- add sources.
[platform/framework/web/crosswalk.git] / src / chrome / common / extensions / docs / server2 / patched_file_system_test.py
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).Get())
94
95     self.assertEqual(
96         expected,
97         self._file_system.Read(expected.keys()).Get())
98
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)
107     self.assertRaises(
108         FileNotFoundError,
109         self._file_system.ReadSingle('dir1/newsubdir/not_existing').Get)
110
111   def testReadDir(self):
112     self.assertEqual(
113         sorted(self._file_system.ReadSingle('dir1/').Get()),
114         sorted(set(self._host_file_system.ReadSingle('dir1/').Get()) |
115                set(('file2.html', 'newsubdir/'))))
116
117     self.assertEqual(
118         sorted(self._file_system.ReadSingle('dir1/newsubdir/').Get()),
119         sorted(['a.js']))
120
121     self.assertEqual(sorted(self._file_system.ReadSingle('dir2/').Get()),
122                      sorted(self._host_file_system.ReadSingle('dir2/').Get()))
123
124     self.assertEqual(
125         sorted(self._file_system.ReadSingle('dir2/subdir1/').Get()),
126         sorted(set(self._host_file_system.ReadSingle('dir2/subdir1/').Get()) -
127                set(('sub1.txt',))))
128
129     self.assertEqual(sorted(self._file_system.ReadSingle('newdir/').Get()),
130                      sorted(['1.html']))
131
132     self.assertEqual(self._file_system.ReadSingle('dir3/').Get(), [])
133
134     self.assertEqual(self._file_system.ReadSingle('dir4/').Get(), [])
135
136     self.assertRaises(FileNotFoundError,
137                       self._file_system.ReadSingle('not_existing_dir/').Get)
138
139   def testStat(self):
140     version = 'patched_%s' % self._patcher.GetVersion()
141     old_version = self._host_file_system.Stat('dir1/file1.html').version
142
143     # Stat an unmodified file.
144     self.assertEqual(self._file_system.Stat('dir1/file1.html'),
145                      self._host_file_system.Stat('dir1/file1.html'))
146
147     # Stat an unmodified directory.
148     self.assertEqual(self._file_system.Stat('dir1/unmodified/'),
149                      self._host_file_system.Stat('dir1/unmodified/'))
150
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}))
157
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/'),
164                      expected)
165
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'),
170                      StatInfo(version))
171     self.assertEqual(self._file_system.Stat('newdir/'),
172                      StatInfo(version, {'1.html': version}))
173     self.assertEqual(self._file_system.Stat('newdir/1.html'),
174                      StatInfo(version))
175
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,
180         'dir4/one.txt')
181
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, {}))
189
190     # Stat empty (after patch) directory's parent
191     self.assertEqual(self._file_system.Stat('dir5/'),
192                      StatInfo(version, {'subdir/': version}))
193
194     # Stat files that don't exist either before or after patching.
195     self.assertRaises(FileNotFoundError, self._file_system.Stat,
196         'not_existing/')
197     self.assertRaises(FileNotFoundError, self._file_system.Stat,
198         'dir1/not_existing/')
199     self.assertRaises(FileNotFoundError, self._file_system.Stat,
200         'dir1/not_existing')
201
202 if __name__ == '__main__':
203   unittest.main()