blob: 38645229fa71578529aaaf3ee483c5f659f1652b [file] [log] [blame]
Frank Farzan37761d12011-12-01 14:29:08 -08001#!/usr/bin/python
2#
Chris Sosa781ba6d2012-04-11 12:44:43 -07003# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Frank Farzan37761d12011-12-01 14:29:08 -08004# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""Unit tests for devserver_util module."""
8
Chris Sosaea148d92012-03-06 16:22:04 -08009import mox
Frank Farzan37761d12011-12-01 14:29:08 -080010import os
11import shutil
Chris Sosaea148d92012-03-06 16:22:04 -080012import subprocess
Frank Farzan37761d12011-12-01 14:29:08 -080013import tempfile
14import unittest
15
16import devserver_util
Chris Sosa47a7d4e2012-03-28 11:26:55 -070017import downloadable_artifact
18import gsutil_util
Frank Farzan37761d12011-12-01 14:29:08 -080019
20
21# Fake Dev Server Layout:
22TEST_LAYOUT = {
23 'test-board-1': ['R17-1413.0.0-a1-b1346', 'R17-18.0.0-a1-b1346'],
Scott Zawalski16954532012-03-20 15:31:36 -040024 'test-board-2': ['R16-2241.0.0-a0-b2', 'R17-2.0.0-a1-b1346'],
25 'test-board-3': []
Frank Farzan37761d12011-12-01 14:29:08 -080026}
27
28
Chris Sosaea148d92012-03-06 16:22:04 -080029class DevServerUtilTest(mox.MoxTestBase):
Frank Farzan37761d12011-12-01 14:29:08 -080030
31 def setUp(self):
Chris Sosaea148d92012-03-06 16:22:04 -080032 mox.MoxTestBase.setUp(self)
Chris Sosa47a7d4e2012-03-28 11:26:55 -070033 self._static_dir = tempfile.mkdtemp('devserver_util_unittest')
34 self._outside_sandbox_dir = tempfile.mkdtemp('devserver_util_unittest')
35 self._install_dir = tempfile.mkdtemp('devserver_util_unittest')
Frank Farzan37761d12011-12-01 14:29:08 -080036
37 for board, builds in TEST_LAYOUT.iteritems():
38 board_path = os.path.join(self._static_dir, board)
39 os.mkdir(board_path)
40 for build in builds:
41 build_path = os.path.join(board_path, build)
42 os.mkdir(build_path)
43 with open(os.path.join(build_path,
Chris Sosa47a7d4e2012-03-28 11:26:55 -070044 downloadable_artifact.TEST_IMAGE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080045 f.write('TEST_IMAGE')
Chris Sosa47a7d4e2012-03-28 11:26:55 -070046 with open(os.path.join(
47 build_path, downloadable_artifact.STATEFUL_UPDATE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080048 f.write('STATEFUL_UPDATE')
49 with open(os.path.join(build_path,
Chris Sosa47a7d4e2012-03-28 11:26:55 -070050 downloadable_artifact.ROOT_UPDATE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080051 f.write('ROOT_UPDATE')
52 # AU payloads.
53 au_dir = os.path.join(build_path, devserver_util.AU_BASE)
54 nton_dir = os.path.join(au_dir, build + devserver_util.NTON_DIR_SUFFIX)
55 os.makedirs(nton_dir)
56 with open(os.path.join(nton_dir,
Chris Sosa47a7d4e2012-03-28 11:26:55 -070057 downloadable_artifact.ROOT_UPDATE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080058 f.write('ROOT_UPDATE')
59 mton_dir = os.path.join(au_dir, build + devserver_util.MTON_DIR_SUFFIX)
60 os.makedirs(mton_dir)
61 with open(os.path.join(mton_dir,
Chris Sosa47a7d4e2012-03-28 11:26:55 -070062 downloadable_artifact.ROOT_UPDATE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080063 f.write('ROOT_UPDATE')
64
Chris Sosaea148d92012-03-06 16:22:04 -080065 self._good_mock_process = self.mox.CreateMock(subprocess.Popen)
66 self._good_mock_process.returncode = 0
67 self._bad_mock_process = self.mox.CreateMock(subprocess.Popen)
68 self._bad_mock_process.returncode = 1
69
Frank Farzan37761d12011-12-01 14:29:08 -080070 def tearDown(self):
71 shutil.rmtree(self._static_dir)
72 shutil.rmtree(self._outside_sandbox_dir)
Chris Sosa47a7d4e2012-03-28 11:26:55 -070073 shutil.rmtree(self._install_dir)
Frank Farzan37761d12011-12-01 14:29:08 -080074
75 def testParsePayloadList(self):
Chris Sosa1228a1a2012-05-22 17:12:13 -070076 """Tests we can parse the payload list into urls."""
Frank Farzan37761d12011-12-01 14:29:08 -080077 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/'
78 'R17-1413.0.0-a1-b1346/')
79 mton_url = (archive_url_prefix + 'chromeos_R17-1412.0.0-a1-b1345_'
80 'R17-1413.0.0-a1_x86-mario_delta_dev.bin')
81 nton_url = (archive_url_prefix + 'chromeos_R17-1413.0.0-a1_'
82 'R17-1413.0.0-a1_x86-mario_delta_dev.bin')
83 full_url = (archive_url_prefix + 'chromeos_R17-1413.0.0-a1_'
84 'x86-mario_full_dev.bin')
85 full_url_out, nton_url_out, mton_url_out = (
86 devserver_util.ParsePayloadList([full_url, nton_url, mton_url]))
87 self.assertEqual([full_url, nton_url, mton_url],
88 [full_url_out, nton_url_out, mton_url_out])
89
90 archive_url_prefix = ('gs://chromeos-image-archive/x86-alex_he-release/'
91 'R18-1420.0.0-a1-b541')
92 mton_url = (archive_url_prefix + 'chromeos_R18-1418.0.0-a1-b540_'
93 'R18-1420.0.0-a1_x86-alex_he_delta_dev.bin')
94 nton_url = (archive_url_prefix + 'chromeos_R18-1420.0.0-a1_'
95 'R18-1420.0.0-a1_x86-alex_he_delta_dev.bin')
96 full_url = (archive_url_prefix + 'chromeos_R18-1420.0.0-a1_'
97 'x86-alex_he_full_dev.bin')
98 full_url_out, nton_url_out, mton_url_out = (
99 devserver_util.ParsePayloadList([full_url, nton_url, mton_url]))
100 self.assertEqual([full_url, nton_url, mton_url],
101 [full_url_out, nton_url_out, mton_url_out])
102
Chris Sosa1228a1a2012-05-22 17:12:13 -0700103 def testParsePayloadListWithoutDeltas(self):
104 """Tests we can parse the payload list when no delta updates exist."""
105 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/'
106 'R17-1413.0.0-a1-b1346/')
107 full_url = (archive_url_prefix + 'chromeos_R17-1413.0.0-a1_'
108 'x86-mario_full_dev.bin')
109 full_url_out, nton_url_out, mton_url_out = (
110 devserver_util.ParsePayloadList([full_url, '', '']))
111 self.assertEqual([full_url, None, None],
112 [full_url_out, nton_url_out, mton_url_out])
113
Chris Sosa781ba6d2012-04-11 12:44:43 -0700114 def testParsePartialPayloadList(self):
115 """Tests that we can parse a payload list with missing optional payload."""
116 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/'
117 'R17-1413.0.0-a1-b1346/')
118 nton_url = (archive_url_prefix + 'chromeos_R17-1413.0.0-a1_'
119 'R17-1413.0.0-a1_x86-mario_delta_dev.bin')
120 full_url = (archive_url_prefix + 'chromeos_R17-1413.0.0-a1_'
121 'x86-mario_full_dev.bin')
122 full_url_out, nton_url_out, mton_url_out = (
123 devserver_util.ParsePayloadList([full_url, nton_url]))
124 self.assertEqual([full_url, nton_url, None],
125 [full_url_out, nton_url_out, mton_url_out])
126
Frank Farzan37761d12011-12-01 14:29:08 -0800127 def testInstallBuild(self):
Simon Glassf5019de2012-03-20 12:14:41 -0700128 # TODO(frankf): Implement this test
129 # self.fail('Not implemented.')
130 pass
Frank Farzan37761d12011-12-01 14:29:08 -0800131
132 def testPrepareAutotestPkgs(self):
Simon Glassf5019de2012-03-20 12:14:41 -0700133 # TODO(frankf): Implement this test
134 # self.fail('Not implemented.')
Scott Zawalski16954532012-03-20 15:31:36 -0400135 # TODO: implement
Simon Glassf5019de2012-03-20 12:14:41 -0700136 pass
Frank Farzan37761d12011-12-01 14:29:08 -0800137
138 def testSafeSandboxAccess(self):
139 # Path is in sandbox.
140 self.assertTrue(
141 devserver_util.SafeSandboxAccess(
142 self._static_dir, os.path.join(self._static_dir, 'some-board')))
143
144 # Path is sandbox.
145 self.assertFalse(
146 devserver_util.SafeSandboxAccess(self._static_dir, self._static_dir))
147
148 # Path is outside the sandbox.
149 self.assertFalse(
150 devserver_util.SafeSandboxAccess(self._static_dir,
151 self._outside_sandbox_dir))
152
153 # Path contains '..'.
154 self.assertFalse(
155 devserver_util.SafeSandboxAccess(
156 self._static_dir, os.path.join(self._static_dir, os.pardir)))
157
158 # Path contains symbolic link references.
159 os.chdir(self._static_dir)
160 os.symlink(os.pardir, 'parent')
161 self.assertFalse(
162 devserver_util.SafeSandboxAccess(
163 self._static_dir, os.path.join(self._static_dir, os.pardir)))
164
165 def testAcquireReleaseLocks(self):
166 # Successful lock and unlock.
167 lock_file = devserver_util.AcquireLock(self._static_dir, 'test-lock')
168 self.assertTrue(os.path.exists(lock_file))
169 devserver_util.ReleaseLock(self._static_dir, 'test-lock')
170 self.assertFalse(os.path.exists(lock_file))
171
172 # Attempt to lock an existing directory.
173 devserver_util.AcquireLock(self._static_dir, 'test-lock')
174 self.assertRaises(devserver_util.DevServerUtilError,
175 devserver_util.AcquireLock, self._static_dir, 'test-lock')
176
177 def testFindMatchingBoards(self):
178 for key in TEST_LAYOUT:
179 # Partial match with multiple boards.
180 self.assertEqual(
181 set(devserver_util.FindMatchingBoards(self._static_dir, key[:-5])),
182 set(TEST_LAYOUT.keys()))
183
184 # Absolute match.
185 self.assertEqual(
186 devserver_util.FindMatchingBoards(self._static_dir, key), [key])
187
188 # Invalid partial match.
189 self.assertEqual(
190 devserver_util.FindMatchingBoards(self._static_dir, 'asdfsadf'), [])
191
192 def testFindMatchingBuilds(self):
193 # Try a partial board and build match with single match.
194 self.assertEqual(
195 devserver_util.FindMatchingBuilds(self._static_dir, 'test-board',
196 'R17-1413'),
197 [('test-board-1', 'R17-1413.0.0-a1-b1346')])
198
199 # Try a partial board and build match with multiple match.
200 actual = set(devserver_util.FindMatchingBuilds(
201 self._static_dir, 'test-board', 'R17'))
202 expected = set([('test-board-1', 'R17-1413.0.0-a1-b1346'),
203 ('test-board-1', 'R17-18.0.0-a1-b1346'),
204 ('test-board-2', 'R17-2.0.0-a1-b1346')])
205 self.assertEqual(actual, expected)
206
207 def testGetLatestBuildVersion(self):
208 self.assertEqual(
209 devserver_util.GetLatestBuildVersion(self._static_dir, 'test-board-1'),
210 'R17-1413.0.0-a1-b1346')
211
Scott Zawalski16954532012-03-20 15:31:36 -0400212 def testGetLatestBuildVersionLatest(self):
213 """Test that we raise DevServerUtilError when a build dir is empty."""
214 self.assertRaises(devserver_util.DevServerUtilError,
215 devserver_util.GetLatestBuildVersion,
216 self._static_dir, 'test-board-3')
Frank Farzan37761d12011-12-01 14:29:08 -0800217
Scott Zawalski16954532012-03-20 15:31:36 -0400218 def testGetLatestBuildVersionUnknownBuild(self):
219 """Test that we raise DevServerUtilError when a build dir does not exist."""
220 self.assertRaises(devserver_util.DevServerUtilError,
221 devserver_util.GetLatestBuildVersion,
222 self._static_dir, 'bad-dir')
Frank Farzan37761d12011-12-01 14:29:08 -0800223
Scott Zawalski16954532012-03-20 15:31:36 -0400224 def testGetLatestBuildVersionMilestone(self):
225 """Test that we can get builds based on milestone."""
226 expected_build_str = 'R16-2241.0.0-a0-b2'
227 milestone = 'R16'
228 build_str = devserver_util.GetLatestBuildVersion(
229 self._static_dir, 'test-board-2', milestone)
230 self.assertEqual(expected_build_str, build_str)
Frank Farzan37761d12011-12-01 14:29:08 -0800231
232 def testCloneBuild(self):
233 test_prefix = 'abc'
234 test_tag = test_prefix + '/123'
235 abc_path = os.path.join(self._static_dir, devserver_util.DEV_BUILD_PREFIX,
236 test_tag)
237
238 os.mkdir(os.path.join(self._static_dir, test_prefix))
239
240 # Verify leaf path is created and proper values returned.
241 board, builds = TEST_LAYOUT.items()[0]
242 dev_build = devserver_util.CloneBuild(self._static_dir, board, builds[0],
243 test_tag)
244 self.assertEquals(dev_build, abc_path)
245 self.assertTrue(os.path.exists(abc_path))
246 self.assertTrue(os.path.isfile(os.path.join(
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700247 abc_path, downloadable_artifact.TEST_IMAGE)))
Frank Farzan37761d12011-12-01 14:29:08 -0800248 self.assertTrue(os.path.isfile(os.path.join(
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700249 abc_path, downloadable_artifact.ROOT_UPDATE)))
Frank Farzan37761d12011-12-01 14:29:08 -0800250 self.assertTrue(os.path.isfile(os.path.join(
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700251 abc_path, downloadable_artifact.STATEFUL_UPDATE)))
Frank Farzan37761d12011-12-01 14:29:08 -0800252
253 # Verify force properly removes the old directory.
254 junk_path = os.path.join(dev_build, 'junk')
255 with open(junk_path, 'w') as f:
256 f.write('hello!')
257 remote_dir = devserver_util.CloneBuild(
258 self._static_dir, board, builds[0], test_tag, force=True)
259 self.assertEquals(remote_dir, abc_path)
260 self.assertTrue(os.path.exists(abc_path))
261 self.assertTrue(os.path.isfile(os.path.join(
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700262 abc_path, downloadable_artifact.TEST_IMAGE)))
Frank Farzan37761d12011-12-01 14:29:08 -0800263 self.assertTrue(os.path.isfile(os.path.join(
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700264 abc_path, downloadable_artifact.ROOT_UPDATE)))
Frank Farzan37761d12011-12-01 14:29:08 -0800265 self.assertTrue(os.path.isfile(os.path.join(
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700266 abc_path, downloadable_artifact.STATEFUL_UPDATE)))
Frank Farzan37761d12011-12-01 14:29:08 -0800267 self.assertFalse(os.path.exists(junk_path))
268
269 def testGetControlFile(self):
270 control_file_dir = os.path.join(
Chris Sosaea148d92012-03-06 16:22:04 -0800271 self._static_dir, 'test-board-1', 'R17-1413.0.0-a1-b1346', 'autotest',
272 'server', 'site_tests', 'network_VPN')
Frank Farzan37761d12011-12-01 14:29:08 -0800273 os.makedirs(control_file_dir)
274 with open(os.path.join(control_file_dir, 'control'), 'w') as f:
275 f.write('hello!')
276
277 control_content = devserver_util.GetControlFile(
Chris Sosaea148d92012-03-06 16:22:04 -0800278 self._static_dir, 'test-board-1/R17-1413.0.0-a1-b1346',
Frank Farzan37761d12011-12-01 14:29:08 -0800279 os.path.join('server', 'site_tests', 'network_VPN', 'control'))
280 self.assertEqual(control_content, 'hello!')
281
282 def testListAutoupdateTargets(self):
283 for board, builds in TEST_LAYOUT.iteritems():
284 for build in builds:
285 au_targets = devserver_util.ListAutoupdateTargets(self._static_dir,
286 board, build)
287 self.assertEqual(set(au_targets),
288 set([build + devserver_util.NTON_DIR_SUFFIX,
289 build + devserver_util.MTON_DIR_SUFFIX]))
290
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700291 def testGatherArtifactDownloads(self):
292 """Tests that we can gather the correct download requirements."""
293 build = 'R17-1413.0.0-a1-b1346'
294 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/' +
295 build)
296 mock_data = 'mock data\nmock_data\nmock_data'
297 payloads = map(lambda x: '/'.join([archive_url_prefix, x]),
298 ['p1', 'p2', 'p3'])
299 expected_payloads = payloads + map(
300 lambda x: '/'.join([archive_url_prefix, x]),
Chris Masone3fe44db2012-05-02 10:50:21 -0700301 [downloadable_artifact.STATEFUL_UPDATE,
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700302 downloadable_artifact.AUTOTEST_PACKAGE,
303 downloadable_artifact.TEST_SUITES_PACKAGE])
304 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
305 self.mox.StubOutWithMock(devserver_util, 'ParsePayloadList')
306
307 # GSUtil ls.
308 gsutil_util.GSUtilRun(mox.StrContains(archive_url_prefix),
309 mox.IgnoreArg()).AndReturn(mock_data)
310 devserver_util.ParsePayloadList(mock_data.splitlines()).AndReturn(payloads)
311
312 self.mox.ReplayAll()
313 artifacts = devserver_util.GatherArtifactDownloads(
Chris Masone3fe44db2012-05-02 10:50:21 -0700314 self._static_dir, archive_url_prefix, build, self._install_dir)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700315 for index, artifact in enumerate(artifacts):
316 self.assertEqual(artifact._gs_path, expected_payloads[index])
317 self.assertTrue(artifact._tmp_staging_dir.startswith(self._static_dir))
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700318
319 self.mox.VerifyAll()
320
Chris Sosa781ba6d2012-04-11 12:44:43 -0700321 def testGatherArtifactDownloadsWithoutMton(self):
322 """Gather the correct download requirements without mton delta."""
323 build = 'R17-1413.0.0-a1-b1346'
324 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/' +
325 build)
326 mock_data = 'mock data\nmock_data'
327 payloads = map(lambda x: '/'.join([archive_url_prefix, x]),
328 ['p1', 'p2'])
329 expected_payloads = payloads + map(
330 lambda x: '/'.join([archive_url_prefix, x]),
Chris Masone3fe44db2012-05-02 10:50:21 -0700331 [downloadable_artifact.STATEFUL_UPDATE,
Chris Sosa781ba6d2012-04-11 12:44:43 -0700332 downloadable_artifact.AUTOTEST_PACKAGE,
333 downloadable_artifact.TEST_SUITES_PACKAGE])
334 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
335 self.mox.StubOutWithMock(devserver_util, 'ParsePayloadList')
336
337 # GSUtil ls.
338 gsutil_util.GSUtilRun(mox.StrContains(archive_url_prefix),
339 mox.IgnoreArg()).AndReturn(mock_data)
340 devserver_util.ParsePayloadList(mock_data.splitlines()).AndReturn(
341 payloads + [None])
342
343 self.mox.ReplayAll()
344 artifacts = devserver_util.GatherArtifactDownloads(
Chris Masone3fe44db2012-05-02 10:50:21 -0700345 self._static_dir, archive_url_prefix, build, self._install_dir)
Chris Sosa781ba6d2012-04-11 12:44:43 -0700346 for index, artifact in enumerate(artifacts):
347 self.assertEqual(artifact._gs_path, expected_payloads[index])
348 self.assertTrue(artifact._tmp_staging_dir.startswith(self._static_dir))
Chris Sosa1228a1a2012-05-22 17:12:13 -0700349
350 self.mox.VerifyAll()
351
352 def testGatherArtifactDownloadsWithoutMtonOrNton(self):
353 """Gather the correct download requirements without delta payloads."""
354 build = 'R17-1413.0.0-a1-b1346'
355 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/' +
356 build)
357 mock_data = 'mock data\nmock_data'
358 payloads = map(lambda x: '/'.join([archive_url_prefix, x]),
359 ['p1'])
360 expected_payloads = payloads + map(
361 lambda x: '/'.join([archive_url_prefix, x]),
362 [downloadable_artifact.STATEFUL_UPDATE,
363 downloadable_artifact.AUTOTEST_PACKAGE,
364 downloadable_artifact.TEST_SUITES_PACKAGE])
365 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
366 self.mox.StubOutWithMock(devserver_util, 'ParsePayloadList')
367
368 # GSUtil ls.
369 gsutil_util.GSUtilRun(mox.StrContains(archive_url_prefix),
370 mox.IgnoreArg()).AndReturn(mock_data)
371 devserver_util.ParsePayloadList(mock_data.splitlines()).AndReturn(
372 payloads + [None, None])
373
374 self.mox.ReplayAll()
375 artifacts = devserver_util.GatherArtifactDownloads(
376 self._static_dir, archive_url_prefix, build, self._install_dir)
377 for index, artifact in enumerate(artifacts):
378 self.assertEqual(artifact._gs_path, expected_payloads[index])
379 self.assertTrue(artifact._tmp_staging_dir.startswith(self._static_dir))
Chris Sosa781ba6d2012-04-11 12:44:43 -0700380
381 self.mox.VerifyAll()
382
Chris Masone816e38c2012-05-02 12:22:36 -0700383 def testGatherSymbolArtifactDownloads(self):
384 """Tests that we can find debug symbol artifacts to download."""
385 build = 'R17-1413.0.0-a1-b1346'
386 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/' +
387 build)
388 symbol_url = archive_url_prefix + '/' + downloadable_artifact.DEBUG_SYMBOLS
389 mock_data = 'mock data\nmock_data\nmock_data'
390 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
391 self.mox.StubOutWithMock(devserver_util, 'ParsePayloadList')
392
393 # GSUtil ls.
394 gsutil_util.GSUtilRun(mox.StrContains(symbol_url),
395 mox.IgnoreArg()).AndReturn(mock_data)
396
397 self.mox.ReplayAll()
398 artifacts = devserver_util.GatherSymbolArtifactDownloads(
399 self._static_dir, archive_url_prefix, self._install_dir)
400 for index, artifact in enumerate(artifacts):
401 self.assertEqual(artifact._gs_path, symbol_url)
402 self.assertTrue(artifact._tmp_staging_dir.startswith(self._static_dir))
403
404 self.mox.VerifyAll()
405
406 def testGatherSymbolArtifactDownloadsWithRetry(self):
407 """Tests that we can poll for debug symbol artifacts to download."""
408 build = 'R17-1413.0.0-a1-b1346'
409 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/' +
410 build)
411 symbol_url = archive_url_prefix + '/' + downloadable_artifact.DEBUG_SYMBOLS
412 mock_data = 'mock data\nmock_data\nmock_data'
413 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
414 self.mox.StubOutWithMock(devserver_util, 'ParsePayloadList')
415
416 # GSUtil ls.
417 gsutil_util.GSUtilRun(mox.StrContains(symbol_url),
418 mox.IgnoreArg()).AndRaise(gsutil_util.GSUtilError())
419 gsutil_util.GSUtilRun(mox.StrContains(symbol_url),
420 mox.IgnoreArg()).AndReturn(mock_data)
421
422 self.mox.ReplayAll()
423 artifacts = devserver_util.GatherSymbolArtifactDownloads(
424 self._static_dir, archive_url_prefix, self._install_dir, delay=1)
425 for index, artifact in enumerate(artifacts):
426 self.assertEqual(artifact._gs_path, symbol_url)
427 self.assertTrue(artifact._tmp_staging_dir.startswith(self._static_dir))
428
429 self.mox.VerifyAll()
430
431 def testGatherSymbolArtifactDownloadsFailAfterRetry(self):
432 """Tests that we can poll for debug symbol artifacts to download."""
433 build = 'R17-1413.0.0-a1-b1346'
434 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/' +
435 build)
436 symbol_url = archive_url_prefix + '/' + downloadable_artifact.DEBUG_SYMBOLS
437 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
438 self.mox.StubOutWithMock(devserver_util, 'ParsePayloadList')
439
440 # GSUtil ls.
441 gsutil_util.GSUtilRun(mox.StrContains(symbol_url),
442 mox.IgnoreArg()
443 ).MultipleTimes().AndRaise(gsutil_util.GSUtilError())
444
445 self.mox.ReplayAll()
446 self.assertRaises(gsutil_util.GSUtilError,
447 devserver_util.GatherSymbolArtifactDownloads,
448 self._static_dir,
449 archive_url_prefix,
450 self._install_dir,
451 timeout=1,
452 delay=1)
453 self.mox.VerifyAll()
454
Frank Farzan37761d12011-12-01 14:29:08 -0800455
456if __name__ == '__main__':
457 unittest.main()