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

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: Tests! 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.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()
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698