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

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

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

Powered by Google App Engine
This is Rietveld 408576698