From 689b05c6281ee6bafb9a0c0bf291260efa130f64 Mon Sep 17 00:00:00 2001 From: Hasan Date: Sat, 17 Jul 2021 14:11:04 +0400 Subject: bpo-42095: plistlib: Add tests that compare with plutil(1) (#27173) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Ɓukasz Langa --- Lib/test/test_plistlib.py | 74 ++++++++++++++++++++++ .../Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst | 2 + 2 files changed, 76 insertions(+) create mode 100644 Misc/NEWS.d/next/Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst diff --git a/Lib/test/test_plistlib.py b/Lib/test/test_plistlib.py index ef96c6c..6b45744 100644 --- a/Lib/test/test_plistlib.py +++ b/Lib/test/test_plistlib.py @@ -6,8 +6,11 @@ import struct import unittest import plistlib import os +import sys +import json import datetime import codecs +import subprocess import binascii import collections from test import support @@ -997,6 +1000,77 @@ class MiscTestCase(unittest.TestCase): not_exported = {"PlistFormat", "PLISTHEADER"} 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__': unittest.main() diff --git a/Misc/NEWS.d/next/Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst b/Misc/NEWS.d/next/Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst new file mode 100644 index 0000000..bf7bc5b --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2021-07-17-11-41-20.bpo-42095.kCB7oj.rst @@ -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. -- cgit v0.12