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