OLD | NEW |
---|---|
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.fetch_tracker = False | |
20 self.stat_fetch_tracker = False | |
not at google - send to devlin
2012/08/13 05:34:15
what's the difference between fetch_tracker and st
cduvall
2012/08/13 19:45:45
Done.
| |
21 | |
22 def Stat(self, path): | |
23 self.stat_fetch_tracker = True | |
24 return self.StatInfo( | |
25 self.stat_value, | |
26 dict((path + str(i), self.stat_value) for i in range(5))) | |
27 | |
28 def Read(self, paths, binary=False): | |
29 if paths: | |
not at google - send to devlin
2012/08/13 05:34:15
Is this so that if read is called with an empty ob
cduvall
2012/08/13 19:45:45
Done.
| |
30 self.fetch_tracker = True | |
31 return Future(value= dict((path, path) for path in paths)) | |
not at google - send to devlin
2012/08/13 05:34:15
nit: extra space after value=
cduvall
2012/08/13 19:45:45
Done.
| |
32 | |
33 class MemcacheFileSystemTest(unittest.TestCase): | |
15 def setUp(self): | 34 def setUp(self): |
16 self._memcache = AppEngineMemcache('') | 35 self._memcache = AppEngineMemcache('') |
17 self._file_system = MemcacheFileSystem( | 36 self._file_system = MemcacheFileSystem( |
18 LocalFileSystem(os.path.join('test_data', 'file_system')), | 37 LocalFileSystem(os.path.join('test_data', 'file_system')), |
19 self._memcache) | 38 self._memcache) |
20 | 39 |
40 def _SetCacheItem(self, key, value, stat): | |
not at google - send to devlin
2012/08/13 05:34:15
would prefer this be SetReadCacheItem since there'
cduvall
2012/08/13 19:45:45
Done.
| |
41 self._memcache.Set(key, (value, stat), memcache.MEMCACHE_FILE_SYSTEM_READ) | |
42 | |
43 def _SetStatCacheItem(self, key, value): | |
44 self._memcache.Set(key, value, memcache.MEMCACHE_FILE_SYSTEM_STAT) | |
45 | |
46 def _DeleteCacheItem(self, key): | |
47 self._memcache.Delete(key, memcache.MEMCACHE_FILE_SYSTEM_READ) | |
48 | |
49 def _DeleteStatCacheItem(self, key): | |
50 self._memcache.Delete(key, memcache.MEMCACHE_FILE_SYSTEM_STAT) | |
51 | |
21 def testReadFiles(self): | 52 def testReadFiles(self): |
22 expected = { | 53 expected = { |
23 'test1.txt': 'test1\n', | 54 'test1.txt': 'test1\n', |
24 'test2.txt': 'test2\n', | 55 'test2.txt': 'test2\n', |
25 'test3.txt': 'test3\n', | 56 'test3.txt': 'test3\n', |
26 } | 57 } |
27 self.assertEqual( | 58 self.assertEqual( |
28 expected, | 59 expected, |
29 self._file_system.Read(['test1.txt', 'test2.txt', 'test3.txt']).Get()) | 60 self._file_system.Read(['test1.txt', 'test2.txt', 'test3.txt']).Get()) |
30 | 61 |
31 def testListDir(self): | 62 def testListDir(self): |
32 expected = ['dir/'] | 63 expected = ['dir/'] |
33 for i in range(7): | 64 for i in range(7): |
34 expected.append('file%d.html' % i) | 65 expected.append('file%d.html' % i) |
35 self.assertEqual(expected, | 66 self.assertEqual(expected, |
36 sorted(self._file_system.ReadSingle('list/'))) | 67 sorted(self._file_system.ReadSingle('list/'))) |
37 expected.remove('file0.html') | 68 expected.remove('file0.html') |
38 self._memcache.Set('list/', | 69 self._SetCacheItem('list/', expected, self._file_system.Stat('list/')) |
39 (expected, self._file_system.Stat('list/')), | |
40 memcache.MEMCACHE_FILE_SYSTEM_READ) | |
41 self.assertEqual(expected, | 70 self.assertEqual(expected, |
42 sorted(self._file_system.ReadSingle('list/'))) | 71 sorted(self._file_system.ReadSingle('list/'))) |
43 | 72 |
73 def testCaching(self): | |
74 fake_fs = _FakeFileSystem() | |
75 self._file_system = MemcacheFileSystem(fake_fs, self._memcache) | |
not at google - send to devlin
2012/08/13 05:34:15
if you find yourself doing this, sounds like _file
cduvall
2012/08/13 19:45:45
Done.
| |
76 self.assertEqual('bob', self._file_system.ReadSingle('bob')) | |
77 self.assertTrue(fake_fs.fetch_tracker) | |
78 fake_fs.fetch_tracker = False | |
79 | |
80 # Test resource is not re-fetched. | |
not at google - send to devlin
2012/08/13 05:34:15
"Resource has been memcached, so test resource is
cduvall
2012/08/13 19:45:45
Done.
| |
81 self.assertEqual('bob', self._file_system.ReadSingle('bob')) | |
82 self.assertFalse(fake_fs.fetch_tracker) | |
83 | |
84 # Test if the Stat version is the same the resource is not re-fetched. | |
85 self._DeleteStatCacheItem('bob') | |
86 self.assertEqual('bob', self._file_system.ReadSingle('bob')) | |
87 self.assertFalse(fake_fs.fetch_tracker) | |
88 | |
89 # Test if there is a newer version, the resource is re-fetched. | |
90 self._DeleteStatCacheItem('bob') | |
91 fake_fs.stat_value += 1 | |
92 self.assertEqual('bob', self._file_system.ReadSingle('bob')) | |
93 self.assertTrue(fake_fs.fetch_tracker) | |
94 fake_fs.fetch_tracker = False | |
95 | |
96 # Test directory and subdirectory stats are cached. | |
97 self.assertEqual('bob/', self._file_system.ReadSingle('bob/')) | |
98 fake_fs.stat_fetch_tracker = False | |
99 self.assertEqual('bob/bob1', self._file_system.ReadSingle('bob/bob1')) | |
100 self.assertFalse(fake_fs.stat_fetch_tracker) | |
101 self.assertEqual('bob/', self._file_system.ReadSingle('bob/')) | |
102 self.assertFalse(fake_fs.stat_fetch_tracker) | |
103 | |
104 # Test a more recent parent directory doesn't force a refetch of children. | |
105 self.assertEqual('bob/bob0', self._file_system.ReadSingle('bob/bob0')) | |
106 self.assertEqual('bob/bob1', self._file_system.ReadSingle('bob/bob1')) | |
107 self.assertEqual('bob/bob2', self._file_system.ReadSingle('bob/bob2')) | |
108 self._SetStatCacheItem('bob/', 10) | |
109 fake_fs.fetch_tracker = False | |
110 self.assertEqual('bob/bob0', self._file_system.ReadSingle('bob/bob0')) | |
111 self.assertEqual('bob/bob1', self._file_system.ReadSingle('bob/bob1')) | |
112 self.assertEqual('bob/bob2', self._file_system.ReadSingle('bob/bob2')) | |
113 self.assertFalse(fake_fs.fetch_tracker) | |
114 | |
115 self._DeleteStatCacheItem('bob/bob0') | |
116 fake_fs.fetch_tracker = False | |
117 self.assertEqual('bob/bob0', self._file_system.ReadSingle('bob/bob0')) | |
118 self.assertFalse(fake_fs.fetch_tracker) | |
119 fake_fs.stat_fetch_tracker = False | |
120 self.assertEqual('bob/bob0', self._file_system.ReadSingle('bob/bob0')) | |
121 self.assertFalse(fake_fs.stat_fetch_tracker) | |
122 self.assertFalse(fake_fs.fetch_tracker) | |
123 | |
44 if __name__ == '__main__': | 124 if __name__ == '__main__': |
45 unittest.main() | 125 unittest.main() |
OLD | NEW |