diff options
author | Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> | 2021-10-28 22:00:34 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-10-28 22:00:34 (GMT) |
commit | dd674ca96f2150fb3f7b4086ef7ec0022c4e2058 (patch) | |
tree | f575f58c7a303a95126f6e6ba0e8eba7e4905a40 | |
parent | 8813a987b1df78b5eaddb085e514dfa5af5c8634 (diff) | |
download | cpython-dd674ca96f2150fb3f7b4086ef7ec0022c4e2058.zip cpython-dd674ca96f2150fb3f7b4086ef7ec0022c4e2058.tar.gz cpython-dd674ca96f2150fb3f7b4086ef7ec0022c4e2058.tar.bz2 |
bpo-45577: test all pickle protocols in `test_zoneinfo` (GH-29167) (GH-29295)
(cherry picked from commit 66e6b3dcd3bbab06feeff2cbaf8aade7b6223d6c)
Co-authored-by: Nikita Sobolev <mail@sobolevn.me>
-rw-r--r-- | Lib/test/test_zoneinfo/test_zoneinfo.py | 97 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Tests/2021-10-22-19-44-13.bpo-45577.dSaNvK.rst | 1 |
2 files changed, 54 insertions, 44 deletions
diff --git a/Lib/test/test_zoneinfo/test_zoneinfo.py b/Lib/test/test_zoneinfo/test_zoneinfo.py index d4704b7..08ebbb1 100644 --- a/Lib/test/test_zoneinfo/test_zoneinfo.py +++ b/Lib/test/test_zoneinfo/test_zoneinfo.py @@ -1403,44 +1403,50 @@ class ZoneInfoPickleTest(TzPathUserMixin, ZoneInfoTestBase): return [self.zoneinfo_data.tzpath] def test_cache_hit(self): - zi_in = self.klass("Europe/Dublin") - pkl = pickle.dumps(zi_in) - zi_rt = pickle.loads(pkl) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + zi_in = self.klass("Europe/Dublin") + pkl = pickle.dumps(zi_in, protocol=proto) + zi_rt = pickle.loads(pkl) - with self.subTest(test="Is non-pickled ZoneInfo"): - self.assertIs(zi_in, zi_rt) + with self.subTest(test="Is non-pickled ZoneInfo"): + self.assertIs(zi_in, zi_rt) - zi_rt2 = pickle.loads(pkl) - with self.subTest(test="Is unpickled ZoneInfo"): - self.assertIs(zi_rt, zi_rt2) + zi_rt2 = pickle.loads(pkl) + with self.subTest(test="Is unpickled ZoneInfo"): + self.assertIs(zi_rt, zi_rt2) def test_cache_miss(self): - zi_in = self.klass("Europe/Dublin") - pkl = pickle.dumps(zi_in) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + zi_in = self.klass("Europe/Dublin") + pkl = pickle.dumps(zi_in, protocol=proto) - del zi_in - self.klass.clear_cache() # Induce a cache miss - zi_rt = pickle.loads(pkl) - zi_rt2 = pickle.loads(pkl) + del zi_in + self.klass.clear_cache() # Induce a cache miss + zi_rt = pickle.loads(pkl) + zi_rt2 = pickle.loads(pkl) - self.assertIs(zi_rt, zi_rt2) + self.assertIs(zi_rt, zi_rt2) def test_no_cache(self): - zi_no_cache = self.klass.no_cache("Europe/Dublin") + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + zi_no_cache = self.klass.no_cache("Europe/Dublin") - pkl = pickle.dumps(zi_no_cache) - zi_rt = pickle.loads(pkl) + pkl = pickle.dumps(zi_no_cache, protocol=proto) + zi_rt = pickle.loads(pkl) - with self.subTest(test="Not the pickled object"): - self.assertIsNot(zi_rt, zi_no_cache) + with self.subTest(test="Not the pickled object"): + self.assertIsNot(zi_rt, zi_no_cache) - zi_rt2 = pickle.loads(pkl) - with self.subTest(test="Not a second unpickled object"): - self.assertIsNot(zi_rt, zi_rt2) + zi_rt2 = pickle.loads(pkl) + with self.subTest(test="Not a second unpickled object"): + self.assertIsNot(zi_rt, zi_rt2) - zi_cache = self.klass("Europe/Dublin") - with self.subTest(test="Not a cached object"): - self.assertIsNot(zi_rt, zi_cache) + zi_cache = self.klass("Europe/Dublin") + with self.subTest(test="Not a cached object"): + self.assertIsNot(zi_rt, zi_cache) def test_from_file(self): key = "Europe/Dublin" @@ -1456,35 +1462,38 @@ class ZoneInfoPickleTest(TzPathUserMixin, ZoneInfoTestBase): ] for zi, test_name in test_cases: - with self.subTest(test_name=test_name): - with self.assertRaises(pickle.PicklingError): - pickle.dumps(zi) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(test_name=test_name, proto=proto): + with self.assertRaises(pickle.PicklingError): + pickle.dumps(zi, protocol=proto) def test_pickle_after_from_file(self): # This may be a bit of paranoia, but this test is to ensure that no # global state is maintained in order to handle the pickle cache and # from_file behavior, and that it is possible to interweave the # constructors of each of these and pickling/unpickling without issues. - key = "Europe/Dublin" - zi = self.klass(key) + for proto in range(pickle.HIGHEST_PROTOCOL + 1): + with self.subTest(proto=proto): + key = "Europe/Dublin" + zi = self.klass(key) - pkl_0 = pickle.dumps(zi) - zi_rt_0 = pickle.loads(pkl_0) - self.assertIs(zi, zi_rt_0) + pkl_0 = pickle.dumps(zi, protocol=proto) + zi_rt_0 = pickle.loads(pkl_0) + self.assertIs(zi, zi_rt_0) - with open(self.zoneinfo_data.path_from_key(key), "rb") as f: - zi_ff = self.klass.from_file(f, key=key) + with open(self.zoneinfo_data.path_from_key(key), "rb") as f: + zi_ff = self.klass.from_file(f, key=key) - pkl_1 = pickle.dumps(zi) - zi_rt_1 = pickle.loads(pkl_1) - self.assertIs(zi, zi_rt_1) + pkl_1 = pickle.dumps(zi, protocol=proto) + zi_rt_1 = pickle.loads(pkl_1) + self.assertIs(zi, zi_rt_1) - with self.assertRaises(pickle.PicklingError): - pickle.dumps(zi_ff) + with self.assertRaises(pickle.PicklingError): + pickle.dumps(zi_ff, protocol=proto) - pkl_2 = pickle.dumps(zi) - zi_rt_2 = pickle.loads(pkl_2) - self.assertIs(zi, zi_rt_2) + pkl_2 = pickle.dumps(zi, protocol=proto) + zi_rt_2 = pickle.loads(pkl_2) + self.assertIs(zi, zi_rt_2) class CZoneInfoPickleTest(ZoneInfoPickleTest): diff --git a/Misc/NEWS.d/next/Tests/2021-10-22-19-44-13.bpo-45577.dSaNvK.rst b/Misc/NEWS.d/next/Tests/2021-10-22-19-44-13.bpo-45577.dSaNvK.rst new file mode 100644 index 0000000..fc9783e --- /dev/null +++ b/Misc/NEWS.d/next/Tests/2021-10-22-19-44-13.bpo-45577.dSaNvK.rst @@ -0,0 +1 @@ +Add subtests for all ``pickle`` protocols in ``test_zoneinfo``. |