Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(36)

Side by Side Diff: appengine/findit/lib/test/cache_decorator_test.py

Issue 2557553002: [Culprit-Finder] Seperate gae related part in cache_decorator and gitile repository to gae_libs/ (Closed)
Patch Set: Fix nits. Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 # Copyright 2015 The Chromium Authors. All rights reserved. 1 # Copyright 2015 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 import pickle 5 import pickle
6 import zlib 6 import zlib
7 7
8 from google.appengine.api import memcache
9 from testing_utils import testing 8 from testing_utils import testing
10 9
10 from lib import cache
11 from lib import cache_decorator 11 from lib import cache_decorator
12 12
13 13
14 class _DummyCacher(cache_decorator.Cacher): 14 class _DummyCache(cache.Cache):
15 def __init__(self, cached_data): 15 def __init__(self, cached_data):
16 self.cached_data = cached_data 16 self.cached_data = cached_data
17 17
18 def Get(self, key): 18 def Get(self, key):
19 return self.cached_data.get(key) 19 return self.cached_data.get(key)
20 20
21 def Set(self, key, data, expire_time=0): 21 def Set(self, key, data, expire_time=0):
22 self.cached_data[key] = data 22 self.cached_data[key] = data
23 23
24 24
25 def _DummyKeyGenerator(func, *_): 25 def _DummyKeyGenerator(func, *_):
26 return func.__name__ 26 return func.__name__
27 27
28 28
29 class CacheDecoratorTest(testing.AppengineTestCase): 29 class CacheDecoratorTest(testing.AppengineTestCase):
30 def testPickledMemCacher(self):
31 cacher = cache_decorator.PickledMemCacher()
32 cacher.Set('a', 'd')
33 self.assertEquals('d', cacher.Get('a'))
34
35 def _MockPickleAndZlib(self):
36 def Func(string, *_, **__):
37 return string
38 self.mock(pickle, 'dumps', Func)
39 self.mock(pickle, 'loads', Func)
40 self.mock(zlib, 'compress', Func)
41 self.mock(zlib, 'decompress', Func)
42
43 def testCachingSmallDataInCompressedMemCacher(self):
44 self._MockPickleAndZlib()
45 cacher = cache_decorator.CompressedMemCacher()
46 data = 'A' * 1024 # A string of size 1KB.
47 cacher.Set('a', data)
48 self.assertEquals(data, cacher.Get('a'))
49
50 def testCachingLargeDataInCompressedMemCacher(self):
51 self._MockPickleAndZlib()
52 cacher = cache_decorator.CompressedMemCacher()
53 data = 'A' * (1024 * 1024 * 2) # A string of size 2MB.
54 cacher.Set('a', data)
55 self.assertEquals(data, cacher.Get('a'))
56
57 def testMissingSubPieceOfLargeDataInCompressedMemCacher(self):
58 self._MockPickleAndZlib()
59 cacher = cache_decorator.CompressedMemCacher()
60 data = 'A' * (1024 * 1024 * 2) # A string of size 2MB.
61 cacher.Set('a', data)
62 memcache.delete('a-0')
63 self.assertEquals(None, cacher.Get('a'))
64
65 def testDefaultKeyGenerator(self): 30 def testDefaultKeyGenerator(self):
66 expected_params = { 31 expected_params = {
67 'id1': 'fi', 32 'id1': 'fi',
68 'id2': 'pi', 33 'id2': 'pi',
69 'url': 'http://url', 34 'url': 'http://url',
70 } 35 }
71 # Hexadecimal digits of MD5 digest of "pickled_params". 36 # Hexadecimal digits of MD5 digest of "pickled_params".
72 expected_key = 'f5f173c811f7c537a80d44511903a3e0' 37 expected_key = 'f5f173c811f7c537a80d44511903a3e0'
73 38
74 def MockPickleDumps(params): 39 def MockPickleDumps(params):
(...skipping 13 matching lines...) Expand all
88 return 'pi' 53 return 'pi'
89 54
90 self.mock(pickle, 'dumps', MockPickleDumps) 55 self.mock(pickle, 'dumps', MockPickleDumps)
91 56
92 args = (CallableIdentifier(), PropertyIdentifier()) 57 args = (CallableIdentifier(), PropertyIdentifier())
93 kwargs = {'url': 'http://url'} 58 kwargs = {'url': 'http://url'}
94 key = cache_decorator._DefaultKeyGenerator(Func, args, kwargs) 59 key = cache_decorator._DefaultKeyGenerator(Func, args, kwargs)
95 self.assertEqual(expected_key, key) 60 self.assertEqual(expected_key, key)
96 61
97 def testCachedDecoratorWhenResultIsAlreadyCached(self): 62 def testCachedDecoratorWhenResultIsAlreadyCached(self):
98 cacher = _DummyCacher({'n-Func': 1}) 63 dummy_cache = _DummyCache({'n-Func': 1})
99 64
100 @cache_decorator.Cached( 65 @cache_decorator.Cached(
101 namespace='n', key_generator=_DummyKeyGenerator, cacher=cacher) 66 namespace='n', key_generator=_DummyKeyGenerator, cache=dummy_cache)
102 def Func(): 67 def Func():
103 return 2 # pragma: no cover. 68 return 2 # pragma: no cover.
104 69
105 self.assertEqual(1, Func()) 70 self.assertEqual(1, Func())
106 self.assertEqual({'n-Func': 1}, cacher.cached_data) 71 self.assertEqual({'n-Func': 1}, dummy_cache.cached_data)
107 72
108 def testCachedDecoratorWhenResultIsNotCachedYet(self): 73 def testCachedDecoratorWhenResultIsNotCachedYet(self):
109 cacher = _DummyCacher({}) 74 dummy_cache = _DummyCache({})
110 75
111 @cache_decorator.Cached( 76 @cache_decorator.Cached(
112 namespace='n', key_generator=_DummyKeyGenerator, cacher=cacher) 77 namespace='n', key_generator=_DummyKeyGenerator, cache=dummy_cache)
113 def Func(): 78 def Func():
114 return 2 79 return 2
115 80
116 self.assertEqual(2, Func()) 81 self.assertEqual(2, Func())
117 self.assertEqual({'n-Func': 2}, cacher.cached_data) 82 self.assertEqual({'n-Func': 2}, dummy_cache.cached_data)
118 83
119 def testCachedDecoratorWhenResultShouldNotBeCached(self): 84 def testCachedDecoratorWhenResultShouldNotBeCached(self):
120 cacher = _DummyCacher({}) 85 dummy_cache = _DummyCache({})
121 86
122 results = [None, 0, [], {}, ''] 87 results = [None, 0, [], {}, '']
123 88
124 @cache_decorator.Cached( 89 @cache_decorator.Cached(
125 namespace='n', key_generator=_DummyKeyGenerator, cacher=cacher) 90 namespace='n', key_generator=_DummyKeyGenerator, cache=dummy_cache)
126 def Func(): 91 def Func():
127 return results.pop() 92 return results.pop()
128 93
129 self.assertEqual('', Func()) 94 self.assertEqual('', Func())
130 self.assertEqual({}, cacher.cached_data) 95 self.assertEqual({}, dummy_cache.cached_data)
131 self.assertEqual({}, Func()) 96 self.assertEqual({}, Func())
132 self.assertEqual({}, cacher.cached_data) 97 self.assertEqual({}, dummy_cache.cached_data)
133 self.assertEqual([], Func()) 98 self.assertEqual([], Func())
134 self.assertEqual({}, cacher.cached_data) 99 self.assertEqual({}, dummy_cache.cached_data)
135 self.assertEqual(0, Func()) 100 self.assertEqual(0, Func())
136 self.assertEqual({}, cacher.cached_data) 101 self.assertEqual({}, dummy_cache.cached_data)
137 self.assertIsNone(Func()) 102 self.assertIsNone(Func())
138 self.assertEqual({}, cacher.cached_data) 103 self.assertEqual({}, dummy_cache.cached_data)
139 104
140 def testCachedDecoratorWithMethodInAClass(self): 105 def testCachedDecoratorWithMethodInAClass(self):
141 class A(object): 106 class A(object):
142 def __init__(self, url, retries): 107 def __init__(self, url, retries):
143 self.url = url 108 self.url = url
144 self.retries = retries 109 self.retries = retries
145 self.runs = 0 110 self.runs = 0
146 111
147 @property 112 @property
148 def identifier(self): 113 def identifier(self):
149 return self.url 114 return self.url
150 115
151 @cache_decorator.Cached() 116 @cache_decorator.Cached(cache=_DummyCache({}))
152 def Func(self, path): 117 def Func(self, path):
153 self.runs += 1 118 self.runs += 1
154 return self.url + '/' + path 119 return self.url + '/' + path
155 120
156 a1 = A('http://test', 3) 121 a1 = A('http://test', 3)
157 self.assertEqual('http://test/p1', a1.Func('p1')) 122 self.assertEqual('http://test/p1', a1.Func('p1'))
158 self.assertEqual('http://test/p1', a1.Func('p1')) 123 self.assertEqual('http://test/p1', a1.Func('p1'))
159 self.assertEqual(1, a1.runs) 124 self.assertEqual(1, a1.runs)
160 125
161 a2 = A('http://test', 5) 126 a2 = A('http://test', 5)
162 self.assertEqual('http://test/p1', a2.Func('p1')) 127 self.assertEqual('http://test/p1', a2.Func('p1'))
163 self.assertEqual(0, a2.runs) 128 self.assertEqual(0, a2.runs)
OLDNEW
« no previous file with comments | « appengine/findit/lib/gitiles/test/gitiles_repository_test.py ('k') | appengine/findit/util_scripts/local_cache.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698