def test_cache_values_with_max_size(self): # setup store store = CountingDict() store['foo'] = b'xxx' store['bar'] = b'yyy' assert 0 == store.counter['__getitem__', 'foo'] assert 0 == store.counter['__getitem__', 'bar'] # setup cache - can only hold one item cache = LRUStoreCache(store, max_size=5) assert 0 == cache.hits assert 0 == cache.misses # test first 'foo' __getitem__, cache miss assert b'xxx' == cache['foo'] assert 1 == store.counter['__getitem__', 'foo'] assert 0 == cache.hits assert 1 == cache.misses # test second 'foo' __getitem__, cache hit assert b'xxx' == cache['foo'] assert 1 == store.counter['__getitem__', 'foo'] assert 1 == cache.hits assert 1 == cache.misses # test first 'bar' __getitem__, cache miss assert b'yyy' == cache['bar'] assert 1 == store.counter['__getitem__', 'bar'] assert 1 == cache.hits assert 2 == cache.misses # test second 'bar' __getitem__, cache hit assert b'yyy' == cache['bar'] assert 1 == store.counter['__getitem__', 'bar'] assert 2 == cache.hits assert 2 == cache.misses # test 'foo' __getitem__, should have been evicted, cache miss assert b'xxx' == cache['foo'] assert 2 == store.counter['__getitem__', 'foo'] assert 2 == cache.hits assert 3 == cache.misses # test 'bar' __getitem__, should have been evicted, cache miss assert b'yyy' == cache['bar'] assert 2 == store.counter['__getitem__', 'bar'] assert 2 == cache.hits assert 4 == cache.misses # setup store store = CountingDict() store['foo'] = b'xxx' store['bar'] = b'yyy' assert 0 == store.counter['__getitem__', 'foo'] assert 0 == store.counter['__getitem__', 'bar'] # setup cache - can hold two items cache = LRUStoreCache(store, max_size=6) assert 0 == cache.hits assert 0 == cache.misses # test first 'foo' __getitem__, cache miss assert b'xxx' == cache['foo'] assert 1 == store.counter['__getitem__', 'foo'] assert 0 == cache.hits assert 1 == cache.misses # test second 'foo' __getitem__, cache hit assert b'xxx' == cache['foo'] assert 1 == store.counter['__getitem__', 'foo'] assert 1 == cache.hits assert 1 == cache.misses # test first 'bar' __getitem__, cache miss assert b'yyy' == cache['bar'] assert 1 == store.counter['__getitem__', 'bar'] assert 1 == cache.hits assert 2 == cache.misses # test second 'bar' __getitem__, cache hit assert b'yyy' == cache['bar'] assert 1 == store.counter['__getitem__', 'bar'] assert 2 == cache.hits assert 2 == cache.misses # test 'foo' __getitem__, should still be cached assert b'xxx' == cache['foo'] assert 1 == store.counter['__getitem__', 'foo'] assert 3 == cache.hits assert 2 == cache.misses # test 'bar' __getitem__, should still be cached assert b'yyy' == cache['bar'] assert 1 == store.counter['__getitem__', 'bar'] assert 4 == cache.hits assert 2 == cache.misses
def test_cache_values_no_max_size(self): # setup store store = CountingDict() store['foo'] = b'xxx' store['bar'] = b'yyy' assert 0 == store.counter['__getitem__', 'foo'] assert 1 == store.counter['__setitem__', 'foo'] assert 0 == store.counter['__getitem__', 'bar'] assert 1 == store.counter['__setitem__', 'bar'] # setup cache cache = LRUStoreCache(store, max_size=None) assert 0 == cache.hits assert 0 == cache.misses # test first __getitem__, cache miss assert b'xxx' == cache['foo'] assert 1 == store.counter['__getitem__', 'foo'] assert 1 == store.counter['__setitem__', 'foo'] assert 0 == cache.hits assert 1 == cache.misses # test second __getitem__, cache hit assert b'xxx' == cache['foo'] assert 1 == store.counter['__getitem__', 'foo'] assert 1 == store.counter['__setitem__', 'foo'] assert 1 == cache.hits assert 1 == cache.misses # test __setitem__, __getitem__ cache['foo'] = b'zzz' assert 1 == store.counter['__getitem__', 'foo'] assert 2 == store.counter['__setitem__', 'foo'] # should be a cache hit assert b'zzz' == cache['foo'] assert 1 == store.counter['__getitem__', 'foo'] assert 2 == store.counter['__setitem__', 'foo'] assert 2 == cache.hits assert 1 == cache.misses # manually invalidate all cached values cache.invalidate_values() assert b'zzz' == cache['foo'] assert 2 == store.counter['__getitem__', 'foo'] assert 2 == store.counter['__setitem__', 'foo'] cache.invalidate() assert b'zzz' == cache['foo'] assert 3 == store.counter['__getitem__', 'foo'] assert 2 == store.counter['__setitem__', 'foo'] # test __delitem__ del cache['foo'] with pytest.raises(KeyError): # noinspection PyStatementEffect cache['foo'] with pytest.raises(KeyError): # noinspection PyStatementEffect store['foo'] # verify other keys untouched assert 0 == store.counter['__getitem__', 'bar'] assert 1 == store.counter['__setitem__', 'bar']
def test_cache_keys(self): # setup store = CountingDict() store['foo'] = b'xxx' store['bar'] = b'yyy' assert 0 == store.counter['__contains__', 'foo'] assert 0 == store.counter['__iter__'] assert 0 == store.counter['keys'] cache = LRUStoreCache(store, max_size=None) # keys should be cached on first call keys = sorted(cache.keys()) assert keys == ['bar', 'foo'] assert 1 == store.counter['keys'] # keys should now be cached assert keys == sorted(cache.keys()) assert 1 == store.counter['keys'] assert 'foo' in cache assert 0 == store.counter['__contains__', 'foo'] assert keys == sorted(cache) assert 0 == store.counter['__iter__'] assert 1 == store.counter['keys'] # cache should be cleared if store is modified - crude but simple for now cache['baz'] = b'zzz' keys = sorted(cache.keys()) assert keys == ['bar', 'baz', 'foo'] assert 2 == store.counter['keys'] # keys should now be cached assert keys == sorted(cache.keys()) assert 2 == store.counter['keys'] # manually invalidate keys cache.invalidate_keys() keys = sorted(cache.keys()) assert keys == ['bar', 'baz', 'foo'] assert 3 == store.counter['keys'] assert 0 == store.counter['__contains__', 'foo'] assert 0 == store.counter['__iter__'] cache.invalidate_keys() keys = sorted(cache) assert keys == ['bar', 'baz', 'foo'] assert 4 == store.counter['keys'] assert 0 == store.counter['__contains__', 'foo'] assert 0 == store.counter['__iter__'] cache.invalidate_keys() assert 'foo' in cache assert 5 == store.counter['keys'] assert 0 == store.counter['__contains__', 'foo'] assert 0 == store.counter['__iter__'] # check these would get counted if called directly assert 'foo' in store assert 1 == store.counter['__contains__', 'foo'] assert keys == sorted(store) assert 1 == store.counter['__iter__']
def create_store(self): return LRUStoreCache(dict(), max_size=2**27)
def create_store(): store = LRUStoreCache(dict(), max_size=None) return store, None