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 future = fs.ReadSingle('apps/') 41 self.assertTrue(*fs.CheckAndReset(read_count=1)) 42 future.Get() 43 self.assertTrue(*fs.CheckAndReset(read_resolve_count=1)) 44 self.assertFalse(*fs.CheckAndReset(read_count=1)) 45 self.assertTrue(*fs.CheckAndReset()) 46 47 future = fs.ReadSingle('apps/') 48 self.assertFalse(*fs.CheckAndReset(read_count=2)) 49 future.Get() 50 self.assertFalse(*fs.CheckAndReset(read_resolve_count=2)) 51 52 fs.ReadSingle('extensions/').Get() 53 fs.ReadSingle('extensions/').Get() 54 self.assertTrue(*fs.CheckAndReset(read_count=2, read_resolve_count=2)) 55 self.assertFalse(*fs.CheckAndReset(read_count=2, read_resolve_count=2)) 56 self.assertTrue(*fs.CheckAndReset()) 57 58 fs.ReadSingle('404.html').Get() 59 self.assertTrue(*fs.CheckAndReset(read_count=1, read_resolve_count=1)) 60 future = fs.Read(['notfound.html', 'apps/']) 61 self.assertTrue(*fs.CheckAndReset(read_count=1)) 62 self.assertRaises(FileNotFoundError, future.Get) 63 self.assertTrue(*fs.CheckAndReset(read_resolve_count=1)) 64 65 fs.Stat('404.html') 66 fs.Stat('404.html') 67 fs.Stat('apps/') 68 self.assertFalse(*fs.CheckAndReset(stat_count=42)) 69 self.assertFalse(*fs.CheckAndReset(stat_count=42)) 70 self.assertTrue(*fs.CheckAndReset()) 71 72 fs.ReadSingle('404.html').Get() 73 fs.Stat('404.html') 74 fs.Stat('apps/') 75 self.assertTrue( 76 *fs.CheckAndReset(read_count=1, read_resolve_count=1, stat_count=2)) 77 self.assertTrue(*fs.CheckAndReset()) 78 79 def testUpdates(self): 80 fs = MockFileSystem(TestFileSystem(deepcopy(_TEST_DATA))) 81 82 self.assertEqual(StatInfo('0', child_versions={ 83 '404.html': '0', 84 'apps/': '0', 85 'extensions/': '0' 86 }), fs.Stat('')) 87 self.assertEqual(StatInfo('0'), fs.Stat('404.html')) 88 self.assertEqual(StatInfo('0', child_versions={ 89 'a11y.html': '0', 90 'about_apps.html': '0', 91 'fakedir/': '0', 92 }), fs.Stat('apps/')) 93 self.assertEqual('404.html contents', fs.ReadSingle('404.html').Get()) 94 95 fs.Update({ 96 '404.html': 'New version!' 97 }) 98 99 self.assertEqual(StatInfo('1', child_versions={ 100 '404.html': '1', 101 'apps/': '0', 102 'extensions/': '0' 103 }), fs.Stat('')) 104 self.assertEqual(StatInfo('1'), fs.Stat('404.html')) 105 self.assertEqual(StatInfo('0', child_versions={ 106 'a11y.html': '0', 107 'about_apps.html': '0', 108 'fakedir/': '0', 109 }), fs.Stat('apps/')) 110 self.assertEqual('New version!', fs.ReadSingle('404.html').Get()) 111 112 fs.Update({ 113 '404.html': 'Newer version!', 114 'apps': { 115 'fakedir': { 116 'file.html': 'yo' 117 } 118 } 119 }) 120 121 self.assertEqual(StatInfo('2', child_versions={ 122 '404.html': '2', 123 'apps/': '2', 124 'extensions/': '0' 125 }), fs.Stat('')) 126 self.assertEqual(StatInfo('2'), fs.Stat('404.html')) 127 self.assertEqual(StatInfo('2', child_versions={ 128 'a11y.html': '0', 129 'about_apps.html': '0', 130 'fakedir/': '2', 131 }), fs.Stat('apps/')) 132 self.assertEqual(StatInfo('0'), fs.Stat('apps/a11y.html')) 133 self.assertEqual(StatInfo('2', child_versions={ 134 'file.html': '2' 135 }), fs.Stat('apps/fakedir/')) 136 self.assertEqual(StatInfo('2'), fs.Stat('apps/fakedir/file.html')) 137 self.assertEqual(StatInfo('0', child_versions={ 138 'activeTab.html': '0', 139 'alarms.html': '0' 140 }), fs.Stat('extensions/')) 141 self.assertEqual('Newer version!', fs.ReadSingle('404.html').Get()) 142 self.assertEqual('yo', fs.ReadSingle('apps/fakedir/file.html').Get()) 143 144 if __name__ == '__main__': 145 unittest.main() 146