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

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

Issue 10829348: Extensions Docs Server: Large performance increase (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 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 unittest 7 import unittest
8 8
9 import appengine_memcache as memcache 9 import object_store
10 from appengine_memcache import AppEngineMemcache 10 from in_memory_object_store import InMemoryObjectStore
11 from file_system import FileSystem 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 memcache_file_system import MemcacheFileSystem 14 from memcache_file_system import MemcacheFileSystem
15 15
16 class _FakeFileSystem(FileSystem): 16 class _FakeFileSystem(FileSystem):
17 def __init__(self): 17 def __init__(self):
18 self.stat_value = 0 18 self.stat_value = 0
19 self._stat_count = 0 19 self._stat_count = 0
20 self._read_count = 0 20 self._read_count = 0
21 21
22 def CheckAndReset(self, read_count=0, stat_count=0): 22 def CheckAndReset(self, read_count=0, stat_count=0):
23 try: 23 try:
24 return (self._read_count == read_count and 24 return (self._read_count == read_count and
25 self._stat_count == stat_count) 25 self._stat_count == stat_count)
26 finally: 26 finally:
27 self._read_count = 0 27 self._read_count = 0
28 self._stat_count = 0 28 self._stat_count = 0
29 29
30 def Stat(self, path): 30 def Stat(self, path):
31 self._stat_count += 1 31 self._stat_count += 1
32 return self.StatInfo( 32 children = dict((path.strip('/') + str(i), self.stat_value)
33 self.stat_value, 33 for i in range(5))
34 dict((path + str(i), self.stat_value) for i in range(5))) 34 if not path.endswith('/'):
35 children[path.rsplit('/', 1)[-1]] = self.stat_value
36 return StatInfo(self.stat_value, children)
35 37
36 def Read(self, paths, binary=False): 38 def Read(self, paths, binary=False):
37 self._read_count += 1 39 self._read_count += 1
38 return Future(value=dict((path, path) for path in paths)) 40 return Future(value=dict((path, path) for path in paths))
39 41
40 class MemcacheFileSystemTest(unittest.TestCase): 42 class MemcacheFileSystemTest(unittest.TestCase):
41 def setUp(self): 43 def setUp(self):
42 self._memcache = AppEngineMemcache('') 44 self._object_store = InMemoryObjectStore('')
43 self._local_fs = LocalFileSystem(os.path.join('test_data', 'file_system')) 45 self._local_fs = LocalFileSystem(os.path.join('test_data', 'file_system'))
44 46
45 def _SetReadCacheItem(self, key, value, stat): 47 def _SetReadCacheItem(self, key, value, stat):
46 self._memcache.Set(key, (value, stat), memcache.MEMCACHE_FILE_SYSTEM_READ) 48 self._object_store.Set(key, (value, stat), object_store.FILE_SYSTEM_READ)
47 49
48 def _SetStatCacheItem(self, key, value): 50 def _SetStatCacheItem(self, key, value):
49 self._memcache.Set(key, value, memcache.MEMCACHE_FILE_SYSTEM_STAT) 51 self._object_store.Set(key, value, object_store.FILE_SYSTEM_STAT)
50 52
51 def _DeleteReadCacheItem(self, key): 53 def _DeleteReadCacheItem(self, key):
52 self._memcache.Delete(key, memcache.MEMCACHE_FILE_SYSTEM_READ) 54 self._object_store.Delete(key, object_store.FILE_SYSTEM_READ)
53 55
54 def _DeleteStatCacheItem(self, key): 56 def _DeleteStatCacheItem(self, key):
55 self._memcache.Delete(key, memcache.MEMCACHE_FILE_SYSTEM_STAT) 57 self._object_store.Delete(key, object_store.FILE_SYSTEM_STAT)
56 58
57 def testReadFiles(self): 59 def testReadFiles(self):
58 file_system = MemcacheFileSystem(self._local_fs, self._memcache) 60 file_system = MemcacheFileSystem(self._local_fs, self._object_store)
59 expected = { 61 expected = {
60 'test1.txt': 'test1\n', 62 './test1.txt': 'test1\n',
61 'test2.txt': 'test2\n', 63 './test2.txt': 'test2\n',
62 'test3.txt': 'test3\n', 64 './test3.txt': 'test3\n',
63 } 65 }
64 self.assertEqual( 66 self.assertEqual(
65 expected, 67 expected,
66 file_system.Read(['test1.txt', 'test2.txt', 'test3.txt']).Get()) 68 file_system.Read(['./test1.txt', './test2.txt', './test3.txt']).Get())
67 69
68 def testListDir(self): 70 def testListDir(self):
69 file_system = MemcacheFileSystem(self._local_fs, self._memcache) 71 file_system = MemcacheFileSystem(self._local_fs, self._object_store)
70 expected = ['dir/'] 72 expected = ['dir/']
71 for i in range(7): 73 for i in range(7):
72 expected.append('file%d.html' % i) 74 expected.append('file%d.html' % i)
73 self._SetReadCacheItem('list/', expected, file_system.Stat('list/').version) 75 self._SetReadCacheItem('list/', expected, file_system.Stat('list/').version)
74 self.assertEqual(expected, 76 self.assertEqual(expected,
75 sorted(file_system.ReadSingle('list/'))) 77 sorted(file_system.ReadSingle('list/')))
76 expected.remove('file0.html') 78 expected.remove('file0.html')
77 self._SetReadCacheItem('list/', expected, file_system.Stat('list/').version) 79 self._SetReadCacheItem('list/', expected, file_system.Stat('list/').version)
78 self.assertEqual(expected, 80 self.assertEqual(expected,
79 sorted(file_system.ReadSingle('list/'))) 81 sorted(file_system.ReadSingle('list/')))
80 82
81 def testCaching(self): 83 def testCaching(self):
82 fake_fs = _FakeFileSystem() 84 fake_fs = _FakeFileSystem()
83 file_system = MemcacheFileSystem(fake_fs, self._memcache) 85 file_system = MemcacheFileSystem(fake_fs, self._object_store)
84 self.assertEqual('bob', file_system.ReadSingle('bob')) 86 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0'))
85 self.assertTrue(fake_fs.CheckAndReset(read_count=1, stat_count=1)) 87 self.assertTrue(fake_fs.CheckAndReset(read_count=1, stat_count=1))
86 88
87 # Resource has been memcached, so test resource is not re-fetched. 89 # Resource has been cached, so test resource is not re-fetched.
88 self.assertEqual('bob', file_system.ReadSingle('bob')) 90 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0'))
89 self.assertTrue(fake_fs.CheckAndReset()) 91 self.assertTrue(fake_fs.CheckAndReset())
90 92
91 # 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.
92 self._DeleteStatCacheItem('bob') 94 self._DeleteStatCacheItem('bob/bob0')
93 self.assertEqual('bob', file_system.ReadSingle('bob')) 95 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0'))
94 self.assertTrue(fake_fs.CheckAndReset(stat_count=1)) 96 self.assertTrue(fake_fs.CheckAndReset(stat_count=1))
95 97
96 # 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.
97 self._DeleteStatCacheItem('bob') 99 self._DeleteStatCacheItem('bob/bob0')
98 fake_fs.stat_value += 1 100 fake_fs.stat_value += 1
99 self.assertEqual('bob', file_system.ReadSingle('bob')) 101 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0'))
100 self.assertTrue(fake_fs.CheckAndReset(read_count=1, stat_count=1)) 102 self.assertTrue(fake_fs.CheckAndReset(read_count=1, stat_count=1))
101 103
102 # Test directory and subdirectory stats are cached. 104 # Test directory and subdirectory stats are cached.
103 self.assertEqual('bob/', file_system.ReadSingle('bob/')) 105 self._DeleteStatCacheItem('bob/bob0')
106 self._DeleteReadCacheItem('bob/bob0')
107 self._DeleteStatCacheItem('bob/bob1')
108 self.assertEqual('bob/bob1', file_system.ReadSingle('bob/bob1'))
104 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0')) 109 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0'))
105 self.assertTrue(fake_fs.CheckAndReset(read_count=2, stat_count=1)) 110 self.assertTrue(fake_fs.CheckAndReset(read_count=2, stat_count=1))
106 self.assertEqual('bob/', file_system.ReadSingle('bob/')) 111 self.assertEqual('bob/bob1', file_system.ReadSingle('bob/bob1'))
107 self.assertTrue(fake_fs.CheckAndReset()) 112 self.assertTrue(fake_fs.CheckAndReset())
108 113
109 # Test a more recent parent directory doesn't force a refetch of children. 114 # Test a more recent parent directory doesn't force a refetch of children.
115 self._DeleteReadCacheItem('bob/bob0')
116 self._DeleteReadCacheItem('bob/bob1')
110 self.assertEqual('bob/bob1', file_system.ReadSingle('bob/bob1')) 117 self.assertEqual('bob/bob1', file_system.ReadSingle('bob/bob1'))
111 self.assertEqual('bob/bob2', file_system.ReadSingle('bob/bob2')) 118 self.assertEqual('bob/bob2', file_system.ReadSingle('bob/bob2'))
112 self.assertEqual('bob/bob3', file_system.ReadSingle('bob/bob3')) 119 self.assertEqual('bob/bob3', file_system.ReadSingle('bob/bob3'))
113 self.assertTrue(fake_fs.CheckAndReset(read_count=3)) 120 self.assertTrue(fake_fs.CheckAndReset(read_count=3))
114 self._SetStatCacheItem('bob/', 10) 121 self._SetStatCacheItem('bob/', 10)
115 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0'))
116 self.assertEqual('bob/bob1', file_system.ReadSingle('bob/bob1')) 122 self.assertEqual('bob/bob1', file_system.ReadSingle('bob/bob1'))
117 self.assertEqual('bob/bob2', file_system.ReadSingle('bob/bob2')) 123 self.assertEqual('bob/bob2', file_system.ReadSingle('bob/bob2'))
124 self.assertEqual('bob/bob3', file_system.ReadSingle('bob/bob3'))
118 self.assertTrue(fake_fs.CheckAndReset()) 125 self.assertTrue(fake_fs.CheckAndReset())
119 126
120 self._DeleteStatCacheItem('bob/bob0') 127 self._DeleteStatCacheItem('bob/bob0')
121 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0')) 128 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0'))
122 self.assertTrue(fake_fs.CheckAndReset(stat_count=1)) 129 self.assertTrue(fake_fs.CheckAndReset(read_count=1, stat_count=1))
123 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0')) 130 self.assertEqual('bob/bob0', file_system.ReadSingle('bob/bob0'))
124 self.assertTrue(fake_fs.CheckAndReset()) 131 self.assertTrue(fake_fs.CheckAndReset())
125 132
126 if __name__ == '__main__': 133 if __name__ == '__main__':
127 unittest.main() 134 unittest.main()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698