blob: ef5f25c9f1e041e80d36337e44cb8b5920e32022 [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
20from chromite.lib.binpkg import PackageIndex
21
22PUBLIC_PACKAGES = [{'CPV': 'gtk+/public1', 'SHA1': '1'},
23 {'CPV': 'gtk+/public2', 'SHA1': '2',
David James3cbba5e2011-02-14 14:53:15 -080024 'PATH': 'gtk+/foo.tgz'}]
David James8c846492011-01-25 17:07:29 -080025PRIVATE_PACKAGES = [{'CPV': 'private', 'SHA1': '3'}]
26
27
28def SimplePackageIndex(header=True, packages=True):
29 pkgindex = PackageIndex()
30 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
110class TestPrebuiltFilters(unittest.TestCase):
111
112 def setUp(self):
113 self.tmp_dir = tempfile.mkdtemp()
114 self.private_dir = os.path.join(self.tmp_dir,
115 prebuilt._PRIVATE_OVERLAY_DIR)
116 self.private_structure_base = 'chromeos-overlay/chromeos-base'
117 self.private_pkgs = ['test-package/salt-flavor-0.1.r3.ebuild',
118 'easy/alpha_beta-0.1.41.r3.ebuild',
Chris Sosa471532a2011-02-01 15:10:06 -0800119 'dev/j-t-r-0.1.r3.ebuild', ]
David James8c846492011-01-25 17:07:29 -0800120 self.expected_filters = set(['salt-flavor', 'alpha_beta', 'j-t-r'])
121
122 def tearDown(self):
123 if self.tmp_dir:
124 shutil.rmtree(self.tmp_dir)
125
126 def _CreateNestedDir(self, tmp_dir, dir_structure):
127 for entry in dir_structure:
128 full_path = os.path.join(os.path.join(tmp_dir, entry))
129 # ensure dirs are created
130 try:
131 os.makedirs(os.path.dirname(full_path))
132 if full_path.endswith('/'):
133 # we only want to create directories
134 return
135 except OSError, err:
136 if err.errno == errno.EEXIST:
137 # we don't care if the dir already exists
138 pass
139 else:
140 raise
141 # create dummy files
142 tmp = open(full_path, 'w')
143 tmp.close()
144
145 def _LoadPrivateMockFilters(self):
146 """Load mock filters as defined in the setUp function."""
147 dir_structure = [os.path.join(self.private_structure_base, entry)
148 for entry in self.private_pkgs]
149
150 self._CreateNestedDir(self.private_dir, dir_structure)
151 prebuilt.LoadPrivateFilters(self.tmp_dir)
152
153 def testFilterPattern(self):
154 """Check that particular packages are filtered properly."""
155 self._LoadPrivateMockFilters()
156 packages = ['/some/dir/area/j-t-r-0.1.r3.tbz',
157 '/var/pkgs/new/alpha_beta-0.2.3.4.tbz',
158 '/usr/local/cache/good-0.1.3.tbz',
159 '/usr-blah/b_d/salt-flavor-0.0.3.tbz']
160 expected_list = ['/usr/local/cache/good-0.1.3.tbz']
161 filtered_list = [file for file in packages if not
162 prebuilt.ShouldFilterPackage(file)]
163 self.assertEqual(expected_list, filtered_list)
164
165 def testLoadPrivateFilters(self):
166 self._LoadPrivateMockFilters()
167 prebuilt.LoadPrivateFilters(self.tmp_dir)
168 self.assertEqual(self.expected_filters, prebuilt._FILTER_PACKAGES)
169
170 def testEmptyFiltersErrors(self):
171 """Ensure LoadPrivateFilters errors if an empty list is generated."""
172 os.makedirs(os.path.join(self.tmp_dir, prebuilt._PRIVATE_OVERLAY_DIR))
173 self.assertRaises(prebuilt.FiltersEmpty, prebuilt.LoadPrivateFilters,
174 self.tmp_dir)
175
176
177class TestPrebuilt(unittest.TestCase):
178
179 def setUp(self):
180 self.mox = mox.Mox()
181
182 def tearDown(self):
183 self.mox.UnsetStubs()
184 self.mox.VerifyAll()
185
186 def testGenerateUploadDict(self):
187 base_local_path = '/b/cbuild/build/chroot/build/x86-dogfood/'
188 gs_bucket_path = 'gs://chromeos-prebuilt/host/version'
189 local_path = os.path.join(base_local_path, 'public1.tbz2')
190 self.mox.StubOutWithMock(prebuilt.os.path, 'exists')
191 prebuilt.os.path.exists(local_path).AndReturn(True)
192 self.mox.ReplayAll()
193 pkgs = [{ 'CPV': 'public1' }]
194 result = prebuilt.GenerateUploadDict(base_local_path, gs_bucket_path, pkgs)
195 expected = { local_path: gs_bucket_path + '/public1.tbz2' }
196 self.assertEqual(result, expected)
197
198 def testFailonUploadFail(self):
199 """Make sure we fail if one of the upload processes fail."""
200 files = {'test': '/uasd'}
David Jamesfd0b0852011-02-23 11:15:36 -0800201 result = prebuilt.RemoteUpload('public-read', files)
202 self.assertEqual(result, set([('test', '/uasd')]))
David James8c846492011-01-25 17:07:29 -0800203
204 def testDeterminePrebuiltConfHost(self):
205 """Test that the host prebuilt path comes back properly."""
206 expected_path = os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64'])
207 self.assertEqual(prebuilt.DeterminePrebuiltConfFile('fake_path', 'amd64'),
208 expected_path)
209
210 def testDeterminePrebuiltConf(self):
211 """Test the different known variants of boards for proper path discovery."""
212 fake_path = '/b/cbuild'
Chris Sosa471532a2011-02-01 15:10:06 -0800213 script_path = os.path.join(fake_path, 'src/platform/dev/host')
David James8c846492011-01-25 17:07:29 -0800214 public_overlay_path = os.path.join(fake_path, 'src/overlays')
215 private_overlay_path = os.path.join(fake_path,
216 prebuilt._PRIVATE_OVERLAY_DIR)
217 path_dict = {'private_overlay_path': private_overlay_path,
218 'public_overlay_path': public_overlay_path}
219 # format for targets
220 # board target key in dictionar
221 # Tuple containing cmd run, expected results as cmd obj, and expected output
222
223 # Mock output from cros_overlay_list
224 x86_out = ('%(private_overlay_path)s/chromeos-overlay\n'
225 '%(public_overlay_path)s/overlay-x86-generic\n' % path_dict)
226
227 x86_cmd = './cros_overlay_list --board x86-generic'
228 x86_expected_path = os.path.join(public_overlay_path, 'overlay-x86-generic',
229 'prebuilt.conf')
230 # Mock output from cros_overlay_list
231 tegra2_out = ('%(private_overlay_path)s/chromeos-overlay\n'
232 '%(public_overlay_path)s/overlay-tegra2\n'
233 '%(public_overlay_path)s/overlay-variant-tegra2-seaboard\n'
234 '%(private_overlay_path)s/overlay-tegra2-private\n'
235 '%(private_overlay_path)s/'
236 'overlay-variant-tegra2-seaboard-private\n' % path_dict)
237 tegra2_cmd = './cros_overlay_list --board tegra2 --variant seaboard'
238 tegra2_expected_path = os.path.join(
239 private_overlay_path, 'overlay-variant-tegra2-seaboard-private',
240 'prebuilt.conf')
241
242
243 targets = {'x86-generic': {'cmd': x86_cmd,
244 'output': x86_out,
245 'result': x86_expected_path},
246 'tegra2_seaboard': {'cmd': tegra2_cmd,
247 'output': tegra2_out,
248 'result': tegra2_expected_path}
249 }
250
251 self.mox.StubOutWithMock(prebuilt.cros_build_lib, 'RunCommand')
252 for target, expected_results in targets.iteritems():
253 # create command object for output
254 cmd_result_obj = cros_build_lib.CommandResult()
255 cmd_result_obj.output = expected_results['output']
256 prebuilt.cros_build_lib.RunCommand(
257 expected_results['cmd'].split(), redirect_stdout=True,
258 cwd=script_path).AndReturn(cmd_result_obj)
Chris Sosa471532a2011-02-01 15:10:06 -0800259
David James8c846492011-01-25 17:07:29 -0800260 self.mox.ReplayAll()
261 for target, expected_results in targets.iteritems():
262 self.assertEqual(
263 prebuilt.DeterminePrebuiltConfFile(fake_path, target),
264 expected_results['result'])
265
266 def testDeterminePrebuiltConfGarbage(self):
267 """Ensure an exception is raised on bad input."""
268 self.assertRaises(prebuilt.UnknownBoardFormat,
269 prebuilt.DeterminePrebuiltConfFile,
270 'fake_path', 'asdfasdf')
271
272
273class TestPackagesFileFiltering(unittest.TestCase):
274
275 def testFilterPkgIndex(self):
276 pkgindex = SimplePackageIndex()
277 pkgindex.RemoveFilteredPackages(lambda pkg: pkg in PRIVATE_PACKAGES)
278 self.assertEqual(pkgindex.packages, PUBLIC_PACKAGES)
279 self.assertEqual(pkgindex.modified, True)
280
281
282class TestPopulateDuplicateDB(unittest.TestCase):
283
284 def testEmptyIndex(self):
285 pkgindex = SimplePackageIndex(packages=False)
286 db = {}
287 pkgindex._PopulateDuplicateDB(db)
288 self.assertEqual(db, {})
289
290 def testNormalIndex(self):
291 pkgindex = SimplePackageIndex()
292 db = {}
293 pkgindex._PopulateDuplicateDB(db)
294 self.assertEqual(len(db), 3)
David James3cbba5e2011-02-14 14:53:15 -0800295 self.assertEqual(db['1'], 'http://www.example.com/gtk+/public1.tbz2')
296 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800297 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
298
299 def testMissingSHA1(self):
300 db = {}
301 pkgindex = SimplePackageIndex()
302 del pkgindex.packages[0]['SHA1']
303 pkgindex._PopulateDuplicateDB(db)
304 self.assertEqual(len(db), 2)
David James3cbba5e2011-02-14 14:53:15 -0800305 self.assertEqual(db['2'], 'http://www.example.com/gtk+/foo.tgz')
David James8c846492011-01-25 17:07:29 -0800306 self.assertEqual(db['3'], 'http://www.example.com/private.tbz2')
307
308 def testFailedPopulate(self):
309 db = {}
310 pkgindex = SimplePackageIndex(header=False)
311 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db)
312 pkgindex = SimplePackageIndex()
313 del pkgindex.packages[0]['CPV']
314 self.assertRaises(KeyError, pkgindex._PopulateDuplicateDB, db)
315
316
317class TestResolveDuplicateUploads(unittest.TestCase):
318
319 def testEmptyList(self):
320 pkgindex = SimplePackageIndex()
321 pristine = SimplePackageIndex()
322 uploads = pkgindex.ResolveDuplicateUploads([])
323 self.assertEqual(uploads, pristine.packages)
324 self.assertEqual(pkgindex.packages, pristine.packages)
325 self.assertEqual(pkgindex.modified, False)
326
327 def testEmptyIndex(self):
328 pkgindex = SimplePackageIndex()
329 pristine = SimplePackageIndex()
330 empty = SimplePackageIndex(packages=False)
331 uploads = pkgindex.ResolveDuplicateUploads([empty])
332 self.assertEqual(uploads, pristine.packages)
333 self.assertEqual(pkgindex.packages, pristine.packages)
334 self.assertEqual(pkgindex.modified, False)
335
336 def testDuplicates(self):
337 pkgindex = SimplePackageIndex()
338 dup_pkgindex = SimplePackageIndex()
339 expected_pkgindex = SimplePackageIndex()
340 for pkg in expected_pkgindex.packages:
David James3cbba5e2011-02-14 14:53:15 -0800341 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
David James8c846492011-01-25 17:07:29 -0800342 uploads = pkgindex.ResolveDuplicateUploads([dup_pkgindex])
343 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
344
345 def testMissingSHA1(self):
346 db = {}
347 pkgindex = SimplePackageIndex()
348 dup_pkgindex = SimplePackageIndex()
349 expected_pkgindex = SimplePackageIndex()
350 del pkgindex.packages[0]['SHA1']
351 del expected_pkgindex.packages[0]['SHA1']
352 for pkg in expected_pkgindex.packages[1:]:
353 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
354 uploads = pkgindex.ResolveDuplicateUploads([dup_pkgindex])
355 self.assertEqual(pkgindex.packages, expected_pkgindex.packages)
356
357
358class TestWritePackageIndex(unittest.TestCase):
359
360 def setUp(self):
361 self.mox = mox.Mox()
362
363 def tearDown(self):
364 self.mox.UnsetStubs()
365 self.mox.VerifyAll()
366
367 def testSimple(self):
368 pkgindex = SimplePackageIndex()
369 self.mox.StubOutWithMock(pkgindex, 'Write')
370 pkgindex.Write(mox.IgnoreArg())
371 self.mox.ReplayAll()
372 f = pkgindex.WriteToNamedTemporaryFile()
373 self.assertEqual(f.read(), '')
374
375
David James05bcb2b2011-02-09 09:25:47 -0800376class TestUploadPrebuilt(unittest.TestCase):
377
378 def setUp(self):
379 class MockTemporaryFile(object):
380 def __init__(self, name):
381 self.name = name
382 self.mox = mox.Mox()
383 self.pkgindex = SimplePackageIndex()
384 self.mox.StubOutWithMock(prebuilt, 'GrabLocalPackageIndex')
385 prebuilt.GrabLocalPackageIndex('/packages').AndReturn(self.pkgindex)
386 self.mox.StubOutWithMock(prebuilt, 'RemoteUpload')
387 self.mox.StubOutWithMock(self.pkgindex, 'ResolveDuplicateUploads')
388 self.pkgindex.ResolveDuplicateUploads([]).AndReturn(PRIVATE_PACKAGES)
389 self.mox.StubOutWithMock(self.pkgindex, 'WriteToNamedTemporaryFile')
390 fake_pkgs_file = MockTemporaryFile('fake')
391 self.pkgindex.WriteToNamedTemporaryFile().AndReturn(fake_pkgs_file)
392
393 def tearDown(self):
394 self.mox.UnsetStubs()
395 self.mox.VerifyAll()
396
397 def doRsyncUpload(self, suffix):
398 self.mox.StubOutWithMock(prebuilt, '_RetryRun')
399 remote_path = '/dir/%s' % suffix.rstrip('/')
400 full_remote_path = 'chromeos-prebuilt:%s' % remote_path
Peter Mayod7cd9d52011-04-21 17:58:43 -0400401 cmds = [['ssh', 'chromeos-prebuilt', 'mkdir', '-p', remote_path],
Peter Mayo193f68f2011-04-19 19:08:21 -0400402 ['rsync', '-av', '--chmod=a+r', 'fake',
403 full_remote_path + '/Packages'],
404 ['rsync', '-Rav', 'private.tbz2', full_remote_path + '/']]
David James05bcb2b2011-02-09 09:25:47 -0800405 for cmd in cmds:
Peter Mayo193f68f2011-04-19 19:08:21 -0400406 prebuilt._RetryRun(cmd, cwd='/packages').AndReturn(True)
David James05bcb2b2011-02-09 09:25:47 -0800407 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800408 uri = self.pkgindex.header['URI']
David Jamesfd0b0852011-02-23 11:15:36 -0800409 uploader = prebuilt.PrebuiltUploader('chromeos-prebuilt:/dir',
410 'public-read', uri, [])
David Jamesc0f158a2011-02-22 16:07:29 -0800411 uploader._UploadPrebuilt('/packages', suffix)
David James05bcb2b2011-02-09 09:25:47 -0800412
413 def testSuccessfulGsUpload(self):
414 uploads = {'/packages/private.tbz2': 'gs://foo/private.tbz2'}
415 self.mox.StubOutWithMock(prebuilt, 'GenerateUploadDict')
416 prebuilt.GenerateUploadDict('/packages', 'gs://foo/suffix',
417 PRIVATE_PACKAGES).AndReturn(uploads)
418 uploads = uploads.copy()
419 uploads['fake'] = 'gs://foo/suffix/Packages'
David Jamesfd0b0852011-02-23 11:15:36 -0800420 acl = 'public-read'
421 prebuilt.RemoteUpload(acl, uploads).AndReturn([None])
David James05bcb2b2011-02-09 09:25:47 -0800422 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800423 uri = self.pkgindex.header['URI']
David Jamesfd0b0852011-02-23 11:15:36 -0800424 uploader = prebuilt.PrebuiltUploader('gs://foo', acl, uri, [])
David Jamesc0f158a2011-02-22 16:07:29 -0800425 uploader._UploadPrebuilt('/packages', 'suffix')
David James05bcb2b2011-02-09 09:25:47 -0800426
427 def testSuccessfulRsyncUploadWithNoTrailingSlash(self):
428 self.doRsyncUpload('suffix')
429
430 def testSuccessfulRsyncUploadWithTrailingSlash(self):
431 self.doRsyncUpload('suffix/')
432
433
434class TestSyncPrebuilts(unittest.TestCase):
435
436 def setUp(self):
437 self.mox = mox.Mox()
David James05bcb2b2011-02-09 09:25:47 -0800438 self.mox.StubOutWithMock(prebuilt, 'DeterminePrebuiltConfFile')
David James05bcb2b2011-02-09 09:25:47 -0800439 self.mox.StubOutWithMock(prebuilt, 'RevGitFile')
440 self.mox.StubOutWithMock(prebuilt, 'UpdateBinhostConfFile')
441 self.build_path = '/trunk'
442 self.upload_location = 'gs://upload/'
443 self.version = '1'
444 self.binhost = 'http://prebuilt/'
445 self.key = 'PORTAGE_BINHOST'
Peter Mayo193f68f2011-04-19 19:08:21 -0400446 self.uploader = prebuilt.PrebuiltUploader(
447 self.upload_location, 'public-read', self.binhost, [])
David Jamesc0f158a2011-02-22 16:07:29 -0800448 self.mox.StubOutWithMock(self.uploader, '_UploadPrebuilt')
David James05bcb2b2011-02-09 09:25:47 -0800449
450 def tearDown(self):
451 self.mox.UnsetStubs()
452 self.mox.VerifyAll()
453
454 def testSyncHostPrebuilts(self):
455 package_path = os.path.join(self.build_path,
456 prebuilt._HOST_PACKAGES_PATH)
457 url_suffix = prebuilt._REL_HOST_PATH % {'version': self.version,
458 'target': prebuilt._HOST_TARGET }
David James8fa34ea2011-04-15 13:00:20 -0700459 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
460 self.uploader._UploadPrebuilt(package_path, packages_url_suffix)
David Jamesf0e6fd72011-04-15 15:58:07 -0700461 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
462 packages_url_suffix.rstrip('/'))
David James05bcb2b2011-02-09 09:25:47 -0800463 prebuilt.RevGitFile(mox.IgnoreArg(), url_value, key=self.key)
464 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
465 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800466 self.uploader._SyncHostPrebuilts(self.build_path, self.version, self.key,
467 True, True)
David James05bcb2b2011-02-09 09:25:47 -0800468
469 def testSyncBoardPrebuilts(self):
470 board = 'x86-generic'
471 board_path = os.path.join(self.build_path,
472 prebuilt._BOARD_PATH % {'board': board})
473 package_path = os.path.join(board_path, 'packages')
474 url_suffix = prebuilt._REL_BOARD_PATH % {'version': self.version,
475 'board': board }
David James8fa34ea2011-04-15 13:00:20 -0700476 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
477 process = None
478 self.mox.StubOutWithMock(multiprocessing.Process, '__init__')
479 self.mox.StubOutWithMock(multiprocessing.Process, 'exitcode')
480 self.mox.StubOutWithMock(multiprocessing.Process, 'start')
481 self.mox.StubOutWithMock(multiprocessing.Process, 'join')
482 multiprocessing.Process.__init__(target=self.uploader._UploadBoardTarball,
483 args=(board_path, url_suffix))
484 multiprocessing.Process.start()
485 self.uploader._UploadPrebuilt(package_path, packages_url_suffix)
486 multiprocessing.Process.join()
487 multiprocessing.Process.exitcode = 0
David Jamesf0e6fd72011-04-15 15:58:07 -0700488 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
489 packages_url_suffix.rstrip('/'))
David James05bcb2b2011-02-09 09:25:47 -0800490 prebuilt.DeterminePrebuiltConfFile(self.build_path, board).AndReturn('foo')
491 prebuilt.RevGitFile('foo', url_value, key=self.key)
492 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
493 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800494 self.uploader._SyncBoardPrebuilts(board, self.build_path, self.version,
David James8fa34ea2011-04-15 13:00:20 -0700495 self.key, True, True, True)
David James05bcb2b2011-02-09 09:25:47 -0800496
497
David Jamesc0f158a2011-02-22 16:07:29 -0800498class TestMain(unittest.TestCase):
499
500 def setUp(self):
501 self.mox = mox.Mox()
502
503 def tearDown(self):
504 self.mox.UnsetStubs()
505 self.mox.VerifyAll()
506
507 def testMain(self):
508 """Test that the main function works."""
509 options = mox.MockObject(object)
David Jamesc0f158a2011-02-22 16:07:29 -0800510 old_binhost = 'http://prebuilt/1'
511 options.previous_binhost_url = [old_binhost]
512 options.board = 'x86-generic'
513 options.build_path = '/trunk'
David Jamesfd0b0852011-02-23 11:15:36 -0800514 options.private = True
David Jamesc0f158a2011-02-22 16:07:29 -0800515 options.sync_host = True
516 options.git_sync = True
David James8fa34ea2011-04-15 13:00:20 -0700517 options.upload_board_tarball = True
David Jamesc0f158a2011-02-22 16:07:29 -0800518 options.upload = 'gs://upload/'
David Jamesfd0b0852011-02-23 11:15:36 -0800519 options.binhost_base_url = options.upload
David Jamesc0f158a2011-02-22 16:07:29 -0800520 options.prepend_version = True
521 options.filters = True
522 options.key = 'PORTAGE_BINHOST'
523 options.sync_binhost_conf = True
524 self.mox.StubOutWithMock(prebuilt, 'ParseOptions')
525 prebuilt.ParseOptions().AndReturn(options)
526 self.mox.StubOutWithMock(prebuilt, 'LoadPrivateFilters')
527 prebuilt.LoadPrivateFilters(options.build_path)
David Jamesc0f158a2011-02-22 16:07:29 -0800528 self.mox.StubOutWithMock(prebuilt, 'GrabRemotePackageIndex')
529 prebuilt.GrabRemotePackageIndex(old_binhost).AndReturn(True)
David Jamesfd0b0852011-02-23 11:15:36 -0800530 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '__init__')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700531 self.mox.StubOutWithMock(prebuilt, 'GetBoardPathFromCrosOverlayList')
532 fake_overlay_path = '/fake_path'
533 acl_path = prebuilt.GetBoardPathFromCrosOverlayList(
534 options.build_path, options.board).AndReturn(fake_overlay_path)
535 expected_gs_acl_path = os.path.join(fake_overlay_path,
536 prebuilt._GOOGLESTORAGE_ACL_FILE)
537 prebuilt.PrebuiltUploader.__init__(options.upload, expected_gs_acl_path,
538 options.upload, mox.IgnoreArg())
David Jamesc0f158a2011-02-22 16:07:29 -0800539 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_SyncHostPrebuilts')
540 prebuilt.PrebuiltUploader._SyncHostPrebuilts(options.build_path,
541 mox.IgnoreArg(), options.key, options.git_sync,
542 options.sync_binhost_conf)
543 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_SyncBoardPrebuilts')
544 prebuilt.PrebuiltUploader._SyncBoardPrebuilts(options.board,
545 options.build_path, mox.IgnoreArg(), options.key, options.git_sync,
David James8fa34ea2011-04-15 13:00:20 -0700546 options.sync_binhost_conf, options.upload_board_tarball)
David Jamesc0f158a2011-02-22 16:07:29 -0800547 self.mox.ReplayAll()
548 prebuilt.main()
549
David James8c846492011-01-25 17:07:29 -0800550if __name__ == '__main__':
551 unittest.main()