diff options
author | chojoyce <chojoyce@google.com> | 2021-12-08 23:54:19 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2021-12-08 23:54:19 +0000 |
commit | 47f9b551e35f3f4709bf0802e20ed5c4cc34296e (patch) | |
tree | f684194a77825219fcd99c9542361533c411d631 /tests/test_wrapper.py | |
parent | 0377d4b9d25a15e2cc4284730a551a42b7a10d22 (diff) | |
parent | e79c25b3e184ab530cc36bf4288f9115ebb91ee4 (diff) | |
download | cachetools-47f9b551e35f3f4709bf0802e20ed5c4cc34296e.tar.gz |
Release platform/external/python/cachetools v4.2.4 am: 39c4b449e8 am: e79c25b3e1
Original change: https://android-review.googlesource.com/c/platform/external/python/cachetools/+/1908894
Change-Id: I1921382c371c2b92f8f492ea4b4cea8c989dade3
Diffstat (limited to 'tests/test_wrapper.py')
-rw-r--r-- | tests/test_wrapper.py | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/tests/test_wrapper.py b/tests/test_wrapper.py new file mode 100644 index 0000000..37af16b --- /dev/null +++ b/tests/test_wrapper.py @@ -0,0 +1,153 @@ +import unittest + +import cachetools +import cachetools.keys + + +class DecoratorTestMixin: + def cache(self, minsize): + raise NotImplementedError + + def func(self, *args, **kwargs): + if hasattr(self, "count"): + self.count += 1 + else: + self.count = 0 + return self.count + + def test_decorator(self): + cache = self.cache(2) + wrapper = cachetools.cached(cache)(self.func) + + self.assertEqual(len(cache), 0) + self.assertEqual(wrapper.__wrapped__, self.func) + + self.assertEqual(wrapper(0), 0) + self.assertEqual(len(cache), 1) + self.assertIn(cachetools.keys.hashkey(0), cache) + self.assertNotIn(cachetools.keys.hashkey(1), cache) + self.assertNotIn(cachetools.keys.hashkey(1.0), cache) + + self.assertEqual(wrapper(1), 1) + self.assertEqual(len(cache), 2) + self.assertIn(cachetools.keys.hashkey(0), cache) + self.assertIn(cachetools.keys.hashkey(1), cache) + self.assertIn(cachetools.keys.hashkey(1.0), cache) + + self.assertEqual(wrapper(1), 1) + self.assertEqual(len(cache), 2) + + self.assertEqual(wrapper(1.0), 1) + self.assertEqual(len(cache), 2) + + self.assertEqual(wrapper(1.0), 1) + self.assertEqual(len(cache), 2) + + def test_decorator_typed(self): + cache = self.cache(3) + key = cachetools.keys.typedkey + wrapper = cachetools.cached(cache, key=key)(self.func) + + self.assertEqual(len(cache), 0) + self.assertEqual(wrapper.__wrapped__, self.func) + + self.assertEqual(wrapper(0), 0) + self.assertEqual(len(cache), 1) + self.assertIn(cachetools.keys.typedkey(0), cache) + self.assertNotIn(cachetools.keys.typedkey(1), cache) + self.assertNotIn(cachetools.keys.typedkey(1.0), cache) + + self.assertEqual(wrapper(1), 1) + self.assertEqual(len(cache), 2) + self.assertIn(cachetools.keys.typedkey(0), cache) + self.assertIn(cachetools.keys.typedkey(1), cache) + self.assertNotIn(cachetools.keys.typedkey(1.0), cache) + + self.assertEqual(wrapper(1), 1) + self.assertEqual(len(cache), 2) + + self.assertEqual(wrapper(1.0), 2) + self.assertEqual(len(cache), 3) + self.assertIn(cachetools.keys.typedkey(0), cache) + self.assertIn(cachetools.keys.typedkey(1), cache) + self.assertIn(cachetools.keys.typedkey(1.0), cache) + + self.assertEqual(wrapper(1.0), 2) + self.assertEqual(len(cache), 3) + + def test_decorator_lock(self): + class Lock: + + count = 0 + + def __enter__(self): + Lock.count += 1 + + def __exit__(self, *exc): + pass + + cache = self.cache(2) + wrapper = cachetools.cached(cache, lock=Lock())(self.func) + + self.assertEqual(len(cache), 0) + self.assertEqual(wrapper.__wrapped__, self.func) + self.assertEqual(wrapper(0), 0) + self.assertEqual(Lock.count, 2) + self.assertEqual(wrapper(1), 1) + self.assertEqual(Lock.count, 4) + self.assertEqual(wrapper(1), 1) + self.assertEqual(Lock.count, 5) + + +class CacheWrapperTest(unittest.TestCase, DecoratorTestMixin): + def cache(self, minsize): + return cachetools.Cache(maxsize=minsize) + + def test_zero_size_cache_decorator(self): + cache = self.cache(0) + wrapper = cachetools.cached(cache)(self.func) + + self.assertEqual(len(cache), 0) + self.assertEqual(wrapper.__wrapped__, self.func) + + self.assertEqual(wrapper(0), 0) + self.assertEqual(len(cache), 0) + + def test_zero_size_cache_decorator_lock(self): + class Lock: + + count = 0 + + def __enter__(self): + Lock.count += 1 + + def __exit__(self, *exc): + pass + + cache = self.cache(0) + wrapper = cachetools.cached(cache, lock=Lock())(self.func) + + self.assertEqual(len(cache), 0) + self.assertEqual(wrapper.__wrapped__, self.func) + + self.assertEqual(wrapper(0), 0) + self.assertEqual(len(cache), 0) + self.assertEqual(Lock.count, 2) + + +class DictWrapperTest(unittest.TestCase, DecoratorTestMixin): + def cache(self, minsize): + return dict() + + +class NoneWrapperTest(unittest.TestCase): + def func(self, *args, **kwargs): + return args + tuple(kwargs.items()) + + def test_decorator(self): + wrapper = cachetools.cached(None)(self.func) + self.assertEqual(wrapper.__wrapped__, self.func) + + self.assertEqual(wrapper(0), (0,)) + self.assertEqual(wrapper(1), (1,)) + self.assertEqual(wrapper(1, foo="bar"), (1, ("foo", "bar"))) |