blob: 63ec49d115de17c6a4de3e9455dcc98d120f2086 [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
David James710b7dc2012-02-07 16:49:59 -080015sys.path.insert(0, constants.SOURCE_ROOT)
Chris Sosa471532a2011-02-01 15:10:06 -080016import 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 James4058b0d2011-12-08 21:24:50 -080020# pylint: disable=E1120,W0212,R0904
David James615e5b52011-06-03 11:10:15 -070021PUBLIC_PACKAGES = [{'CPV': 'gtk+/public1', 'SHA1': '1', 'MTIME': '1'},
David James8c846492011-01-25 17:07:29 -080022 {'CPV': 'gtk+/public2', 'SHA1': '2',
David James615e5b52011-06-03 11:10:15 -070023 'PATH': 'gtk+/foo.tgz', 'MTIME': '2'}]
24PRIVATE_PACKAGES = [{'CPV': 'private', 'SHA1': '3', 'MTIME': '3'}]
David James8c846492011-01-25 17:07:29 -080025
26
27def SimplePackageIndex(header=True, packages=True):
Chris Sosa58669192011-06-30 12:45:03 -070028 pkgindex = binpkg.PackageIndex()
29 if header:
30 pkgindex.header['URI'] = 'http://www.example.com'
31 if packages:
32 pkgindex.packages = copy.deepcopy(PUBLIC_PACKAGES + PRIVATE_PACKAGES)
33 return pkgindex
David James8c846492011-01-25 17:07:29 -080034
35
36class TestUpdateFile(unittest.TestCase):
37
38 def setUp(self):
39 self.contents_str = ['# comment that should be skipped',
40 'PKGDIR="/var/lib/portage/pkgs"',
41 'PORTAGE_BINHOST="http://no.thanks.com"',
42 'portage portage-20100310.tar.bz2',
43 'COMPILE_FLAGS="some_value=some_other"',
44 ]
45 temp_fd, self.version_file = tempfile.mkstemp()
46 os.write(temp_fd, '\n'.join(self.contents_str))
47 os.close(temp_fd)
48
49 def tearDown(self):
50 os.remove(self.version_file)
51
52 def _read_version_file(self, version_file=None):
53 """Read the contents of self.version_file and return as a list."""
54 if not version_file:
55 version_file = self.version_file
56
57 version_fh = open(version_file)
58 try:
59 return [line.strip() for line in version_fh.readlines()]
60 finally:
61 version_fh.close()
62
63 def _verify_key_pair(self, key, val):
64 file_contents = self._read_version_file()
65 # ensure key for verify is wrapped on quotes
66 if '"' not in val:
67 val = '"%s"' % val
68 for entry in file_contents:
69 if '=' not in entry:
70 continue
71 file_key, file_val = entry.split('=')
72 if file_key == key:
73 if val == file_val:
74 break
75 else:
76 self.fail('Could not find "%s=%s" in version file' % (key, val))
77
78 def testAddVariableThatDoesNotExist(self):
79 """Add in a new variable that was no present in the file."""
80 key = 'PORTAGE_BINHOST'
81 value = '1234567'
82 prebuilt.UpdateLocalFile(self.version_file, value)
83 print self.version_file
Chris Sosa58669192011-06-30 12:45:03 -070084 self._read_version_file()
David James8c846492011-01-25 17:07:29 -080085 self._verify_key_pair(key, value)
86 print self.version_file
87
88 def testUpdateVariable(self):
89 """Test updating a variable that already exists."""
90 key, val = self.contents_str[2].split('=')
91 new_val = 'test_update'
92 self._verify_key_pair(key, val)
93 prebuilt.UpdateLocalFile(self.version_file, new_val)
94 self._verify_key_pair(key, new_val)
95
96 def testUpdateNonExistentFile(self):
97 key = 'PORTAGE_BINHOST'
98 value = '1234567'
99 non_existent_file = tempfile.mktemp()
100 try:
101 prebuilt.UpdateLocalFile(non_existent_file, value)
102 file_contents = self._read_version_file(non_existent_file)
Chris Sosa739c8752012-05-16 19:30:35 -0700103 self.assertEqual(file_contents, ['%s="%s"' % (key, value)])
David James8c846492011-01-25 17:07:29 -0800104 finally:
105 if os.path.exists(non_existent_file):
106 os.remove(non_existent_file)
107
108
David James8c846492011-01-25 17:07:29 -0800109class TestPrebuilt(unittest.TestCase):
110
111 def setUp(self):
112 self.mox = mox.Mox()
113
114 def tearDown(self):
115 self.mox.UnsetStubs()
116 self.mox.VerifyAll()
117
118 def testGenerateUploadDict(self):
119 base_local_path = '/b/cbuild/build/chroot/build/x86-dogfood/'
120 gs_bucket_path = 'gs://chromeos-prebuilt/host/version'
121 local_path = os.path.join(base_local_path, 'public1.tbz2')
122 self.mox.StubOutWithMock(prebuilt.os.path, 'exists')
123 prebuilt.os.path.exists(local_path).AndReturn(True)
124 self.mox.ReplayAll()
125 pkgs = [{ 'CPV': 'public1' }]
126 result = prebuilt.GenerateUploadDict(base_local_path, gs_bucket_path, pkgs)
127 expected = { local_path: gs_bucket_path + '/public1.tbz2' }
128 self.assertEqual(result, expected)
129
130 def testFailonUploadFail(self):
131 """Make sure we fail if one of the upload processes fail."""
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700132 return_obj = self.mox.CreateMock(cros_build_lib.CommandResult)
133 return_obj.returncode = 1
134 self.mox.StubOutWithMock(cros_build_lib, 'RunCommandWithRetries')
135 cros_build_lib.RunCommandWithRetries(
136 prebuilt._RETRIES, mox.IgnoreArg(), print_cmd=False,
137 error_code_ok=True).AndReturn(return_obj)
David James615e5b52011-06-03 11:10:15 -0700138 self.mox.ReplayAll()
David James8c846492011-01-25 17:07:29 -0800139 files = {'test': '/uasd'}
David Jamesfd0b0852011-02-23 11:15:36 -0800140 result = prebuilt.RemoteUpload('public-read', files)
141 self.assertEqual(result, set([('test', '/uasd')]))
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700142 cros_build_lib.RunCommandWithRetries(prebuilt._RETRIES, 'example',
143 print_cmd=False, error_code_ok=True)
David James8c846492011-01-25 17:07:29 -0800144
145 def testDeterminePrebuiltConfHost(self):
146 """Test that the host prebuilt path comes back properly."""
147 expected_path = os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64'])
148 self.assertEqual(prebuilt.DeterminePrebuiltConfFile('fake_path', 'amd64'),
149 expected_path)
150
151 def testDeterminePrebuiltConf(self):
152 """Test the different known variants of boards for proper path discovery."""
153 fake_path = '/b/cbuild'
Chris Sosa471532a2011-02-01 15:10:06 -0800154 script_path = os.path.join(fake_path, 'src/platform/dev/host')
David James8c846492011-01-25 17:07:29 -0800155 public_overlay_path = os.path.join(fake_path, 'src/overlays')
156 private_overlay_path = os.path.join(fake_path,
157 prebuilt._PRIVATE_OVERLAY_DIR)
158 path_dict = {'private_overlay_path': private_overlay_path,
159 'public_overlay_path': public_overlay_path}
160 # format for targets
161 # board target key in dictionar
162 # Tuple containing cmd run, expected results as cmd obj, and expected output
163
164 # Mock output from cros_overlay_list
165 x86_out = ('%(private_overlay_path)s/chromeos-overlay\n'
166 '%(public_overlay_path)s/overlay-x86-generic\n' % path_dict)
167
168 x86_cmd = './cros_overlay_list --board x86-generic'
169 x86_expected_path = os.path.join(public_overlay_path, 'overlay-x86-generic',
170 'prebuilt.conf')
171 # Mock output from cros_overlay_list
172 tegra2_out = ('%(private_overlay_path)s/chromeos-overlay\n'
173 '%(public_overlay_path)s/overlay-tegra2\n'
174 '%(public_overlay_path)s/overlay-variant-tegra2-seaboard\n'
175 '%(private_overlay_path)s/overlay-tegra2-private\n'
176 '%(private_overlay_path)s/'
177 'overlay-variant-tegra2-seaboard-private\n' % path_dict)
178 tegra2_cmd = './cros_overlay_list --board tegra2 --variant seaboard'
179 tegra2_expected_path = os.path.join(
180 private_overlay_path, 'overlay-variant-tegra2-seaboard-private',
181 'prebuilt.conf')
182
183
184 targets = {'x86-generic': {'cmd': x86_cmd,
185 'output': x86_out,
186 'result': x86_expected_path},
187 'tegra2_seaboard': {'cmd': tegra2_cmd,
188 'output': tegra2_out,
189 'result': tegra2_expected_path}
190 }
191
192 self.mox.StubOutWithMock(prebuilt.cros_build_lib, 'RunCommand')
193 for target, expected_results in targets.iteritems():
194 # create command object for output
195 cmd_result_obj = cros_build_lib.CommandResult()
196 cmd_result_obj.output = expected_results['output']
197 prebuilt.cros_build_lib.RunCommand(
198 expected_results['cmd'].split(), redirect_stdout=True,
199 cwd=script_path).AndReturn(cmd_result_obj)
Chris Sosa471532a2011-02-01 15:10:06 -0800200
David James8c846492011-01-25 17:07:29 -0800201 self.mox.ReplayAll()
202 for target, expected_results in targets.iteritems():
David James4058b0d2011-12-08 21:24:50 -0800203 target = prebuilt.BuildTarget(target)
David James8c846492011-01-25 17:07:29 -0800204 self.assertEqual(
205 prebuilt.DeterminePrebuiltConfFile(fake_path, target),
206 expected_results['result'])
207
David James8c846492011-01-25 17:07:29 -0800208
209class TestPackagesFileFiltering(unittest.TestCase):
210
211 def testFilterPkgIndex(self):
212 pkgindex = SimplePackageIndex()
213 pkgindex.RemoveFilteredPackages(lambda pkg: pkg in PRIVATE_PACKAGES)
214 self.assertEqual(pkgindex.packages, PUBLIC_PACKAGES)
215 self.assertEqual(pkgindex.modified, True)
216
217
218class TestPopulateDuplicateDB(unittest.TestCase):
219
220 def testEmptyIndex(self):
221 pkgindex = SimplePackageIndex(packages=False)
222 db = {}
David James615e5b52011-06-03 11:10:15 -0700223 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800224 self.assertEqual(db, {})
225
226 def testNormalIndex(self):
227 pkgindex = SimplePackageIndex()
228 db = {}
David James615e5b52011-06-03 11:10:15 -0700229 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800230 self.assertEqual(len(db), 3)
David James3cbba5e2011-02-14 14:53:15 -0800231 self.assertEqual(db['1'], 'http://www.example.com/gtk+/public1.tbz2')
232 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800233 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
234
235 def testMissingSHA1(self):
236 db = {}
237 pkgindex = SimplePackageIndex()
238 del pkgindex.packages[0]['SHA1']
David James615e5b52011-06-03 11:10:15 -0700239 pkgindex._PopulateDuplicateDB(db, 0)
David James8c846492011-01-25 17:07:29 -0800240 self.assertEqual(len(db), 2)
David James3cbba5e2011-02-14 14:53:15 -0800241 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800242 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
243
244 def testFailedPopulate(self):
245 db = {}
246 pkgindex = SimplePackageIndex(header=False)
David James615e5b52011-06-03 11:10:15 -0700247 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db, 0)
David James8c846492011-01-25 17:07:29 -0800248 pkgindex = SimplePackageIndex()
249 del pkgindex.packages[0]['CPV']
David James615e5b52011-06-03 11:10:15 -0700250 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db, 0)
David James8c846492011-01-25 17:07:29 -0800251
252
253class TestResolveDuplicateUploads(unittest.TestCase):
254
David James615e5b52011-06-03 11:10:15 -0700255 def setUp(self):
256 self.mox = mox.Mox()
257 self.mox.StubOutWithMock(binpkg.time, 'time')
258 binpkg.time.time().AndReturn(binpkg.TWO_WEEKS)
259 self.mox.ReplayAll()
260
261 def tearDown(self):
262 self.mox.UnsetStubs()
263 self.mox.VerifyAll()
264
David James8c846492011-01-25 17:07:29 -0800265 def testEmptyList(self):
266 pkgindex = SimplePackageIndex()
267 pristine = SimplePackageIndex()
268 uploads = pkgindex.ResolveDuplicateUploads([])
David James615e5b52011-06-03 11:10:15 -0700269 self.assertEqual(uploads, pkgindex.packages)
270 self.assertEqual(len(pkgindex.packages), len(pristine.packages))
271 for pkg1, pkg2 in zip(pkgindex.packages, pristine.packages):
272 self.assertNotEqual(pkg1['MTIME'], pkg2['MTIME'])
273 del pkg1['MTIME']
274 del pkg2['MTIME']
David James8c846492011-01-25 17:07:29 -0800275 self.assertEqual(pkgindex.modified, False)
276
277 def testEmptyIndex(self):
278 pkgindex = SimplePackageIndex()
279 pristine = SimplePackageIndex()
280 empty = SimplePackageIndex(packages=False)
281 uploads = pkgindex.ResolveDuplicateUploads([empty])
David James615e5b52011-06-03 11:10:15 -0700282 self.assertEqual(uploads, pkgindex.packages)
283 self.assertEqual(len(pkgindex.packages), len(pristine.packages))
284 for pkg1, pkg2 in zip(pkgindex.packages, pristine.packages):
285 self.assertNotEqual(pkg1['MTIME'], pkg2['MTIME'])
286 del pkg1['MTIME']
287 del pkg2['MTIME']
288 self.assertEqual(pkg1, pkg2)
David James8c846492011-01-25 17:07:29 -0800289 self.assertEqual(pkgindex.modified, False)
290
291 def testDuplicates(self):
292 pkgindex = SimplePackageIndex()
293 dup_pkgindex = SimplePackageIndex()
294 expected_pkgindex = SimplePackageIndex()
295 for pkg in expected_pkgindex.packages:
David James3cbba5e2011-02-14 14:53:15 -0800296 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
Chris Sosa58669192011-06-30 12:45:03 -0700297 pkgindex.ResolveDuplicateUploads([dup_pkgindex])
David James8c846492011-01-25 17:07:29 -0800298 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
299
300 def testMissingSHA1(self):
David James8c846492011-01-25 17:07:29 -0800301 pkgindex = SimplePackageIndex()
302 dup_pkgindex = SimplePackageIndex()
303 expected_pkgindex = SimplePackageIndex()
304 del pkgindex.packages[0]['SHA1']
305 del expected_pkgindex.packages[0]['SHA1']
306 for pkg in expected_pkgindex.packages[1:]:
307 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
Chris Sosa58669192011-06-30 12:45:03 -0700308 pkgindex.ResolveDuplicateUploads([dup_pkgindex])
David James615e5b52011-06-03 11:10:15 -0700309 self.assertNotEqual(pkgindex.packages[0]['MTIME'],
310 expected_pkgindex.packages[0]['MTIME'])
311 del pkgindex.packages[0]['MTIME']
312 del expected_pkgindex.packages[0]['MTIME']
David James8c846492011-01-25 17:07:29 -0800313 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
314
315
316class TestWritePackageIndex(unittest.TestCase):
317
318 def setUp(self):
319 self.mox = mox.Mox()
320
321 def tearDown(self):
322 self.mox.UnsetStubs()
323 self.mox.VerifyAll()
324
325 def testSimple(self):
326 pkgindex = SimplePackageIndex()
327 self.mox.StubOutWithMock(pkgindex, 'Write')
328 pkgindex.Write(mox.IgnoreArg())
329 self.mox.ReplayAll()
330 f = pkgindex.WriteToNamedTemporaryFile()
331 self.assertEqual(f.read(), '')
332
333
David James05bcb2b2011-02-09 09:25:47 -0800334class TestUploadPrebuilt(unittest.TestCase):
335
336 def setUp(self):
337 class MockTemporaryFile(object):
338 def __init__(self, name):
339 self.name = name
340 self.mox = mox.Mox()
341 self.pkgindex = SimplePackageIndex()
Brian Harring99718532012-06-10 05:12:14 -0700342 self.mox.StubOutWithMock(binpkg, 'GrabLocalPackageIndex')
343 binpkg.GrabLocalPackageIndex('/packages').AndReturn(self.pkgindex)
David James05bcb2b2011-02-09 09:25:47 -0800344 self.mox.StubOutWithMock(prebuilt, 'RemoteUpload')
345 self.mox.StubOutWithMock(self.pkgindex, 'ResolveDuplicateUploads')
346 self.pkgindex.ResolveDuplicateUploads([]).AndReturn(PRIVATE_PACKAGES)
347 self.mox.StubOutWithMock(self.pkgindex, 'WriteToNamedTemporaryFile')
348 fake_pkgs_file = MockTemporaryFile('fake')
349 self.pkgindex.WriteToNamedTemporaryFile().AndReturn(fake_pkgs_file)
350
351 def tearDown(self):
352 self.mox.UnsetStubs()
353 self.mox.VerifyAll()
354
355 def doRsyncUpload(self, suffix):
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700356 mock_return = self.mox.CreateMock(cros_build_lib.CommandResult)
357 mock_return.returncode = 0
358 self.mox.StubOutWithMock(cros_build_lib, 'RunCommandWithRetries')
David James05bcb2b2011-02-09 09:25:47 -0800359 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:
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700366 cros_build_lib.RunCommandWithRetries(
367 prebuilt._RETRIES, cmd, cwd='/packages').AndReturn(mock_return)
David James05bcb2b2011-02-09 09:25:47 -0800368 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800369 uri = self.pkgindex.header['URI']
David Jamesfd0b0852011-02-23 11:15:36 -0800370 uploader = prebuilt.PrebuiltUploader('chromeos-prebuilt:/dir',
David James4058b0d2011-12-08 21:24:50 -0800371 'public-read', uri, [], '/', [], False, 'foo', False,
372 ('x86-foo', 'aura'), [])
David Jamesc0f158a2011-02-22 16:07:29 -0800373 uploader._UploadPrebuilt('/packages', suffix)
David James05bcb2b2011-02-09 09:25:47 -0800374
375 def testSuccessfulGsUpload(self):
376 uploads = {'/packages/private.tbz2': 'gs://foo/private.tbz2'}
377 self.mox.StubOutWithMock(prebuilt, 'GenerateUploadDict')
378 prebuilt.GenerateUploadDict('/packages', 'gs://foo/suffix',
379 PRIVATE_PACKAGES).AndReturn(uploads)
380 uploads = uploads.copy()
381 uploads['fake'] = 'gs://foo/suffix/Packages'
David Jamesfd0b0852011-02-23 11:15:36 -0800382 acl = 'public-read'
383 prebuilt.RemoteUpload(acl, uploads).AndReturn([None])
David James05bcb2b2011-02-09 09:25:47 -0800384 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800385 uri = self.pkgindex.header['URI']
David James8ece7ee2011-06-29 16:02:30 -0700386 uploader = prebuilt.PrebuiltUploader('gs://foo', acl, uri, [], '/', [],
David Jamese2488642011-11-14 16:15:20 -0800387 False, 'foo', False, 'x86-foo', [])
David Jamesc0f158a2011-02-22 16:07:29 -0800388 uploader._UploadPrebuilt('/packages', 'suffix')
David James05bcb2b2011-02-09 09:25:47 -0800389
390 def testSuccessfulRsyncUploadWithNoTrailingSlash(self):
391 self.doRsyncUpload('suffix')
392
393 def testSuccessfulRsyncUploadWithTrailingSlash(self):
394 self.doRsyncUpload('suffix/')
395
396
397class TestSyncPrebuilts(unittest.TestCase):
398
399 def setUp(self):
400 self.mox = mox.Mox()
David James05bcb2b2011-02-09 09:25:47 -0800401 self.mox.StubOutWithMock(prebuilt, 'DeterminePrebuiltConfFile')
David James05bcb2b2011-02-09 09:25:47 -0800402 self.mox.StubOutWithMock(prebuilt, 'RevGitFile')
403 self.mox.StubOutWithMock(prebuilt, 'UpdateBinhostConfFile')
404 self.build_path = '/trunk'
405 self.upload_location = 'gs://upload/'
406 self.version = '1'
407 self.binhost = 'http://prebuilt/'
408 self.key = 'PORTAGE_BINHOST'
David James615e5b52011-06-03 11:10:15 -0700409 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_UploadPrebuilt')
David James05bcb2b2011-02-09 09:25:47 -0800410
411 def tearDown(self):
412 self.mox.UnsetStubs()
413 self.mox.VerifyAll()
414
415 def testSyncHostPrebuilts(self):
David Jamese2488642011-11-14 16:15:20 -0800416 board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800417 target = prebuilt.BuildTarget(board, 'aura')
418 slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
David James05bcb2b2011-02-09 09:25:47 -0800419 package_path = os.path.join(self.build_path,
420 prebuilt._HOST_PACKAGES_PATH)
421 url_suffix = prebuilt._REL_HOST_PATH % {'version': self.version,
David James4058b0d2011-12-08 21:24:50 -0800422 'host_arch': prebuilt._HOST_ARCH, 'target': target}
David James8fa34ea2011-04-15 13:00:20 -0700423 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James615e5b52011-06-03 11:10:15 -0700424 prebuilt.PrebuiltUploader._UploadPrebuilt(package_path,
425 packages_url_suffix).AndReturn(True)
David Jamesf0e6fd72011-04-15 15:58:07 -0700426 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
427 packages_url_suffix.rstrip('/'))
David Jamese2488642011-11-14 16:15:20 -0800428 urls = [url_value.replace('foo', 'bar'), url_value]
David James20b2b6f2011-11-18 15:11:58 -0800429 binhost = ' '.join(urls)
David Jamese2488642011-11-14 16:15:20 -0800430 prebuilt.RevGitFile(mox.IgnoreArg(), binhost, key=self.key, dryrun=False)
431 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, binhost)
David James05bcb2b2011-02-09 09:25:47 -0800432 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700433 uploader = prebuilt.PrebuiltUploader(
434 self.upload_location, 'public-read', self.binhost, [],
David James4058b0d2011-12-08 21:24:50 -0800435 self.build_path, [], False, 'foo', False, target, slave_targets)
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700436 uploader.SyncHostPrebuilts(self.version, self.key, True, True)
David James05bcb2b2011-02-09 09:25:47 -0800437
438 def testSyncBoardPrebuilts(self):
David Jamese2488642011-11-14 16:15:20 -0800439 board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800440 target = prebuilt.BuildTarget(board, 'aura')
441 slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
David James05bcb2b2011-02-09 09:25:47 -0800442 board_path = os.path.join(self.build_path,
443 prebuilt._BOARD_PATH % {'board': board})
444 package_path = os.path.join(board_path, 'packages')
445 url_suffix = prebuilt._REL_BOARD_PATH % {'version': self.version,
David James4058b0d2011-12-08 21:24:50 -0800446 'target': target}
David James8fa34ea2011-04-15 13:00:20 -0700447 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James8fa34ea2011-04-15 13:00:20 -0700448 self.mox.StubOutWithMock(multiprocessing.Process, '__init__')
449 self.mox.StubOutWithMock(multiprocessing.Process, 'exitcode')
450 self.mox.StubOutWithMock(multiprocessing.Process, 'start')
451 self.mox.StubOutWithMock(multiprocessing.Process, 'join')
David James615e5b52011-06-03 11:10:15 -0700452 multiprocessing.Process.__init__(target=mox.IgnoreArg(),
Zdenek Behan5ad96c02011-06-23 01:04:06 +0200453 args=(board_path, url_suffix, self.version))
David James8fa34ea2011-04-15 13:00:20 -0700454 multiprocessing.Process.start()
David James615e5b52011-06-03 11:10:15 -0700455 prebuilt.PrebuiltUploader._UploadPrebuilt(package_path,
456 packages_url_suffix).AndReturn(True)
David James8fa34ea2011-04-15 13:00:20 -0700457 multiprocessing.Process.join()
458 multiprocessing.Process.exitcode = 0
David Jamesf0e6fd72011-04-15 15:58:07 -0700459 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
460 packages_url_suffix.rstrip('/'))
David Jamese2488642011-11-14 16:15:20 -0800461 bar_binhost = url_value.replace('foo', 'bar')
David James4058b0d2011-12-08 21:24:50 -0800462 prebuilt.DeterminePrebuiltConfFile(self.build_path,
463 slave_targets[0]).AndReturn('bar')
David Jamese2488642011-11-14 16:15:20 -0800464 prebuilt.RevGitFile('bar', bar_binhost, key=self.key, dryrun=False)
465 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, bar_binhost)
David James4058b0d2011-12-08 21:24:50 -0800466 prebuilt.DeterminePrebuiltConfFile(self.build_path, target).AndReturn('foo')
David James27fa7d12011-06-29 17:24:14 -0700467 prebuilt.RevGitFile('foo', url_value, key=self.key, dryrun=False)
David James05bcb2b2011-02-09 09:25:47 -0800468 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
469 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700470 uploader = prebuilt.PrebuiltUploader(
471 self.upload_location, 'public-read', self.binhost, [],
David James4058b0d2011-12-08 21:24:50 -0800472 self.build_path, [], False, 'foo', False, target, slave_targets)
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700473 uploader.SyncBoardPrebuilts(self.version, self.key, True, True, True)
David James05bcb2b2011-02-09 09:25:47 -0800474
475
David Jamesc0f158a2011-02-22 16:07:29 -0800476class TestMain(unittest.TestCase):
477
478 def setUp(self):
479 self.mox = mox.Mox()
480
481 def tearDown(self):
482 self.mox.UnsetStubs()
483 self.mox.VerifyAll()
484
485 def testMain(self):
486 """Test that the main function works."""
487 options = mox.MockObject(object)
David Jamesc0f158a2011-02-22 16:07:29 -0800488 old_binhost = 'http://prebuilt/1'
489 options.previous_binhost_url = [old_binhost]
David Jamese2488642011-11-14 16:15:20 -0800490 options.board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800491 options.profile = None
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700492 target = prebuilt.BuildTarget(options.board, options.profile)
David Jamesc0f158a2011-02-22 16:07:29 -0800493 options.build_path = '/trunk'
David James27fa7d12011-06-29 17:24:14 -0700494 options.debug = False
David Jamesfd0b0852011-02-23 11:15:36 -0800495 options.private = True
David James615e5b52011-06-03 11:10:15 -0700496 options.packages = []
David Jamesc0f158a2011-02-22 16:07:29 -0800497 options.sync_host = True
498 options.git_sync = True
David James8fa34ea2011-04-15 13:00:20 -0700499 options.upload_board_tarball = True
David Jamesc0f158a2011-02-22 16:07:29 -0800500 options.upload = 'gs://upload/'
David Jamesfd0b0852011-02-23 11:15:36 -0800501 options.binhost_base_url = options.upload
David Jamesc0f158a2011-02-22 16:07:29 -0800502 options.prepend_version = True
David James8ece7ee2011-06-29 16:02:30 -0700503 options.set_version = None
504 options.skip_upload = False
David Jamesc0f158a2011-02-22 16:07:29 -0800505 options.filters = True
506 options.key = 'PORTAGE_BINHOST'
David James32b0b2f2011-07-13 20:56:50 -0700507 options.binhost_conf_dir = 'foo'
David Jamesc0f158a2011-02-22 16:07:29 -0800508 options.sync_binhost_conf = True
David James4058b0d2011-12-08 21:24:50 -0800509 options.slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
David Jamesc0f158a2011-02-22 16:07:29 -0800510 self.mox.StubOutWithMock(prebuilt, 'ParseOptions')
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700511 prebuilt.ParseOptions().AndReturn(tuple([options, target]))
Brian Harring99718532012-06-10 05:12:14 -0700512 self.mox.StubOutWithMock(binpkg, 'GrabRemotePackageIndex')
513 binpkg.GrabRemotePackageIndex(old_binhost).AndReturn(True)
David Jamesfd0b0852011-02-23 11:15:36 -0800514 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '__init__')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700515 self.mox.StubOutWithMock(prebuilt, 'GetBoardPathFromCrosOverlayList')
516 fake_overlay_path = '/fake_path'
Chris Sosa58669192011-06-30 12:45:03 -0700517 prebuilt.GetBoardPathFromCrosOverlayList(
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700518 options.build_path, options.board).AndReturn(fake_overlay_path)
519 expected_gs_acl_path = os.path.join(fake_overlay_path,
520 prebuilt._GOOGLESTORAGE_ACL_FILE)
521 prebuilt.PrebuiltUploader.__init__(options.upload, expected_gs_acl_path,
David James615e5b52011-06-03 11:10:15 -0700522 options.upload, mox.IgnoreArg(),
David James8ece7ee2011-06-29 16:02:30 -0700523 options.build_path, options.packages,
David Jamese2488642011-11-14 16:15:20 -0800524 False, options.binhost_conf_dir, False,
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700525 target, options.slave_targets)
526 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, 'SyncHostPrebuilts')
527 prebuilt.PrebuiltUploader.SyncHostPrebuilts(mox.IgnoreArg(), options.key,
David James615e5b52011-06-03 11:10:15 -0700528 options.git_sync, options.sync_binhost_conf)
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700529 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, 'SyncBoardPrebuilts')
530 prebuilt.PrebuiltUploader.SyncBoardPrebuilts(
David James615e5b52011-06-03 11:10:15 -0700531 mox.IgnoreArg(), options.key, options.git_sync,
David James8fa34ea2011-04-15 13:00:20 -0700532 options.sync_binhost_conf, options.upload_board_tarball)
David Jamesc0f158a2011-02-22 16:07:29 -0800533 self.mox.ReplayAll()
534 prebuilt.main()
535
David James8c846492011-01-25 17:07:29 -0800536if __name__ == '__main__':
537 unittest.main()