summaryrefslogtreecommitdiffstats
path: root/Lib
diff options
context:
space:
mode:
authorHasan <aliyevH@hotmail.com>2021-07-17 10:11:04 (GMT)
committerGitHub <noreply@github.com>2021-07-17 10:11:04 (GMT)
commit689b05c6281ee6bafb9a0c0bf291260efa130f64 (patch)
tree38215f92425819ca8f5cc5af253bb09d8ca543ea /Lib
parentd0b2b00c7d5ac3dc18d77bf4fcf607ee98c11650 (diff)
downloadcpython-689b05c6281ee6bafb9a0c0bf291260efa130f64.zip
cpython-689b05c6281ee6bafb9a0c0bf291260efa130f64.tar.gz
cpython-689b05c6281ee6bafb9a0c0bf291260efa130f64.tar.bz2
bpo-42095: plistlib: Add tests that compare with plutil(1) (#27173)
Co-authored-by: Ɓukasz Langa <lukasz@langa.pl>
Diffstat (limited to 'Lib')
-rw-r--r--Lib/test/test_plistlib.py74
1 files changed, 74 insertions, 0 deletions
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()