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

Side by Side Diff: client/tests/lru_test.py

Issue 2414543003: isolateserver: DiskCache format v2 (Closed)
Patch Set: typo and nit Created 4 years, 2 months 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
(Empty)
1 #!/usr/bin/env python
2 # Copyright 2013 The LUCI Authors. All rights reserved.
3 # Use of this source code is governed under the Apache License, Version 2.0
4 # that can be found in the LICENSE file.
5
6 import json
7 import logging
8 import os
9 import sys
10 import tempfile
11 import unittest
12
13 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(
14 __file__.decode(sys.getfilesystemencoding()))))
15 sys.path.insert(0, ROOT_DIR)
16
17 from utils import lru
18
19
20 class LRUDictTest(unittest.TestCase):
21 @staticmethod
22 def prepare_lru_dict(keys):
23 """Returns new LRUDict with given |keys| added one by one."""
24 lru_dict = lru.LRUDict()
25 for key in keys:
26 lru_dict.add(key, None)
27 return lru_dict
28
29 def assert_order(self, lru_dict, expected_keys):
30 """Asserts order of keys in |lru_dict| is |expected_keys|.
31
32 expected_keys[0] is supposedly oldest key, expected_keys[-1] is newest.
33
34 Destroys |lru_dict| state in the process.
35 """
36 # Check keys iteration works.
37 self.assertEqual(lru_dict.keys_set(), set(expected_keys))
38
39 # Check pop_oldest returns keys in expected order.
40 actual_keys = []
41 while lru_dict:
42 oldest_key, _ = lru_dict.pop_oldest()
43 actual_keys.append(oldest_key)
44 self.assertEqual(actual_keys, expected_keys)
45
46 def assert_same_data(self, lru_dict, regular_dict):
47 """Asserts that given |lru_dict| contains same data as |regular_dict|."""
48 self.assertEqual(lru_dict.keys_set(), set(regular_dict.keys()))
49 self.assertEqual(set(lru_dict.itervalues()), set(regular_dict.values()))
50
51 for k, v in regular_dict.items():
52 self.assertEqual(lru_dict.get(k), v)
53
54 def test_basic_dict_funcs(self):
55 lru_dict = lru.LRUDict()
56
57 # Add a bunch.
58 data = {1: 'one', 2: 'two', 3: 'three'}
59 for k, v in data.items():
60 lru_dict.add(k, v)
61 # Check its there.
62 self.assert_same_data(lru_dict, data)
63
64 # Replace value.
65 lru_dict.add(1, 'one!!!')
66 data[1] = 'one!!!'
67 self.assert_same_data(lru_dict, data)
68
69 # Check pop works.
70 self.assertEqual(lru_dict.pop(2), 'two')
71 data.pop(2)
72 self.assert_same_data(lru_dict, data)
73
74 # Pop missing key.
75 with self.assertRaises(KeyError):
76 lru_dict.pop(2)
77
78 # Touch has no effect on set of keys and values.
79 lru_dict.touch(1)
80 self.assert_same_data(lru_dict, data)
81
82 # Touch fails on missing key.
83 with self.assertRaises(KeyError):
84 lru_dict.touch(22)
85
86 def test_magic_methods(self):
87 # Check __nonzero__, __len__ and __contains__ for empty dict.
88 lru_dict = lru.LRUDict()
89 self.assertFalse(lru_dict)
90 self.assertEqual(len(lru_dict), 0)
91 self.assertFalse(1 in lru_dict)
92
93 # Dict with one item.
94 lru_dict.add(1, 'one')
95 self.assertTrue(lru_dict)
96 self.assertEqual(len(lru_dict), 1)
97 self.assertTrue(1 in lru_dict)
98 self.assertFalse(2 in lru_dict)
99
100 def test_order(self):
101 data = [1, 2, 3]
102
103 # Edge cases.
104 self.assert_order(self.prepare_lru_dict([]), [])
105 self.assert_order(self.prepare_lru_dict([1]), [1])
106
107 # No touches.
108 self.assert_order(self.prepare_lru_dict(data), data)
109
110 # Touching newest item is noop.
111 lru_dict = self.prepare_lru_dict(data)
112 lru_dict.touch(3)
113 self.assert_order(lru_dict, data)
114
115 # Touch to move to newest.
116 lru_dict = self.prepare_lru_dict(data)
117 lru_dict.touch(2)
118 self.assert_order(lru_dict, [1, 3, 2])
119
120 # Pop newest.
121 lru_dict = self.prepare_lru_dict(data)
122 lru_dict.pop(1)
123 self.assert_order(lru_dict, [2, 3])
124
125 # Pop in the middle.
126 lru_dict = self.prepare_lru_dict(data)
127 lru_dict.pop(2)
128 self.assert_order(lru_dict, [1, 3])
129
130 # Pop oldest.
131 lru_dict = self.prepare_lru_dict(data)
132 lru_dict.pop(3)
133 self.assert_order(lru_dict, [1, 2])
134
135 # Add oldest.
136 lru_dict = self.prepare_lru_dict(data)
137 lru_dict.batch_insert_oldest([(4, 4), (5, 5)])
138 self.assert_order(lru_dict, [4, 5] + data)
139
140 # Add newest.
141 lru_dict = self.prepare_lru_dict(data)
142 lru_dict.add(4, 4)
143 self.assert_order(lru_dict, data + [4])
144
145 def test_load_save(self):
146 def save_and_load(lru_dict):
147 handle, tmp_name = tempfile.mkstemp(prefix=u'lru_test')
148 os.close(handle)
149 try:
150 lru_dict.save(tmp_name)
151 return lru.LRUDict.load(tmp_name)
152 finally:
153 try:
154 os.unlink(tmp_name)
155 except OSError:
156 pass
157
158 data = [1, 2, 3]
159
160 # Edge case.
161 empty = save_and_load(lru.LRUDict())
162 self.assertFalse(empty)
163
164 # Normal flow.
165 lru_dict = save_and_load(self.prepare_lru_dict(data))
166 self.assert_order(lru_dict, data)
167
168 # After touches.
169 lru_dict = self.prepare_lru_dict(data)
170 lru_dict.touch(2)
171 lru_dict = save_and_load(lru_dict)
172 self.assert_order(lru_dict, [1, 3, 2])
173
174 # After pop.
175 lru_dict = self.prepare_lru_dict(data)
176 lru_dict.pop(2)
177 lru_dict = save_and_load(lru_dict)
178 self.assert_order(lru_dict, [1, 3])
179
180 # After add.
181 lru_dict = self.prepare_lru_dict(data)
182 lru_dict.add(4, 4)
183 lru_dict.batch_insert_oldest([(5, 5), (6, 6)])
184 lru_dict = save_and_load(lru_dict)
185 self.assert_order(lru_dict, [5, 6] + data + [4])
186
187 def test_corrupted_state_file(self):
188 def load_from_state(state_text):
189 handle, tmp_name = tempfile.mkstemp(prefix=u'lru_test')
190 os.close(handle)
191 try:
192 with open(tmp_name, 'w') as f:
193 f.write(state_text)
194 return lru.LRUDict.load(tmp_name)
195 finally:
196 os.unlink(tmp_name)
197
198 # Loads correct state just fine.
199 self.assertIsNotNone(load_from_state(json.dumps([
200 ['key1', 'value1'],
201 ['key2', 'value2'],
202 ])))
203
204 # Not a json.
205 with self.assertRaises(ValueError):
206 load_from_state('garbage, not a state')
207
208 # Not a list.
209 with self.assertRaises(ValueError):
210 load_from_state('{}')
211
212 # Not a list of pairs.
213 with self.assertRaises(ValueError):
214 load_from_state(json.dumps([
215 ['key', 'value', 'and whats this?'],
216 ]))
217
218 # Duplicate keys.
219 with self.assertRaises(ValueError):
220 load_from_state(json.dumps([
221 ['key', 'value'],
222 ['key', 'another_value'],
223 ]))
224
225
226 if __name__ == '__main__':
227 VERBOSE = '-v' in sys.argv
228 logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR)
229 unittest.main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698