blob: 421f400c30fb6ba3572a5db57f39c8263c3a9407 [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
Gilad Arnoldc65330c2012-09-20 15:17:48 -07007"""Unit tests for common_util module."""
Frank Farzan37761d12011-12-01 14:29:08 -08008
9import os
10import shutil
Chris Sosaea148d92012-03-06 16:22:04 -080011import subprocess
Frank Farzan37761d12011-12-01 14:29:08 -080012import tempfile
13import unittest
14
Gilad Arnoldabb352e2012-09-23 01:24:27 -070015import mox
16
Gilad Arnoldc65330c2012-09-20 15:17:48 -070017import build_artifact
18import common_util
Chris Sosa47a7d4e2012-03-28 11:26:55 -070019import gsutil_util
Frank Farzan37761d12011-12-01 14:29:08 -080020
21
22# Fake Dev Server Layout:
23TEST_LAYOUT = {
24 'test-board-1': ['R17-1413.0.0-a1-b1346', 'R17-18.0.0-a1-b1346'],
Scott Zawalski16954532012-03-20 15:31:36 -040025 'test-board-2': ['R16-2241.0.0-a0-b2', 'R17-2.0.0-a1-b1346'],
26 'test-board-3': []
Frank Farzan37761d12011-12-01 14:29:08 -080027}
28
29
Gilad Arnold17fe03d2012-10-02 10:05:01 -070030class CommonUtilTest(mox.MoxTestBase):
Frank Farzan37761d12011-12-01 14:29:08 -080031
32 def setUp(self):
Chris Sosaea148d92012-03-06 16:22:04 -080033 mox.MoxTestBase.setUp(self)
Gilad Arnoldc65330c2012-09-20 15:17:48 -070034 self._static_dir = tempfile.mkdtemp('common_util_unittest')
35 self._outside_sandbox_dir = tempfile.mkdtemp('common_util_unittest')
36 self._install_dir = tempfile.mkdtemp('common_util_unittest')
Frank Farzan37761d12011-12-01 14:29:08 -080037
38 for board, builds in TEST_LAYOUT.iteritems():
39 board_path = os.path.join(self._static_dir, board)
40 os.mkdir(board_path)
41 for build in builds:
42 build_path = os.path.join(board_path, build)
43 os.mkdir(build_path)
Gilad Arnoldc65330c2012-09-20 15:17:48 -070044 with open(os.path.join(
45 build_path, build_artifact.TEST_IMAGE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080046 f.write('TEST_IMAGE')
Chris Sosa47a7d4e2012-03-28 11:26:55 -070047 with open(os.path.join(
Gilad Arnoldc65330c2012-09-20 15:17:48 -070048 build_path, build_artifact.STATEFUL_UPDATE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080049 f.write('STATEFUL_UPDATE')
Gilad Arnoldc65330c2012-09-20 15:17:48 -070050 with open(os.path.join(
51 build_path, build_artifact.ROOT_UPDATE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080052 f.write('ROOT_UPDATE')
53 # AU payloads.
Gilad Arnoldc65330c2012-09-20 15:17:48 -070054 au_dir = os.path.join(build_path, common_util.AU_BASE)
55 nton_dir = os.path.join(au_dir, build + common_util.NTON_DIR_SUFFIX)
Frank Farzan37761d12011-12-01 14:29:08 -080056 os.makedirs(nton_dir)
Gilad Arnoldc65330c2012-09-20 15:17:48 -070057 with open(os.path.join(nton_dir, build_artifact.ROOT_UPDATE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080058 f.write('ROOT_UPDATE')
Gilad Arnoldc65330c2012-09-20 15:17:48 -070059 mton_dir = os.path.join(au_dir, build + common_util.MTON_DIR_SUFFIX)
Frank Farzan37761d12011-12-01 14:29:08 -080060 os.makedirs(mton_dir)
Gilad Arnoldc65330c2012-09-20 15:17:48 -070061 with open(os.path.join(mton_dir, build_artifact.ROOT_UPDATE), 'w') as f:
Frank Farzan37761d12011-12-01 14:29:08 -080062 f.write('ROOT_UPDATE')
63
Chris Sosaea148d92012-03-06 16:22:04 -080064 self._good_mock_process = self.mox.CreateMock(subprocess.Popen)
65 self._good_mock_process.returncode = 0
66 self._bad_mock_process = self.mox.CreateMock(subprocess.Popen)
67 self._bad_mock_process.returncode = 1
68
Frank Farzan37761d12011-12-01 14:29:08 -080069 def tearDown(self):
70 shutil.rmtree(self._static_dir)
71 shutil.rmtree(self._outside_sandbox_dir)
Chris Sosa47a7d4e2012-03-28 11:26:55 -070072 shutil.rmtree(self._install_dir)
Frank Farzan37761d12011-12-01 14:29:08 -080073
Chris Sosa1228a1a2012-05-22 17:12:13 -070074 def testParsePayloadListWithoutDeltas(self):
75 """Tests we can parse the payload list when no delta updates exist."""
76 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/'
Yu-Ju Hong825ddc32012-08-13 18:47:10 -070077 'R17-1413.0.0-a1-b1346')
78 full_basename = ('chromeos_R17-1413.0.0-a1_x86-mario_full_dev.bin')
79 full_url = '/'.join([archive_url_prefix, full_basename])
Vadim Bendeburyfee389c2013-01-23 14:14:43 -080080 full_url_out, nton_url_out, mton_url_out, fw_url_out = (
Gilad Arnoldc65330c2012-09-20 15:17:48 -070081 common_util.ParsePayloadList(
82 archive_url_prefix, [full_basename, '', '']))
Vadim Bendeburyfee389c2013-01-23 14:14:43 -080083 self.assertEqual([full_url, None, None, None],
84 [full_url_out, nton_url_out, mton_url_out, fw_url_out])
Chris Sosa1228a1a2012-05-22 17:12:13 -070085
Chris Sosa781ba6d2012-04-11 12:44:43 -070086 def testParsePartialPayloadList(self):
87 """Tests that we can parse a payload list with missing optional payload."""
88 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/'
89 'R17-1413.0.0-a1-b1346/')
Yu-Ju Hong825ddc32012-08-13 18:47:10 -070090 nton_basename = ('chromeos_R17-1413.0.0-a1_R17-1413.0.0-a1_x86-'
91 'mario_delta_dev.bin')
92 full_basename = ('chromeos_R17-1413.0.0-a1_x86-mario_full_dev.bin')
93
94 nton_url = '/'.join([archive_url_prefix, nton_basename])
95 full_url = '/'.join([archive_url_prefix, full_basename])
96
Vadim Bendeburyfee389c2013-01-23 14:14:43 -080097 full_url_out, nton_url_out, mton_url_out, fw_url_out = (
Gilad Arnoldc65330c2012-09-20 15:17:48 -070098 common_util.ParsePayloadList(archive_url_prefix,
99 [full_basename, nton_basename]))
Vadim Bendeburyfee389c2013-01-23 14:14:43 -0800100 self.assertEqual([full_url, nton_url, None, None],
101 [full_url_out, nton_url_out, mton_url_out, fw_url_out])
Chris Sosa781ba6d2012-04-11 12:44:43 -0700102
Frank Farzan37761d12011-12-01 14:29:08 -0800103 def testInstallBuild(self):
Simon Glassf5019de2012-03-20 12:14:41 -0700104 # TODO(frankf): Implement this test
105 # self.fail('Not implemented.')
106 pass
Frank Farzan37761d12011-12-01 14:29:08 -0800107
108 def testPrepareAutotestPkgs(self):
Simon Glassf5019de2012-03-20 12:14:41 -0700109 # TODO(frankf): Implement this test
110 # self.fail('Not implemented.')
Scott Zawalski16954532012-03-20 15:31:36 -0400111 # TODO: implement
Simon Glassf5019de2012-03-20 12:14:41 -0700112 pass
Frank Farzan37761d12011-12-01 14:29:08 -0800113
114 def testSafeSandboxAccess(self):
115 # Path is in sandbox.
116 self.assertTrue(
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700117 common_util.SafeSandboxAccess(
Frank Farzan37761d12011-12-01 14:29:08 -0800118 self._static_dir, os.path.join(self._static_dir, 'some-board')))
119
120 # Path is sandbox.
121 self.assertFalse(
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700122 common_util.SafeSandboxAccess(self._static_dir, self._static_dir))
Frank Farzan37761d12011-12-01 14:29:08 -0800123
124 # Path is outside the sandbox.
125 self.assertFalse(
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700126 common_util.SafeSandboxAccess(
127 self._static_dir, self._outside_sandbox_dir))
Frank Farzan37761d12011-12-01 14:29:08 -0800128
129 # Path contains '..'.
130 self.assertFalse(
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700131 common_util.SafeSandboxAccess(
Frank Farzan37761d12011-12-01 14:29:08 -0800132 self._static_dir, os.path.join(self._static_dir, os.pardir)))
133
134 # Path contains symbolic link references.
135 os.chdir(self._static_dir)
136 os.symlink(os.pardir, 'parent')
137 self.assertFalse(
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700138 common_util.SafeSandboxAccess(
Frank Farzan37761d12011-12-01 14:29:08 -0800139 self._static_dir, os.path.join(self._static_dir, os.pardir)))
140
141 def testAcquireReleaseLocks(self):
Gilad Arnold5174ca22012-09-12 10:49:09 -0700142 # Successful lock and unlock, removing the newly created directory.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700143 lock_file = common_util.AcquireLock(self._static_dir, 'test-lock')
Frank Farzan37761d12011-12-01 14:29:08 -0800144 self.assertTrue(os.path.exists(lock_file))
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700145 common_util.ReleaseLock(self._static_dir, 'test-lock', destroy=True)
Frank Farzan37761d12011-12-01 14:29:08 -0800146 self.assertFalse(os.path.exists(lock_file))
147
Gilad Arnold5174ca22012-09-12 10:49:09 -0700148 # Attempt to freshly create and lock an existing directory.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700149 common_util.AcquireLock(self._static_dir, 'test-lock')
150 common_util.ReleaseLock(self._static_dir, 'test-lock')
Gilad Arnold17fe03d2012-10-02 10:05:01 -0700151 self.assertRaises(common_util.CommonUtilError, common_util.AcquireLock,
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700152 self._static_dir, 'test-lock')
153 common_util.AcquireLock(self._static_dir, 'test-lock', create_once=False)
154 common_util.ReleaseLock(self._static_dir, 'test-lock', destroy=True)
Gilad Arnold5174ca22012-09-12 10:49:09 -0700155
156 # Sucessfully re-lock a pre-existing directory.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700157 common_util.AcquireLock(self._static_dir, 'test-lock')
158 common_util.ReleaseLock(self._static_dir, 'test-lock')
159 common_util.AcquireLock(self._static_dir, 'test-lock', create_once=False)
160 common_util.ReleaseLock(self._static_dir, 'test-lock', destroy=True)
Gilad Arnold5174ca22012-09-12 10:49:09 -0700161
162 # Attempt to lock an already locked directory.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700163 common_util.AcquireLock(self._static_dir, 'test-lock')
Gilad Arnold17fe03d2012-10-02 10:05:01 -0700164 self.assertRaises(common_util.CommonUtilError, common_util.AcquireLock,
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700165 self._static_dir, 'test-lock')
166 common_util.ReleaseLock(self._static_dir, 'test-lock', destroy=True)
Frank Farzan37761d12011-12-01 14:29:08 -0800167
Frank Farzan37761d12011-12-01 14:29:08 -0800168 def testGetLatestBuildVersion(self):
169 self.assertEqual(
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700170 common_util.GetLatestBuildVersion(self._static_dir, 'test-board-1'),
Frank Farzan37761d12011-12-01 14:29:08 -0800171 'R17-1413.0.0-a1-b1346')
172
Scott Zawalski16954532012-03-20 15:31:36 -0400173 def testGetLatestBuildVersionLatest(self):
Gilad Arnold17fe03d2012-10-02 10:05:01 -0700174 """Test that we raise CommonUtilError when a build dir is empty."""
175 self.assertRaises(common_util.CommonUtilError,
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700176 common_util.GetLatestBuildVersion,
Scott Zawalski16954532012-03-20 15:31:36 -0400177 self._static_dir, 'test-board-3')
Frank Farzan37761d12011-12-01 14:29:08 -0800178
Scott Zawalski16954532012-03-20 15:31:36 -0400179 def testGetLatestBuildVersionUnknownBuild(self):
Gilad Arnold17fe03d2012-10-02 10:05:01 -0700180 """Test that we raise CommonUtilError when a build dir does not exist."""
181 self.assertRaises(common_util.CommonUtilError,
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700182 common_util.GetLatestBuildVersion,
Scott Zawalski16954532012-03-20 15:31:36 -0400183 self._static_dir, 'bad-dir')
Frank Farzan37761d12011-12-01 14:29:08 -0800184
Scott Zawalski16954532012-03-20 15:31:36 -0400185 def testGetLatestBuildVersionMilestone(self):
186 """Test that we can get builds based on milestone."""
187 expected_build_str = 'R16-2241.0.0-a0-b2'
188 milestone = 'R16'
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700189 build_str = common_util.GetLatestBuildVersion(
Scott Zawalski16954532012-03-20 15:31:36 -0400190 self._static_dir, 'test-board-2', milestone)
191 self.assertEqual(expected_build_str, build_str)
Frank Farzan37761d12011-12-01 14:29:08 -0800192
Frank Farzan37761d12011-12-01 14:29:08 -0800193 def testGetControlFile(self):
194 control_file_dir = os.path.join(
Chris Sosaea148d92012-03-06 16:22:04 -0800195 self._static_dir, 'test-board-1', 'R17-1413.0.0-a1-b1346', 'autotest',
196 'server', 'site_tests', 'network_VPN')
Frank Farzan37761d12011-12-01 14:29:08 -0800197 os.makedirs(control_file_dir)
198 with open(os.path.join(control_file_dir, 'control'), 'w') as f:
199 f.write('hello!')
200
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700201 control_content = common_util.GetControlFile(
Chris Sosaea148d92012-03-06 16:22:04 -0800202 self._static_dir, 'test-board-1/R17-1413.0.0-a1-b1346',
Frank Farzan37761d12011-12-01 14:29:08 -0800203 os.path.join('server', 'site_tests', 'network_VPN', 'control'))
204 self.assertEqual(control_content, 'hello!')
205
Vadim Bendeburyfee389c2013-01-23 14:14:43 -0800206 def commonGatherArtifactDownloads(self, payload_names):
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700207 """Tests that we can gather the correct download requirements."""
208 build = 'R17-1413.0.0-a1-b1346'
209 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/' +
210 build)
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700211 mock_data = 'mock data\nmock_data'
Vadim Bendeburyfee389c2013-01-23 14:14:43 -0800212 payloads = map(lambda x: '/'.join([archive_url_prefix, x]), payload_names)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700213 expected_payloads = payloads + map(
214 lambda x: '/'.join([archive_url_prefix, x]),
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700215 [build_artifact.STATEFUL_UPDATE,
216 build_artifact.AUTOTEST_ZIPPED_PACKAGE,
217 build_artifact.TEST_SUITES_PACKAGE])
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700218 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700219 self.mox.StubOutWithMock(common_util, 'IsAvailable')
220 self.mox.StubOutWithMock(common_util, 'ParsePayloadList')
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700221
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700222 # GSUtil cat gs://archive_url_prefix/UPLOADED.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700223 gsutil_util.GSUtilRun(mox.StrContains(common_util.UPLOADED_LIST),
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700224 mox.IgnoreArg()).AndReturn(mock_data)
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700225 common_util.IsAvailable(
226 mox.IgnoreArg(), mock_data.splitlines()).AndReturn(True)
227 common_util.ParsePayloadList(archive_url_prefix,
Vadim Bendeburyfee389c2013-01-23 14:14:43 -0800228 mock_data.splitlines()).AndReturn(
229 payloads + [None] * (4 - len(payload_names)))
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700230 self.mox.ReplayAll()
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700231 artifacts = common_util.GatherArtifactDownloads(
Gilad Arnold6f99b982012-09-12 10:49:40 -0700232 self._static_dir, archive_url_prefix, self._install_dir, build)
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700233 for index, artifact in enumerate(artifacts):
234 self.assertEqual(artifact._gs_path, expected_payloads[index])
235 self.assertTrue(artifact._tmp_staging_dir.startswith(self._static_dir))
Chris Sosa47a7d4e2012-03-28 11:26:55 -0700236
237 self.mox.VerifyAll()
238
Vadim Bendeburyfee389c2013-01-23 14:14:43 -0800239
240 def testGatherArtifactDownloadsWithoutFirmware(self):
241 """Tests that we can gather the correct download requirements."""
242 self.commonGatherArtifactDownloads(['p1', 'p2', 'p3'])
243
244 def testGatherArtifactDownloads(self):
245 """Tests that we can gather the correct download requirements."""
246 self.commonGatherArtifactDownloads(['p1', 'p2', 'p3', 'p4'])
247
Chris Sosa781ba6d2012-04-11 12:44:43 -0700248 def testGatherArtifactDownloadsWithoutMton(self):
249 """Gather the correct download requirements without mton delta."""
Vadim Bendeburyfee389c2013-01-23 14:14:43 -0800250 self.commonGatherArtifactDownloads(['p1', 'p2'])
Chris Sosa1228a1a2012-05-22 17:12:13 -0700251
252 def testGatherArtifactDownloadsWithoutMtonOrNton(self):
253 """Gather the correct download requirements without delta payloads."""
Vadim Bendeburyfee389c2013-01-23 14:14:43 -0800254 self.commonGatherArtifactDownloads(['p1'])
Chris Sosa781ba6d2012-04-11 12:44:43 -0700255
Chris Masone816e38c2012-05-02 12:22:36 -0700256 def testGatherSymbolArtifactDownloads(self):
257 """Tests that we can find debug symbol artifacts to download."""
258 build = 'R17-1413.0.0-a1-b1346'
259 archive_url_prefix = ('gs://chromeos-image-archive/x86-mario-release/' +
260 build)
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700261 symbol_url = '/'.join([archive_url_prefix,
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700262 build_artifact.DEBUG_SYMBOLS])
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700263 mock_data = 'mock-tarball.tgz\nmock-debug.tgz'
Chris Masone816e38c2012-05-02 12:22:36 -0700264 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
Chris Masone816e38c2012-05-02 12:22:36 -0700265
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700266 # GSUtil cat gs://archive_url_prefix/UPLOADED.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700267 gsutil_util.GSUtilRun(mox.StrContains(common_util.UPLOADED_LIST),
Chris Masone816e38c2012-05-02 12:22:36 -0700268 mox.IgnoreArg()).AndReturn(mock_data)
269
270 self.mox.ReplayAll()
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700271 artifacts = common_util.GatherSymbolArtifactDownloads(
Chris Masone816e38c2012-05-02 12:22:36 -0700272 self._static_dir, archive_url_prefix, self._install_dir)
Vadim Bendeburyfee389c2013-01-23 14:14:43 -0800273 for _, artifact in enumerate(artifacts):
Chris Masone816e38c2012-05-02 12:22:36 -0700274 self.assertEqual(artifact._gs_path, symbol_url)
275 self.assertTrue(artifact._tmp_staging_dir.startswith(self._static_dir))
276
277 self.mox.VerifyAll()
278
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700279 def testIsAvailable(self):
280 """Test that we can detect whether the target artifacts are avaialble."""
281 # Test when the all target files are available
282 pattern_list = ['_full_', 'autotest.tar']
283 uploaded_list = ['chromeos_R17-1413.0.0-a1_x86-mario_full_dev.bin',
284 'debug.tgz',
285 'autotest.tar.bz2']
286
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700287 available = common_util.IsAvailable(pattern_list, uploaded_list)
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700288 self.assertTrue(available)
289
290 # Test when some target files are missing
291 pattern_list = ['_full_', 'autotest.tar']
292 uploaded_list = ['chromeos_R17-1413.0.0-a1_x86-mario_full_dev.bin',
293 'debug.tgz']
294
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700295 available = common_util.IsAvailable(pattern_list, uploaded_list)
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700296 self.assertFalse(available)
297
298 def testWaitUntilAvailable(self):
299 """Test that we can poll until all target artifacts are available."""
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700300 archive_url = ('gs://chromeos-image-archive/x86-mario-release/'
301 'R17-1413.0.0-a1-b1346')
302 to_wait_list = ['_full_']
Chris Masone816e38c2012-05-02 12:22:36 -0700303 mock_data = 'mock data\nmock_data\nmock_data'
Chris Masone816e38c2012-05-02 12:22:36 -0700304
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700305 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700306 self.mox.StubOutWithMock(common_util, 'IsAvailable')
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700307
308 # GSUtil cat gs://archive_url_prefix/UPLOADED.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700309 gsutil_util.GSUtilRun(mox.StrContains(common_util.UPLOADED_LIST),
Chris Masone816e38c2012-05-02 12:22:36 -0700310 mox.IgnoreArg()).AndReturn(mock_data)
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700311 common_util.IsAvailable(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(True)
Chris Masone816e38c2012-05-02 12:22:36 -0700312
313 self.mox.ReplayAll()
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700314 uploaded_list = common_util.WaitUntilAvailable(
315 to_wait_list, archive_url, 'UNIT TEST', delay=1)
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700316 self.assertEqual(uploaded_list, mock_data.splitlines())
Chris Masone816e38c2012-05-02 12:22:36 -0700317 self.mox.VerifyAll()
318
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700319 def testWaitUntilAvailableWithRetry(self):
320 """Test that we can poll until all target artifacts are available."""
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700321 archive_url = ('gs://chromeos-image-archive/x86-mario-release/'
322 'R17-1413.0.0-a1-b1346')
323 to_wait_list = ['_full_']
324 mock_data = 'mock data\nmock_data\nmock_data'
Chris Masone816e38c2012-05-02 12:22:36 -0700325
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700326 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700327 self.mox.StubOutWithMock(common_util, 'IsAvailable')
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700328
329 # GSUtil cat gs://archive_url_prefix/UPLOADED.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700330 gsutil_util.GSUtilRun(mox.StrContains(common_util.UPLOADED_LIST),
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700331 mox.IgnoreArg()).AndReturn(mock_data)
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700332 common_util.IsAvailable(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(False)
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700333
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700334 gsutil_util.GSUtilRun(mox.StrContains(common_util.UPLOADED_LIST),
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700335 mox.IgnoreArg()).AndReturn(mock_data)
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700336 common_util.IsAvailable(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(True)
Chris Masone816e38c2012-05-02 12:22:36 -0700337
338 self.mox.ReplayAll()
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700339 uploaded_list = common_util.WaitUntilAvailable(
340 to_wait_list, archive_url, 'UNIT TEST', delay=1)
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700341 self.assertEqual(uploaded_list, mock_data.splitlines())
Chris Masone816e38c2012-05-02 12:22:36 -0700342 self.mox.VerifyAll()
343
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700344 def testWaitUntilAvailableTimeout(self):
345 """Test that we wait for the target artifacts until timeout occurs."""
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700346 archive_url = ('gs://chromeos-image-archive/x86-mario-release/'
347 'R17-1413.0.0-a1-b1346')
348 to_wait_list = ['_full_']
349 mock_data = 'mock data\nmock_data\nmock_data'
350
351 self.mox.StubOutWithMock(gsutil_util, 'GSUtilRun')
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700352 self.mox.StubOutWithMock(common_util, 'IsAvailable')
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700353
354 # GSUtil cat gs://archive_url_prefix/UPLOADED.
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700355 gsutil_util.GSUtilRun(mox.StrContains(common_util.UPLOADED_LIST),
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700356 mox.IgnoreArg()).AndReturn(mock_data)
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700357 common_util.IsAvailable(mox.IgnoreArg(), mox.IgnoreArg()).AndReturn(False)
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700358
359 self.mox.ReplayAll()
Gilad Arnold17fe03d2012-10-02 10:05:01 -0700360 self.assertRaises(common_util.CommonUtilError,
Gilad Arnoldc65330c2012-09-20 15:17:48 -0700361 common_util.WaitUntilAvailable,
Yu-Ju Hong825ddc32012-08-13 18:47:10 -0700362 to_wait_list,
363 archive_url,
364 'UNIT TEST',
365 delay=2,
366 timeout=1)
367 self.mox.VerifyAll()
Frank Farzan37761d12011-12-01 14:29:08 -0800368
369if __name__ == '__main__':
370 unittest.main()