| OLD | NEW |
| (Empty) | |
| 1 #!/usr/bin/env python |
| 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. |
| 5 |
| 6 from copy import deepcopy |
| 7 import unittest |
| 8 |
| 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 |
| 15 import url_constants |
| 16 |
| 17 _TEST_FS_DATA = { |
| 18 'dir1': { |
| 19 'file1.html': 'This is dir1/file1.html', |
| 20 'unmodified': { |
| 21 '1': '1', |
| 22 '2': '', |
| 23 }, |
| 24 }, |
| 25 'dir2': { |
| 26 'subdir1': { |
| 27 'sub1.txt': 'in subdir(1)', |
| 28 'sub2.txt': 'in subdir(2)', |
| 29 'sub3.txt': 'in subdir(3)', |
| 30 }, |
| 31 }, |
| 32 'dir3': { |
| 33 }, |
| 34 'dir4': { |
| 35 'one.txt': '', |
| 36 }, |
| 37 'dir5': { |
| 38 'subdir': { |
| 39 '1.txt': '555', |
| 40 }, |
| 41 }, |
| 42 'test1.txt': 'test1', |
| 43 'test2.txt': 'test2', |
| 44 } |
| 45 |
| 46 _TEST_PATCH_VERSION = '1001' |
| 47 _TEST_PATCH_FILES = ( |
| 48 # Added |
| 49 [ |
| 50 'test3.txt', |
| 51 'dir1/file2.html', |
| 52 'dir1/newsubdir/a.js', |
| 53 'newdir/1.html', |
| 54 ], |
| 55 # Deleted |
| 56 [ |
| 57 'test2.txt', |
| 58 'dir2/subdir1/sub1.txt', |
| 59 'dir4/one.txt', |
| 60 'dir5/subdir/1.txt', |
| 61 ], |
| 62 # Modified |
| 63 [ |
| 64 'dir2/subdir1/sub2.txt', |
| 65 ] |
| 66 ) |
| 67 _TEST_PATCH_DATA = { |
| 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', |
| 73 } |
| 74 |
| 75 class PatchedFileSystemTest(unittest.TestCase): |
| 76 def setUp(self): |
| 77 self._patcher = TestPatcher(_TEST_PATCH_VERSION, |
| 78 _TEST_PATCH_FILES, |
| 79 _TEST_PATCH_DATA) |
| 80 self._host_file_system = TestFileSystem(_TEST_FS_DATA) |
| 81 self._file_system = PatchedFileSystem(self._host_file_system, |
| 82 self._patcher) |
| 83 |
| 84 def testRead(self): |
| 85 expected = deepcopy(_TEST_PATCH_DATA) |
| 86 # Files that are not modified. |
| 87 expected.update({ |
| 88 'dir2/subdir1/sub3.txt': 'in subdir(3)', |
| 89 'dir1/file1.html': 'This is dir1/file1.html', |
| 90 }) |
| 91 |
| 92 for key in expected: |
| 93 self.assertEqual(expected[key], self._file_system.ReadSingle(key)) |
| 94 |
| 95 self.assertEqual( |
| 96 expected, |
| 97 self._file_system.Read(expected.keys()).Get()) |
| 98 |
| 99 self.assertRaises(FileNotFoundError, self._file_system.ReadSingle, |
| 100 'test2.txt') |
| 101 self.assertRaises(FileNotFoundError, self._file_system.ReadSingle, |
| 102 'dir2/subdir1/sub1.txt') |
| 103 self.assertRaises(FileNotFoundError, self._file_system.ReadSingle, |
| 104 'not_existing') |
| 105 self.assertRaises(FileNotFoundError, self._file_system.ReadSingle, |
| 106 'dir1/not_existing') |
| 107 self.assertRaises(FileNotFoundError, self._file_system.ReadSingle, |
| 108 'dir1/newsubdir/not_existing') |
| 109 |
| 110 def testReadDir(self): |
| 111 self.assertEqual(sorted(self._file_system.ReadSingle('dir1/')), |
| 112 sorted(set(self._host_file_system.ReadSingle('dir1/')) | |
| 113 {'file2.html', 'newsubdir/'})) |
| 114 |
| 115 self.assertEqual(sorted(self._file_system.ReadSingle('dir1/newsubdir/')), |
| 116 sorted(['a.js'])) |
| 117 |
| 118 self.assertEqual(sorted(self._file_system.ReadSingle('dir2/')), |
| 119 sorted(self._host_file_system.ReadSingle('dir2/'))) |
| 120 |
| 121 self.assertEqual(sorted(self._file_system.ReadSingle('dir2/subdir1/')), |
| 122 sorted(set(self._host_file_system.ReadSingle('dir2/subdir1/')) - |
| 123 {'sub1.txt'})) |
| 124 |
| 125 self.assertEqual(sorted(self._file_system.ReadSingle('newdir/')), |
| 126 sorted(['1.html'])) |
| 127 |
| 128 self.assertEqual(self._file_system.ReadSingle('dir3/'), []) |
| 129 |
| 130 self.assertEqual(self._file_system.ReadSingle('dir4/'), []) |
| 131 |
| 132 self.assertRaises(FileNotFoundError, self._file_system.ReadSingle, |
| 133 'not_existing_dir/') |
| 134 |
| 135 def testStat(self): |
| 136 version = 'patched_%s' % self._patcher.GetVersion() |
| 137 old_version = self._host_file_system.Stat('dir1/file1.html').version |
| 138 |
| 139 # Stat an unmodified file. |
| 140 self.assertEqual(self._file_system.Stat('dir1/file1.html'), |
| 141 self._host_file_system.Stat('dir1/file1.html')) |
| 142 |
| 143 # Stat an unmodified directory. |
| 144 self.assertEqual(self._file_system.Stat('dir1/unmodified/'), |
| 145 self._host_file_system.Stat('dir1/unmodified/')) |
| 146 |
| 147 # Stat a modified directory. |
| 148 self.assertEqual(self._file_system.Stat('dir2/'), |
| 149 StatInfo(version, {'subdir1/': version})) |
| 150 self.assertEqual(self._file_system.Stat('dir2/subdir1/'), |
| 151 StatInfo(version, {'sub2.txt': version, |
| 152 'sub3.txt': old_version})) |
| 153 |
| 154 # Stat a modified directory with new files. |
| 155 expected = self._host_file_system.Stat('dir1/') |
| 156 expected.version = version |
| 157 expected.child_versions.update({'file2.html': version, |
| 158 'newsubdir/': version}) |
| 159 self.assertEqual(self._file_system.Stat('dir1/'), |
| 160 expected) |
| 161 |
| 162 # Stat an added directory. |
| 163 self.assertEqual(self._file_system.Stat('dir1/newsubdir/'), |
| 164 StatInfo(version, {'a.js': version})) |
| 165 self.assertEqual(self._file_system.Stat('dir1/newsubdir/a.js'), |
| 166 StatInfo(version)) |
| 167 self.assertEqual(self._file_system.Stat('newdir/'), |
| 168 StatInfo(version, {'1.html': version})) |
| 169 self.assertEqual(self._file_system.Stat('newdir/1.html'), |
| 170 StatInfo(version)) |
| 171 |
| 172 # Stat files removed in the patch. |
| 173 self.assertRaises(FileNotFoundError, self._file_system.Stat, |
| 174 'dir2/subdir1/sub1.txt') |
| 175 self.assertRaises(FileNotFoundError, self._file_system.Stat, |
| 176 'dir4/one.txt') |
| 177 |
| 178 # Stat empty directories. |
| 179 self.assertEqual(self._file_system.Stat('dir3/'), |
| 180 StatInfo(old_version, {})) |
| 181 self.assertEqual(self._file_system.Stat('dir4/'), |
| 182 StatInfo(version, {})) |
| 183 self.assertEqual(self._file_system.Stat('dir5/subdir/'), |
| 184 StatInfo(version, {})) |
| 185 |
| 186 # Stat empty (after patch) directory's parent |
| 187 self.assertEqual(self._file_system.Stat('dir5/'), |
| 188 StatInfo(version, {'subdir/': version})) |
| 189 |
| 190 # Stat files that don't exist either before or after patching. |
| 191 self.assertRaises(FileNotFoundError, self._file_system.Stat, |
| 192 'not_existing/') |
| 193 self.assertRaises(FileNotFoundError, self._file_system.Stat, |
| 194 'dir1/not_existing/') |
| 195 self.assertRaises(FileNotFoundError, self._file_system.Stat, |
| 196 'dir1/not_existing') |
| 197 |
| 198 if __name__ == '__main__': |
| 199 unittest.main() |
| OLD | NEW |