| OLD | NEW |
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 The LUCI Authors. All rights reserved. | 2 # Copyright 2013 The LUCI Authors. All rights reserved. |
| 3 # Use of this source code is governed under the Apache License, Version 2.0 | 3 # Use of this source code is governed under the Apache License, Version 2.0 |
| 4 # that can be found in the LICENSE file. | 4 # that can be found in the LICENSE file. |
| 5 | 5 |
| 6 import json | 6 import json |
| 7 import logging | 7 import logging |
| 8 import os | 8 import os |
| 9 import sys | 9 import sys |
| 10 import tempfile | 10 import tempfile |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 125 # Pop in the middle. | 125 # Pop in the middle. |
| 126 lru_dict = self.prepare_lru_dict(data) | 126 lru_dict = self.prepare_lru_dict(data) |
| 127 lru_dict.pop(2) | 127 lru_dict.pop(2) |
| 128 self.assert_order(lru_dict, [1, 3]) | 128 self.assert_order(lru_dict, [1, 3]) |
| 129 | 129 |
| 130 # Pop oldest. | 130 # Pop oldest. |
| 131 lru_dict = self.prepare_lru_dict(data) | 131 lru_dict = self.prepare_lru_dict(data) |
| 132 lru_dict.pop(3) | 132 lru_dict.pop(3) |
| 133 self.assert_order(lru_dict, [1, 2]) | 133 self.assert_order(lru_dict, [1, 2]) |
| 134 | 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. | 135 # Add newest. |
| 141 lru_dict = self.prepare_lru_dict(data) | 136 lru_dict = self.prepare_lru_dict(data) |
| 142 lru_dict.add(4, 4) | 137 lru_dict.add(4, 4) |
| 143 self.assert_order(lru_dict, data + [4]) | 138 self.assert_order(lru_dict, data + [4]) |
| 144 | 139 |
| 145 def test_load_save(self): | 140 def test_load_save(self): |
| 141 def pairs(d): |
| 142 return [(k, d[k]) for k in d] |
| 143 |
| 146 def save_and_load(lru_dict): | 144 def save_and_load(lru_dict): |
| 147 handle, tmp_name = tempfile.mkstemp(prefix=u'lru_test') | 145 handle, tmp_name = tempfile.mkstemp(prefix=u'lru_test') |
| 148 os.close(handle) | 146 os.close(handle) |
| 147 |
| 149 try: | 148 try: |
| 149 # Old format. |
| 150 with open(tmp_name, 'w') as f: |
| 151 json.dump(pairs(lru_dict), f) |
| 152 loaded_old_format = lru_dict.load(tmp_name) |
| 153 |
| 154 # Current format. |
| 150 lru_dict.save(tmp_name) | 155 lru_dict.save(tmp_name) |
| 151 return lru.LRUDict.load(tmp_name) | 156 loaded = lru_dict.load(tmp_name) |
| 157 |
| 158 self.assertEqual(pairs(loaded), pairs(loaded_old_format)) |
| 159 return loaded |
| 152 finally: | 160 finally: |
| 153 try: | 161 try: |
| 154 os.unlink(tmp_name) | 162 os.unlink(tmp_name) |
| 155 except OSError: | 163 except OSError: |
| 156 pass | 164 pass |
| 157 | 165 |
| 158 data = [1, 2, 3] | 166 data = [1, 2, 3] |
| 159 | 167 |
| 160 # Edge case. | 168 # Edge case. |
| 161 empty = save_and_load(lru.LRUDict()) | 169 empty = save_and_load(lru.LRUDict()) |
| (...skipping 11 matching lines...) Expand all Loading... |
| 173 | 181 |
| 174 # After pop. | 182 # After pop. |
| 175 lru_dict = self.prepare_lru_dict(data) | 183 lru_dict = self.prepare_lru_dict(data) |
| 176 lru_dict.pop(2) | 184 lru_dict.pop(2) |
| 177 lru_dict = save_and_load(lru_dict) | 185 lru_dict = save_and_load(lru_dict) |
| 178 self.assert_order(lru_dict, [1, 3]) | 186 self.assert_order(lru_dict, [1, 3]) |
| 179 | 187 |
| 180 # After add. | 188 # After add. |
| 181 lru_dict = self.prepare_lru_dict(data) | 189 lru_dict = self.prepare_lru_dict(data) |
| 182 lru_dict.add(4, 4) | 190 lru_dict.add(4, 4) |
| 183 lru_dict.batch_insert_oldest([(5, 5), (6, 6)]) | |
| 184 lru_dict = save_and_load(lru_dict) | 191 lru_dict = save_and_load(lru_dict) |
| 185 self.assert_order(lru_dict, [5, 6] + data + [4]) | 192 self.assert_order(lru_dict, data + [4]) |
| 186 | 193 |
| 187 def test_corrupted_state_file(self): | 194 def test_corrupted_state_file(self): |
| 188 def load_from_state(state_text): | 195 def load_from_state(state_text): |
| 189 handle, tmp_name = tempfile.mkstemp(prefix=u'lru_test') | 196 handle, tmp_name = tempfile.mkstemp(prefix=u'lru_test') |
| 190 os.close(handle) | 197 os.close(handle) |
| 191 try: | 198 try: |
| 192 with open(tmp_name, 'w') as f: | 199 with open(tmp_name, 'w') as f: |
| 193 f.write(state_text) | 200 f.write(state_text) |
| 194 return lru.LRUDict.load(tmp_name) | 201 return lru.LRUDict.load(tmp_name) |
| 195 finally: | 202 finally: |
| (...skipping 19 matching lines...) Expand all Loading... |
| 215 ['key', 'value', 'and whats this?'], | 222 ['key', 'value', 'and whats this?'], |
| 216 ])) | 223 ])) |
| 217 | 224 |
| 218 # Duplicate keys. | 225 # Duplicate keys. |
| 219 with self.assertRaises(ValueError): | 226 with self.assertRaises(ValueError): |
| 220 load_from_state(json.dumps([ | 227 load_from_state(json.dumps([ |
| 221 ['key', 'value'], | 228 ['key', 'value'], |
| 222 ['key', 'another_value'], | 229 ['key', 'another_value'], |
| 223 ])) | 230 ])) |
| 224 | 231 |
| 232 def test_timestamp(self): |
| 233 lru_dict = lru.LRUDict() |
| 234 |
| 235 now = 0 |
| 236 lru_dict.time_fn = lambda: now |
| 237 |
| 238 lru_dict.add('ka', 'va') |
| 239 now += 1 |
| 240 |
| 241 lru_dict.add('kb', 'vb') |
| 242 now += 1 |
| 243 |
| 244 self.assertEqual(lru_dict.get_oldest(), ('ka', ('va', 0))) |
| 245 self.assertEqual(lru_dict.pop_oldest(), ('ka', ('va', 0))) |
| 246 self.assertEqual(lru_dict.get_oldest(), ('kb', ('vb', 1))) |
| 247 self.assertEqual(lru_dict.pop_oldest(), ('kb', ('vb', 1))) |
| 225 | 248 |
| 226 if __name__ == '__main__': | 249 if __name__ == '__main__': |
| 227 VERBOSE = '-v' in sys.argv | 250 VERBOSE = '-v' in sys.argv |
| 228 logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR) | 251 logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR) |
| 229 unittest.main() | 252 unittest.main() |
| OLD | NEW |