Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(694)

Side by Side Diff: chrome/common/extensions/docs/server2/caching_file_system_test.py

Issue 15009006: Docserver: refactor Servlet, ObjectStore, and ServerInstance architecture to (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cduvall, redirect fix Created 7 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 import os 6 import os
7 import sys 7 import sys
8 import unittest 8 import unittest
9 9
10 from caching_file_system import CachingFileSystem 10 from caching_file_system import CachingFileSystem
11 from file_system import FileSystem, StatInfo 11 from file_system import FileSystem, StatInfo
12 from future import Future 12 from future import Future
13 from local_file_system import LocalFileSystem 13 from local_file_system import LocalFileSystem
14 from mock_file_system import MockFileSystem
14 from object_store_creator import ObjectStoreCreator 15 from object_store_creator import ObjectStoreCreator
15 from test_file_system import TestFileSystem 16 from test_file_system import TestFileSystem
16 from test_object_store import TestObjectStore 17 from test_object_store import TestObjectStore
17 18
18 def _CreateLocalFs(): 19 def _CreateLocalFs():
19 return LocalFileSystem( 20 return LocalFileSystem(
20 os.path.join(sys.path[0], 'test_data', 'file_system')) 21 os.path.join(sys.path[0], 'test_data', 'file_system'))
21 22
22 class CachingFileSystemTest(unittest.TestCase): 23 class CachingFileSystemTest(unittest.TestCase):
23 def setUp(self): 24 def setUp(self):
24 # Use this to make sure that every time _CreateCachingFileSystem is called 25 # Use this to make sure that every time _CreateCachingFileSystem is called
25 # the underlying object store data is the same, within each test. 26 # the underlying object store data is the same, within each test.
26 self._object_store_dbs = {} 27 self._object_store_dbs = {}
27 28
28 def _CreateCachingFileSystem(self, fs, use_existing_values=False): 29 def _CreateCachingFileSystem(self, fs, start_empty=False):
29 def object_store_constructor(namespace, start_empty=False): 30 def store_type_constructor(namespace, start_empty=False):
31 '''Returns an ObjectStore backed onto test-lifetime-persistent objects
32 in |_object_store_dbs|.
33 '''
30 if namespace not in self._object_store_dbs: 34 if namespace not in self._object_store_dbs:
31 self._object_store_dbs[namespace] = {} 35 self._object_store_dbs[namespace] = {}
32 db = self._object_store_dbs[namespace] 36 db = self._object_store_dbs[namespace]
33 if start_empty: 37 if start_empty:
34 db.clear() 38 db.clear()
35 return TestObjectStore(namespace, init=db) 39 return TestObjectStore(namespace, init=db)
36 return CachingFileSystem( 40 object_store_creator = ObjectStoreCreator('test',
37 fs, 41 start_empty=start_empty,
38 ObjectStoreCreator.TestFactory(store_type=object_store_constructor), 42 store_type=store_type_constructor)
39 use_existing_values=use_existing_values) 43 return CachingFileSystem(fs, object_store_creator)
40 44
41 def testReadFiles(self): 45 def testReadFiles(self):
42 file_system = CachingFileSystem(_CreateLocalFs(), 46 file_system = self._CreateCachingFileSystem(
43 ObjectStoreCreator.TestFactory()) 47 _CreateLocalFs(), start_empty=False)
44 expected = { 48 expected = {
45 './test1.txt': 'test1\n', 49 './test1.txt': 'test1\n',
46 './test2.txt': 'test2\n', 50 './test2.txt': 'test2\n',
47 './test3.txt': 'test3\n', 51 './test3.txt': 'test3\n',
48 } 52 }
49 self.assertEqual( 53 self.assertEqual(
50 expected, 54 expected,
51 file_system.Read(['./test1.txt', './test2.txt', './test3.txt']).Get()) 55 file_system.Read(['./test1.txt', './test2.txt', './test3.txt']).Get())
52 56
53 def testListDir(self): 57 def testListDir(self):
54 file_system = CachingFileSystem(_CreateLocalFs(), 58 file_system = self._CreateCachingFileSystem(
55 ObjectStoreCreator.TestFactory()) 59 _CreateLocalFs(), start_empty=False)
56 expected = ['dir/'] + ['file%d.html' % i for i in range(7)] 60 expected = ['dir/'] + ['file%d.html' % i for i in range(7)]
57 file_system._read_object_store.Set( 61 file_system._read_object_store.Set(
58 'list/', 62 'list/',
59 (expected, file_system.Stat('list/').version)) 63 (expected, file_system.Stat('list/').version))
60 self.assertEqual(expected, sorted(file_system.ReadSingle('list/'))) 64 self.assertEqual(expected, sorted(file_system.ReadSingle('list/')))
61 65
62 expected.remove('file0.html') 66 expected.remove('file0.html')
63 file_system._read_object_store.Set( 67 file_system._read_object_store.Set(
64 'list/', 68 'list/',
65 (expected, file_system.Stat('list/').version)) 69 (expected, file_system.Stat('list/').version))
66 self.assertEqual(expected, sorted(file_system.ReadSingle('list/'))) 70 self.assertEqual(expected, sorted(file_system.ReadSingle('list/')))
67 71
68 def testCaching(self): 72 def testCaching(self):
69 fake_fs = TestFileSystem({ 73 test_fs = TestFileSystem({
70 'bob': { 74 'bob': {
71 'bob0': 'bob/bob0 contents', 75 'bob0': 'bob/bob0 contents',
72 'bob1': 'bob/bob1 contents', 76 'bob1': 'bob/bob1 contents',
73 'bob2': 'bob/bob2 contents', 77 'bob2': 'bob/bob2 contents',
74 'bob3': 'bob/bob3 contents', 78 'bob3': 'bob/bob3 contents',
75 } 79 }
76 }) 80 })
77 file_system = self._CreateCachingFileSystem(fake_fs) 81 mock_fs = MockFileSystem(test_fs)
82 def create_empty_caching_fs():
83 return self._CreateCachingFileSystem(mock_fs, start_empty=True)
78 84
85 file_system = create_empty_caching_fs()
79 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0')) 86 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0'))
80 self.assertTrue(*fake_fs.CheckAndReset(read_count=1, stat_count=1)) 87 self.assertTrue(*mock_fs.CheckAndReset(read_count=1, stat_count=1))
81 88
82 # Resource has been cached, so test resource is not re-fetched. 89 # Resource has been cached, so test resource is not re-fetched.
83 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0')) 90 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0'))
84 self.assertTrue(*fake_fs.CheckAndReset()) 91 self.assertTrue(*mock_fs.CheckAndReset())
85 92
86 # Test if the Stat version is the same the resource is not re-fetched. 93 # Test if the Stat version is the same the resource is not re-fetched.
87 file_system = self._CreateCachingFileSystem(fake_fs) 94 file_system = create_empty_caching_fs()
88 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0')) 95 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0'))
89 self.assertTrue(*fake_fs.CheckAndReset(stat_count=1)) 96 self.assertTrue(*mock_fs.CheckAndReset(stat_count=1))
90 97
91 # Test if there is a newer version, the resource is re-fetched. 98 # Test if there is a newer version, the resource is re-fetched.
92 file_system = self._CreateCachingFileSystem(fake_fs) 99 file_system = create_empty_caching_fs()
93 fake_fs.IncrementStat(); 100 test_fs.IncrementStat();
94 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0')) 101 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0'))
95 self.assertTrue(*fake_fs.CheckAndReset(read_count=1, stat_count=1)) 102 self.assertTrue(*mock_fs.CheckAndReset(read_count=1, stat_count=1))
96 103
97 # Test directory and subdirectory stats are cached. 104 # Test directory and subdirectory stats are cached.
98 file_system = self._CreateCachingFileSystem(fake_fs) 105 file_system = create_empty_caching_fs()
99 file_system._stat_object_store.Del('bob/bob0') 106 file_system._stat_object_store.Del('bob/bob0')
100 file_system._read_object_store.Del('bob/bob0') 107 file_system._read_object_store.Del('bob/bob0')
101 file_system._stat_object_store.Del('bob/bob1') 108 file_system._stat_object_store.Del('bob/bob1')
102 fake_fs.IncrementStat(); 109 test_fs.IncrementStat();
103 self.assertEqual('bob/bob1 contents', file_system.ReadSingle('bob/bob1')) 110 self.assertEqual('bob/bob1 contents', file_system.ReadSingle('bob/bob1'))
104 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0')) 111 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0'))
105 self.assertTrue(*fake_fs.CheckAndReset(read_count=2, stat_count=1)) 112 self.assertTrue(*mock_fs.CheckAndReset(read_count=2, stat_count=1))
106 self.assertEqual('bob/bob1 contents', file_system.ReadSingle('bob/bob1')) 113 self.assertEqual('bob/bob1 contents', file_system.ReadSingle('bob/bob1'))
107 self.assertTrue(*fake_fs.CheckAndReset()) 114 self.assertTrue(*mock_fs.CheckAndReset())
108 115
109 # Test a more recent parent directory doesn't force a refetch of children. 116 # Test a more recent parent directory doesn't force a refetch of children.
110 file_system = self._CreateCachingFileSystem(fake_fs) 117 file_system = create_empty_caching_fs()
111 file_system._read_object_store.Del('bob/bob0') 118 file_system._read_object_store.Del('bob/bob0')
112 file_system._read_object_store.Del('bob/bob1') 119 file_system._read_object_store.Del('bob/bob1')
113 self.assertEqual('bob/bob1 contents', file_system.ReadSingle('bob/bob1')) 120 self.assertEqual('bob/bob1 contents', file_system.ReadSingle('bob/bob1'))
114 self.assertEqual('bob/bob2 contents', file_system.ReadSingle('bob/bob2')) 121 self.assertEqual('bob/bob2 contents', file_system.ReadSingle('bob/bob2'))
115 self.assertEqual('bob/bob3 contents', file_system.ReadSingle('bob/bob3')) 122 self.assertEqual('bob/bob3 contents', file_system.ReadSingle('bob/bob3'))
116 self.assertTrue(*fake_fs.CheckAndReset(read_count=3, stat_count=1)) 123 self.assertTrue(*mock_fs.CheckAndReset(read_count=3, stat_count=1))
117 124
118 fake_fs.IncrementStat(path='bob/') 125 test_fs.IncrementStat(path='bob/')
119 file_system = self._CreateCachingFileSystem(fake_fs) 126 file_system = create_empty_caching_fs()
120 self.assertEqual('bob/bob1 contents', file_system.ReadSingle('bob/bob1')) 127 self.assertEqual('bob/bob1 contents', file_system.ReadSingle('bob/bob1'))
121 self.assertEqual('bob/bob2 contents', file_system.ReadSingle('bob/bob2')) 128 self.assertEqual('bob/bob2 contents', file_system.ReadSingle('bob/bob2'))
122 self.assertEqual('bob/bob3 contents', file_system.ReadSingle('bob/bob3')) 129 self.assertEqual('bob/bob3 contents', file_system.ReadSingle('bob/bob3'))
123 self.assertTrue(*fake_fs.CheckAndReset(stat_count=1)) 130 self.assertTrue(*mock_fs.CheckAndReset(stat_count=1))
124 131
125 file_system = self._CreateCachingFileSystem(fake_fs) 132 file_system = create_empty_caching_fs()
126 file_system._stat_object_store.Del('bob/bob0') 133 file_system._stat_object_store.Del('bob/bob0')
127 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0')) 134 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0'))
128 self.assertTrue(*fake_fs.CheckAndReset(read_count=1, stat_count=1)) 135 self.assertTrue(*mock_fs.CheckAndReset(read_count=1, stat_count=1))
129 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0')) 136 self.assertEqual('bob/bob0 contents', file_system.ReadSingle('bob/bob0'))
130 self.assertTrue(*fake_fs.CheckAndReset()) 137 self.assertTrue(*mock_fs.CheckAndReset())
131 138
132 def testCachedStat(self): 139 def testCachedStat(self):
133 fake_fs = TestFileSystem({ 140 test_fs = TestFileSystem({
134 'bob': { 141 'bob': {
135 'bob0': 'bob/bob0 contents', 142 'bob0': 'bob/bob0 contents',
136 'bob1': 'bob/bob1 contents' 143 'bob1': 'bob/bob1 contents'
137 } 144 }
138 }) 145 })
139 file_system = self._CreateCachingFileSystem(fake_fs, 146 mock_fs = MockFileSystem(test_fs)
140 use_existing_values=True) 147
148 file_system = self._CreateCachingFileSystem(mock_fs, start_empty=False)
141 149
142 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob0')) 150 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob0'))
143 self.assertTrue(*fake_fs.CheckAndReset(stat_count=1)) 151 self.assertTrue(*mock_fs.CheckAndReset(stat_count=1))
144 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob0')) 152 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob0'))
145 self.assertTrue(*fake_fs.CheckAndReset()) 153 self.assertTrue(*mock_fs.CheckAndReset())
146 154
147 # Caching happens on a directory basis, so reading other files from that 155 # Caching happens on a directory basis, so reading other files from that
148 # directory won't result in a stat. 156 # directory won't result in a stat.
149 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob1')) 157 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob1'))
150 self.assertEqual( 158 self.assertEqual(
151 StatInfo('0', child_versions={'bob0': '0', 'bob1': '0'}), 159 StatInfo('0', child_versions={'bob0': '0', 'bob1': '0'}),
152 file_system.Stat('bob/')) 160 file_system.Stat('bob/'))
153 self.assertTrue(*fake_fs.CheckAndReset()) 161 self.assertTrue(*mock_fs.CheckAndReset())
154 162
155 # Even though the stat is bumped, the object store still has it cached so 163 # Even though the stat is bumped, the object store still has it cached so
156 # this won't update. 164 # this won't update.
157 fake_fs.IncrementStat() 165 test_fs.IncrementStat()
158 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob0')) 166 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob0'))
159 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob1')) 167 self.assertEqual(StatInfo('0'), file_system.Stat('bob/bob1'))
160 self.assertEqual( 168 self.assertEqual(
161 StatInfo('0', child_versions={'bob0': '0', 'bob1': '0'}), 169 StatInfo('0', child_versions={'bob0': '0', 'bob1': '0'}),
162 file_system.Stat('bob/')) 170 file_system.Stat('bob/'))
163 self.assertTrue(*fake_fs.CheckAndReset()) 171 self.assertTrue(*mock_fs.CheckAndReset())
164 172
165 def testFreshStat(self): 173 def testFreshStat(self):
166 fake_fs = TestFileSystem({ 174 test_fs = TestFileSystem({
167 'bob': { 175 'bob': {
168 'bob0': 'bob/bob0 contents', 176 'bob0': 'bob/bob0 contents',
169 'bob1': 'bob/bob1 contents' 177 'bob1': 'bob/bob1 contents'
170 } 178 }
171 }) 179 })
180 mock_fs = MockFileSystem(test_fs)
172 181
173 def run_expecting_stat(stat): 182 def run_expecting_stat(stat):
174 def run(): 183 def run():
175 file_system = self._CreateCachingFileSystem(fake_fs) 184 file_system = self._CreateCachingFileSystem(mock_fs, start_empty=True)
176 self.assertEqual( 185 self.assertEqual(
177 StatInfo(stat, child_versions={'bob0': stat, 'bob1': stat}), 186 StatInfo(stat, child_versions={'bob0': stat, 'bob1': stat}),
178 file_system.Stat('bob/')) 187 file_system.Stat('bob/'))
179 self.assertTrue(*fake_fs.CheckAndReset(stat_count=1)) 188 self.assertTrue(*mock_fs.CheckAndReset(stat_count=1))
180 self.assertEqual(StatInfo(stat), file_system.Stat('bob/bob0')) 189 self.assertEqual(StatInfo(stat), file_system.Stat('bob/bob0'))
181 self.assertEqual(StatInfo(stat), file_system.Stat('bob/bob0')) 190 self.assertEqual(StatInfo(stat), file_system.Stat('bob/bob0'))
182 self.assertTrue(*fake_fs.CheckAndReset()) 191 self.assertTrue(*mock_fs.CheckAndReset())
183 run() 192 run()
184 run() 193 run()
185 194
186 run_expecting_stat('0') 195 run_expecting_stat('0')
187 fake_fs.IncrementStat() 196 test_fs.IncrementStat()
188 run_expecting_stat('1') 197 run_expecting_stat('1')
189 198
190 if __name__ == '__main__': 199 if __name__ == '__main__':
191 unittest.main() 200 unittest.main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698