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

Side by Side Diff: client/tests/named_cache_test.py

Issue 2875113002: Revert "named caches: move instead of symlinking" (Closed)
Patch Set: Created 3 years, 7 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
« no previous file with comments | « client/run_isolated.py ('k') | client/tests/run_isolated_test.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright 2016 The LUCI Authors. All rights reserved. 2 # Copyright 2016 The LUCI Authors. All rights reserved.
3 # Use of this source code is governed under the Apache License, Version 2.0 3 # Use of this source code is governed under the Apache License, Version 2.0
4 # that can be found in the LICENSE file. 4 # that can be found in the LICENSE file.
5 5
6 import logging 6 import logging
7 import os 7 import os
8 import sys 8 import sys
9 import tempfile 9 import tempfile
10 import unittest 10 import unittest
11 11
12 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath( 12 ROOT_DIR = os.path.dirname(os.path.dirname(os.path.abspath(
13 __file__.decode(sys.getfilesystemencoding())))) 13 __file__.decode(sys.getfilesystemencoding()))))
14 sys.path.insert(0, ROOT_DIR) 14 sys.path.insert(0, ROOT_DIR)
15 sys.path.insert(0, os.path.join(ROOT_DIR, 'third_party')) 15 sys.path.insert(0, os.path.join(ROOT_DIR, 'third_party'))
16 16
17 from depot_tools import fix_encoding 17 from depot_tools import fix_encoding
18 from utils import file_path 18 from utils import file_path
19 from utils import fs 19 from utils import fs
20 import named_cache 20 import named_cache
21 21
22 22
23 def write_file(path, contents):
24 with open(path, 'wb') as f:
25 f.write(contents)
26
27
28 def read_file(path):
29 with open(path, 'rb') as f:
30 return f.read()
31
32
33 class CacheManagerTest(unittest.TestCase): 23 class CacheManagerTest(unittest.TestCase):
34 def setUp(self): 24 def setUp(self):
35 self.tempdir = tempfile.mkdtemp(prefix=u'named_cache_test') 25 self.tempdir = tempfile.mkdtemp(prefix=u'named_cache_test')
36 self.manager = named_cache.CacheManager(self.tempdir) 26 self.manager = named_cache.CacheManager(self.tempdir)
37 27
38 def tearDown(self): 28 def tearDown(self):
39 try: 29 try:
40 file_path.rmtree(self.tempdir) 30 file_path.rmtree(self.tempdir)
41 finally: 31 finally:
42 super(CacheManagerTest, self).tearDown() 32 super(CacheManagerTest, self).tearDown()
43 33
44 def make_caches(self, names): 34 def test_request(self):
45 dest_dir = tempfile.mkdtemp(prefix=u'named_cache_test') 35 with self.assertRaises(AssertionError):
46 try: 36 self.manager.request('foo') # manager is not open
47 names = map(unicode, names) 37 with self.manager.open():
48 for n in names: 38 foo_path = self.manager.request('foo')
49 self.manager.install(os.path.join(dest_dir, n), n) 39 self.assertEqual(foo_path, self.manager.request('foo'))
50 self.assertEqual(set(names), set(os.listdir(dest_dir))) 40 bar_path = self.manager.request('bar')
51 for n in names: 41 self.assertEqual(
52 self.manager.uninstall(os.path.join(dest_dir, n), n) 42 foo_path,
53 self.assertEqual([], os.listdir(dest_dir)) 43 os.path.abspath(os.readlink(
54 self.assertTrue(self.manager.available.issuperset(names)) 44 os.path.join(self.tempdir, 'named', 'foo'))))
55 finally: 45 self.assertEqual(
56 file_path.rmtree(dest_dir) 46 bar_path,
47 os.path.abspath(os.readlink(
48 os.path.join(self.tempdir, 'named', 'bar'))))
49 self.assertEqual(os.path.dirname(bar_path), self.tempdir)
50 self.assertEqual([], os.listdir(foo_path))
51 self.assertEqual([], os.listdir(bar_path))
57 52
58 def test_get_oldest(self): 53 def test_get_oldest(self):
59 with self.manager.open(): 54 with self.manager.open():
60 self.assertIsNone(self.manager.get_oldest()) 55 self.assertIsNone(self.manager.get_oldest())
61 self.make_caches(range(10)) 56 for i in xrange(10):
62 self.assertEqual(self.manager.get_oldest(), u'0') 57 self.manager.request(str(i))
58 self.assertEqual(self.manager.get_oldest(), '0')
63 59
64 def test_get_timestamp(self): 60 def test_get_timestamp(self):
65 now = 0 61 now = 0
66 time_fn = lambda: now 62 time_fn = lambda: now
67 with self.manager.open(time_fn=time_fn): 63 with self.manager.open(time_fn=time_fn):
68 for i in xrange(10): 64 for i in xrange(10):
69 self.make_caches([i]) 65 self.manager.request(str(i))
70 now += 1 66 now += 1
71 for i in xrange(10): 67 for i in xrange(10):
72 self.assertEqual(i, self.manager.get_timestamp(str(i))) 68 self.assertEqual(i, self.manager.get_timestamp(str(i)))
73 69
74 def test_clean_cache(self): 70 def test_create_symlinks(self):
75 dest_dir = tempfile.mkdtemp(prefix=u'named_cache_test') 71 dest_dir = tempfile.mkdtemp(prefix=u'named_cache_test')
76 with self.manager.open(): 72 with self.manager.open():
77 self.assertEqual([], os.listdir(self.manager.root_dir)) 73 for i in xrange(10):
78 74 self.manager.request(str(i))
79 a_path = os.path.join(dest_dir, u'a') 75 self.manager.create_symlinks(dest_dir, [('1', 'a'), ('3', 'c')])
80 b_path = os.path.join(dest_dir, u'b') 76 self.assertEqual({'a', 'c'}, set(os.listdir(dest_dir)))
81
82 self.manager.install(a_path, u'1')
83 self.manager.install(b_path, u'2')
84
85 self.assertEqual({u'a', u'b'}, set(os.listdir(dest_dir)))
86 self.assertFalse(self.manager.available)
87 self.assertEqual([], os.listdir(self.manager.root_dir))
88
89 write_file(os.path.join(a_path, u'x'), u'x')
90 write_file(os.path.join(b_path, u'y'), u'y')
91
92 self.manager.uninstall(a_path, u'1')
93 self.manager.uninstall(b_path, u'2')
94
95 self.assertEqual(3, len(os.listdir(self.manager.root_dir)))
96 path1 = os.path.join(self.manager.root_dir, self.manager._lru['1'])
97 path2 = os.path.join(self.manager.root_dir, self.manager._lru['2'])
98
99 self.assertEqual('x', read_file(os.path.join(path1, u'x')))
100 self.assertEqual('y', read_file(os.path.join(path2, u'y')))
101 self.assertEqual(os.readlink(self.manager._get_named_path('1')), path1)
102 self.assertEqual(os.readlink(self.manager._get_named_path('2')), path2)
103
104 def test_existing_cache(self):
105 dest_dir = tempfile.mkdtemp(prefix=u'named_cache_test')
106 with self.manager.open():
107 # Assume test_clean passes.
108 a_path = os.path.join(dest_dir, u'a')
109 b_path = os.path.join(dest_dir, u'b')
110
111 self.manager.install(a_path, u'1')
112 write_file(os.path.join(dest_dir, u'a', u'x'), u'x')
113 self.manager.uninstall(a_path, u'1')
114
115 # Test starts here.
116 self.manager.install(a_path, u'1')
117 self.manager.install(b_path, u'2')
118 self.assertEqual({'a', 'b'}, set(os.listdir(dest_dir)))
119 self.assertFalse(self.manager.available)
120 self.assertEqual(['named'], os.listdir(self.manager.root_dir))
121
122 self.assertEqual( 77 self.assertEqual(
123 'x', read_file(os.path.join(os.path.join(dest_dir, u'a', u'x')))) 78 os.readlink(os.path.join(dest_dir, 'a')), self.manager.request('1'))
124 write_file(os.path.join(a_path, 'x'), 'x2') 79 self.assertEqual(
125 write_file(os.path.join(b_path, 'y'), 'y') 80 os.readlink(os.path.join(dest_dir, 'c')), self.manager.request('3'))
126 81 self.assertEqual([], os.listdir(os.path.join(dest_dir, 'c')))
127 self.manager.uninstall(a_path, '1')
128 self.manager.uninstall(b_path, '2')
129
130 self.assertEqual(3, len(os.listdir(self.manager.root_dir)))
131 path1 = os.path.join(self.manager.root_dir, self.manager._lru['1'])
132 path2 = os.path.join(self.manager.root_dir, self.manager._lru['2'])
133
134 self.assertEqual('x2', read_file(os.path.join(path1, 'x')))
135 self.assertEqual('y', read_file(os.path.join(path2, 'y')))
136 self.assertEqual(os.readlink(self.manager._get_named_path('1')), path1)
137 self.assertEqual(os.readlink(self.manager._get_named_path('2')), path2)
138 82
139 def test_trim(self): 83 def test_trim(self):
140 with self.manager.open(): 84 with self.manager.open():
141 item_count = named_cache.MAX_CACHE_SIZE + 10 85 item_count = named_cache.MAX_CACHE_SIZE + 10
142 self.make_caches(range(item_count)) 86 for i in xrange(item_count):
87 self.manager.request(str(i))
143 self.assertEqual(len(self.manager), item_count) 88 self.assertEqual(len(self.manager), item_count)
144 self.manager.trim(None) 89 self.manager.trim(None)
145 self.assertEqual(len(self.manager), named_cache.MAX_CACHE_SIZE) 90 self.assertEqual(len(self.manager), named_cache.MAX_CACHE_SIZE)
146 self.assertEqual( 91 self.assertEqual(
147 set(map(str, xrange(10, 10 + named_cache.MAX_CACHE_SIZE))), 92 set(map(str, xrange(10, 10 + named_cache.MAX_CACHE_SIZE))),
148 set(os.listdir(os.path.join(self.tempdir, 'named')))) 93 set(os.listdir(os.path.join(self.tempdir, 'named'))),
94 )
149 95
150 def test_corrupted(self): 96 def test_corrupted(self):
151 with open(os.path.join(self.tempdir, u'state.json'), 'w') as f: 97 with open(os.path.join(self.tempdir, u'state.json'), 'w') as f:
152 f.write('}}}}') 98 f.write('}}}}')
153 fs.makedirs(os.path.join(self.tempdir, 'a'), 0777) 99 fs.makedirs(os.path.join(self.tempdir, 'a'), 0777)
154 with self.manager.open(): 100 with self.manager.open():
155 self.assertFalse(os.path.isdir(self.tempdir)) 101 self.assertFalse(os.path.isdir(self.tempdir))
156 self.make_caches(['a']) 102 self.manager.request('a')
157 self.assertTrue(fs.islink(os.path.join(self.tempdir, 'named', 'a'))) 103 self.assertTrue(fs.islink(os.path.join(self.tempdir, 'named', 'a')))
158 104
105
159 if __name__ == '__main__': 106 if __name__ == '__main__':
160 fix_encoding.fix_encoding() 107 fix_encoding.fix_encoding()
161 VERBOSE = '-v' in sys.argv 108 VERBOSE = '-v' in sys.argv
162 logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR) 109 logging.basicConfig(level=logging.DEBUG if VERBOSE else logging.ERROR)
163 unittest.main() 110 unittest.main()
OLDNEW
« no previous file with comments | « client/run_isolated.py ('k') | client/tests/run_isolated_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698