2 # Copyright 2013 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file.
6 from copy import deepcopy
9 from file_system import FileSystem, FileNotFoundError, StatInfo
10 from future import Future
11 from patched_file_system import PatchedFileSystem
12 from patcher import Patcher
13 from test_file_system import TestFileSystem
14 from test_patcher import TestPatcher
19 'file1.html': 'This is dir1/file1.html',
27 'sub1.txt': 'in subdir(1)',
28 'sub2.txt': 'in subdir(2)',
29 'sub3.txt': 'in subdir(3)',
46 _TEST_PATCH_VERSION = '1001'
52 'dir1/newsubdir/a.js',
58 'dir2/subdir1/sub1.txt',
64 'dir2/subdir1/sub2.txt',
68 'test3.txt': 'test3 is added.',
69 'dir1/file2.html': 'This is dir1/file2.html',
70 'dir1/newsubdir/a.js': 'This is a.js',
71 'newdir/1.html': 'This comes from a new dir.',
72 'dir2/subdir1/sub2.txt': 'in subdir',
75 class PatchedFileSystemTest(unittest.TestCase):
77 self._patcher = TestPatcher(_TEST_PATCH_VERSION,
80 self._host_file_system = TestFileSystem(_TEST_FS_DATA)
81 self._file_system = PatchedFileSystem(self._host_file_system,
85 expected = deepcopy(_TEST_PATCH_DATA)
86 # Files that are not modified.
88 'dir2/subdir1/sub3.txt': 'in subdir(3)',
89 'dir1/file1.html': 'This is dir1/file1.html',
93 self.assertEqual(expected[key], self._file_system.ReadSingle(key).Get())
97 self._file_system.Read(expected.keys()).Get())
99 self.assertRaises(FileNotFoundError,
100 self._file_system.ReadSingle('test2.txt').Get)
101 self.assertRaises(FileNotFoundError,
102 self._file_system.ReadSingle('dir2/subdir1/sub1.txt').Get)
103 self.assertRaises(FileNotFoundError,
104 self._file_system.ReadSingle('not_existing').Get)
105 self.assertRaises(FileNotFoundError,
106 self._file_system.ReadSingle('dir1/not_existing').Get)
109 self._file_system.ReadSingle('dir1/newsubdir/not_existing').Get)
111 def testReadDir(self):
113 sorted(self._file_system.ReadSingle('dir1/').Get()),
114 sorted(set(self._host_file_system.ReadSingle('dir1/').Get()) |
115 set(('file2.html', 'newsubdir/'))))
118 sorted(self._file_system.ReadSingle('dir1/newsubdir/').Get()),
121 self.assertEqual(sorted(self._file_system.ReadSingle('dir2/').Get()),
122 sorted(self._host_file_system.ReadSingle('dir2/').Get()))
125 sorted(self._file_system.ReadSingle('dir2/subdir1/').Get()),
126 sorted(set(self._host_file_system.ReadSingle('dir2/subdir1/').Get()) -
129 self.assertEqual(sorted(self._file_system.ReadSingle('newdir/').Get()),
132 self.assertEqual(self._file_system.ReadSingle('dir3/').Get(), [])
134 self.assertEqual(self._file_system.ReadSingle('dir4/').Get(), [])
136 self.assertRaises(FileNotFoundError,
137 self._file_system.ReadSingle('not_existing_dir/').Get)
140 version = 'patched_%s' % self._patcher.GetVersion()
141 old_version = self._host_file_system.Stat('dir1/file1.html').version
143 # Stat an unmodified file.
144 self.assertEqual(self._file_system.Stat('dir1/file1.html'),
145 self._host_file_system.Stat('dir1/file1.html'))
147 # Stat an unmodified directory.
148 self.assertEqual(self._file_system.Stat('dir1/unmodified/'),
149 self._host_file_system.Stat('dir1/unmodified/'))
151 # Stat a modified directory.
152 self.assertEqual(self._file_system.Stat('dir2/'),
153 StatInfo(version, {'subdir1/': version}))
154 self.assertEqual(self._file_system.Stat('dir2/subdir1/'),
155 StatInfo(version, {'sub2.txt': version,
156 'sub3.txt': old_version}))
158 # Stat a modified directory with new files.
159 expected = self._host_file_system.Stat('dir1/')
160 expected.version = version
161 expected.child_versions.update({'file2.html': version,
162 'newsubdir/': version})
163 self.assertEqual(self._file_system.Stat('dir1/'),
166 # Stat an added directory.
167 self.assertEqual(self._file_system.Stat('dir1/newsubdir/'),
168 StatInfo(version, {'a.js': version}))
169 self.assertEqual(self._file_system.Stat('dir1/newsubdir/a.js'),
171 self.assertEqual(self._file_system.Stat('newdir/'),
172 StatInfo(version, {'1.html': version}))
173 self.assertEqual(self._file_system.Stat('newdir/1.html'),
176 # Stat files removed in the patch.
177 self.assertRaises(FileNotFoundError, self._file_system.Stat,
178 'dir2/subdir1/sub1.txt')
179 self.assertRaises(FileNotFoundError, self._file_system.Stat,
182 # Stat empty directories.
183 self.assertEqual(self._file_system.Stat('dir3/'),
184 StatInfo(old_version, {}))
185 self.assertEqual(self._file_system.Stat('dir4/'),
186 StatInfo(version, {}))
187 self.assertEqual(self._file_system.Stat('dir5/subdir/'),
188 StatInfo(version, {}))
190 # Stat empty (after patch) directory's parent
191 self.assertEqual(self._file_system.Stat('dir5/'),
192 StatInfo(version, {'subdir/': version}))
194 # Stat files that don't exist either before or after patching.
195 self.assertRaises(FileNotFoundError, self._file_system.Stat,
197 self.assertRaises(FileNotFoundError, self._file_system.Stat,
198 'dir1/not_existing/')
199 self.assertRaises(FileNotFoundError, self._file_system.Stat,
202 if __name__ == '__main__':