summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2021-10-28 15:00:34 -0700
committerGitHub <noreply@github.com>2021-10-29 00:00:34 +0200
commitdd674ca96f2150fb3f7b4086ef7ec0022c4e2058 (patch)
treef575f58c7a303a95126f6e6ba0e8eba7e4905a40
parent8813a987b1df78b5eaddb085e514dfa5af5c8634 (diff)
downloadcpython-git-dd674ca96f2150fb3f7b4086ef7ec0022c4e2058.tar.gz
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.py97
-rw-r--r--Misc/NEWS.d/next/Tests/2021-10-22-19-44-13.bpo-45577.dSaNvK.rst1
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 d4704b75d3..08ebbb1dd9 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 0000000000..fc9783eb9d
--- /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``.