bpo-26707: Enable plistlib to read UID keys. (GH-12153) · python/cpython@c981ad1 (original) (raw)
1
1
`# Copyright (C) 2003-2013 Python Software Foundation
`
2
``
-
``
2
`+
import copy
`
``
3
`+
import operator
`
``
4
`+
import pickle
`
3
5
`import unittest
`
4
6
`import plistlib
`
5
7
`import os
`
`@@ -10,6 +12,8 @@
`
10
12
`from test import support
`
11
13
`from io import BytesIO
`
12
14
``
``
15
`+
from plistlib import UID
`
``
16
+
13
17
`ALL_FORMATS=(plistlib.FMT_XML, plistlib.FMT_BINARY)
`
14
18
``
15
19
`# The testdata is generated using Mac/Tools/plistlib_generate_testdata.py
`
88
92
` ZwB0AHwAiACUAJoApQCuALsAygDTAOQA7QD4AQQBDwEdASsBNgE3ATgBTwFn
`
89
93
` AW4BcAFyAXQBdgF/AYMBhQGHAYwBlQGbAZ0BnwGhAaUBpwGwAbkBwAHBAcIB
`
90
94
` xQHHAsQC0gAAAAAAAAIBAAAAAAAAADkAAAAAAAAAAAAAAAAAAALs'''),
`
``
95
`+
'KEYED_ARCHIVE': binascii.a2b_base64(b'''
`
``
96
`+
YnBsaXN0MDDUAQIDBAUGHB1YJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVy
`
``
97
`+
VCR0b3ASAAGGoKMHCA9VJG51bGzTCQoLDA0OVnB5dHlwZVYkY2xhc3NZTlMu
`
``
98
`+
c3RyaW5nEAGAAl8QE0tleUFyY2hpdmUgVUlEIFRlc3TTEBESExQZWiRjbGFz
`
``
99
`+
c25hbWVYJGNsYXNzZXNbJGNsYXNzaGludHNfEBdPQ19CdWlsdGluUHl0aG9u
`
``
100
`+
VW5pY29kZaQVFhcYXxAXT0NfQnVpbHRpblB5dGhvblVuaWNvZGVfEBBPQ19Q
`
``
101
`+
eXRob25Vbmljb2RlWE5TU3RyaW5nWE5TT2JqZWN0ohobXxAPT0NfUHl0aG9u
`
``
102
`+
U3RyaW5nWE5TU3RyaW5nXxAPTlNLZXllZEFyY2hpdmVy0R4fVHJvb3SAAQAI
`
``
103
`+
ABEAGgAjAC0AMgA3ADsAQQBIAE8AVgBgAGIAZAB6AIEAjACVAKEAuwDAANoA
`
``
104
`+
7QD2AP8BAgEUAR0BLwEyATcAAAAAAAACAQAAAAAAAAAgAAAAAAAAAAAAAAAA
`
``
105
`+
AAABOQ=='''),
`
91
106
`}
`
92
107
``
93
108
``
`@@ -151,6 +166,14 @@ def test_invalid_type(self):
`
151
166
`with self.subTest(fmt=fmt):
`
152
167
`self.assertRaises(TypeError, plistlib.dumps, pl, fmt=fmt)
`
153
168
``
``
169
`+
def test_invalid_uid(self):
`
``
170
`+
with self.assertRaises(TypeError):
`
``
171
`+
UID("not an int")
`
``
172
`+
with self.assertRaises(ValueError):
`
``
173
`+
UID(2 ** 64)
`
``
174
`+
with self.assertRaises(ValueError):
`
``
175
`+
UID(-19)
`
``
176
+
154
177
`def test_int(self):
`
155
178
`for pl in [0, 28-1, 28, 216-1, 216, 232-1, 232,
`
156
179
`263-1, 264-1, 1, -2**63]:
`
`@@ -200,6 +223,45 @@ def test_indentation_dict_mix(self):
`
200
223
`data = {'1': {'2': [{'3': [[[[[{'test': b'aaaaaa'}]]]]]}]}}
`
201
224
`self.assertEqual(plistlib.loads(plistlib.dumps(data)), data)
`
202
225
``
``
226
`+
def test_uid(self):
`
``
227
`+
data = UID(1)
`
``
228
`+
self.assertEqual(plistlib.loads(plistlib.dumps(data, fmt=plistlib.FMT_BINARY)), data)
`
``
229
`+
dict_data = {
`
``
230
`+
'uid0': UID(0),
`
``
231
`+
'uid2': UID(2),
`
``
232
`+
'uid8': UID(2 ** 8),
`
``
233
`+
'uid16': UID(2 ** 16),
`
``
234
`+
'uid32': UID(2 ** 32),
`
``
235
`+
'uid63': UID(2 ** 63)
`
``
236
`+
}
`
``
237
`+
self.assertEqual(plistlib.loads(plistlib.dumps(dict_data, fmt=plistlib.FMT_BINARY)), dict_data)
`
``
238
+
``
239
`+
def test_uid_data(self):
`
``
240
`+
uid = UID(1)
`
``
241
`+
self.assertEqual(uid.data, 1)
`
``
242
+
``
243
`+
def test_uid_eq(self):
`
``
244
`+
self.assertEqual(UID(1), UID(1))
`
``
245
`+
self.assertNotEqual(UID(1), UID(2))
`
``
246
`+
self.assertNotEqual(UID(1), "not uid")
`
``
247
+
``
248
`+
def test_uid_hash(self):
`
``
249
`+
self.assertEqual(hash(UID(1)), hash(UID(1)))
`
``
250
+
``
251
`+
def test_uid_repr(self):
`
``
252
`+
self.assertEqual(repr(UID(1)), "UID(1)")
`
``
253
+
``
254
`+
def test_uid_index(self):
`
``
255
`+
self.assertEqual(operator.index(UID(1)), 1)
`
``
256
+
``
257
`+
def test_uid_pickle(self):
`
``
258
`+
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
`
``
259
`+
self.assertEqual(pickle.loads(pickle.dumps(UID(19), protocol=proto)), UID(19))
`
``
260
+
``
261
`+
def test_uid_copy(self):
`
``
262
`+
self.assertEqual(copy.copy(UID(1)), UID(1))
`
``
263
`+
self.assertEqual(copy.deepcopy(UID(1)), UID(1))
`
``
264
+
203
265
`def test_appleformatting(self):
`
204
266
`for use_builtin_types in (True, False):
`
205
267
`for fmt in ALL_FORMATS:
`
`@@ -648,14 +710,46 @@ def test_dataobject_deprecated(self):
`
648
710
`self.assertEqual(cur, in_data)
`
649
711
``
650
712
``
``
713
`+
class TestKeyedArchive(unittest.TestCase):
`
``
714
`+
def test_keyed_archive_data(self):
`
``
715
`+
This is the structure of a NSKeyedArchive packed plist
`
``
716
`+
data = {
`
``
717
`+
'$version': 100000,
`
``
718
`+
'$objects': [
`
``
719
`+
'$null', {
`
``
720
`+
'pytype': 1,
`
``
721
`+
'$class': UID(2),
`
``
722
`+
'NS.string': 'KeyArchive UID Test'
`
``
723
`+
},
`
``
724
`+
{
`
``
725
`+
'$classname': 'OC_BuiltinPythonUnicode',
`
``
726
`+
'$classes': [
`
``
727
`+
'OC_BuiltinPythonUnicode',
`
``
728
`+
'OC_PythonUnicode',
`
``
729
`+
'NSString',
`
``
730
`+
'NSObject'
`
``
731
`+
],
`
``
732
`+
'$classhints': [
`
``
733
`+
'OC_PythonString', 'NSString'
`
``
734
`+
]
`
``
735
`+
}
`
``
736
`+
],
`
``
737
`+
'$archiver': 'NSKeyedArchiver',
`
``
738
`+
'$top': {
`
``
739
`+
'root': UID(1)
`
``
740
`+
}
`
``
741
`+
}
`
``
742
`+
self.assertEqual(plistlib.loads(TESTDATA["KEYED_ARCHIVE"]), data)
`
``
743
+
``
744
+
651
745
`class MiscTestCase(unittest.TestCase):
`
652
746
`def test__all__(self):
`
653
747
`blacklist = {"PlistFormat", "PLISTHEADER"}
`
654
748
`support.check__all__(self, plistlib, blacklist=blacklist)
`
655
749
``
656
750
``
657
751
`def test_main():
`
658
``
`-
support.run_unittest(TestPlistlib, TestPlistlibDeprecated, MiscTestCase)
`
``
752
`+
support.run_unittest(TestPlistlib, TestPlistlibDeprecated, TestKeyedArchive, MiscTestCase)
`
659
753
``
660
754
``
661
755
`if name == 'main':
`