1 #!/usr/bin/env python 2 # Copyright 2013 The Chromium Authors. All rights reserved. 3 # Use of this source code is governed by a BSD-style license that can be 4 # found in the LICENSE file. 5 6 from cache_chain_object_store import CacheChainObjectStore 7 from test_object_store import TestObjectStore 8 import unittest 9 10 class CacheChainObjectStoreTest(unittest.TestCase): 11 def setUp(self): 12 self._first = TestObjectStore('first', init={ 13 'storage.html': 'storage', 14 }) 15 self._second = TestObjectStore('second', init={ 16 'runtime.html': 'runtime', 17 'storage.html': 'storage', 18 }) 19 self._third = TestObjectStore('third', init={ 20 'commands.html': 'commands', 21 'runtime.html': 'runtime', 22 'storage.html': 'storage', 23 }) 24 self._store = CacheChainObjectStore( 25 (self._first, self._second, self._third)) 26 27 def testGetFromFirstLayer(self): 28 self.assertEqual('storage', self._store.Get('storage.html').Get()) 29 self.assertTrue(*self._first.CheckAndReset(get_count=1)) 30 # Found in first layer, stop. 31 self.assertTrue(*self._second.CheckAndReset()) 32 self.assertTrue(*self._third.CheckAndReset()) 33 # Cached in memory, won't re-query. 34 self.assertEqual('storage', self._store.Get('storage.html').Get()) 35 self.assertTrue(*self._first.CheckAndReset()) 36 self.assertTrue(*self._second.CheckAndReset()) 37 self.assertTrue(*self._third.CheckAndReset()) 38 39 def testGetFromSecondLayer(self): 40 self.assertEqual('runtime', self._store.Get('runtime.html').Get()) 41 # Not found in first layer but found in second. 42 self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1)) 43 self.assertTrue(*self._second.CheckAndReset(get_count=1)) 44 self.assertTrue(*self._third.CheckAndReset()) 45 # First will now have it cached. 46 self.assertEqual('runtime', self._first.Get('runtime.html').Get()) 47 self._first.Reset() 48 # Cached in memory, won't re-query. 49 self.assertEqual('runtime', self._store.Get('runtime.html').Get()) 50 self.assertTrue(*self._first.CheckAndReset()) 51 self.assertTrue(*self._second.CheckAndReset()) 52 self.assertTrue(*self._third.CheckAndReset()) 53 54 def testGetFromThirdLayer(self): 55 self.assertEqual('commands', self._store.Get('commands.html').Get()) 56 # As above but for third. 57 self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1)) 58 self.assertTrue(*self._second.CheckAndReset(get_count=1, set_count=1)) 59 self.assertTrue(*self._third.CheckAndReset(get_count=1)) 60 # First and second will now have it cached. 61 self.assertEqual('commands', self._first.Get('commands.html').Get()) 62 self.assertEqual('commands', self._second.Get('commands.html').Get()) 63 self._first.Reset() 64 self._second.Reset() 65 # Cached in memory, won't re-query. 66 self.assertEqual('commands', self._store.Get('commands.html').Get()) 67 self.assertTrue(*self._first.CheckAndReset()) 68 self.assertTrue(*self._second.CheckAndReset()) 69 self.assertTrue(*self._third.CheckAndReset()) 70 71 def testGetFromAllLayers(self): 72 self.assertEqual({ 73 'commands.html': 'commands', 74 'runtime.html': 'runtime', 75 'storage.html': 'storage', 76 }, self._store.GetMulti(('commands.html', 77 'runtime.html', 78 'storage.html')).Get()) 79 self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1)) 80 self.assertTrue(*self._second.CheckAndReset(get_count=1, set_count=1)) 81 self.assertTrue(*self._third.CheckAndReset(get_count=1)) 82 # First and second will have it all cached. 83 self.assertEqual('runtime', self._first.Get('runtime.html').Get()) 84 self.assertEqual('commands', self._first.Get('commands.html').Get()) 85 self.assertEqual('commands', self._second.Get('commands.html').Get()) 86 self._first.Reset() 87 self._second.Reset() 88 # Cached in memory. 89 self.assertEqual({ 90 'commands.html': 'commands', 91 'runtime.html': 'runtime', 92 'storage.html': 'storage', 93 }, self._store.GetMulti(('commands.html', 94 'runtime.html', 95 'storage.html')).Get()) 96 self.assertTrue(*self._first.CheckAndReset()) 97 self.assertTrue(*self._second.CheckAndReset()) 98 self.assertTrue(*self._third.CheckAndReset()) 99 100 def testPartiallyCachedInMemory(self): 101 self.assertEqual({ 102 'commands.html': 'commands', 103 'storage.html': 'storage', 104 }, self._store.GetMulti(('commands.html', 'storage.html')).Get()) 105 self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1)) 106 self.assertTrue(*self._second.CheckAndReset(get_count=1, set_count=1)) 107 self.assertTrue(*self._third.CheckAndReset(get_count=1)) 108 # runtime wasn't cached in memory, so stores should still be queried. 109 self.assertEqual({ 110 'commands.html': 'commands', 111 'runtime.html': 'runtime', 112 }, self._store.GetMulti(('commands.html', 'runtime.html')).Get()) 113 self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1)) 114 self.assertTrue(*self._second.CheckAndReset(get_count=1)) 115 self.assertTrue(*self._third.CheckAndReset()) 116 117 def testNotFound(self): 118 self.assertEqual(None, self._store.Get('notfound.html').Get()) 119 self.assertTrue(*self._first.CheckAndReset(get_count=1)) 120 self.assertTrue(*self._second.CheckAndReset(get_count=1)) 121 self.assertTrue(*self._third.CheckAndReset(get_count=1)) 122 # Not-foundedness shouldn't be cached. 123 self.assertEqual(None, self._store.Get('notfound.html').Get()) 124 self.assertTrue(*self._first.CheckAndReset(get_count=1)) 125 self.assertTrue(*self._second.CheckAndReset(get_count=1)) 126 self.assertTrue(*self._third.CheckAndReset(get_count=1)) 127 # Test some things not found, some things found. 128 self.assertEqual({ 129 'runtime.html': 'runtime', 130 }, self._store.GetMulti(('runtime.html', 'notfound.html')).Get()) 131 self.assertTrue(*self._first.CheckAndReset(get_count=1, set_count=1)) 132 self.assertTrue(*self._second.CheckAndReset(get_count=1)) 133 self.assertTrue(*self._third.CheckAndReset(get_count=1)) 134 135 def testSet(self): 136 self._store.Set('hello.html', 'hello') 137 self.assertTrue(*self._first.CheckAndReset(set_count=1)) 138 self.assertTrue(*self._second.CheckAndReset(set_count=1)) 139 self.assertTrue(*self._third.CheckAndReset(set_count=1)) 140 # Should have cached it. 141 self.assertEqual('hello', self._store.Get('hello.html').Get()) 142 self.assertTrue(*self._first.CheckAndReset()) 143 self.assertTrue(*self._second.CheckAndReset()) 144 self.assertTrue(*self._third.CheckAndReset()) 145 # Should have the new content. 146 self.assertEqual('hello', self._first.Get('hello.html').Get()) 147 self.assertEqual('hello', self._second.Get('hello.html').Get()) 148 self.assertEqual('hello', self._third.Get('hello.html').Get()) 149 150 def testDel(self): 151 # Cache it. 152 self.assertEqual('storage', self._store.Get('storage.html').Get()) 153 self.assertTrue(*self._first.CheckAndReset(get_count=1)) 154 # Delete it. 155 self._store.Del('storage.html') 156 self.assertTrue(*self._first.CheckAndReset(del_count=1)) 157 self.assertTrue(*self._second.CheckAndReset(del_count=1)) 158 self.assertTrue(*self._third.CheckAndReset(del_count=1)) 159 # Not cached anymore. 160 self.assertEqual(None, self._store.Get('storage.html').Get()) 161 self.assertTrue(*self._first.CheckAndReset(get_count=1)) 162 self.assertTrue(*self._second.CheckAndReset(get_count=1)) 163 self.assertTrue(*self._third.CheckAndReset(get_count=1)) 164 165 def testStartEmpty(self): 166 store = CacheChainObjectStore((self._first, self._second, self._third), 167 start_empty=True) 168 # Won't query delegate file systems because it starts empty. 169 self.assertEqual(None, store.Get('storage.html').Get()) 170 self.assertTrue(*self._first.CheckAndReset()) 171 self.assertTrue(*self._second.CheckAndReset()) 172 self.assertTrue(*self._third.CheckAndReset()) 173 # Setting values will set on all delegates, though. 174 store.Set('storage.html', 'new content') 175 self.assertEqual('new content', store.Get('storage.html').Get()) 176 self.assertTrue(*self._first.CheckAndReset(set_count=1)) 177 self.assertTrue(*self._second.CheckAndReset(set_count=1)) 178 self.assertTrue(*self._third.CheckAndReset(set_count=1)) 179 self.assertEqual('new content', self._first.Get('storage.html').Get()) 180 self.assertEqual('new content', self._second.Get('storage.html').Get()) 181 self.assertEqual('new content', self._third.Get('storage.html').Get()) 182 183 if __name__ == '__main__': 184 unittest.main() 185