blob: d85cbb05e29e7a35ca72c7b775c7201ac1b20708 [file] [log] [blame]
David James8c846492011-01-25 17:07:29 -08001#!/usr/bin/python
2# Copyright (c) 2010 The Chromium OS 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 copy
7import mox
8import os
David James8fa34ea2011-04-15 13:00:20 -07009import multiprocessing
Chris Sosa471532a2011-02-01 15:10:06 -080010import sys
David James8c846492011-01-25 17:07:29 -080011import tempfile
12import unittest
Chris Sosa471532a2011-02-01 15:10:06 -080013
14import constants
15sys.path.append(constants.SOURCE_ROOT)
16import prebuilt
David James8c846492011-01-25 17:07:29 -080017from chromite.lib import cros_build_lib
David James615e5b52011-06-03 11:10:15 -070018from chromite.lib import binpkg
David James8c846492011-01-25 17:07:29 -080019
David James615e5b52011-06-03 11:10:15 -070020PUBLIC_PACKAGES = [{'CPV': 'gtk+/public1', 'SHA1': '1', 'MTIME': '1'},
David James8c846492011-01-25 17:07:29 -080021 {'CPV': 'gtk+/public2', 'SHA1': '2',
David James615e5b52011-06-03 11:10:15 -070022 'PATH': 'gtk+/foo.tgz', 'MTIME': '2'}]
23PRIVATE_PACKAGES = [{'CPV': 'private', 'SHA1': '3', 'MTIME': '3'}]
David James8c846492011-01-25 17:07:29 -080024
25
26def SimplePackageIndex(header=True, packages=True):
Chris Sosa58669192011-06-30 12:45:03 -070027 pkgindex = binpkg.PackageIndex()
28 if header:
29 pkgindex.header['URI'] = 'http://www.example.com'
30 if packages:
31 pkgindex.packages = copy.deepcopy(PUBLIC_PACKAGES + PRIVATE_PACKAGES)
32 return pkgindex
David James8c846492011-01-25 17:07:29 -080033
34
35class TestUpdateFile(unittest.TestCase):
36
37 def setUp(self):
38 self.contents_str = ['# comment that should be skipped',
39 'PKGDIR="/var/lib/portage/pkgs"',
40 'PORTAGE_BINHOST="http://no.thanks.com"',
41 'portage portage-20100310.tar.bz2',
42 'COMPILE_FLAGS="some_value=some_other"',
43 ]
44 temp_fd, self.version_file = tempfile.mkstemp()
45 os.write(temp_fd, '\n'.join(self.contents_str))
46 os.close(temp_fd)
47
48 def tearDown(self):
49 os.remove(self.version_file)
50
51 def _read_version_file(self, version_file=None):
52 """Read the contents of self.version_file and return as a list."""
53 if not version_file:
54 version_file = self.version_file
55
56 version_fh = open(version_file)
57 try:
58 return [line.strip() for line in version_fh.readlines()]
59 finally:
60 version_fh.close()
61
62 def _verify_key_pair(self, key, val):
63 file_contents = self._read_version_file()
64 # ensure key for verify is wrapped on quotes
65 if '"' not in val:
66 val = '"%s"' % val
67 for entry in file_contents:
68 if '=' not in entry:
69 continue
70 file_key, file_val = entry.split('=')
71 if file_key == key:
72 if val == file_val:
73 break
74 else:
75 self.fail('Could not find "%s=%s" in version file' % (key, val))
76
77 def testAddVariableThatDoesNotExist(self):
78 """Add in a new variable that was no present in the file."""
79 key = 'PORTAGE_BINHOST'
80 value = '1234567'
81 prebuilt.UpdateLocalFile(self.version_file, value)
82 print self.version_file
Chris Sosa58669192011-06-30 12:45:03 -070083 self._read_version_file()
David James8c846492011-01-25 17:07:29 -080084 self._verify_key_pair(key, value)
85 print self.version_file
86
87 def testUpdateVariable(self):
88 """Test updating a variable that already exists."""
89 key, val = self.contents_str[2].split('=')
90 new_val = 'test_update'
91 self._verify_key_pair(key, val)
92 prebuilt.UpdateLocalFile(self.version_file, new_val)
93 self._verify_key_pair(key, new_val)
94
95 def testUpdateNonExistentFile(self):
96 key = 'PORTAGE_BINHOST'
97 value = '1234567'
98 non_existent_file = tempfile.mktemp()
99 try:
100 prebuilt.UpdateLocalFile(non_existent_file, value)
101 file_contents = self._read_version_file(non_existent_file)
102 self.assertEqual(file_contents, ['%s=%s' % (key, value)])
103 finally:
104 if os.path.exists(non_existent_file):
105 os.remove(non_existent_file)
106
107
David James8c846492011-01-25 17:07:29 -0800108class TestPrebuilt(unittest.TestCase):
109
110 def setUp(self):
111 self.mox = mox.Mox()
112
113 def tearDown(self):
114 self.mox.UnsetStubs()
115 self.mox.VerifyAll()
116
117 def testGenerateUploadDict(self):
118 base_local_path = '/b/cbuild/build/chroot/build/x86-dogfood/'
119 gs_bucket_path = 'gs://chromeos-prebuilt/host/version'
120 local_path = os.path.join(base_local_path, 'public1.tbz2')
121 self.mox.StubOutWithMock(prebuilt.os.path, 'exists')
122 prebuilt.os.path.exists(local_path).AndReturn(True)
123 self.mox.ReplayAll()
124 pkgs = [{ 'CPV': 'public1' }]
125 result = prebuilt.GenerateUploadDict(base_local_path, gs_bucket_path, pkgs)
126 expected = { local_path: gs_bucket_path + '/public1.tbz2' }
127 self.assertEqual(result, expected)
128
129 def testFailonUploadFail(self):
130 """Make sure we fail if one of the upload processes fail."""
David James615e5b52011-06-03 11:10:15 -0700131 self.mox.StubOutWithMock(prebuilt, '_RetryRun')
132 prebuilt._RetryRun(mox.IgnoreArg(), print_cmd=False).AndReturn(False)
133 self.mox.ReplayAll()
David James8c846492011-01-25 17:07:29 -0800134 files = {'test': '/uasd'}
David Jamesfd0b0852011-02-23 11:15:36 -0800135 result = prebuilt.RemoteUpload('public-read', files)
136 self.assertEqual(result, set([('test', '/uasd')]))
David James615e5b52011-06-03 11:10:15 -0700137 prebuilt._RetryRun('example', print_cmd=False)
David James8c846492011-01-25 17:07:29 -0800138
139 def testDeterminePrebuiltConfHost(self):
140 """Test that the host prebuilt path comes back properly."""
141 expected_path = os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64'])
142 self.assertEqual(prebuilt.DeterminePrebuiltConfFile('fake_path', 'amd64'),
143 expected_path)
144
145 def testDeterminePrebuiltConf(self):
146 """Test the different known variants of boards for proper path discovery."""
147 fake_path = '/b/cbuild'
Chris Sosa471532a2011-02-01 15:10:06 -0800148 script_path = os.path.join(fake_path, 'src/platform/dev/host')
David James8c846492011-01-25 17:07:29 -0800149 public_overlay_path = os.path.join(fake_path, 'src/overlays')
150 private_overlay_path = os.path.join(fake_path,
151 prebuilt._PRIVATE_OVERLAY_DIR)
152 path_dict = {'private_overlay_path': private_overlay_path,
153 'public_overlay_path': public_overlay_path}
154 # format for targets
155 # board target key in dictionar
156 # Tuple containing cmd run, expected results as cmd obj, and expected output
157
158 # Mock output from cros_overlay_list
159 x86_out = ('%(private_overlay_path)s/chromeos-overlay\n'
160 '%(public_overlay_path)s/overlay-x86-generic\n' % path_dict)
161
162 x86_cmd = './cros_overlay_list --board x86-generic'
163 x86_expected_path = os.path.join(public_overlay_path, 'overlay-x86-generic',
164 'prebuilt.conf')
165 # Mock output from cros_overlay_list
166 tegra2_out = ('%(private_overlay_path)s/chromeos-overlay\n'
167 '%(public_overlay_path)s/overlay-tegra2\n'
168 '%(public_overlay_path)s/overlay-variant-tegra2-seaboard\n'
169 '%(private_overlay_path)s/overlay-tegra2-private\n'
170 '%(private_overlay_path)s/'
171 'overlay-variant-tegra2-seaboard-private\n' % path_dict)
172 tegra2_cmd = './cros_overlay_list --board tegra2 --variant seaboard'
173 tegra2_expected_path = os.path.join(
174 private_overlay_path, 'overlay-variant-tegra2-seaboard-private',
175 'prebuilt.conf')
176
177
178 targets = {'x86-generic': {'cmd': x86_cmd,
179 'output': x86_out,
180 'result': x86_expected_path},
181 'tegra2_seaboard': {'cmd': tegra2_cmd,
182 'output': tegra2_out,
183 'result': tegra2_expected_path}
184 }
185
186 self.mox.StubOutWithMock(prebuilt.cros_build_lib, 'RunCommand')
187 for target, expected_results in targets.iteritems():
188 # create command object for output
189 cmd_result_obj = cros_build_lib.CommandResult()
190 cmd_result_obj.output = expected_results['output']
191 prebuilt.cros_build_lib.RunCommand(
192 expected_results['cmd'].split(), redirect_stdout=True,
193 cwd=script_path).AndReturn(cmd_result_obj)
Chris Sosa471532a2011-02-01 15:10:06 -0800194
David James8c846492011-01-25 17:07:29 -0800195 self.mox.ReplayAll()
196 for target, expected_results in targets.iteritems():
197 self.assertEqual(
198 prebuilt.DeterminePrebuiltConfFile(fake_path, target),
199 expected_results['result'])
200
201 def testDeterminePrebuiltConfGarbage(self):
202 """Ensure an exception is raised on bad input."""
203 self.assertRaises(prebuilt.UnknownBoardFormat,
204 prebuilt.DeterminePrebuiltConfFile,
205 'fake_path', 'asdfasdf')
206
207
208class TestPackagesFileFiltering(unittest.TestCase):
209
210 def testFilterPkgIndex(self):
211 pkgindex = SimplePackageIndex()
212 pkgindex.RemoveFilteredPackages(lambda pkg: pkg in PRIVATE_PACKAGES)
213 self.assertEqual(pkgindex.packages, PUBLIC_PACKAGES)
214 self.assertEqual(pkgindex.modified, True)
215
216
217class TestPopulateDuplicateDB(unittest.TestCase):
218
219 def testEmptyIndex(self):
220 pkgindex = SimplePackageIndex(packages=False)
221 db = {}
David James615e5b52011-06-03 11:10:15 -0700222 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800223 self.assertEqual(db, {})
224
225 def testNormalIndex(self):
226 pkgindex = SimplePackageIndex()
227 db = {}
David James615e5b52011-06-03 11:10:15 -0700228 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800229 self.assertEqual(len(db), 3)
David James3cbba5e2011-02-14 14:53:15 -0800230 self.assertEqual(db['1'], 'http://www.example.com/gtk+/public1.tbz2')
231 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800232 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
233
234 def testMissingSHA1(self):
235 db = {}
236 pkgindex = SimplePackageIndex()
237 del pkgindex.packages[0]['SHA1']
David James615e5b52011-06-03 11:10:15 -0700238 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800239 self.assertEqual(len(db), 2)
David James3cbba5e2011-02-14 14:53:15 -0800240 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800241 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
242
243 def testFailedPopulate(self):
244 db = {}
245 pkgindex = SimplePackageIndex(header=False)
David James615e5b52011-06-03 11:10:15 -0700246 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db, 0)
David James8c846492011-01-25 17:07:29 -0800247 pkgindex = SimplePackageIndex()
248 del pkgindex.packages[0]['CPV']
David James615e5b52011-06-03 11:10:15 -0700249 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db, 0)
David James8c846492011-01-25 17:07:29 -0800250
251
252class TestResolveDuplicateUploads(unittest.TestCase):
253
David James615e5b52011-06-03 11:10:15 -0700254 def setUp(self):
255 self.mox = mox.Mox()
256 self.mox.StubOutWithMock(binpkg.time, 'time')
257 binpkg.time.time().AndReturn(binpkg.TWO_WEEKS)
258 self.mox.ReplayAll()
259
260 def tearDown(self):
261 self.mox.UnsetStubs()
262 self.mox.VerifyAll()
263
David James8c846492011-01-25 17:07:29 -0800264 def testEmptyList(self):
265 pkgindex = SimplePackageIndex()
266 pristine = SimplePackageIndex()
267 uploads = pkgindex.ResolveDuplicateUploads([])
David James615e5b52011-06-03 11:10:15 -0700268 self.assertEqual(uploads, pkgindex.packages)
269 self.assertEqual(len(pkgindex.packages), len(pristine.packages))
270 for pkg1, pkg2 in zip(pkgindex.packages, pristine.packages):
271 self.assertNotEqual(pkg1['MTIME'], pkg2['MTIME'])
272 del pkg1['MTIME']
273 del pkg2['MTIME']
David James8c846492011-01-25 17:07:29 -0800274 self.assertEqual(pkgindex.modified, False)
275
276 def testEmptyIndex(self):
277 pkgindex = SimplePackageIndex()
278 pristine = SimplePackageIndex()
279 empty = SimplePackageIndex(packages=False)
280 uploads = pkgindex.ResolveDuplicateUploads([empty])
David James615e5b52011-06-03 11:10:15 -0700281 self.assertEqual(uploads, pkgindex.packages)
282 self.assertEqual(len(pkgindex.packages), len(pristine.packages))
283 for pkg1, pkg2 in zip(pkgindex.packages, pristine.packages):
284 self.assertNotEqual(pkg1['MTIME'], pkg2['MTIME'])
285 del pkg1['MTIME']
286 del pkg2['MTIME']
287 self.assertEqual(pkg1, pkg2)
David James8c846492011-01-25 17:07:29 -0800288 self.assertEqual(pkgindex.modified, False)
289
290 def testDuplicates(self):
291 pkgindex = SimplePackageIndex()
292 dup_pkgindex = SimplePackageIndex()
293 expected_pkgindex = SimplePackageIndex()
294 for pkg in expected_pkgindex.packages:
David James3cbba5e2011-02-14 14:53:15 -0800295 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
Chris Sosa58669192011-06-30 12:45:03 -0700296 pkgindex.ResolveDuplicateUploads([dup_pkgindex])
David James8c846492011-01-25 17:07:29 -0800297 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
298
299 def testMissingSHA1(self):
David James8c846492011-01-25 17:07:29 -0800300 pkgindex = SimplePackageIndex()
301 dup_pkgindex = SimplePackageIndex()
302 expected_pkgindex = SimplePackageIndex()
303 del pkgindex.packages[0]['SHA1']
304 del expected_pkgindex.packages[0]['SHA1']
305 for pkg in expected_pkgindex.packages[1:]:
306 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
Chris Sosa58669192011-06-30 12:45:03 -0700307 pkgindex.ResolveDuplicateUploads([dup_pkgindex])
David James615e5b52011-06-03 11:10:15 -0700308 self.assertNotEqual(pkgindex.packages[0]['MTIME'],
309 expected_pkgindex.packages[0]['MTIME'])
310 del pkgindex.packages[0]['MTIME']
311 del expected_pkgindex.packages[0]['MTIME']
David James8c846492011-01-25 17:07:29 -0800312 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
313
314
315class TestWritePackageIndex(unittest.TestCase):
316
317 def setUp(self):
318 self.mox = mox.Mox()
319
320 def tearDown(self):
321 self.mox.UnsetStubs()
322 self.mox.VerifyAll()
323
324 def testSimple(self):
325 pkgindex = SimplePackageIndex()
326 self.mox.StubOutWithMock(pkgindex, 'Write')
327 pkgindex.Write(mox.IgnoreArg())
328 self.mox.ReplayAll()
329 f = pkgindex.WriteToNamedTemporaryFile()
330 self.assertEqual(f.read(), '')
331
332
David James05bcb2b2011-02-09 09:25:47 -0800333class TestUploadPrebuilt(unittest.TestCase):
334
335 def setUp(self):
336 class MockTemporaryFile(object):
337 def __init__(self, name):
338 self.name = name
339 self.mox = mox.Mox()
340 self.pkgindex = SimplePackageIndex()
341 self.mox.StubOutWithMock(prebuilt, 'GrabLocalPackageIndex')
342 prebuilt.GrabLocalPackageIndex('/packages').AndReturn(self.pkgindex)
343 self.mox.StubOutWithMock(prebuilt, 'RemoteUpload')
344 self.mox.StubOutWithMock(self.pkgindex, 'ResolveDuplicateUploads')
345 self.pkgindex.ResolveDuplicateUploads([]).AndReturn(PRIVATE_PACKAGES)
346 self.mox.StubOutWithMock(self.pkgindex, 'WriteToNamedTemporaryFile')
347 fake_pkgs_file = MockTemporaryFile('fake')
348 self.pkgindex.WriteToNamedTemporaryFile().AndReturn(fake_pkgs_file)
349
350 def tearDown(self):
351 self.mox.UnsetStubs()
352 self.mox.VerifyAll()
353
354 def doRsyncUpload(self, suffix):
355 self.mox.StubOutWithMock(prebuilt, '_RetryRun')
356 remote_path = '/dir/%s' % suffix.rstrip('/')
357 full_remote_path = 'chromeos-prebuilt:%s' % remote_path
Peter Mayod7cd9d52011-04-21 17:58:43 -0400358 cmds = [['ssh', 'chromeos-prebuilt', 'mkdir', '-p', remote_path],
Peter Mayo193f68f2011-04-19 19:08:21 -0400359 ['rsync', '-av', '--chmod=a+r', 'fake',
360 full_remote_path + '/Packages'],
361 ['rsync', '-Rav', 'private.tbz2', full_remote_path + '/']]
David James05bcb2b2011-02-09 09:25:47 -0800362 for cmd in cmds:
Peter Mayo193f68f2011-04-19 19:08:21 -0400363 prebuilt._RetryRun(cmd, cwd='/packages').AndReturn(True)
David James05bcb2b2011-02-09 09:25:47 -0800364 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800365 uri = self.pkgindex.header['URI']
David Jamesfd0b0852011-02-23 11:15:36 -0800366 uploader = prebuilt.PrebuiltUploader('chromeos-prebuilt:/dir',
David James32b0b2f2011-07-13 20:56:50 -0700367 'public-read', uri, [], '/', [], False, 'foo', False)
David Jamesc0f158a2011-02-22 16:07:29 -0800368 uploader._UploadPrebuilt('/packages', suffix)
David James05bcb2b2011-02-09 09:25:47 -0800369
370 def testSuccessfulGsUpload(self):
371 uploads = {'/packages/private.tbz2': 'gs://foo/private.tbz2'}
372 self.mox.StubOutWithMock(prebuilt, 'GenerateUploadDict')
373 prebuilt.GenerateUploadDict('/packages', 'gs://foo/suffix',
374 PRIVATE_PACKAGES).AndReturn(uploads)
375 uploads = uploads.copy()
376 uploads['fake'] = 'gs://foo/suffix/Packages'
David Jamesfd0b0852011-02-23 11:15:36 -0800377 acl = 'public-read'
378 prebuilt.RemoteUpload(acl, uploads).AndReturn([None])
David James05bcb2b2011-02-09 09:25:47 -0800379 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800380 uri = self.pkgindex.header['URI']
David James8ece7ee2011-06-29 16:02:30 -0700381 uploader = prebuilt.PrebuiltUploader('gs://foo', acl, uri, [], '/', [],
David James32b0b2f2011-07-13 20:56:50 -0700382 False, 'foo', False)
David Jamesc0f158a2011-02-22 16:07:29 -0800383 uploader._UploadPrebuilt('/packages', 'suffix')
David James05bcb2b2011-02-09 09:25:47 -0800384
385 def testSuccessfulRsyncUploadWithNoTrailingSlash(self):
386 self.doRsyncUpload('suffix')
387
388 def testSuccessfulRsyncUploadWithTrailingSlash(self):
389 self.doRsyncUpload('suffix/')
390
391
392class TestSyncPrebuilts(unittest.TestCase):
393
394 def setUp(self):
395 self.mox = mox.Mox()
David James05bcb2b2011-02-09 09:25:47 -0800396 self.mox.StubOutWithMock(prebuilt, 'DeterminePrebuiltConfFile')
David James05bcb2b2011-02-09 09:25:47 -0800397 self.mox.StubOutWithMock(prebuilt, 'RevGitFile')
398 self.mox.StubOutWithMock(prebuilt, 'UpdateBinhostConfFile')
399 self.build_path = '/trunk'
400 self.upload_location = 'gs://upload/'
401 self.version = '1'
402 self.binhost = 'http://prebuilt/'
403 self.key = 'PORTAGE_BINHOST'
David James615e5b52011-06-03 11:10:15 -0700404 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_UploadPrebuilt')
David James05bcb2b2011-02-09 09:25:47 -0800405
406 def tearDown(self):
407 self.mox.UnsetStubs()
408 self.mox.VerifyAll()
409
410 def testSyncHostPrebuilts(self):
411 package_path = os.path.join(self.build_path,
412 prebuilt._HOST_PACKAGES_PATH)
413 url_suffix = prebuilt._REL_HOST_PATH % {'version': self.version,
414 'target': prebuilt._HOST_TARGET }
David James8fa34ea2011-04-15 13:00:20 -0700415 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James615e5b52011-06-03 11:10:15 -0700416 prebuilt.PrebuiltUploader._UploadPrebuilt(package_path,
417 packages_url_suffix).AndReturn(True)
David Jamesf0e6fd72011-04-15 15:58:07 -0700418 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
419 packages_url_suffix.rstrip('/'))
David James27fa7d12011-06-29 17:24:14 -0700420 prebuilt.RevGitFile(mox.IgnoreArg(), url_value, key=self.key, dryrun=False)
David James05bcb2b2011-02-09 09:25:47 -0800421 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
422 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700423 uploader = prebuilt.PrebuiltUploader(
424 self.upload_location, 'public-read', self.binhost, [],
David James32b0b2f2011-07-13 20:56:50 -0700425 self.build_path, [], False, 'foo', False)
David James615e5b52011-06-03 11:10:15 -0700426 uploader._SyncHostPrebuilts(self.version, self.key, True, True)
David James05bcb2b2011-02-09 09:25:47 -0800427
428 def testSyncBoardPrebuilts(self):
429 board = 'x86-generic'
430 board_path = os.path.join(self.build_path,
431 prebuilt._BOARD_PATH % {'board': board})
432 package_path = os.path.join(board_path, 'packages')
433 url_suffix = prebuilt._REL_BOARD_PATH % {'version': self.version,
434 'board': board }
David James8fa34ea2011-04-15 13:00:20 -0700435 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James8fa34ea2011-04-15 13:00:20 -0700436 self.mox.StubOutWithMock(multiprocessing.Process, '__init__')
437 self.mox.StubOutWithMock(multiprocessing.Process, 'exitcode')
438 self.mox.StubOutWithMock(multiprocessing.Process, 'start')
439 self.mox.StubOutWithMock(multiprocessing.Process, 'join')
David James615e5b52011-06-03 11:10:15 -0700440 multiprocessing.Process.__init__(target=mox.IgnoreArg(),
Zdenek Behan5ad96c02011-06-23 01:04:06 +0200441 args=(board_path, url_suffix, self.version))
David James8fa34ea2011-04-15 13:00:20 -0700442 multiprocessing.Process.start()
David James615e5b52011-06-03 11:10:15 -0700443 prebuilt.PrebuiltUploader._UploadPrebuilt(package_path,
444 packages_url_suffix).AndReturn(True)
David James8fa34ea2011-04-15 13:00:20 -0700445 multiprocessing.Process.join()
446 multiprocessing.Process.exitcode = 0
David Jamesf0e6fd72011-04-15 15:58:07 -0700447 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
448 packages_url_suffix.rstrip('/'))
David James05bcb2b2011-02-09 09:25:47 -0800449 prebuilt.DeterminePrebuiltConfFile(self.build_path, board).AndReturn('foo')
David James27fa7d12011-06-29 17:24:14 -0700450 prebuilt.RevGitFile('foo', url_value, key=self.key, dryrun=False)
David James05bcb2b2011-02-09 09:25:47 -0800451 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
452 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700453 uploader = prebuilt.PrebuiltUploader(
454 self.upload_location, 'public-read', self.binhost, [],
David James32b0b2f2011-07-13 20:56:50 -0700455 self.build_path, [], False, 'foo', False)
David James615e5b52011-06-03 11:10:15 -0700456 uploader._SyncBoardPrebuilts(board, self.version, self.key, True,
457 True, True)
David James05bcb2b2011-02-09 09:25:47 -0800458
459
David Jamesc0f158a2011-02-22 16:07:29 -0800460class TestMain(unittest.TestCase):
461
462 def setUp(self):
463 self.mox = mox.Mox()
464
465 def tearDown(self):
466 self.mox.UnsetStubs()
467 self.mox.VerifyAll()
468
469 def testMain(self):
470 """Test that the main function works."""
471 options = mox.MockObject(object)
David Jamesc0f158a2011-02-22 16:07:29 -0800472 old_binhost = 'http://prebuilt/1'
473 options.previous_binhost_url = [old_binhost]
474 options.board = 'x86-generic'
475 options.build_path = '/trunk'
David James27fa7d12011-06-29 17:24:14 -0700476 options.debug = False
David Jamesfd0b0852011-02-23 11:15:36 -0800477 options.private = True
David James615e5b52011-06-03 11:10:15 -0700478 options.packages = []
David Jamesc0f158a2011-02-22 16:07:29 -0800479 options.sync_host = True
480 options.git_sync = True
David James8fa34ea2011-04-15 13:00:20 -0700481 options.upload_board_tarball = True
David Jamesc0f158a2011-02-22 16:07:29 -0800482 options.upload = 'gs://upload/'
David Jamesfd0b0852011-02-23 11:15:36 -0800483 options.binhost_base_url = options.upload
David Jamesc0f158a2011-02-22 16:07:29 -0800484 options.prepend_version = True
David James8ece7ee2011-06-29 16:02:30 -0700485 options.set_version = None
486 options.skip_upload = False
David Jamesc0f158a2011-02-22 16:07:29 -0800487 options.filters = True
488 options.key = 'PORTAGE_BINHOST'
David James32b0b2f2011-07-13 20:56:50 -0700489 options.binhost_conf_dir = 'foo'
David Jamesc0f158a2011-02-22 16:07:29 -0800490 options.sync_binhost_conf = True
491 self.mox.StubOutWithMock(prebuilt, 'ParseOptions')
492 prebuilt.ParseOptions().AndReturn(options)
David Jamesc0f158a2011-02-22 16:07:29 -0800493 self.mox.StubOutWithMock(prebuilt, 'GrabRemotePackageIndex')
494 prebuilt.GrabRemotePackageIndex(old_binhost).AndReturn(True)
David Jamesfd0b0852011-02-23 11:15:36 -0800495 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '__init__')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700496 self.mox.StubOutWithMock(prebuilt, 'GetBoardPathFromCrosOverlayList')
497 fake_overlay_path = '/fake_path'
Chris Sosa58669192011-06-30 12:45:03 -0700498 prebuilt.GetBoardPathFromCrosOverlayList(
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700499 options.build_path, options.board).AndReturn(fake_overlay_path)
500 expected_gs_acl_path = os.path.join(fake_overlay_path,
501 prebuilt._GOOGLESTORAGE_ACL_FILE)
502 prebuilt.PrebuiltUploader.__init__(options.upload, expected_gs_acl_path,
David James615e5b52011-06-03 11:10:15 -0700503 options.upload, mox.IgnoreArg(),
David James8ece7ee2011-06-29 16:02:30 -0700504 options.build_path, options.packages,
David James32b0b2f2011-07-13 20:56:50 -0700505 False, options.binhost_conf_dir, False)
David Jamesc0f158a2011-02-22 16:07:29 -0800506 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_SyncHostPrebuilts')
David James615e5b52011-06-03 11:10:15 -0700507 prebuilt.PrebuiltUploader._SyncHostPrebuilts(mox.IgnoreArg(), options.key,
508 options.git_sync, options.sync_binhost_conf)
David Jamesc0f158a2011-02-22 16:07:29 -0800509 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_SyncBoardPrebuilts')
510 prebuilt.PrebuiltUploader._SyncBoardPrebuilts(options.board,
David James615e5b52011-06-03 11:10:15 -0700511 mox.IgnoreArg(), options.key, options.git_sync,
David James8fa34ea2011-04-15 13:00:20 -0700512 options.sync_binhost_conf, options.upload_board_tarball)
David Jamesc0f158a2011-02-22 16:07:29 -0800513 self.mox.ReplayAll()
514 prebuilt.main()
515
David James8c846492011-01-25 17:07:29 -0800516if __name__ == '__main__':
517 unittest.main()