blob: 051d5601cc280a3e41be11fa14ee98cbb45503c7 [file] [log] [blame]
#!/usr/bin/env python
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
from cache_chain_object_store import CacheChainObjectStore
from test_object_store import TestObjectStore
import unittest
class CacheChainObjectStoreTest(unittest.TestCase):
def setUp(self):
self._first = TestObjectStore('first', init={
'storage.html': 'storage',
})
self._second = TestObjectStore('second', init={
'runtime.html': 'runtime',
'storage.html': 'storage',
})
self._third = TestObjectStore('third', init={
'commands.html': 'commands',
'runtime.html': 'runtime',
'storage.html': 'storage',
})
self._store = CacheChainObjectStore(
(self._first, self._second, self._third))
def testGetFromFirstLayer(self):
self.assertEqual('storage', self._store.Get('storage.html').Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1))
# Found in first layer, stop.
self.assertTrue(*self._second.CheckAndReset())
self.assertTrue(*self._third.CheckAndReset())
# Cached in memory, won't re-query.
self.assertEqual('storage', self._store.Get('storage.html').Get())
self.assertTrue(*self._first.CheckAndReset())
self.assertTrue(*self._second.CheckAndReset())
self.assertTrue(*self._third.CheckAndReset())
def testGetFromSecondLayer(self):
self.assertEqual('runtime', self._store.Get('runtime.html').Get())
# Not found in first layer but found in second.
self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1))
self.assertTrue(*self._third.CheckAndReset())
# First will now have it cached.
self.assertEqual('runtime', self._first.Get('runtime.html').Get())
self._first.Reset()
# Cached in memory, won't re-query.
self.assertEqual('runtime', self._store.Get('runtime.html').Get())
self.assertTrue(*self._first.CheckAndReset())
self.assertTrue(*self._second.CheckAndReset())
self.assertTrue(*self._third.CheckAndReset())
def testGetFromThirdLayer(self):
self.assertEqual('commands', self._store.Get('commands.html').Get())
# As above but for third.
self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._third.CheckAndReset(get_count=1))
# First and second will now have it cached.
self.assertEqual('commands', self._first.Get('commands.html').Get())
self.assertEqual('commands', self._second.Get('commands.html').Get())
self._first.Reset()
self._second.Reset()
# Cached in memory, won't re-query.
self.assertEqual('commands', self._store.Get('commands.html').Get())
self.assertTrue(*self._first.CheckAndReset())
self.assertTrue(*self._second.CheckAndReset())
self.assertTrue(*self._third.CheckAndReset())
def testGetFromAllLayers(self):
self.assertEqual({
'commands.html': 'commands',
'runtime.html': 'runtime',
'storage.html': 'storage',
}, self._store.GetMulti(('commands.html',
'runtime.html',
'storage.html')).Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._third.CheckAndReset(get_count=1))
# First and second will have it all cached.
self.assertEqual('runtime', self._first.Get('runtime.html').Get())
self.assertEqual('commands', self._first.Get('commands.html').Get())
self.assertEqual('commands', self._second.Get('commands.html').Get())
self._first.Reset()
self._second.Reset()
# Cached in memory.
self.assertEqual({
'commands.html': 'commands',
'runtime.html': 'runtime',
'storage.html': 'storage',
}, self._store.GetMulti(('commands.html',
'runtime.html',
'storage.html')).Get())
self.assertTrue(*self._first.CheckAndReset())
self.assertTrue(*self._second.CheckAndReset())
self.assertTrue(*self._third.CheckAndReset())
def testPartiallyCachedInMemory(self):
self.assertEqual({
'commands.html': 'commands',
'storage.html': 'storage',
}, self._store.GetMulti(('commands.html', 'storage.html')).Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._third.CheckAndReset(get_count=1))
# runtime wasn't cached in memory, so stores should still be queried.
self.assertEqual({
'commands.html': 'commands',
'runtime.html': 'runtime',
}, self._store.GetMulti(('commands.html', 'runtime.html')).Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1))
self.assertTrue(*self._third.CheckAndReset())
def testNotFound(self):
self.assertEqual(None, self._store.Get('notfound.html').Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1))
self.assertTrue(*self._third.CheckAndReset(get_count=1))
# Not-foundedness shouldn't be cached.
self.assertEqual(None, self._store.Get('notfound.html').Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1))
self.assertTrue(*self._third.CheckAndReset(get_count=1))
# Test some things not found, some things found.
self.assertEqual({
'runtime.html': 'runtime',
}, self._store.GetMulti(('runtime.html', 'notfound.html')).Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1))
self.assertTrue(*self._third.CheckAndReset(get_count=1))
def testSet(self):
self._store.Set('hello.html', 'hello')
self.assertTrue(*self._first.CheckAndReset(set_count=1))
self.assertTrue(*self._second.CheckAndReset(set_count=1))
self.assertTrue(*self._third.CheckAndReset(set_count=1))
# Should have cached it.
self.assertEqual('hello', self._store.Get('hello.html').Get())
self.assertTrue(*self._first.CheckAndReset())
self.assertTrue(*self._second.CheckAndReset())
self.assertTrue(*self._third.CheckAndReset())
# Should have the new content.
self.assertEqual('hello', self._first.Get('hello.html').Get())
self.assertEqual('hello', self._second.Get('hello.html').Get())
self.assertEqual('hello', self._third.Get('hello.html').Get())
def testDel(self):
# Cache it.
self.assertEqual('storage', self._store.Get('storage.html').Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1))
# Delete it.
self._store.Del('storage.html')
self.assertTrue(*self._first.CheckAndReset(del_count=1))
self.assertTrue(*self._second.CheckAndReset(del_count=1))
self.assertTrue(*self._third.CheckAndReset(del_count=1))
# Not cached anymore.
self.assertEqual(None, self._store.Get('storage.html').Get())
self.assertTrue(*self._first.CheckAndReset(get_count=1))
self.assertTrue(*self._second.CheckAndReset(get_count=1))
self.assertTrue(*self._third.CheckAndReset(get_count=1))
def testStartEmpty(self):
store = CacheChainObjectStore((self._first, self._second, self._third),
start_empty=True)
# Won't query delegate file systems because it starts empty.
self.assertEqual(None, store.Get('storage.html').Get())
self.assertTrue(*self._first.CheckAndReset())
self.assertTrue(*self._second.CheckAndReset())
self.assertTrue(*self._third.CheckAndReset())
# Setting values will set on all delegates, though.
store.Set('storage.html', 'new content')
self.assertEqual('new content', store.Get('storage.html').Get())
self.assertTrue(*self._first.CheckAndReset(set_count=1))
self.assertTrue(*self._second.CheckAndReset(set_count=1))
self.assertTrue(*self._third.CheckAndReset(set_count=1))
self.assertEqual('new content', self._first.Get('storage.html').Get())
self.assertEqual('new content', self._second.Get('storage.html').Get())
self.assertEqual('new content', self._third.Get('storage.html').Get())
if __name__ == '__main__':
unittest.main()