Chromium Code Reviews| 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 |