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 from file_system import FileNotFoundError, StatInfo 8 from mock_file_system import MockFileSystem 9 from test_file_system import TestFileSystem 10 import unittest 11 12 _TEST_DATA = { 13 '404.html': '404.html contents', 14 'apps': { 15 'a11y.html': 'a11y.html contents', 16 'about_apps.html': 'about_apps.html contents', 17 'fakedir': { 18 'file.html': 'file.html contents' 19 } 20 }, 21 'extensions': { 22 'activeTab.html': 'activeTab.html contents', 23 'alarms.html': 'alarms.html contents' 24 } 25 } 26 27 def _Get(fn): 28 '''Returns a function which calls Future.Get on the result of |fn|. 29 ''' 30 return lambda *args: fn(*args).Get() 31 32 class MockFileSystemTest(unittest.TestCase): 33 def testCheckAndReset(self): 34 fs = MockFileSystem(TestFileSystem(deepcopy(_TEST_DATA))) 35 36 self.assertTrue(*fs.CheckAndReset()) 37 self.assertFalse(*fs.CheckAndReset(read_count=1)) 38 self.assertFalse(*fs.CheckAndReset(stat_count=1)) 39 40 fs.ReadSingle('apps/') 41 self.assertTrue(*fs.CheckAndReset(read_count=1)) 42 self.assertFalse(*fs.CheckAndReset(read_count=1)) 43 self.assertTrue(*fs.CheckAndReset()) 44 45 fs.ReadSingle('apps/') 46 self.assertFalse(*fs.CheckAndReset(read_count=2)) 47 48 fs.ReadSingle('extensions/') 49 fs.ReadSingle('extensions/') 50 self.assertTrue(*fs.CheckAndReset(read_count=2)) 51 self.assertFalse(*fs.CheckAndReset(read_count=2)) 52 self.assertTrue(*fs.CheckAndReset()) 53 54 fs.ReadSingle('404.html') 55 future = fs.Read(['notfound.html', 'apps/']) 56 self.assertTrue(*fs.CheckAndReset(read_count=2)) 57 self.assertRaises(FileNotFoundError, future.Get) 58 59 fs.Stat('404.html') 60 fs.Stat('404.html') 61 fs.Stat('apps/') 62 self.assertFalse(*fs.CheckAndReset(stat_count=42)) 63 self.assertFalse(*fs.CheckAndReset(stat_count=42)) 64 self.assertTrue(*fs.CheckAndReset()) 65 66 fs.ReadSingle('404.html') 67 fs.Stat('404.html') 68 fs.Stat('apps/') 69 self.assertTrue(*fs.CheckAndReset(read_count=1, stat_count=2)) 70 self.assertTrue(*fs.CheckAndReset()) 71 72 def testUpdates(self): 73 fs = MockFileSystem(TestFileSystem(deepcopy(_TEST_DATA))) 74 75 self.assertEqual(StatInfo('0', child_versions={ 76 '404.html': '0', 77 'apps/': '0', 78 'extensions/': '0' 79 }), fs.Stat('/')) 80 self.assertEqual(StatInfo('0'), fs.Stat('404.html')) 81 self.assertEqual(StatInfo('0', child_versions={ 82 'a11y.html': '0', 83 'about_apps.html': '0', 84 'fakedir/': '0', 85 }), fs.Stat('apps/')) 86 self.assertEqual('404.html contents', fs.ReadSingle('404.html')) 87 88 fs.Update({ 89 '404.html': 'New version!' 90 }) 91 92 self.assertEqual(StatInfo('1', child_versions={ 93 '404.html': '1', 94 'apps/': '0', 95 'extensions/': '0' 96 }), fs.Stat('/')) 97 self.assertEqual(StatInfo('1'), fs.Stat('404.html')) 98 self.assertEqual(StatInfo('0', child_versions={ 99 'a11y.html': '0', 100 'about_apps.html': '0', 101 'fakedir/': '0', 102 }), fs.Stat('apps/')) 103 self.assertEqual('New version!', fs.ReadSingle('404.html')) 104 105 fs.Update({ 106 '404.html': 'Newer version!', 107 'apps': { 108 'fakedir': { 109 'file.html': 'yo' 110 } 111 } 112 }) 113 114 self.assertEqual(StatInfo('2', child_versions={ 115 '404.html': '2', 116 'apps/': '2', 117 'extensions/': '0' 118 }), fs.Stat('/')) 119 self.assertEqual(StatInfo('2'), fs.Stat('404.html')) 120 self.assertEqual(StatInfo('2', child_versions={ 121 'a11y.html': '0', 122 'about_apps.html': '0', 123 'fakedir/': '2', 124 }), fs.Stat('apps/')) 125 self.assertEqual(StatInfo('0'), fs.Stat('apps/a11y.html')) 126 self.assertEqual(StatInfo('2', child_versions={ 127 'file.html': '2' 128 }), fs.Stat('apps/fakedir/')) 129 self.assertEqual(StatInfo('2'), fs.Stat('apps/fakedir/file.html')) 130 self.assertEqual(StatInfo('0', child_versions={ 131 'activeTab.html': '0', 132 'alarms.html': '0' 133 }), fs.Stat('extensions/')) 134 self.assertEqual('Newer version!', fs.ReadSingle('404.html')) 135 self.assertEqual('yo', fs.ReadSingle('apps/fakedir/file.html')) 136 137 if __name__ == '__main__': 138 unittest.main() 139