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 host_file_system_provider import HostFileSystemProvider 10from host_file_system_iterator import HostFileSystemIterator 11from object_store_creator import ObjectStoreCreator 12from test_branch_utility import TestBranchUtility 13from test_data.canned_data import CANNED_API_FILE_SYSTEM_DATA 14from test_file_system import TestFileSystem 15 16 17def _GetIterationTracker(version): 18 '''Adds the ChannelInfo object from each iteration to a list, and signals the 19 loop to stop when |version| is reached. 20 ''' 21 iterations = [] 22 def callback(file_system, channel_info): 23 if channel_info.version == version: 24 return False 25 iterations.append(channel_info) 26 return True 27 return (iterations, callback) 28 29 30class HostFileSystemIteratorTest(unittest.TestCase): 31 32 def setUp(self): 33 def host_file_system_constructor(branch, **optargs): 34 return TestFileSystem(deepcopy(CANNED_API_FILE_SYSTEM_DATA[branch])) 35 host_file_system_provider = HostFileSystemProvider( 36 ObjectStoreCreator.ForTest(), 37 constructor_for_test=host_file_system_constructor) 38 self._branch_utility = TestBranchUtility.CreateWithCannedData() 39 self._iterator = HostFileSystemIterator( 40 host_file_system_provider, 41 self._branch_utility) 42 43 def _GetStableChannelInfo(self,version): 44 return self._branch_utility.GetStableChannelInfo(version) 45 46 def _GetChannelInfo(self, channel_name): 47 return self._branch_utility.GetChannelInfo(channel_name) 48 49 def testAscending(self): 50 # Start at |stable| version 5, and move up towards |master|. 51 # Total: 28 file systems. 52 iterations, callback = _GetIterationTracker(0) 53 self.assertEqual( 54 self._iterator.Ascending(self._GetStableChannelInfo(5), callback), 55 self._GetChannelInfo('master')) 56 self.assertEqual(len(iterations), 28) 57 58 # Start at |stable| version 5, and move up towards |master|. The callback 59 # fails at |beta|, so the last successful callback was the latest version 60 # of |stable|. Total: 25 file systems. 61 iterations, callback = _GetIterationTracker( 62 self._GetChannelInfo('beta').version) 63 self.assertEqual( 64 self._iterator.Ascending(self._GetStableChannelInfo(5), callback), 65 self._GetChannelInfo('stable')) 66 self.assertEqual(len(iterations), 25) 67 68 # Start at |stable| version 5, and the callback fails immediately. Since 69 # no file systems are successfully processed, expect a return of None. 70 iterations, callback = _GetIterationTracker(5) 71 self.assertEqual( 72 self._iterator.Ascending(self._GetStableChannelInfo(5), callback), 73 None) 74 self.assertEqual([], iterations) 75 76 # Start at |stable| version 5, and the callback fails at version 6. 77 # The return should represent |stable| version 5. 78 iterations, callback = _GetIterationTracker(6) 79 self.assertEqual( 80 self._iterator.Ascending(self._GetStableChannelInfo(5), callback), 81 self._GetStableChannelInfo(5)) 82 self.assertEqual([self._GetStableChannelInfo(5)], iterations) 83 84 # Start at the latest version of |stable|, and the callback fails at 85 # |master|. Total: 3 file systems. 86 iterations, callback = _GetIterationTracker('master') 87 self.assertEqual( 88 self._iterator.Ascending(self._GetChannelInfo('stable'), callback), 89 self._GetChannelInfo('dev')) 90 self.assertEqual([self._GetChannelInfo('stable'), 91 self._GetChannelInfo('beta'), 92 self._GetChannelInfo('dev')], iterations) 93 94 # Start at |stable| version 10, and the callback fails at |master|. 95 iterations, callback = _GetIterationTracker('master') 96 self.assertEqual( 97 self._iterator.Ascending(self._GetStableChannelInfo(10), callback), 98 self._GetChannelInfo('dev')) 99 self.assertEqual([self._GetStableChannelInfo(10), 100 self._GetStableChannelInfo(11), 101 self._GetStableChannelInfo(12), 102 self._GetStableChannelInfo(13), 103 self._GetStableChannelInfo(14), 104 self._GetStableChannelInfo(15), 105 self._GetStableChannelInfo(16), 106 self._GetStableChannelInfo(17), 107 self._GetStableChannelInfo(18), 108 self._GetStableChannelInfo(19), 109 self._GetStableChannelInfo(20), 110 self._GetStableChannelInfo(21), 111 self._GetStableChannelInfo(22), 112 self._GetStableChannelInfo(23), 113 self._GetStableChannelInfo(24), 114 self._GetStableChannelInfo(25), 115 self._GetStableChannelInfo(26), 116 self._GetStableChannelInfo(27), 117 self._GetStableChannelInfo(28), 118 self._GetChannelInfo('stable'), 119 self._GetChannelInfo('beta'), 120 self._GetChannelInfo('dev')], iterations) 121 122 def testDescending(self): 123 # Start at |master|, and the callback fails immediately. No file systems 124 # are successfully processed, so Descending() will return None. 125 iterations, callback = _GetIterationTracker('master') 126 self.assertEqual( 127 self._iterator.Descending(self._GetChannelInfo('master'), callback), 128 None) 129 self.assertEqual([], iterations) 130 131 # Start at |master|, and the callback fails at |dev|. Last good iteration 132 # should be |master|. 133 iterations, callback = _GetIterationTracker( 134 self._GetChannelInfo('dev').version) 135 self.assertEqual( 136 self._iterator.Descending(self._GetChannelInfo('master'), callback), 137 self._GetChannelInfo('master')) 138 self.assertEqual([self._GetChannelInfo('master')], iterations) 139 140 # Start at |master|, and then move from |dev| down to |stable| at version 5. 141 # Total: 28 file systems. 142 iterations, callback = _GetIterationTracker(0) 143 self.assertEqual( 144 self._iterator.Descending(self._GetChannelInfo('master'), callback), 145 self._GetStableChannelInfo(5)) 146 self.assertEqual(len(iterations), 28) 147 148 # Start at the latest version of |stable|, and move down to |stable| at 149 # version 5. Total: 25 file systems. 150 iterations, callback = _GetIterationTracker(0) 151 self.assertEqual( 152 self._iterator.Descending(self._GetChannelInfo('stable'), callback), 153 self._GetStableChannelInfo(5)) 154 self.assertEqual(len(iterations), 25) 155 156 # Start at |dev| and iterate down through |stable| versions. The callback 157 # fails at version 10. Total: 18 file systems. 158 iterations, callback = _GetIterationTracker(10) 159 self.assertEqual( 160 self._iterator.Descending(self._GetChannelInfo('dev'), callback), 161 self._GetStableChannelInfo(11)) 162 self.assertEqual([self._GetChannelInfo('dev'), 163 self._GetChannelInfo('beta'), 164 self._GetChannelInfo('stable'), 165 self._GetStableChannelInfo(28), 166 self._GetStableChannelInfo(27), 167 self._GetStableChannelInfo(26), 168 self._GetStableChannelInfo(25), 169 self._GetStableChannelInfo(24), 170 self._GetStableChannelInfo(23), 171 self._GetStableChannelInfo(22), 172 self._GetStableChannelInfo(21), 173 self._GetStableChannelInfo(20), 174 self._GetStableChannelInfo(19), 175 self._GetStableChannelInfo(18), 176 self._GetStableChannelInfo(17), 177 self._GetStableChannelInfo(16), 178 self._GetStableChannelInfo(15), 179 self._GetStableChannelInfo(14), 180 self._GetStableChannelInfo(13), 181 self._GetStableChannelInfo(12), 182 self._GetStableChannelInfo(11)], iterations) 183 184 185if __name__ == '__main__': 186 unittest.main() 187