class CZoneInfoCacheTest(ZoneInfoCacheTest):
module = c_zoneinfo
+ def test_inconsistent_weak_cache_get(self):
+ class Cache:
+ def get(self, key, default=None):
+ return 1337
+
+ class ZI(self.klass):
+ pass
+ # Class attribute must be set after class creation
+ # to override zoneinfo.ZoneInfo.__init_subclass__.
+ ZI._weak_cache = Cache()
+
+ with self.assertRaises(RuntimeError) as te:
+ ZI("America/Los_Angeles")
+ self.assertEqual(
+ str(te.exception),
+ "Unexpected instance of int in ZI weak cache for key 'America/Los_Angeles'"
+ )
+
+ def test_inconsistent_weak_cache_setdefault(self):
+ class Cache:
+ def get(self, key, default=None):
+ return default
+ def setdefault(self, key, value):
+ return 1337
+
+ class ZI(self.klass):
+ pass
+ # Class attribute must be set after class creation
+ # to override zoneinfo.ZoneInfo.__init_subclass__.
+ ZI._weak_cache = Cache()
+
+ with self.assertRaises(RuntimeError) as te:
+ ZI("America/Los_Angeles")
+ self.assertEqual(
+ str(te.exception),
+ "Unexpected instance of int in ZI weak cache for key 'America/Los_Angeles'"
+ )
+
class ZoneInfoPickleTest(TzPathUserMixin, ZoneInfoTestBase):
module = py_zoneinfo
return NULL;
}
+ ((PyZoneInfo_ZoneInfo *)tmp)->source = SOURCE_CACHE;
instance =
PyObject_CallMethod(weak_cache, "setdefault", "OO", key, tmp);
Py_DECREF(tmp);
Py_DECREF(weak_cache);
return NULL;
}
- ((PyZoneInfo_ZoneInfo *)instance)->source = SOURCE_CACHE;
+ }
+
+ if (!PyObject_TypeCheck(instance, type)) {
+ PyErr_Format(PyExc_RuntimeError,
+ "Unexpected instance of %T in %s weak cache for key %R",
+ instance, _PyType_Name(type), key);
+ Py_DECREF(instance);
+ Py_DECREF(weak_cache);
+ return NULL;
}
update_strong_cache(state, type, key, instance);