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
6import unittest
7
8from chained_compiled_file_system import ChainedCompiledFileSystem
9from compiled_file_system import CompiledFileSystem
10from object_store_creator import ObjectStoreCreator
11from test_file_system import TestFileSystem
12
13_TEST_DATA_BASE = {
14  'a.txt': 'base a.txt',
15  'dir': {
16    'b.txt': 'base b.txt'
17  },
18}
19
20_TEST_DATA_NEW = {
21  'a.txt': 'new a.txt',
22  'new.txt': 'a new file',
23  'dir': {
24    'b.txt': 'new b.txt',
25    'new.txt': 'new file in dir',
26  },
27}
28
29identity = lambda _, x: x
30
31class ChainedCompiledFileSystemTest(unittest.TestCase):
32  def setUp(self):
33    object_store_creator = ObjectStoreCreator(start_empty=False)
34    base_file_system = TestFileSystem(_TEST_DATA_BASE)
35    self._base_factory = CompiledFileSystem.Factory(base_file_system,
36                                                    object_store_creator)
37    self._file_system = TestFileSystem(_TEST_DATA_NEW)
38    self._patched_factory = CompiledFileSystem.Factory(self._file_system,
39                                                       object_store_creator)
40    self._chained_factory = ChainedCompiledFileSystem.Factory(
41        [(self._patched_factory, self._file_system),
42         (self._base_factory, base_file_system)])
43    self._base_compiled_fs = self._base_factory.Create(identity, TestFileSystem)
44    self._chained_compiled_fs = self._chained_factory.Create(
45        identity, TestFileSystem)
46
47  def testGetFromFile(self):
48    self.assertEqual(self._chained_compiled_fs.GetFromFile('a.txt'),
49                     self._base_compiled_fs.GetFromFile('a.txt'))
50    self.assertEqual(self._chained_compiled_fs.GetFromFile('new.txt'),
51                     'a new file')
52    self.assertEqual(self._chained_compiled_fs.GetFromFile('dir/new.txt'),
53                     'new file in dir')
54    self._file_system.IncrementStat('a.txt')
55    self.assertNotEqual(self._chained_compiled_fs.GetFromFile('a.txt'),
56                        self._base_compiled_fs.GetFromFile('a.txt'))
57    self.assertEqual(self._chained_compiled_fs.GetFromFile('a.txt'),
58                     self._file_system.ReadSingle('a.txt'))
59
60  def testGetFromFileListing(self):
61    self.assertEqual(self._chained_compiled_fs.GetFromFile('dir/'),
62                     self._base_compiled_fs.GetFromFile('dir/'))
63    self._file_system.IncrementStat('dir/')
64    self.assertNotEqual(self._chained_compiled_fs.GetFromFileListing('dir/'),
65                        self._base_compiled_fs.GetFromFileListing('dir/'))
66    self.assertEqual(self._chained_compiled_fs.GetFromFileListing('dir/'),
67                     self._file_system.ReadSingle('dir/'))
68
69if __name__ == '__main__':
70  unittest.main()
71