Chromium Code Reviews| Index: appengine/findit/libs/test/cache_decorator_test.py |
| diff --git a/appengine/findit/libs/test/cache_decorator_test.py b/appengine/findit/libs/test/cache_decorator_test.py |
| index 03e31d976bb7cc943625a0de13f9a894993a35f4..271f63905355379fbebc7c480a1a27c5e7c449e4 100644 |
| --- a/appengine/findit/libs/test/cache_decorator_test.py |
| +++ b/appengine/findit/libs/test/cache_decorator_test.py |
| @@ -2,11 +2,11 @@ |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| +import mock |
| import pickle |
| +import unittest |
| import zlib |
| -from testing_utils import testing |
| - |
| from libs import cache |
| from libs import cache_decorator |
| @@ -22,19 +22,24 @@ class _DummyCache(cache.Cache): |
| self.cached_data[key] = data |
| -def _DummyKeyGenerator(func, *_): |
| - return func.__name__ |
| +def _DummyKeyGenerator(func, args, kwargs, # pylint: disable=W0613 |
| + namespace=None): |
| + namespace = namespace or '%s.%s' % (func.__module__, func.__name__) |
| + return namespace + '-' + func.__name__ |
| + |
| +class CachedTest(unittest.TestCase): |
| + """Tests ``Cached`` decorator.""" |
| -class CacheDecoratorTest(testing.AppengineTestCase): |
| def testDefaultKeyGenerator(self): |
| + namespace = 'n' |
| expected_params = { |
| 'id1': 'fi', |
| 'id2': 'pi', |
| 'url': 'http://url', |
| } |
| # Hexadecimal digits of MD5 digest of "pickled_params". |
| - expected_key = 'f5f173c811f7c537a80d44511903a3e0' |
| + expected_key = namespace + '-f5f173c811f7c537a80d44511903a3e0' |
| def MockPickleDumps(params): |
| self.assertEqual(expected_params, params) |
| @@ -52,12 +57,12 @@ class CacheDecoratorTest(testing.AppengineTestCase): |
| def identifier(self): |
| return 'pi' |
| - self.mock(pickle, 'dumps', MockPickleDumps) |
| - |
| - args = (CallableIdentifier(), PropertyIdentifier()) |
| - kwargs = {'url': 'http://url'} |
| - key = cache_decorator._DefaultKeyGenerator(Func, args, kwargs) |
| - self.assertEqual(expected_key, key) |
| + with mock.patch('pickle.dumps', MockPickleDumps): |
| + args = (CallableIdentifier(), PropertyIdentifier()) |
| + kwargs = {'url': 'http://url'} |
| + key = cache_decorator._DefaultKeyGenerator(Func, args, kwargs, |
| + namespace=namespace) |
|
chanli
2017/01/21 07:11:56
Nit: move all parameters in one line?
Sharu Jiang
2017/01/23 19:15:35
Done.
|
| + self.assertEqual(expected_key, key) |
| def testCachedDecoratorWhenResultIsAlreadyCached(self): |
| dummy_cache = _DummyCache({'n-Func': 1}) |
| @@ -126,3 +131,66 @@ class CacheDecoratorTest(testing.AppengineTestCase): |
| a2 = A('http://test', 5) |
| self.assertEqual('http://test/p1', a2.Func('p1')) |
| self.assertEqual(0, a2.runs) |
| + |
| + |
| +class GeneratorCachedTest(unittest.TestCase): |
| + """Tests ``GeneratorCached`` decorator.""" |
| + |
| + def testWhenResultIsAlreadyCached(self): |
| + value_list = [0, 1, 2] |
| + key = 'n-Func' |
| + # Zero value won't be cached. |
| + cached_keys = ['%s-%d' % (key, i) for i in xrange(len(value_list))] |
| + cached_data = {key: value for key, value in zip(cached_keys, value_list)} |
| + cached_data[key] = cached_keys |
| + |
| + dummy_cache = _DummyCache(cached_data) |
| + |
| + @cache_decorator.GeneratorCached( |
| + dummy_cache, namespace='n', key_generator=_DummyKeyGenerator) |
| + def Func(): # pragma: no cover |
| + for value in value_list: |
| + yield value |
| + |
| + for value, expected_value in zip(Func(), value_list): |
| + self.assertEqual(value, expected_value) |
| + |
| + def testWhenResultIsNotCachedYet(self): |
| + value_list = [0, 1, 2, 3, 4] |
| + dummy_cache = _DummyCache({}) |
| + |
| + @cache_decorator.GeneratorCached( |
| + dummy_cache, namespace='n', key_generator=_DummyKeyGenerator) |
| + def Func(): # pragma: no cover |
| + for value in value_list: |
| + yield value |
| + |
| + key = _DummyKeyGenerator(Func, [], {}, namespace='n') |
| + cached_keys = ['%s-%d' % (key, i) for i in xrange(len(value_list))] |
| + cached_data = {key: value for key, value in zip(cached_keys, value_list)} |
| + cached_data[key] = cached_keys |
| + for value, expected_value in zip(Func(), value_list): |
| + self.assertEqual(value, expected_value) |
| + |
| + self.assertDictEqual(dummy_cache.cached_data, cached_data) |
| + |
| + @mock.patch('libs.cache_decorator.GeneratorCached.SetCache', |
| + lambda *_: False) |
| + def testFailedToSetValue(self): |
| + value_list = [0, 1, 2, 3, 4] |
| + dummy_cache = _DummyCache({}) |
| + |
| + @cache_decorator.GeneratorCached( |
| + dummy_cache, namespace='n', key_generator=_DummyKeyGenerator) |
| + def Func(): # pragma: no cover |
| + for value in value_list: |
| + yield value |
| + |
| + key = _DummyKeyGenerator(Func, [], {}, namespace='n') |
| + cached_keys = ['%s-%d' % (key, i) for i in xrange(len(value_list))] |
| + cached_data = {key: value for key, value in zip(cached_keys, value_list)} |
| + cached_data[key] = cached_keys |
| + for value, expected_value in zip(Func(), value_list): |
| + self.assertEqual(value, expected_value) |
| + |
| + self.assertDictEqual(dummy_cache.cached_data, {}) |