blob: 27506a35de1d45921ae37b7d9a42842ebf70e703 [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 James8c846492011-01-25 17:07:29 -08009import shutil
Chris Sosa471532a2011-02-01 15:10:06 -080010import sys
David James8c846492011-01-25 17:07:29 -080011import tempfile
12import unittest
13import urllib
Chris Sosa471532a2011-02-01 15:10:06 -080014
15import constants
16sys.path.append(constants.SOURCE_ROOT)
17import prebuilt
David James8c846492011-01-25 17:07:29 -080018from chromite.lib import cros_build_lib
19from chromite.lib.binpkg import PackageIndex
20
21PUBLIC_PACKAGES = [{'CPV': 'gtk+/public1', 'SHA1': '1'},
22 {'CPV': 'gtk+/public2', 'SHA1': '2',
David James3cbba5e2011-02-14 14:53:15 -080023 'PATH': 'gtk+/foo.tgz'}]
David James8c846492011-01-25 17:07:29 -080024PRIVATE_PACKAGES = [{'CPV': 'private', 'SHA1': '3'}]
25
26
27def SimplePackageIndex(header=True, packages=True):
28 pkgindex = 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
34
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
84 current_version_str = self._read_version_file()
85 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)
103 self.assertEqual(file_contents, ['%s=%s' % (key, value)])
104 finally:
105 if os.path.exists(non_existent_file):
106 os.remove(non_existent_file)
107
108
109class TestPrebuiltFilters(unittest.TestCase):
110
111 def setUp(self):
112 self.tmp_dir = tempfile.mkdtemp()
113 self.private_dir = os.path.join(self.tmp_dir,
114 prebuilt._PRIVATE_OVERLAY_DIR)
115 self.private_structure_base = 'chromeos-overlay/chromeos-base'
116 self.private_pkgs = ['test-package/salt-flavor-0.1.r3.ebuild',
117 'easy/alpha_beta-0.1.41.r3.ebuild',
Chris Sosa471532a2011-02-01 15:10:06 -0800118 'dev/j-t-r-0.1.r3.ebuild', ]
David James8c846492011-01-25 17:07:29 -0800119 self.expected_filters = set(['salt-flavor', 'alpha_beta', 'j-t-r'])
120
121 def tearDown(self):
122 if self.tmp_dir:
123 shutil.rmtree(self.tmp_dir)
124
125 def _CreateNestedDir(self, tmp_dir, dir_structure):
126 for entry in dir_structure:
127 full_path = os.path.join(os.path.join(tmp_dir, entry))
128 # ensure dirs are created
129 try:
130 os.makedirs(os.path.dirname(full_path))
131 if full_path.endswith('/'):
132 # we only want to create directories
133 return
134 except OSError, err:
135 if err.errno == errno.EEXIST:
136 # we don't care if the dir already exists
137 pass
138 else:
139 raise
140 # create dummy files
141 tmp = open(full_path, 'w')
142 tmp.close()
143
144 def _LoadPrivateMockFilters(self):
145 """Load mock filters as defined in the setUp function."""
146 dir_structure = [os.path.join(self.private_structure_base, entry)
147 for entry in self.private_pkgs]
148
149 self._CreateNestedDir(self.private_dir, dir_structure)
150 prebuilt.LoadPrivateFilters(self.tmp_dir)
151
152 def testFilterPattern(self):
153 """Check that particular packages are filtered properly."""
154 self._LoadPrivateMockFilters()
155 packages = ['/some/dir/area/j-t-r-0.1.r3.tbz',
156 '/var/pkgs/new/alpha_beta-0.2.3.4.tbz',
157 '/usr/local/cache/good-0.1.3.tbz',
158 '/usr-blah/b_d/salt-flavor-0.0.3.tbz']
159 expected_list = ['/usr/local/cache/good-0.1.3.tbz']
160 filtered_list = [file for file in packages if not
161 prebuilt.ShouldFilterPackage(file)]
162 self.assertEqual(expected_list, filtered_list)
163
164 def testLoadPrivateFilters(self):
165 self._LoadPrivateMockFilters()
166 prebuilt.LoadPrivateFilters(self.tmp_dir)
167 self.assertEqual(self.expected_filters, prebuilt._FILTER_PACKAGES)
168
169 def testEmptyFiltersErrors(self):
170 """Ensure LoadPrivateFilters errors if an empty list is generated."""
171 os.makedirs(os.path.join(self.tmp_dir, prebuilt._PRIVATE_OVERLAY_DIR))
172 self.assertRaises(prebuilt.FiltersEmpty, prebuilt.LoadPrivateFilters,
173 self.tmp_dir)
174
175
176class TestPrebuilt(unittest.TestCase):
177
178 def setUp(self):
179 self.mox = mox.Mox()
180
181 def tearDown(self):
182 self.mox.UnsetStubs()
183 self.mox.VerifyAll()
184
185 def testGenerateUploadDict(self):
186 base_local_path = '/b/cbuild/build/chroot/build/x86-dogfood/'
187 gs_bucket_path = 'gs://chromeos-prebuilt/host/version'
188 local_path = os.path.join(base_local_path, 'public1.tbz2')
189 self.mox.StubOutWithMock(prebuilt.os.path, 'exists')
190 prebuilt.os.path.exists(local_path).AndReturn(True)
191 self.mox.ReplayAll()
192 pkgs = [{ 'CPV': 'public1' }]
193 result = prebuilt.GenerateUploadDict(base_local_path, gs_bucket_path, pkgs)
194 expected = { local_path: gs_bucket_path + '/public1.tbz2' }
195 self.assertEqual(result, expected)
196
197 def testFailonUploadFail(self):
198 """Make sure we fail if one of the upload processes fail."""
199 files = {'test': '/uasd'}
David Jamesfd0b0852011-02-23 11:15:36 -0800200 result = prebuilt.RemoteUpload('public-read', files)
201 self.assertEqual(result, set([('test', '/uasd')]))
David James8c846492011-01-25 17:07:29 -0800202
203 def testDeterminePrebuiltConfHost(self):
204 """Test that the host prebuilt path comes back properly."""
205 expected_path = os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64'])
206 self.assertEqual(prebuilt.DeterminePrebuiltConfFile('fake_path', 'amd64'),
207 expected_path)
208
209 def testDeterminePrebuiltConf(self):
210 """Test the different known variants of boards for proper path discovery."""
211 fake_path = '/b/cbuild'
Chris Sosa471532a2011-02-01 15:10:06 -0800212 script_path = os.path.join(fake_path, 'src/platform/dev/host')
David James8c846492011-01-25 17:07:29 -0800213 public_overlay_path = os.path.join(fake_path, 'src/overlays')
214 private_overlay_path = os.path.join(fake_path,
215 prebuilt._PRIVATE_OVERLAY_DIR)
216 path_dict = {'private_overlay_path': private_overlay_path,
217 'public_overlay_path': public_overlay_path}
218 # format for targets
219 # board target key in dictionar
220 # Tuple containing cmd run, expected results as cmd obj, and expected output
221
222 # Mock output from cros_overlay_list
223 x86_out = ('%(private_overlay_path)s/chromeos-overlay\n'
224 '%(public_overlay_path)s/overlay-x86-generic\n' % path_dict)
225
226 x86_cmd = './cros_overlay_list --board x86-generic'
227 x86_expected_path = os.path.join(public_overlay_path, 'overlay-x86-generic',
228 'prebuilt.conf')
229 # Mock output from cros_overlay_list
230 tegra2_out = ('%(private_overlay_path)s/chromeos-overlay\n'
231 '%(public_overlay_path)s/overlay-tegra2\n'
232 '%(public_overlay_path)s/overlay-variant-tegra2-seaboard\n'
233 '%(private_overlay_path)s/overlay-tegra2-private\n'
234 '%(private_overlay_path)s/'
235 'overlay-variant-tegra2-seaboard-private\n' % path_dict)
236 tegra2_cmd = './cros_overlay_list --board tegra2 --variant seaboard'
237 tegra2_expected_path = os.path.join(
238 private_overlay_path, 'overlay-variant-tegra2-seaboard-private',
239 'prebuilt.conf')
240
241
242 targets = {'x86-generic': {'cmd': x86_cmd,
243 'output': x86_out,
244 'result': x86_expected_path},
245 'tegra2_seaboard': {'cmd': tegra2_cmd,
246 'output': tegra2_out,
247 'result': tegra2_expected_path}
248 }
249
250 self.mox.StubOutWithMock(prebuilt.cros_build_lib, 'RunCommand')
251 for target, expected_results in targets.iteritems():
252 # create command object for output
253 cmd_result_obj = cros_build_lib.CommandResult()
254 cmd_result_obj.output = expected_results['output']
255 prebuilt.cros_build_lib.RunCommand(
256 expected_results['cmd'].split(), redirect_stdout=True,
257 cwd=script_path).AndReturn(cmd_result_obj)
Chris Sosa471532a2011-02-01 15:10:06 -0800258
David James8c846492011-01-25 17:07:29 -0800259 self.mox.ReplayAll()
260 for target, expected_results in targets.iteritems():
261 self.assertEqual(
262 prebuilt.DeterminePrebuiltConfFile(fake_path, target),
263 expected_results['result'])
264
265 def testDeterminePrebuiltConfGarbage(self):
266 """Ensure an exception is raised on bad input."""
267 self.assertRaises(prebuilt.UnknownBoardFormat,
268 prebuilt.DeterminePrebuiltConfFile,
269 'fake_path', 'asdfasdf')
270
271
272class TestPackagesFileFiltering(unittest.TestCase):
273
274 def testFilterPkgIndex(self):
275 pkgindex = SimplePackageIndex()
276 pkgindex.RemoveFilteredPackages(lambda pkg: pkg in PRIVATE_PACKAGES)
277 self.assertEqual(pkgindex.packages, PUBLIC_PACKAGES)
278 self.assertEqual(pkgindex.modified, True)
279
280
281class TestPopulateDuplicateDB(unittest.TestCase):
282
283 def testEmptyIndex(self):
284 pkgindex = SimplePackageIndex(packages=False)
285 db = {}
286 pkgindex._PopulateDuplicateDB(db)
287 self.assertEqual(db, {})
288
289 def testNormalIndex(self):
290 pkgindex = SimplePackageIndex()
291 db = {}
292 pkgindex._PopulateDuplicateDB(db)
293 self.assertEqual(len(db), 3)
David James3cbba5e2011-02-14 14:53:15 -0800294 self.assertEqual(db['1'], 'http://www.example.com/gtk+/public1.tbz2')
295 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800296 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
297
298 def testMissingSHA1(self):
299 db = {}
300 pkgindex = SimplePackageIndex()
301 del pkgindex.packages[0]['SHA1']
302 pkgindex._PopulateDuplicateDB(db)
303 self.assertEqual(len(db), 2)
David James3cbba5e2011-02-14 14:53:15 -0800304 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800305 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
306
307 def testFailedPopulate(self):
308 db = {}
309 pkgindex = SimplePackageIndex(header=False)
310 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db)
311 pkgindex = SimplePackageIndex()
312 del pkgindex.packages[0]['CPV']
313 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db)
314
315
316class TestResolveDuplicateUploads(unittest.TestCase):
317
318 def testEmptyList(self):
319 pkgindex = SimplePackageIndex()
320 pristine = SimplePackageIndex()
321 uploads = pkgindex.ResolveDuplicateUploads([])
322 self.assertEqual(uploads, pristine.packages)
323 self.assertEqual(pkgindex.packages, pristine.packages)
324 self.assertEqual(pkgindex.modified, False)
325
326 def testEmptyIndex(self):
327 pkgindex = SimplePackageIndex()
328 pristine = SimplePackageIndex()
329 empty = SimplePackageIndex(packages=False)
330 uploads = pkgindex.ResolveDuplicateUploads([empty])
331 self.assertEqual(uploads, pristine.packages)
332 self.assertEqual(pkgindex.packages, pristine.packages)
333 self.assertEqual(pkgindex.modified, False)
334
335 def testDuplicates(self):
336 pkgindex = SimplePackageIndex()
337 dup_pkgindex = SimplePackageIndex()
338 expected_pkgindex = SimplePackageIndex()
339 for pkg in expected_pkgindex.packages:
David James3cbba5e2011-02-14 14:53:15 -0800340 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
David James8c846492011-01-25 17:07:29 -0800341 uploads = pkgindex.ResolveDuplicateUploads([dup_pkgindex])
342 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
343
344 def testMissingSHA1(self):
345 db = {}
346 pkgindex = SimplePackageIndex()
347 dup_pkgindex = SimplePackageIndex()
348 expected_pkgindex = SimplePackageIndex()
349 del pkgindex.packages[0]['SHA1']
350 del expected_pkgindex.packages[0]['SHA1']
351 for pkg in expected_pkgindex.packages[1:]:
352 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
353 uploads = pkgindex.ResolveDuplicateUploads([dup_pkgindex])
354 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
355
356
357class TestWritePackageIndex(unittest.TestCase):
358
359 def setUp(self):
360 self.mox = mox.Mox()
361
362 def tearDown(self):
363 self.mox.UnsetStubs()
364 self.mox.VerifyAll()
365
366 def testSimple(self):
367 pkgindex = SimplePackageIndex()
368 self.mox.StubOutWithMock(pkgindex, 'Write')
369 pkgindex.Write(mox.IgnoreArg())
370 self.mox.ReplayAll()
371 f = pkgindex.WriteToNamedTemporaryFile()
372 self.assertEqual(f.read(), '')
373
374
David James05bcb2b2011-02-09 09:25:47 -0800375class TestUploadPrebuilt(unittest.TestCase):
376
377 def setUp(self):
378 class MockTemporaryFile(object):
379 def __init__(self, name):
380 self.name = name
381 self.mox = mox.Mox()
382 self.pkgindex = SimplePackageIndex()
383 self.mox.StubOutWithMock(prebuilt, 'GrabLocalPackageIndex')
384 prebuilt.GrabLocalPackageIndex('/packages').AndReturn(self.pkgindex)
385 self.mox.StubOutWithMock(prebuilt, 'RemoteUpload')
386 self.mox.StubOutWithMock(self.pkgindex, 'ResolveDuplicateUploads')
387 self.pkgindex.ResolveDuplicateUploads([]).AndReturn(PRIVATE_PACKAGES)
388 self.mox.StubOutWithMock(self.pkgindex, 'WriteToNamedTemporaryFile')
389 fake_pkgs_file = MockTemporaryFile('fake')
390 self.pkgindex.WriteToNamedTemporaryFile().AndReturn(fake_pkgs_file)
391
392 def tearDown(self):
393 self.mox.UnsetStubs()
394 self.mox.VerifyAll()
395
396 def doRsyncUpload(self, suffix):
397 self.mox.StubOutWithMock(prebuilt, '_RetryRun')
398 remote_path = '/dir/%s' % suffix.rstrip('/')
399 full_remote_path = 'chromeos-prebuilt:%s' % remote_path
400 cmds = ['ssh chromeos-prebuilt mkdir -p %s' % remote_path,
401 'rsync -av --chmod=a+r fake %s/Packages' % full_remote_path,
402 'rsync -Rav private.tbz2 %s/' % full_remote_path]
403 for cmd in cmds:
404 prebuilt._RetryRun(cmd, shell=True, cwd='/packages').AndReturn(True)
405 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800406 uri = self.pkgindex.header['URI']
David Jamesfd0b0852011-02-23 11:15:36 -0800407 uploader = prebuilt.PrebuiltUploader('chromeos-prebuilt:/dir',
408 'public-read', uri, [])
David Jamesc0f158a2011-02-22 16:07:29 -0800409 uploader._UploadPrebuilt('/packages', suffix)
David James05bcb2b2011-02-09 09:25:47 -0800410
411 def testSuccessfulGsUpload(self):
412 uploads = {'/packages/private.tbz2': 'gs://foo/private.tbz2'}
413 self.mox.StubOutWithMock(prebuilt, 'GenerateUploadDict')
414 prebuilt.GenerateUploadDict('/packages', 'gs://foo/suffix',
415 PRIVATE_PACKAGES).AndReturn(uploads)
416 uploads = uploads.copy()
417 uploads['fake'] = 'gs://foo/suffix/Packages'
David Jamesfd0b0852011-02-23 11:15:36 -0800418 acl = 'public-read'
419 prebuilt.RemoteUpload(acl, uploads).AndReturn([None])
David James05bcb2b2011-02-09 09:25:47 -0800420 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800421 uri = self.pkgindex.header['URI']
David Jamesfd0b0852011-02-23 11:15:36 -0800422 uploader = prebuilt.PrebuiltUploader('gs://foo', acl, uri, [])
David Jamesc0f158a2011-02-22 16:07:29 -0800423 uploader._UploadPrebuilt('/packages', 'suffix')
David James05bcb2b2011-02-09 09:25:47 -0800424
425 def testSuccessfulRsyncUploadWithNoTrailingSlash(self):
426 self.doRsyncUpload('suffix')
427
428 def testSuccessfulRsyncUploadWithTrailingSlash(self):
429 self.doRsyncUpload('suffix/')
430
431
432class TestSyncPrebuilts(unittest.TestCase):
433
434 def setUp(self):
435 self.mox = mox.Mox()
David James05bcb2b2011-02-09 09:25:47 -0800436 self.mox.StubOutWithMock(prebuilt, 'DeterminePrebuiltConfFile')
David James05bcb2b2011-02-09 09:25:47 -0800437 self.mox.StubOutWithMock(prebuilt, 'RevGitFile')
438 self.mox.StubOutWithMock(prebuilt, 'UpdateBinhostConfFile')
439 self.build_path = '/trunk'
440 self.upload_location = 'gs://upload/'
441 self.version = '1'
442 self.binhost = 'http://prebuilt/'
443 self.key = 'PORTAGE_BINHOST'
David Jamesc0f158a2011-02-22 16:07:29 -0800444 self.uploader = prebuilt.PrebuiltUploader(self.upload_location,
David Jamesfd0b0852011-02-23 11:15:36 -0800445 'public-read', self.binhost, [])
David Jamesc0f158a2011-02-22 16:07:29 -0800446 self.mox.StubOutWithMock(self.uploader, '_UploadPrebuilt')
David James05bcb2b2011-02-09 09:25:47 -0800447
448 def tearDown(self):
449 self.mox.UnsetStubs()
450 self.mox.VerifyAll()
451
452 def testSyncHostPrebuilts(self):
453 package_path = os.path.join(self.build_path,
454 prebuilt._HOST_PACKAGES_PATH)
455 url_suffix = prebuilt._REL_HOST_PATH % {'version': self.version,
456 'target': prebuilt._HOST_TARGET }
David Jamesc0f158a2011-02-22 16:07:29 -0800457 self.uploader._UploadPrebuilt(package_path, url_suffix)
David James05bcb2b2011-02-09 09:25:47 -0800458 url_value = '%s/%s/' % (self.binhost.rstrip('/'), url_suffix.rstrip('/'))
459 prebuilt.RevGitFile(mox.IgnoreArg(), url_value, key=self.key)
460 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
461 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800462 self.uploader._SyncHostPrebuilts(self.build_path, self.version, self.key,
463 True, True)
David James05bcb2b2011-02-09 09:25:47 -0800464
465 def testSyncBoardPrebuilts(self):
466 board = 'x86-generic'
467 board_path = os.path.join(self.build_path,
468 prebuilt._BOARD_PATH % {'board': board})
469 package_path = os.path.join(board_path, 'packages')
470 url_suffix = prebuilt._REL_BOARD_PATH % {'version': self.version,
471 'board': board }
David Jamesc0f158a2011-02-22 16:07:29 -0800472 self.uploader._UploadPrebuilt(package_path, url_suffix)
David James05bcb2b2011-02-09 09:25:47 -0800473 url_value = '%s/%s/' % (self.binhost.rstrip('/'), url_suffix.rstrip('/'))
474 prebuilt.DeterminePrebuiltConfFile(self.build_path, board).AndReturn('foo')
475 prebuilt.RevGitFile('foo', url_value, key=self.key)
476 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
477 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800478 self.uploader._SyncBoardPrebuilts(board, self.build_path, self.version,
479 self.key, True, True)
David James05bcb2b2011-02-09 09:25:47 -0800480
481
David Jamesc0f158a2011-02-22 16:07:29 -0800482class TestMain(unittest.TestCase):
483
484 def setUp(self):
485 self.mox = mox.Mox()
486
487 def tearDown(self):
488 self.mox.UnsetStubs()
489 self.mox.VerifyAll()
490
491 def testMain(self):
492 """Test that the main function works."""
493 options = mox.MockObject(object)
David Jamesc0f158a2011-02-22 16:07:29 -0800494 old_binhost = 'http://prebuilt/1'
495 options.previous_binhost_url = [old_binhost]
496 options.board = 'x86-generic'
497 options.build_path = '/trunk'
David Jamesfd0b0852011-02-23 11:15:36 -0800498 options.private = True
David Jamesc0f158a2011-02-22 16:07:29 -0800499 options.sync_host = True
500 options.git_sync = True
501 options.upload = 'gs://upload/'
David Jamesfd0b0852011-02-23 11:15:36 -0800502 options.binhost_base_url = options.upload
David Jamesc0f158a2011-02-22 16:07:29 -0800503 options.prepend_version = True
504 options.filters = True
505 options.key = 'PORTAGE_BINHOST'
506 options.sync_binhost_conf = True
507 self.mox.StubOutWithMock(prebuilt, 'ParseOptions')
508 prebuilt.ParseOptions().AndReturn(options)
509 self.mox.StubOutWithMock(prebuilt, 'LoadPrivateFilters')
510 prebuilt.LoadPrivateFilters(options.build_path)
David Jamesc0f158a2011-02-22 16:07:29 -0800511 self.mox.StubOutWithMock(prebuilt, 'GrabRemotePackageIndex')
512 prebuilt.GrabRemotePackageIndex(old_binhost).AndReturn(True)
David Jamesfd0b0852011-02-23 11:15:36 -0800513 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '__init__')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700514 self.mox.StubOutWithMock(prebuilt, 'GetBoardPathFromCrosOverlayList')
515 fake_overlay_path = '/fake_path'
516 acl_path = prebuilt.GetBoardPathFromCrosOverlayList(
517 options.build_path, options.board).AndReturn(fake_overlay_path)
518 expected_gs_acl_path = os.path.join(fake_overlay_path,
519 prebuilt._GOOGLESTORAGE_ACL_FILE)
520 prebuilt.PrebuiltUploader.__init__(options.upload, expected_gs_acl_path,
521 options.upload, mox.IgnoreArg())
David Jamesc0f158a2011-02-22 16:07:29 -0800522 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_SyncHostPrebuilts')
523 prebuilt.PrebuiltUploader._SyncHostPrebuilts(options.build_path,
524 mox.IgnoreArg(), options.key, options.git_sync,
525 options.sync_binhost_conf)
526 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_SyncBoardPrebuilts')
527 prebuilt.PrebuiltUploader._SyncBoardPrebuilts(options.board,
528 options.build_path, mox.IgnoreArg(), options.key, options.git_sync,
529 options.sync_binhost_conf)
530 self.mox.ReplayAll()
531 prebuilt.main()
532
David James8c846492011-01-25 17:07:29 -0800533if __name__ == '__main__':
534 unittest.main()