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