bpo-42095: plistlib: Add tests that compare with plutil(1) (#27173)

Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
Hasan 2021-07-17 14:11:04 +04:00 committed by GitHub
parent d0b2b00c7d
commit 689b05c628
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 76 additions and 0 deletions

View File

@ -6,8 +6,11 @@ import struct
import unittest import unittest
import plistlib import plistlib
import os import os
import sys
import json
import datetime import datetime
import codecs import codecs
import subprocess
import binascii import binascii
import collections import collections
from test import support from test import support
@ -997,6 +1000,77 @@ class MiscTestCase(unittest.TestCase):
not_exported = {"PlistFormat", "PLISTHEADER"} not_exported = {"PlistFormat", "PLISTHEADER"}
support.check__all__(self, plistlib, not_exported=not_exported) support.check__all__(self, plistlib, not_exported=not_exported)
@unittest.skipUnless(sys.platform == "darwin", "plutil utility is for Mac os")
class TestPlutil(unittest.TestCase):
file_name = "plutil_test.plist"
properties = {
"fname" : "H",
"lname":"A",
"marks" : {"a":100, "b":0x10}
}
exptected_properties = {
"fname" : "H",
"lname": "A",
"marks" : {"a":100, "b":16}
}
pl = {
"HexType" : 0x0100000c,
"IntType" : 0o123
}
@classmethod
def setUpClass(cls) -> None:
## Generate plist file with plistlib and parse with plutil
with open(cls.file_name,'wb') as f:
plistlib.dump(cls.properties, f, fmt=plistlib.FMT_BINARY)
@classmethod
def tearDownClass(cls) -> None:
os.remove(cls.file_name)
def get_lint_status(self):
return subprocess.run(['plutil', "-lint", self.file_name], capture_output=True, text=True).stdout
def convert_to_json(self):
"""Convert binary file to json using plutil
"""
subprocess.run(['plutil', "-convert", 'json', self.file_name])
def convert_to_bin(self):
"""Convert file to binary using plutil
"""
subprocess.run(['plutil', "-convert", 'binary1', self.file_name])
def write_pl(self):
"""Write Hex properties to file using writePlist
"""
with open(self.file_name, 'wb') as f:
plistlib.dump(self.pl, f, fmt=plistlib.FMT_BINARY)
def test_lint_status(self):
# check lint status of file using plutil
self.assertEqual(f"{self.file_name}: OK\n", self.get_lint_status())
def check_content(self):
# check file content with plutil converting binary to json
self.convert_to_json()
with open(self.file_name) as f:
ff = json.loads(f.read())
self.assertEqual(ff, self.exptected_properties)
def check_plistlib_parse(self):
# Generate plist files with plutil and parse with plistlib
self.convert_to_bin()
with open(self.file_name, 'rb') as f:
self.assertEqual(plistlib.load(f), self.exptected_properties)
def test_octal_and_hex(self):
self.write_pl()
self.convert_to_json()
with open(self.file_name, 'r') as f:
p = json.loads(f.read())
self.assertEqual(p.get("HexType"), 16777228)
self.assertEqual(p.get("IntType"), 83)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View File

@ -0,0 +1,2 @@
Added interop tests for Apple plists: generate plist files with Python
plistlib and parse with Apple plutil; and the other way round.