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