patched_file_system_test.py revision a93a17c8d99d686bd4a1511e5504e5e6cc9fcadf
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 6from copy import deepcopy 7import unittest 8 9from file_system import FileSystem, FileNotFoundError, StatInfo 10from future import Future 11from patched_file_system import PatchedFileSystem 12from patcher import Patcher 13from test_file_system import TestFileSystem 14from test_patcher import TestPatcher 15import 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 75class 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 198if __name__ == '__main__': 199 unittest.main() 200