bpo-42095: plistlib: Add tests that compare with plutil(1) (#27173)
Co-authored-by: Łukasz Langa <lukasz@langa.pl>
This commit is contained in:
parent
d0b2b00c7d
commit
689b05c628
@ -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()
|
||||||
|
@ -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.
|
Loading…
x
Reference in New Issue
Block a user