blob: b048ca9cdbe745c0315f53530b3188a67ac6296e [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
David James8c846492011-01-25 17:07:29 -080010import shutil
Chris Sosa471532a2011-02-01 15:10:06 -080011import sys
David James8c846492011-01-25 17:07:29 -080012import tempfile
13import unittest
14import urllib
Chris Sosa471532a2011-02-01 15:10:06 -080015
16import constants
17sys.path.append(constants.SOURCE_ROOT)
18import prebuilt
David James8c846492011-01-25 17:07:29 -080019from chromite.lib import cros_build_lib
David James615e5b52011-06-03 11:10:15 -070020from chromite.lib import binpkg
David James8c846492011-01-25 17:07:29 -080021
David James615e5b52011-06-03 11:10:15 -070022PUBLIC_PACKAGES = [{'CPV': 'gtk+/public1', 'SHA1': '1', 'MTIME': '1'},
David James8c846492011-01-25 17:07:29 -080023 {'CPV': 'gtk+/public2', 'SHA1': '2',
David James615e5b52011-06-03 11:10:15 -070024 'PATH': 'gtk+/foo.tgz', 'MTIME': '2'}]
25PRIVATE_PACKAGES = [{'CPV': 'private', 'SHA1': '3', 'MTIME': '3'}]
David James8c846492011-01-25 17:07:29 -080026
27
28def SimplePackageIndex(header=True, packages=True):
David James615e5b52011-06-03 11:10:15 -070029 pkgindex = binpkg.PackageIndex()
David James8c846492011-01-25 17:07:29 -080030 if header:
31 pkgindex.header['URI'] = 'http://www.example.com'
32 if packages:
33 pkgindex.packages = copy.deepcopy(PUBLIC_PACKAGES + PRIVATE_PACKAGES)
34 return pkgindex
35
36
37class TestUpdateFile(unittest.TestCase):
38
39 def setUp(self):
40 self.contents_str = ['# comment that should be skipped',
41 'PKGDIR="/var/lib/portage/pkgs"',
42 'PORTAGE_BINHOST="http://no.thanks.com"',
43 'portage portage-20100310.tar.bz2',
44 'COMPILE_FLAGS="some_value=some_other"',
45 ]
46 temp_fd, self.version_file = tempfile.mkstemp()
47 os.write(temp_fd, '\n'.join(self.contents_str))
48 os.close(temp_fd)
49
50 def tearDown(self):
51 os.remove(self.version_file)
52
53 def _read_version_file(self, version_file=None):
54 """Read the contents of self.version_file and return as a list."""
55 if not version_file:
56 version_file = self.version_file
57
58 version_fh = open(version_file)
59 try:
60 return [line.strip() for line in version_fh.readlines()]
61 finally:
62 version_fh.close()
63
64 def _verify_key_pair(self, key, val):
65 file_contents = self._read_version_file()
66 # ensure key for verify is wrapped on quotes
67 if '"' not in val:
68 val = '"%s"' % val
69 for entry in file_contents:
70 if '=' not in entry:
71 continue
72 file_key, file_val = entry.split('=')
73 if file_key == key:
74 if val == file_val:
75 break
76 else:
77 self.fail('Could not find "%s=%s" in version file' % (key, val))
78
79 def testAddVariableThatDoesNotExist(self):
80 """Add in a new variable that was no present in the file."""
81 key = 'PORTAGE_BINHOST'
82 value = '1234567'
83 prebuilt.UpdateLocalFile(self.version_file, value)
84 print self.version_file
85 current_version_str = self._read_version_file()
86 self._verify_key_pair(key, value)
87 print self.version_file
88
89 def testUpdateVariable(self):
90 """Test updating a variable that already exists."""
91 key, val = self.contents_str[2].split('=')
92 new_val = 'test_update'
93 self._verify_key_pair(key, val)
94 prebuilt.UpdateLocalFile(self.version_file, new_val)
95 self._verify_key_pair(key, new_val)
96
97 def testUpdateNonExistentFile(self):
98 key = 'PORTAGE_BINHOST'
99 value = '1234567'
100 non_existent_file = tempfile.mktemp()
101 try:
102 prebuilt.UpdateLocalFile(non_existent_file, value)
103 file_contents = self._read_version_file(non_existent_file)
104 self.assertEqual(file_contents, ['%s=%s' % (key, value)])
105 finally:
106 if os.path.exists(non_existent_file):
107 os.remove(non_existent_file)
108
109
David James8c846492011-01-25 17:07:29 -0800110class TestPrebuilt(unittest.TestCase):
111
112 def setUp(self):
113 self.mox = mox.Mox()
114
115 def tearDown(self):
116 self.mox.UnsetStubs()
117 self.mox.VerifyAll()
118
119 def testGenerateUploadDict(self):
120 base_local_path = '/b/cbuild/build/chroot/build/x86-dogfood/'
121 gs_bucket_path = 'gs://chromeos-prebuilt/host/version'
122 local_path = os.path.join(base_local_path, 'public1.tbz2')
123 self.mox.StubOutWithMock(prebuilt.os.path, 'exists')
124 prebuilt.os.path.exists(local_path).AndReturn(True)
125 self.mox.ReplayAll()
126 pkgs = [{ 'CPV': 'public1' }]
127 result = prebuilt.GenerateUploadDict(base_local_path, gs_bucket_path, pkgs)
128 expected = { local_path: gs_bucket_path + '/public1.tbz2' }
129 self.assertEqual(result, expected)
130
131 def testFailonUploadFail(self):
132 """Make sure we fail if one of the upload processes fail."""
David James615e5b52011-06-03 11:10:15 -0700133 self.mox.StubOutWithMock(prebuilt, '_RetryRun')
134 prebuilt._RetryRun(mox.IgnoreArg(), print_cmd=False).AndReturn(False)
135 self.mox.ReplayAll()
David James8c846492011-01-25 17:07:29 -0800136 files = {'test': '/uasd'}
David Jamesfd0b0852011-02-23 11:15:36 -0800137 result = prebuilt.RemoteUpload('public-read', files)
138 self.assertEqual(result, set([('test', '/uasd')]))
David James615e5b52011-06-03 11:10:15 -0700139 prebuilt._RetryRun('example', print_cmd=False)
David James8c846492011-01-25 17:07:29 -0800140
141 def testDeterminePrebuiltConfHost(self):
142 """Test that the host prebuilt path comes back properly."""
143 expected_path = os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64'])
144 self.assertEqual(prebuilt.DeterminePrebuiltConfFile('fake_path', 'amd64'),
145 expected_path)
146
147 def testDeterminePrebuiltConf(self):
148 """Test the different known variants of boards for proper path discovery."""
149 fake_path = '/b/cbuild'
Chris Sosa471532a2011-02-01 15:10:06 -0800150 script_path = os.path.join(fake_path, 'src/platform/dev/host')
David James8c846492011-01-25 17:07:29 -0800151 public_overlay_path = os.path.join(fake_path, 'src/overlays')
152 private_overlay_path = os.path.join(fake_path,
153 prebuilt._PRIVATE_OVERLAY_DIR)
154 path_dict = {'private_overlay_path': private_overlay_path,
155 'public_overlay_path': public_overlay_path}
156 # format for targets
157 # board target key in dictionar
158 # Tuple containing cmd run, expected results as cmd obj, and expected output
159
160 # Mock output from cros_overlay_list
161 x86_out = ('%(private_overlay_path)s/chromeos-overlay\n'
162 '%(public_overlay_path)s/overlay-x86-generic\n' % path_dict)
163
164 x86_cmd = './cros_overlay_list --board x86-generic'
165 x86_expected_path = os.path.join(public_overlay_path, 'overlay-x86-generic',
166 'prebuilt.conf')
167 # Mock output from cros_overlay_list
168 tegra2_out = ('%(private_overlay_path)s/chromeos-overlay\n'
169 '%(public_overlay_path)s/overlay-tegra2\n'
170 '%(public_overlay_path)s/overlay-variant-tegra2-seaboard\n'
171 '%(private_overlay_path)s/overlay-tegra2-private\n'
172 '%(private_overlay_path)s/'
173 'overlay-variant-tegra2-seaboard-private\n' % path_dict)
174 tegra2_cmd = './cros_overlay_list --board tegra2 --variant seaboard'
175 tegra2_expected_path = os.path.join(
176 private_overlay_path, 'overlay-variant-tegra2-seaboard-private',
177 'prebuilt.conf')
178
179
180 targets = {'x86-generic': {'cmd': x86_cmd,
181 'output': x86_out,
182 'result': x86_expected_path},
183 'tegra2_seaboard': {'cmd': tegra2_cmd,
184 'output': tegra2_out,
185 'result': tegra2_expected_path}
186 }
187
188 self.mox.StubOutWithMock(prebuilt.cros_build_lib, 'RunCommand')
189 for target, expected_results in targets.iteritems():
190 # create command object for output
191 cmd_result_obj = cros_build_lib.CommandResult()
192 cmd_result_obj.output = expected_results['output']
193 prebuilt.cros_build_lib.RunCommand(
194 expected_results['cmd'].split(), redirect_stdout=True,
195 cwd=script_path).AndReturn(cmd_result_obj)
Chris Sosa471532a2011-02-01 15:10:06 -0800196
David James8c846492011-01-25 17:07:29 -0800197 self.mox.ReplayAll()
198 for target, expected_results in targets.iteritems():
199 self.assertEqual(
200 prebuilt.DeterminePrebuiltConfFile(fake_path, target),
201 expected_results['result'])
202
203 def testDeterminePrebuiltConfGarbage(self):
204 """Ensure an exception is raised on bad input."""
205 self.assertRaises(prebuilt.UnknownBoardFormat,
206 prebuilt.DeterminePrebuiltConfFile,
207 'fake_path', 'asdfasdf')
208
209
210class TestPackagesFileFiltering(unittest.TestCase):
211
212 def testFilterPkgIndex(self):
213 pkgindex = SimplePackageIndex()
214 pkgindex.RemoveFilteredPackages(lambda pkg: pkg in PRIVATE_PACKAGES)
215 self.assertEqual(pkgindex.packages, PUBLIC_PACKAGES)
216 self.assertEqual(pkgindex.modified, True)
217
218
219class TestPopulateDuplicateDB(unittest.TestCase):
220
221 def testEmptyIndex(self):
222 pkgindex = SimplePackageIndex(packages=False)
223 db = {}
David James615e5b52011-06-03 11:10:15 -0700224 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800225 self.assertEqual(db, {})
226
227 def testNormalIndex(self):
228 pkgindex = SimplePackageIndex()
229 db = {}
David James615e5b52011-06-03 11:10:15 -0700230 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800231 self.assertEqual(len(db), 3)
David James3cbba5e2011-02-14 14:53:15 -0800232 self.assertEqual(db['1'], 'http://www.example.com/gtk+/public1.tbz2')
233 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800234 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
235
236 def testMissingSHA1(self):
237 db = {}
238 pkgindex = SimplePackageIndex()
239 del pkgindex.packages[0]['SHA1']
David James615e5b52011-06-03 11:10:15 -0700240 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800241 self.assertEqual(len(db), 2)
David James3cbba5e2011-02-14 14:53:15 -0800242 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800243 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
244
245 def testFailedPopulate(self):
246 db = {}
247 pkgindex = SimplePackageIndex(header=False)
David James615e5b52011-06-03 11:10:15 -0700248 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db, 0)
David James8c846492011-01-25 17:07:29 -0800249 pkgindex = SimplePackageIndex()
250 del pkgindex.packages[0]['CPV']
David James615e5b52011-06-03 11:10:15 -0700251 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db, 0)
David James8c846492011-01-25 17:07:29 -0800252
253
254class TestResolveDuplicateUploads(unittest.TestCase):
255
David James615e5b52011-06-03 11:10:15 -0700256 def setUp(self):
257 self.mox = mox.Mox()
258 self.mox.StubOutWithMock(binpkg.time, 'time')
259 binpkg.time.time().AndReturn(binpkg.TWO_WEEKS)
260 self.mox.ReplayAll()
261
262 def tearDown(self):
263 self.mox.UnsetStubs()
264 self.mox.VerifyAll()
265
David James8c846492011-01-25 17:07:29 -0800266 def testEmptyList(self):
267 pkgindex = SimplePackageIndex()
268 pristine = SimplePackageIndex()
269 uploads = pkgindex.ResolveDuplicateUploads([])
David James615e5b52011-06-03 11:10:15 -0700270 self.assertEqual(uploads, pkgindex.packages)
271 self.assertEqual(len(pkgindex.packages), len(pristine.packages))
272 for pkg1, pkg2 in zip(pkgindex.packages, pristine.packages):
273 self.assertNotEqual(pkg1['MTIME'], pkg2['MTIME'])
274 del pkg1['MTIME']
275 del pkg2['MTIME']
David James8c846492011-01-25 17:07:29 -0800276 self.assertEqual(pkgindex.modified, False)
277
278 def testEmptyIndex(self):
279 pkgindex = SimplePackageIndex()
280 pristine = SimplePackageIndex()
281 empty = SimplePackageIndex(packages=False)
282 uploads = pkgindex.ResolveDuplicateUploads([empty])
David James615e5b52011-06-03 11:10:15 -0700283 self.assertEqual(uploads, pkgindex.packages)
284 self.assertEqual(len(pkgindex.packages), len(pristine.packages))
285 for pkg1, pkg2 in zip(pkgindex.packages, pristine.packages):
286 self.assertNotEqual(pkg1['MTIME'], pkg2['MTIME'])
287 del pkg1['MTIME']
288 del pkg2['MTIME']
289 self.assertEqual(pkg1, pkg2)
David James8c846492011-01-25 17:07:29 -0800290 self.assertEqual(pkgindex.modified, False)
291
292 def testDuplicates(self):
293 pkgindex = SimplePackageIndex()
294 dup_pkgindex = SimplePackageIndex()
295 expected_pkgindex = SimplePackageIndex()
296 for pkg in expected_pkgindex.packages:
David James3cbba5e2011-02-14 14:53:15 -0800297 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
David James8c846492011-01-25 17:07:29 -0800298 uploads = pkgindex.ResolveDuplicateUploads([dup_pkgindex])
299 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
300
301 def testMissingSHA1(self):
302 db = {}
303 pkgindex = SimplePackageIndex()
304 dup_pkgindex = SimplePackageIndex()
305 expected_pkgindex = SimplePackageIndex()
306 del pkgindex.packages[0]['SHA1']
307 del expected_pkgindex.packages[0]['SHA1']
308 for pkg in expected_pkgindex.packages[1:]:
309 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
310 uploads = pkgindex.ResolveDuplicateUploads([dup_pkgindex])
David James615e5b52011-06-03 11:10:15 -0700311 self.assertNotEqual(pkgindex.packages[0]['MTIME'],
312 expected_pkgindex.packages[0]['MTIME'])
313 del pkgindex.packages[0]['MTIME']
314 del expected_pkgindex.packages[0]['MTIME']
David James8c846492011-01-25 17:07:29 -0800315 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
316
317
318class TestWritePackageIndex(unittest.TestCase):
319
320 def setUp(self):
321 self.mox = mox.Mox()
322
323 def tearDown(self):
324 self.mox.UnsetStubs()
325 self.mox.VerifyAll()
326
327 def testSimple(self):
328 pkgindex = SimplePackageIndex()
329 self.mox.StubOutWithMock(pkgindex, 'Write')
330 pkgindex.Write(mox.IgnoreArg())
331 self.mox.ReplayAll()
332 f = pkgindex.WriteToNamedTemporaryFile()
333 self.assertEqual(f.read(), '')
334
335
David James05bcb2b2011-02-09 09:25:47 -0800336class TestUploadPrebuilt(unittest.TestCase):
337
338 def setUp(self):
339 class MockTemporaryFile(object):
340 def __init__(self, name):
341 self.name = name
342 self.mox = mox.Mox()
343 self.pkgindex = SimplePackageIndex()
344 self.mox.StubOutWithMock(prebuilt, 'GrabLocalPackageIndex')
345 prebuilt.GrabLocalPackageIndex('/packages').AndReturn(self.pkgindex)
346 self.mox.StubOutWithMock(prebuilt, 'RemoteUpload')
347 self.mox.StubOutWithMock(self.pkgindex, 'ResolveDuplicateUploads')
348 self.pkgindex.ResolveDuplicateUploads([]).AndReturn(PRIVATE_PACKAGES)
349 self.mox.StubOutWithMock(self.pkgindex, 'WriteToNamedTemporaryFile')
350 fake_pkgs_file = MockTemporaryFile('fake')
351 self.pkgindex.WriteToNamedTemporaryFile().AndReturn(fake_pkgs_file)
352
353 def tearDown(self):
354 self.mox.UnsetStubs()
355 self.mox.VerifyAll()
356
357 def doRsyncUpload(self, suffix):
358 self.mox.StubOutWithMock(prebuilt, '_RetryRun')
359 remote_path = '/dir/%s' % suffix.rstrip('/')
360 full_remote_path = 'chromeos-prebuilt:%s' % remote_path
Peter Mayod7cd9d52011-04-21 17:58:43 -0400361 cmds = [['ssh', 'chromeos-prebuilt', 'mkdir', '-p', remote_path],
Peter Mayo193f68f2011-04-19 19:08:21 -0400362 ['rsync', '-av', '--chmod=a+r', 'fake',
363 full_remote_path + '/Packages'],
364 ['rsync', '-Rav', 'private.tbz2', full_remote_path + '/']]
David James05bcb2b2011-02-09 09:25:47 -0800365 for cmd in cmds:
Peter Mayo193f68f2011-04-19 19:08:21 -0400366 prebuilt._RetryRun(cmd, cwd='/packages').AndReturn(True)
David James05bcb2b2011-02-09 09:25:47 -0800367 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800368 uri = self.pkgindex.header['URI']
David Jamesfd0b0852011-02-23 11:15:36 -0800369 uploader = prebuilt.PrebuiltUploader('chromeos-prebuilt:/dir',
David James615e5b52011-06-03 11:10:15 -0700370 'public-read', uri, [], '/', [])
David Jamesc0f158a2011-02-22 16:07:29 -0800371 uploader._UploadPrebuilt('/packages', suffix)
David James05bcb2b2011-02-09 09:25:47 -0800372
373 def testSuccessfulGsUpload(self):
374 uploads = {'/packages/private.tbz2': 'gs://foo/private.tbz2'}
375 self.mox.StubOutWithMock(prebuilt, 'GenerateUploadDict')
376 prebuilt.GenerateUploadDict('/packages', 'gs://foo/suffix',
377 PRIVATE_PACKAGES).AndReturn(uploads)
378 uploads = uploads.copy()
379 uploads['fake'] = 'gs://foo/suffix/Packages'
David Jamesfd0b0852011-02-23 11:15:36 -0800380 acl = 'public-read'
381 prebuilt.RemoteUpload(acl, uploads).AndReturn([None])
David James05bcb2b2011-02-09 09:25:47 -0800382 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800383 uri = self.pkgindex.header['URI']
David James615e5b52011-06-03 11:10:15 -0700384 uploader = prebuilt.PrebuiltUploader('gs://foo', acl, uri, [], '/', [])
David Jamesc0f158a2011-02-22 16:07:29 -0800385 uploader._UploadPrebuilt('/packages', 'suffix')
David James05bcb2b2011-02-09 09:25:47 -0800386
387 def testSuccessfulRsyncUploadWithNoTrailingSlash(self):
388 self.doRsyncUpload('suffix')
389
390 def testSuccessfulRsyncUploadWithTrailingSlash(self):
391 self.doRsyncUpload('suffix/')
392
393
394class TestSyncPrebuilts(unittest.TestCase):
395
396 def setUp(self):
397 self.mox = mox.Mox()
David James05bcb2b2011-02-09 09:25:47 -0800398 self.mox.StubOutWithMock(prebuilt, 'DeterminePrebuiltConfFile')
David James05bcb2b2011-02-09 09:25:47 -0800399 self.mox.StubOutWithMock(prebuilt, 'RevGitFile')
400 self.mox.StubOutWithMock(prebuilt, 'UpdateBinhostConfFile')
401 self.build_path = '/trunk'
402 self.upload_location = 'gs://upload/'
403 self.version = '1'
404 self.binhost = 'http://prebuilt/'
405 self.key = 'PORTAGE_BINHOST'
David James615e5b52011-06-03 11:10:15 -0700406 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_UploadPrebuilt')
David James05bcb2b2011-02-09 09:25:47 -0800407
408 def tearDown(self):
409 self.mox.UnsetStubs()
410 self.mox.VerifyAll()
411
412 def testSyncHostPrebuilts(self):
413 package_path = os.path.join(self.build_path,
414 prebuilt._HOST_PACKAGES_PATH)
415 url_suffix = prebuilt._REL_HOST_PATH % {'version': self.version,
416 'target': prebuilt._HOST_TARGET }
David James8fa34ea2011-04-15 13:00:20 -0700417 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James615e5b52011-06-03 11:10:15 -0700418 prebuilt.PrebuiltUploader._UploadPrebuilt(package_path,
419 packages_url_suffix).AndReturn(True)
David Jamesf0e6fd72011-04-15 15:58:07 -0700420 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
421 packages_url_suffix.rstrip('/'))
David James05bcb2b2011-02-09 09:25:47 -0800422 prebuilt.RevGitFile(mox.IgnoreArg(), url_value, key=self.key)
423 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
424 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700425 uploader = prebuilt.PrebuiltUploader(
426 self.upload_location, 'public-read', self.binhost, [],
427 self.build_path, [])
428 uploader._SyncHostPrebuilts(self.version, self.key, True, True)
David James05bcb2b2011-02-09 09:25:47 -0800429
430 def testSyncBoardPrebuilts(self):
431 board = 'x86-generic'
432 board_path = os.path.join(self.build_path,
433 prebuilt._BOARD_PATH % {'board': board})
434 package_path = os.path.join(board_path, 'packages')
435 url_suffix = prebuilt._REL_BOARD_PATH % {'version': self.version,
436 'board': board }
David James8fa34ea2011-04-15 13:00:20 -0700437 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
438 process = None
439 self.mox.StubOutWithMock(multiprocessing.Process, '__init__')
440 self.mox.StubOutWithMock(multiprocessing.Process, 'exitcode')
441 self.mox.StubOutWithMock(multiprocessing.Process, 'start')
442 self.mox.StubOutWithMock(multiprocessing.Process, 'join')
David James615e5b52011-06-03 11:10:15 -0700443 multiprocessing.Process.__init__(target=mox.IgnoreArg(),
Zdenek Behan5ad96c02011-06-23 01:04:06 +0200444 args=(board_path, url_suffix, self.version))
David James8fa34ea2011-04-15 13:00:20 -0700445 multiprocessing.Process.start()
David James615e5b52011-06-03 11:10:15 -0700446 prebuilt.PrebuiltUploader._UploadPrebuilt(package_path,
447 packages_url_suffix).AndReturn(True)
David James8fa34ea2011-04-15 13:00:20 -0700448 multiprocessing.Process.join()
449 multiprocessing.Process.exitcode = 0
David Jamesf0e6fd72011-04-15 15:58:07 -0700450 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
451 packages_url_suffix.rstrip('/'))
David James05bcb2b2011-02-09 09:25:47 -0800452 prebuilt.DeterminePrebuiltConfFile(self.build_path, board).AndReturn('foo')
453 prebuilt.RevGitFile('foo', url_value, key=self.key)
454 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
455 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700456 uploader = prebuilt.PrebuiltUploader(
457 self.upload_location, 'public-read', self.binhost, [],
458 self.build_path, [])
459 uploader._SyncBoardPrebuilts(board, self.version, self.key, True,
460 True, True)
David James05bcb2b2011-02-09 09:25:47 -0800461
462
David Jamesc0f158a2011-02-22 16:07:29 -0800463class TestMain(unittest.TestCase):
464
465 def setUp(self):
466 self.mox = mox.Mox()
467
468 def tearDown(self):
469 self.mox.UnsetStubs()
470 self.mox.VerifyAll()
471
472 def testMain(self):
473 """Test that the main function works."""
474 options = mox.MockObject(object)
David Jamesc0f158a2011-02-22 16:07:29 -0800475 old_binhost = 'http://prebuilt/1'
476 options.previous_binhost_url = [old_binhost]
477 options.board = 'x86-generic'
478 options.build_path = '/trunk'
David Jamesfd0b0852011-02-23 11:15:36 -0800479 options.private = True
David James615e5b52011-06-03 11:10:15 -0700480 options.packages = []
David Jamesc0f158a2011-02-22 16:07:29 -0800481 options.sync_host = True
482 options.git_sync = True
David James8fa34ea2011-04-15 13:00:20 -0700483 options.upload_board_tarball = True
David Jamesc0f158a2011-02-22 16:07:29 -0800484 options.upload = 'gs://upload/'
David Jamesfd0b0852011-02-23 11:15:36 -0800485 options.binhost_base_url = options.upload
David Jamesc0f158a2011-02-22 16:07:29 -0800486 options.prepend_version = True
487 options.filters = True
488 options.key = 'PORTAGE_BINHOST'
489 options.sync_binhost_conf = True
490 self.mox.StubOutWithMock(prebuilt, 'ParseOptions')
491 prebuilt.ParseOptions().AndReturn(options)
David Jamesc0f158a2011-02-22 16:07:29 -0800492 self.mox.StubOutWithMock(prebuilt, 'GrabRemotePackageIndex')
493 prebuilt.GrabRemotePackageIndex(old_binhost).AndReturn(True)
David Jamesfd0b0852011-02-23 11:15:36 -0800494 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '__init__')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700495 self.mox.StubOutWithMock(prebuilt, 'GetBoardPathFromCrosOverlayList')
496 fake_overlay_path = '/fake_path'
497 acl_path = prebuilt.GetBoardPathFromCrosOverlayList(
498 options.build_path, options.board).AndReturn(fake_overlay_path)
499 expected_gs_acl_path = os.path.join(fake_overlay_path,
500 prebuilt._GOOGLESTORAGE_ACL_FILE)
501 prebuilt.PrebuiltUploader.__init__(options.upload, expected_gs_acl_path,
David James615e5b52011-06-03 11:10:15 -0700502 options.upload, mox.IgnoreArg(),
503 options.build_path, options.packages)
David Jamesc0f158a2011-02-22 16:07:29 -0800504 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_SyncHostPrebuilts')
David James615e5b52011-06-03 11:10:15 -0700505 prebuilt.PrebuiltUploader._SyncHostPrebuilts(mox.IgnoreArg(), options.key,
506 options.git_sync, options.sync_binhost_conf)
David Jamesc0f158a2011-02-22 16:07:29 -0800507 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_SyncBoardPrebuilts')
508 prebuilt.PrebuiltUploader._SyncBoardPrebuilts(options.board,
David James615e5b52011-06-03 11:10:15 -0700509 mox.IgnoreArg(), options.key, options.git_sync,
David James8fa34ea2011-04-15 13:00:20 -0700510 options.sync_binhost_conf, options.upload_board_tarball)
David Jamesc0f158a2011-02-22 16:07:29 -0800511 self.mox.ReplayAll()
512 prebuilt.main()
513
David James8c846492011-01-25 17:07:29 -0800514if __name__ == '__main__':
515 unittest.main()