278
278
self.assertEqual([3, 4, 5, 6, 7, 8, 9, 10], sorted(cache.keys()))
279
cache[11] = 12 # triggers cleanup back to new after_cleanup_count
279
cache[11] = 12 # triggers cleanup back to new after_cleanup_count
280
280
self.assertEqual([6, 7, 8, 9, 10, 11], sorted(cache.keys()))
285
285
def test_basic_init(self):
286
286
cache = lru_cache.LRUSizeCache()
287
287
self.assertEqual(2048, cache._max_cache)
288
self.assertEqual(int(cache._max_size * 0.8), cache._after_cleanup_size)
288
self.assertEqual(int(cache._max_size*0.8), cache._after_cleanup_size)
289
289
self.assertEqual(0, cache._value_size)
291
291
def test_add__null_key(self):
292
292
cache = lru_cache.LRUSizeCache()
293
293
self.assertRaises(ValueError,
294
cache.__setitem__, lru_cache._null_key, 1)
294
cache.__setitem__, lru_cache._null_key, 1)
296
296
def test_add_tracks_size(self):
297
297
cache = lru_cache.LRUSizeCache()
318
318
self.assertEqual({'test': 'key'}, cache.as_dict())
319
319
cache['test2'] = 'key that is too big'
320
320
self.assertEqual(3, cache._value_size)
321
self.assertEqual({'test': 'key'}, cache.as_dict())
321
self.assertEqual({'test':'key'}, cache.as_dict())
322
322
# If we would add a key, only to cleanup and remove all cached entries,
323
323
# then obviously that value should not be stored
324
324
cache['test3'] = 'bigkey'
325
325
self.assertEqual(3, cache._value_size)
326
self.assertEqual({'test': 'key'}, cache.as_dict())
326
self.assertEqual({'test':'key'}, cache.as_dict())
328
328
cache['test4'] = 'bikey'
329
329
self.assertEqual(3, cache._value_size)
330
self.assertEqual({'test': 'key'}, cache.as_dict())
330
self.assertEqual({'test':'key'}, cache.as_dict())
332
332
def test_adding_clears_cache_based_on_size(self):
333
333
"""The cache is cleared in LRU order until small enough"""
334
334
cache = lru_cache.LRUSizeCache(max_size=20)
335
cache['key1'] = 'value' # 5 chars
336
cache['key2'] = 'value2' # 6 chars
337
cache['key3'] = 'value23' # 7 chars
338
self.assertEqual(5 + 6 + 7, cache._value_size)
339
cache['key2'] # reference key2 so it gets a newer reference time
340
cache['key4'] = 'value234' # 8 chars, over limit
335
cache['key1'] = 'value' # 5 chars
336
cache['key2'] = 'value2' # 6 chars
337
cache['key3'] = 'value23' # 7 chars
338
self.assertEqual(5+6+7, cache._value_size)
339
cache['key2'] # reference key2 so it gets a newer reference time
340
cache['key4'] = 'value234' # 8 chars, over limit
341
341
# We have to remove 2 keys to get back under limit
342
self.assertEqual(6 + 8, cache._value_size)
343
self.assertEqual({'key2': 'value2', 'key4': 'value234'},
342
self.assertEqual(6+8, cache._value_size)
343
self.assertEqual({'key2':'value2', 'key4':'value234'},
346
346
def test_adding_clears_to_after_cleanup_size(self):
347
347
cache = lru_cache.LRUSizeCache(max_size=20, after_cleanup_size=10)
348
cache['key1'] = 'value' # 5 chars
349
cache['key2'] = 'value2' # 6 chars
350
cache['key3'] = 'value23' # 7 chars
351
self.assertEqual(5 + 6 + 7, cache._value_size)
352
cache['key2'] # reference key2 so it gets a newer reference time
353
cache['key4'] = 'value234' # 8 chars, over limit
348
cache['key1'] = 'value' # 5 chars
349
cache['key2'] = 'value2' # 6 chars
350
cache['key3'] = 'value23' # 7 chars
351
self.assertEqual(5+6+7, cache._value_size)
352
cache['key2'] # reference key2 so it gets a newer reference time
353
cache['key4'] = 'value234' # 8 chars, over limit
354
354
# We have to remove 3 keys to get back under limit
355
355
self.assertEqual(8, cache._value_size)
356
self.assertEqual({'key4': 'value234'}, cache.as_dict())
356
self.assertEqual({'key4':'value234'}, cache.as_dict())
358
358
def test_custom_sizes(self):
359
359
def size_of_list(lst):
361
361
cache = lru_cache.LRUSizeCache(max_size=20, after_cleanup_size=10,
362
362
compute_size=size_of_list)
364
cache['key1'] = ['val', 'ue'] # 5 chars
365
cache['key2'] = ['val', 'ue2'] # 6 chars
366
cache['key3'] = ['val', 'ue23'] # 7 chars
367
self.assertEqual(5 + 6 + 7, cache._value_size)
368
cache['key2'] # reference key2 so it gets a newer reference time
369
cache['key4'] = ['value', '234'] # 8 chars, over limit
364
cache['key1'] = ['val', 'ue'] # 5 chars
365
cache['key2'] = ['val', 'ue2'] # 6 chars
366
cache['key3'] = ['val', 'ue23'] # 7 chars
367
self.assertEqual(5+6+7, cache._value_size)
368
cache['key2'] # reference key2 so it gets a newer reference time
369
cache['key4'] = ['value', '234'] # 8 chars, over limit
370
370
# We have to remove 3 keys to get back under limit
371
371
self.assertEqual(8, cache._value_size)
372
self.assertEqual({'key4': ['value', '234']}, cache.as_dict())
372
self.assertEqual({'key4':['value', '234']}, cache.as_dict())
374
374
def test_cleanup(self):
375
375
cache = lru_cache.LRUSizeCache(max_size=20, after_cleanup_size=10)
377
377
# Add these in order
378
cache['key1'] = 'value' # 5 chars
379
cache['key2'] = 'value2' # 6 chars
380
cache['key3'] = 'value23' # 7 chars
381
self.assertEqual(5 + 6 + 7, cache._value_size)
378
cache['key1'] = 'value' # 5 chars
379
cache['key2'] = 'value2' # 6 chars
380
cache['key3'] = 'value23' # 7 chars
381
self.assertEqual(5+6+7, cache._value_size)
384
384
# Only the most recent fits after cleaning up