Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(64)

Side by Side Diff: tests/gclient_test.py

Issue 6598087: Fix parallelization of multiple solutions. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/depot_tools
Patch Set: Fix the issue once for real Created 9 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« gclient.py ('K') | « gclient.py ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2011 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Unit tests for gclient.py. 6 """Unit tests for gclient.py.
7 7
8 See gclient_smoketest.py for integration tests. 8 See gclient_smoketest.py for integration tests.
9 """ 9 """
10 10
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
87 # fetched until 'src' is done. 87 # fetched until 'src' is done.
88 # jobs is the number of parallel jobs simulated. reverse is to reshuffle the 88 # jobs is the number of parallel jobs simulated. reverse is to reshuffle the
89 # list to see if it is still processed in order correctly. 89 # list to see if it is still processed in order correctly.
90 parser = gclient.Parser() 90 parser = gclient.Parser()
91 options, args = parser.parse_args(['--jobs', jobs]) 91 options, args = parser.parse_args(['--jobs', jobs])
92 write( 92 write(
93 '.gclient', 93 '.gclient',
94 'solutions = [\n' 94 'solutions = [\n'
95 ' { "name": "foo", "url": "svn://example.com/foo" },\n' 95 ' { "name": "foo", "url": "svn://example.com/foo" },\n'
96 ' { "name": "bar", "url": "svn://example.com/bar" },\n' 96 ' { "name": "bar", "url": "svn://example.com/bar" },\n'
97 ' { "name": "bar/empty", "url": "svn://example.com/bar_empty" },\n'
97 ']') 98 ']')
98 write( 99 write(
99 os.path.join('foo', 'DEPS'), 100 os.path.join('foo', 'DEPS'),
100 'deps = {\n' 101 'deps = {\n'
101 ' "foo/dir1": "/dir1",\n' 102 ' "foo/dir1": "/dir1",\n'
102 ' "foo/dir1/dir2/dir3": "/dir1/dir2/dir3",\n' 103 ' "foo/dir1/dir2/dir3": "/dir1/dir2/dir3",\n'
103 ' "foo/dir1/dir4": "/dir1/dir4",\n' 104 ' "foo/dir1/dir4": "/dir1/dir4",\n'
104 ' "foo/dir1/dir2/dir3/dir4": "/dir1/dir2/dir3/dir4",\n' 105 ' "foo/dir1/dir2/dir3/dir4": "/dir1/dir2/dir3/dir4",\n'
105 '}') 106 '}')
106 write( 107 write(
107 os.path.join('bar', 'DEPS'), 108 os.path.join('bar', 'DEPS'),
108 'deps = {\n' 109 'deps = {\n'
109 ' "foo/dir1/dir2": "/dir1/dir2",\n' 110 ' "foo/dir1/dir2": "/dir1/dir2",\n'
110 '}') 111 '}')
112 write(
113 os.path.join('bar/empty', 'DEPS'),
114 'deps = {\n'
115 '}')
111 116
112 obj = gclient.GClient.LoadCurrentConfig(options) 117 obj = gclient.GClient.LoadCurrentConfig(options)
113 self._check_requirements(obj.dependencies[0], {}) 118 self._check_requirements(obj.dependencies[0], {})
114 self._check_requirements(obj.dependencies[1], {}) 119 self._check_requirements(obj.dependencies[1], {})
115 obj.RunOnDeps('None', args) 120 obj.RunOnDeps('None', args)
116 # The trick here is to manually process the list to make sure it's out of 121 # The trick here is to manually process the list to make sure it's out of
117 # order. 122 # order.
118 obj.dependencies[0].dependencies.sort(key=lambda x: x.name, reverse=reverse) 123 for i in obj.dependencies:
124 i.dependencies.sort(key=lambda x: x.name, reverse=reverse)
119 actual = self._get_processed() 125 actual = self._get_processed()
120 # We don't care of the ordering of this item. 126 # We don't care of the ordering of these items:
127 self.assertEquals(
128 ['svn://example.com/bar', 'svn://example.com/foo'], sorted(actual[0:2]))
129 actual = actual[2:]
130 # Ordering may not be exact in case of parallel jobs.
131 self.assertGreater(
132 actual.index('svn://example.com/bar/dir1/dir2'),
133 actual.index('svn://example.com/foo/dir1'))
121 actual.remove('svn://example.com/bar/dir1/dir2') 134 actual.remove('svn://example.com/bar/dir1/dir2')
135
136 # Ordering may not be exact in case of parallel jobs.
137 actual.remove('svn://example.com/bar_empty')
122 self.assertEquals( 138 self.assertEquals(
123 [ 139 [
124 'svn://example.com/foo',
125 'svn://example.com/bar',
126 'svn://example.com/foo/dir1', 140 'svn://example.com/foo/dir1',
127 'svn://example.com/foo/dir1/dir4', 141 'svn://example.com/foo/dir1/dir4',
128 'svn://example.com/foo/dir1/dir2/dir3', 142 'svn://example.com/foo/dir1/dir2/dir3',
129 'svn://example.com/foo/dir1/dir2/dir3/dir4', 143 'svn://example.com/foo/dir1/dir2/dir3/dir4',
130 ], 144 ],
131 actual) 145 actual)
132 self._check_requirements( 146 self._check_requirements(
133 obj.dependencies[0], 147 obj.dependencies[0],
134 { 148 {
135 'foo/dir1': ['foo'], 149 'foo/dir1': ['foo'],
136 'foo/dir1/dir2/dir3': ['foo', 'foo/dir1'], 150 'foo/dir1/dir2/dir3': ['foo', 'foo/dir1', 'foo/dir1/dir2'],
137 'foo/dir1/dir2/dir3/dir4': ['foo', 'foo/dir1', 'foo/dir1/dir2/dir3'], 151 'foo/dir1/dir2/dir3/dir4':
152 ['foo', 'foo/dir1', 'foo/dir1/dir2', 'foo/dir1/dir2/dir3'],
138 'foo/dir1/dir4': ['foo', 'foo/dir1'], 153 'foo/dir1/dir4': ['foo', 'foo/dir1'],
139 }) 154 })
140 self._check_requirements( 155 self._check_requirements(
141 obj.dependencies[1], 156 obj.dependencies[1],
142 { 157 {
143 'foo/dir1/dir2': ['bar'], 158 'foo/dir1/dir2': ['bar', 'foo', 'foo/dir1'],
159 })
160 self._check_requirements(
161 obj,
162 {
163 'foo': [],
164 'bar': [],
165 'bar/empty': ['bar'],
144 }) 166 })
145 167
146 def _check_requirements(self, solution, expected): 168 def _check_requirements(self, solution, expected):
147 for dependency in solution.dependencies: 169 for dependency in solution.dependencies:
148 self.assertEquals(expected.pop(dependency.name), dependency.requirements) 170 self.assertEquals(
171 expected.pop(dependency.name), sorted(dependency.requirements))
149 self.assertEquals({}, expected) 172 self.assertEquals({}, expected)
150 173
151 def _get_processed(self): 174 def _get_processed(self):
152 items = [] 175 items = []
153 try: 176 try:
154 while True: 177 while True:
155 items.append(self.processed.get_nowait()) 178 items.append(self.processed.get_nowait())
156 except Queue.Empty: 179 except Queue.Empty:
157 pass 180 pass
158 return items 181 return items
159 182
160 183
161 if __name__ == '__main__': 184 if __name__ == '__main__':
162 logging.basicConfig( 185 logging.basicConfig(
163 level=[logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG][ 186 level=[logging.ERROR, logging.WARNING, logging.INFO, logging.DEBUG][
164 min(sys.argv.count('-v'), 3)], 187 min(sys.argv.count('-v'), 3)],
165 format='%(asctime).19s %(levelname)s %(filename)s:' 188 format='%(asctime).19s %(levelname)s %(filename)s:'
166 '%(lineno)s %(message)s') 189 '%(lineno)s %(message)s')
167 unittest.main() 190 unittest.main()
OLDNEW
« gclient.py ('K') | « gclient.py ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698