blob: 01ed0b0ef9d5ee384d83c1dcc9b153d55c534e5d [file] [log] [blame]
David James8c846492011-01-25 17:07:29 -08001#!/usr/bin/python
David Jamesbb20ac82012-07-18 10:59:16 -07002# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
David James8c846492011-01-25 17:07:29 -08003# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
Mike Frysingerc6824f62014-02-03 11:09:44 -05006"""Unittests for upload_prebuilts.py."""
7
David James8c846492011-01-25 17:07:29 -08008import copy
9import mox
10import os
David James8fa34ea2011-04-15 13:00:20 -070011import multiprocessing
Chris Sosa471532a2011-02-01 15:10:06 -080012import sys
David James8c846492011-01-25 17:07:29 -080013import tempfile
Chris Sosa471532a2011-02-01 15:10:06 -080014
David Jamesc5cbd472012-06-19 16:25:45 -070015sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)),
16 '..', '..'))
17from chromite.scripts import upload_prebuilts as prebuilt
Brian Harringc92788f2012-09-21 18:07:15 -070018from chromite.lib import cros_test_lib
David James2c7ccb42012-11-04 15:34:28 -080019from chromite.lib import gs
David James615e5b52011-06-03 11:10:15 -070020from chromite.lib import binpkg
Zdenek Behanc0e18762012-09-22 04:06:17 +020021from chromite.lib import osutils
David James8c846492011-01-25 17:07:29 -080022
David James4058b0d2011-12-08 21:24:50 -080023# pylint: disable=E1120,W0212,R0904
David James615e5b52011-06-03 11:10:15 -070024PUBLIC_PACKAGES = [{'CPV': 'gtk+/public1', 'SHA1': '1', 'MTIME': '1'},
David James8c846492011-01-25 17:07:29 -080025 {'CPV': 'gtk+/public2', 'SHA1': '2',
David James615e5b52011-06-03 11:10:15 -070026 'PATH': 'gtk+/foo.tgz', 'MTIME': '2'}]
27PRIVATE_PACKAGES = [{'CPV': 'private', 'SHA1': '3', 'MTIME': '3'}]
David James8c846492011-01-25 17:07:29 -080028
29
30def SimplePackageIndex(header=True, packages=True):
Chris Sosa58669192011-06-30 12:45:03 -070031 pkgindex = binpkg.PackageIndex()
32 if header:
David James2c7ccb42012-11-04 15:34:28 -080033 pkgindex.header['URI'] = 'gs://example'
Chris Sosa58669192011-06-30 12:45:03 -070034 if packages:
35 pkgindex.packages = copy.deepcopy(PUBLIC_PACKAGES + PRIVATE_PACKAGES)
36 return pkgindex
David James8c846492011-01-25 17:07:29 -080037
38
Brian Harringc92788f2012-09-21 18:07:15 -070039class TestUpdateFile(cros_test_lib.TempDirTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -050040 """Tests for the UpdateLocalFile function."""
David James8c846492011-01-25 17:07:29 -080041
42 def setUp(self):
43 self.contents_str = ['# comment that should be skipped',
44 'PKGDIR="/var/lib/portage/pkgs"',
45 'PORTAGE_BINHOST="http://no.thanks.com"',
46 'portage portage-20100310.tar.bz2',
47 'COMPILE_FLAGS="some_value=some_other"',
48 ]
Zdenek Behanc0e18762012-09-22 04:06:17 +020049 self.version_file = os.path.join(self.tempdir, 'version')
50 osutils.WriteFile(self.version_file, '\n'.join(self.contents_str))
David James8c846492011-01-25 17:07:29 -080051
David James8c846492011-01-25 17:07:29 -080052 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
Brian Harringc92788f2012-09-21 18:07:15 -0700109class TestPrebuilt(cros_test_lib.MoxTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500110 """Tests for Prebuilt logic."""
David James8c846492011-01-25 17:07:29 -0800111
112 def testGenerateUploadDict(self):
113 base_local_path = '/b/cbuild/build/chroot/build/x86-dogfood/'
114 gs_bucket_path = 'gs://chromeos-prebuilt/host/version'
115 local_path = os.path.join(base_local_path, 'public1.tbz2')
116 self.mox.StubOutWithMock(prebuilt.os.path, 'exists')
117 prebuilt.os.path.exists(local_path).AndReturn(True)
118 self.mox.ReplayAll()
119 pkgs = [{ 'CPV': 'public1' }]
120 result = prebuilt.GenerateUploadDict(base_local_path, gs_bucket_path, pkgs)
121 expected = { local_path: gs_bucket_path + '/public1.tbz2' }
122 self.assertEqual(result, expected)
123
David James8c846492011-01-25 17:07:29 -0800124 def testDeterminePrebuiltConfHost(self):
125 """Test that the host prebuilt path comes back properly."""
126 expected_path = os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64'])
127 self.assertEqual(prebuilt.DeterminePrebuiltConfFile('fake_path', 'amd64'),
128 expected_path)
129
David James8c846492011-01-25 17:07:29 -0800130
David James2c7ccb42012-11-04 15:34:28 -0800131class TestPkgIndex(cros_test_lib.TestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500132 """Helper for tests that update the Packages index file."""
David James2c7ccb42012-11-04 15:34:28 -0800133
134 def setUp(self):
135 self.db = {}
136 self.pkgindex = SimplePackageIndex()
137 self.empty = SimplePackageIndex(packages=False)
138
139 def assertURIs(self, uris):
140 """Verify that the duplicate DB has the specified URLs."""
141 expected = [v.uri for _, v in sorted(self.db.items())]
142 self.assertEqual(expected, uris)
143
144
145class TestPackagesFileFiltering(TestPkgIndex):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500146 """Tests for Packages filtering behavior."""
David James8c846492011-01-25 17:07:29 -0800147
148 def testFilterPkgIndex(self):
David James2c7ccb42012-11-04 15:34:28 -0800149 """Test filtering out of private packages."""
150 self.pkgindex.RemoveFilteredPackages(lambda pkg: pkg in PRIVATE_PACKAGES)
151 self.assertEqual(self.pkgindex.packages, PUBLIC_PACKAGES)
152 self.assertEqual(self.pkgindex.modified, True)
David James8c846492011-01-25 17:07:29 -0800153
154
David James2c7ccb42012-11-04 15:34:28 -0800155class TestPopulateDuplicateDB(TestPkgIndex):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500156 """Tests for the _PopulateDuplicateDB function."""
David James8c846492011-01-25 17:07:29 -0800157
158 def testEmptyIndex(self):
David James2c7ccb42012-11-04 15:34:28 -0800159 """Test population of the duplicate DB with an empty index."""
160 self.empty._PopulateDuplicateDB(self.db, 0)
161 self.assertEqual(self.db, {})
David James8c846492011-01-25 17:07:29 -0800162
163 def testNormalIndex(self):
David James2c7ccb42012-11-04 15:34:28 -0800164 """Test population of the duplicate DB with a full index."""
165 self.pkgindex._PopulateDuplicateDB(self.db, 0)
166 self.assertURIs(['gs://example/gtk+/public1.tbz2',
167 'gs://example/gtk+/foo.tgz',
168 'gs://example/private.tbz2'])
David James8c846492011-01-25 17:07:29 -0800169
170 def testMissingSHA1(self):
David James2c7ccb42012-11-04 15:34:28 -0800171 """Test population of the duplicate DB with a missing SHA1."""
172 del self.pkgindex.packages[0]['SHA1']
173 self.pkgindex._PopulateDuplicateDB(self.db, 0)
174 self.assertURIs(['gs://example/gtk+/foo.tgz',
175 'gs://example/private.tbz2'])
David James8c846492011-01-25 17:07:29 -0800176
177 def testFailedPopulate(self):
David James2c7ccb42012-11-04 15:34:28 -0800178 """Test failure conditions for the populate method."""
179 headerless = SimplePackageIndex(header=False)
180 self.assertRaises(KeyError, headerless._PopulateDuplicateDB, self.db, 0)
181 del self.pkgindex.packages[0]['CPV']
182 self.assertRaises(KeyError, self.pkgindex._PopulateDuplicateDB, self.db, 0)
David James8c846492011-01-25 17:07:29 -0800183
184
David James2c7ccb42012-11-04 15:34:28 -0800185class TestResolveDuplicateUploads(cros_test_lib.MoxTestCase, TestPkgIndex):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500186 """Tests for the ResolveDuplicateUploads function."""
David James8c846492011-01-25 17:07:29 -0800187
David James615e5b52011-06-03 11:10:15 -0700188 def setUp(self):
David James615e5b52011-06-03 11:10:15 -0700189 self.mox.StubOutWithMock(binpkg.time, 'time')
190 binpkg.time.time().AndReturn(binpkg.TWO_WEEKS)
191 self.mox.ReplayAll()
David James2c7ccb42012-11-04 15:34:28 -0800192 self.db = {}
193 self.dup = SimplePackageIndex()
194 self.expected_pkgindex = SimplePackageIndex()
195
196 def assertNoDuplicates(self, candidates):
197 """Verify no duplicates are found with the specified candidates."""
198 uploads = self.pkgindex.ResolveDuplicateUploads(candidates)
199 self.assertEqual(uploads, self.pkgindex.packages)
200 self.assertEqual(len(self.pkgindex.packages),
201 len(self.expected_pkgindex.packages))
202 for pkg1, pkg2 in zip(self.pkgindex.packages,
203 self.expected_pkgindex.packages):
204 self.assertNotEqual(pkg1['MTIME'], pkg2['MTIME'])
205 del pkg1['MTIME']
206 del pkg2['MTIME']
207 self.assertEqual(self.pkgindex.modified, False)
208 self.assertEqual(self.pkgindex.packages, self.expected_pkgindex.packages)
209
210 def assertAllDuplicates(self, candidates):
211 """Verify every package is a duplicate in the specified list."""
212 for pkg in self.expected_pkgindex.packages:
213 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
214 self.pkgindex.ResolveDuplicateUploads(candidates)
215 self.assertEqual(self.pkgindex.packages, self.expected_pkgindex.packages)
David James615e5b52011-06-03 11:10:15 -0700216
David James8c846492011-01-25 17:07:29 -0800217 def testEmptyList(self):
David James2c7ccb42012-11-04 15:34:28 -0800218 """If no candidates are supplied, no duplicates should be found."""
219 self.assertNoDuplicates([])
David James8c846492011-01-25 17:07:29 -0800220
221 def testEmptyIndex(self):
David James2c7ccb42012-11-04 15:34:28 -0800222 """If no packages are supplied, no duplicates should be found."""
223 self.assertNoDuplicates([self.empty])
David James8c846492011-01-25 17:07:29 -0800224
David James2c7ccb42012-11-04 15:34:28 -0800225 def testDifferentURI(self):
226 """If the URI differs, no duplicates should be found."""
227 self.dup.header['URI'] = 'gs://example2'
228 self.assertNoDuplicates([self.dup])
229
230 def testUpdateModificationTime(self):
231 """When duplicates are found, we should use the latest mtime."""
232 for pkg in self.expected_pkgindex.packages:
233 pkg['MTIME'] = '10'
234 for pkg in self.dup.packages:
235 pkg['MTIME'] = '4'
236 self.assertAllDuplicates([self.expected_pkgindex, self.dup])
237
238 def testCanonicalUrl(self):
239 """If the URL is in a different format, we should still find duplicates."""
240 self.dup.header['URI'] = gs.PUBLIC_BASE_HTTPS_URL + 'example'
241 self.assertAllDuplicates([self.dup])
David James8c846492011-01-25 17:07:29 -0800242
243 def testMissingSHA1(self):
David James2c7ccb42012-11-04 15:34:28 -0800244 """We should not find duplicates if there is no SHA1."""
245 del self.pkgindex.packages[0]['SHA1']
246 del self.expected_pkgindex.packages[0]['SHA1']
247 for pkg in self.expected_pkgindex.packages[1:]:
David James8c846492011-01-25 17:07:29 -0800248 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
David James2c7ccb42012-11-04 15:34:28 -0800249 self.pkgindex.ResolveDuplicateUploads([self.dup])
250 self.assertNotEqual(self.pkgindex.packages[0]['MTIME'],
251 self.expected_pkgindex.packages[0]['MTIME'])
252 del self.pkgindex.packages[0]['MTIME']
253 del self.expected_pkgindex.packages[0]['MTIME']
254 self.assertEqual(self.pkgindex.packages, self.expected_pkgindex.packages)
David James8c846492011-01-25 17:07:29 -0800255
256
David James2c7ccb42012-11-04 15:34:28 -0800257class TestWritePackageIndex(cros_test_lib.MoxTestCase, TestPkgIndex):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500258 """Tests for the WriteToNamedTemporaryFile function."""
David James8c846492011-01-25 17:07:29 -0800259
260 def testSimple(self):
David James2c7ccb42012-11-04 15:34:28 -0800261 """Test simple call of WriteToNamedTemporaryFile()"""
262 self.mox.StubOutWithMock(self.pkgindex, 'Write')
263 self.pkgindex.Write(mox.IgnoreArg())
David James8c846492011-01-25 17:07:29 -0800264 self.mox.ReplayAll()
David James2c7ccb42012-11-04 15:34:28 -0800265 f = self.pkgindex.WriteToNamedTemporaryFile()
David James8c846492011-01-25 17:07:29 -0800266 self.assertEqual(f.read(), '')
267
268
Brian Harringd2f971f2012-11-01 16:50:48 -0700269class TestUploadPrebuilt(cros_test_lib.MoxTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500270 """Tests for the _UploadPrebuilt function."""
David James05bcb2b2011-02-09 09:25:47 -0800271
272 def setUp(self):
273 class MockTemporaryFile(object):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500274 """Mock out the temporary file logic."""
David James05bcb2b2011-02-09 09:25:47 -0800275 def __init__(self, name):
276 self.name = name
David James05bcb2b2011-02-09 09:25:47 -0800277 self.pkgindex = SimplePackageIndex()
Brian Harring99718532012-06-10 05:12:14 -0700278 self.mox.StubOutWithMock(binpkg, 'GrabLocalPackageIndex')
279 binpkg.GrabLocalPackageIndex('/packages').AndReturn(self.pkgindex)
David James05bcb2b2011-02-09 09:25:47 -0800280 self.mox.StubOutWithMock(prebuilt, 'RemoteUpload')
281 self.mox.StubOutWithMock(self.pkgindex, 'ResolveDuplicateUploads')
282 self.pkgindex.ResolveDuplicateUploads([]).AndReturn(PRIVATE_PACKAGES)
283 self.mox.StubOutWithMock(self.pkgindex, 'WriteToNamedTemporaryFile')
284 fake_pkgs_file = MockTemporaryFile('fake')
285 self.pkgindex.WriteToNamedTemporaryFile().AndReturn(fake_pkgs_file)
286
David James05bcb2b2011-02-09 09:25:47 -0800287 def testSuccessfulGsUpload(self):
288 uploads = {'/packages/private.tbz2': 'gs://foo/private.tbz2'}
289 self.mox.StubOutWithMock(prebuilt, 'GenerateUploadDict')
290 prebuilt.GenerateUploadDict('/packages', 'gs://foo/suffix',
291 PRIVATE_PACKAGES).AndReturn(uploads)
292 uploads = uploads.copy()
293 uploads['fake'] = 'gs://foo/suffix/Packages'
David Jamesfd0b0852011-02-23 11:15:36 -0800294 acl = 'public-read'
Mike Frysinger540883b2014-05-24 13:46:16 -0400295 prebuilt.RemoteUpload(mox.IgnoreArg(), acl, uploads)
David James05bcb2b2011-02-09 09:25:47 -0800296 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800297 uri = self.pkgindex.header['URI']
David James8ece7ee2011-06-29 16:02:30 -0700298 uploader = prebuilt.PrebuiltUploader('gs://foo', acl, uri, [], '/', [],
Mike Frysinger8092a632014-05-24 13:25:46 -0400299 False, 'foo', False, 'x86-foo', [], '')
David Jamesc0f158a2011-02-22 16:07:29 -0800300 uploader._UploadPrebuilt('/packages', 'suffix')
David James05bcb2b2011-02-09 09:25:47 -0800301
David James05bcb2b2011-02-09 09:25:47 -0800302
Brian Harringc92788f2012-09-21 18:07:15 -0700303class TestSyncPrebuilts(cros_test_lib.MoxTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500304 """Tests for the SyncHostPrebuilts function."""
David James05bcb2b2011-02-09 09:25:47 -0800305
306 def setUp(self):
David James05bcb2b2011-02-09 09:25:47 -0800307 self.mox.StubOutWithMock(prebuilt, 'DeterminePrebuiltConfFile')
David James05bcb2b2011-02-09 09:25:47 -0800308 self.mox.StubOutWithMock(prebuilt, 'RevGitFile')
309 self.mox.StubOutWithMock(prebuilt, 'UpdateBinhostConfFile')
310 self.build_path = '/trunk'
311 self.upload_location = 'gs://upload/'
312 self.version = '1'
313 self.binhost = 'http://prebuilt/'
314 self.key = 'PORTAGE_BINHOST'
David James615e5b52011-06-03 11:10:15 -0700315 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_UploadPrebuilt')
David James05bcb2b2011-02-09 09:25:47 -0800316
David James05bcb2b2011-02-09 09:25:47 -0800317 def testSyncHostPrebuilts(self):
David Jamese2488642011-11-14 16:15:20 -0800318 board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800319 target = prebuilt.BuildTarget(board, 'aura')
320 slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
David James05bcb2b2011-02-09 09:25:47 -0800321 package_path = os.path.join(self.build_path,
322 prebuilt._HOST_PACKAGES_PATH)
323 url_suffix = prebuilt._REL_HOST_PATH % {'version': self.version,
David James4058b0d2011-12-08 21:24:50 -0800324 'host_arch': prebuilt._HOST_ARCH, 'target': target}
David James8fa34ea2011-04-15 13:00:20 -0700325 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James615e5b52011-06-03 11:10:15 -0700326 prebuilt.PrebuiltUploader._UploadPrebuilt(package_path,
327 packages_url_suffix).AndReturn(True)
David Jamesf0e6fd72011-04-15 15:58:07 -0700328 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
329 packages_url_suffix.rstrip('/'))
David Jamese2488642011-11-14 16:15:20 -0800330 urls = [url_value.replace('foo', 'bar'), url_value]
David James20b2b6f2011-11-18 15:11:58 -0800331 binhost = ' '.join(urls)
Mike Frysinger5b34d732013-01-17 15:11:58 -0500332 prebuilt.RevGitFile(mox.IgnoreArg(), {self.key: binhost}, dryrun=False)
David Jamese2488642011-11-14 16:15:20 -0800333 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, binhost)
David James05bcb2b2011-02-09 09:25:47 -0800334 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700335 uploader = prebuilt.PrebuiltUploader(
336 self.upload_location, 'public-read', self.binhost, [],
Mike Frysinger8092a632014-05-24 13:25:46 -0400337 self.build_path, [], False, 'foo', False, target, slave_targets,
338 self.version)
339 uploader.SyncHostPrebuilts(self.key, True, True)
David James05bcb2b2011-02-09 09:25:47 -0800340
341 def testSyncBoardPrebuilts(self):
David Jamese2488642011-11-14 16:15:20 -0800342 board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800343 target = prebuilt.BuildTarget(board, 'aura')
344 slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
Mike Frysinger8092a632014-05-24 13:25:46 -0400345 board_path = os.path.join(
346 self.build_path, prebuilt._BOARD_PATH % {'board': board})
David James05bcb2b2011-02-09 09:25:47 -0800347 package_path = os.path.join(board_path, 'packages')
348 url_suffix = prebuilt._REL_BOARD_PATH % {'version': self.version,
David James4058b0d2011-12-08 21:24:50 -0800349 'target': target}
David James8fa34ea2011-04-15 13:00:20 -0700350 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James8fa34ea2011-04-15 13:00:20 -0700351 self.mox.StubOutWithMock(multiprocessing.Process, '__init__')
352 self.mox.StubOutWithMock(multiprocessing.Process, 'exitcode')
353 self.mox.StubOutWithMock(multiprocessing.Process, 'start')
354 self.mox.StubOutWithMock(multiprocessing.Process, 'join')
Mike Frysinger8092a632014-05-24 13:25:46 -0400355 multiprocessing.Process.__init__(
356 target=mox.IgnoreArg(),
357 args=(board_path, url_suffix, None, None, None))
David James8fa34ea2011-04-15 13:00:20 -0700358 multiprocessing.Process.start()
Mike Frysinger8092a632014-05-24 13:25:46 -0400359 prebuilt.PrebuiltUploader._UploadPrebuilt(
360 package_path, packages_url_suffix).AndReturn(True)
David James8fa34ea2011-04-15 13:00:20 -0700361 multiprocessing.Process.join()
362 multiprocessing.Process.exitcode = 0
David Jamesf0e6fd72011-04-15 15:58:07 -0700363 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
364 packages_url_suffix.rstrip('/'))
David Jamese2488642011-11-14 16:15:20 -0800365 bar_binhost = url_value.replace('foo', 'bar')
Mike Frysinger8092a632014-05-24 13:25:46 -0400366 prebuilt.DeterminePrebuiltConfFile(
367 self.build_path, slave_targets[0]).AndReturn('bar')
Mike Frysinger5b34d732013-01-17 15:11:58 -0500368 prebuilt.RevGitFile('bar', {self.key: bar_binhost}, dryrun=False)
David Jamese2488642011-11-14 16:15:20 -0800369 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, bar_binhost)
David James4058b0d2011-12-08 21:24:50 -0800370 prebuilt.DeterminePrebuiltConfFile(self.build_path, target).AndReturn('foo')
Mike Frysinger5b34d732013-01-17 15:11:58 -0500371 prebuilt.RevGitFile('foo', {self.key: url_value}, dryrun=False)
David James05bcb2b2011-02-09 09:25:47 -0800372 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
373 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700374 uploader = prebuilt.PrebuiltUploader(
375 self.upload_location, 'public-read', self.binhost, [],
Mike Frysinger8092a632014-05-24 13:25:46 -0400376 self.build_path, [], False, 'foo', False, target, slave_targets,
377 self.version)
378 uploader.SyncBoardPrebuilts(self.key, True, True, True, None, None, None)
David James05bcb2b2011-02-09 09:25:47 -0800379
380
Brian Harringc92788f2012-09-21 18:07:15 -0700381class TestMain(cros_test_lib.MoxTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500382 """Tests for the main() function."""
David Jamesc0f158a2011-02-22 16:07:29 -0800383
384 def testMain(self):
385 """Test that the main function works."""
386 options = mox.MockObject(object)
David Jamesc0f158a2011-02-22 16:07:29 -0800387 old_binhost = 'http://prebuilt/1'
388 options.previous_binhost_url = [old_binhost]
David Jamese2488642011-11-14 16:15:20 -0800389 options.board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800390 options.profile = None
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700391 target = prebuilt.BuildTarget(options.board, options.profile)
David Jamesc0f158a2011-02-22 16:07:29 -0800392 options.build_path = '/trunk'
Mike Frysinger86509232014-05-24 13:18:37 -0400393 options.dryrun = False
David Jamesfd0b0852011-02-23 11:15:36 -0800394 options.private = True
David James615e5b52011-06-03 11:10:15 -0700395 options.packages = []
David Jamesc0f158a2011-02-22 16:07:29 -0800396 options.sync_host = True
397 options.git_sync = True
David James8fa34ea2011-04-15 13:00:20 -0700398 options.upload_board_tarball = True
Zdenek Behan62a57792012-08-31 15:09:08 +0200399 options.prepackaged_tarball = None
Mike Frysinger9e979b92012-11-29 02:55:09 -0500400 options.toolchain_tarballs = []
401 options.toolchain_upload_path = ''
David Jamesc0f158a2011-02-22 16:07:29 -0800402 options.upload = 'gs://upload/'
David Jamesfd0b0852011-02-23 11:15:36 -0800403 options.binhost_base_url = options.upload
David Jamesc0f158a2011-02-22 16:07:29 -0800404 options.prepend_version = True
David James8ece7ee2011-06-29 16:02:30 -0700405 options.set_version = None
406 options.skip_upload = False
David Jamesc0f158a2011-02-22 16:07:29 -0800407 options.filters = True
408 options.key = 'PORTAGE_BINHOST'
David James32b0b2f2011-07-13 20:56:50 -0700409 options.binhost_conf_dir = 'foo'
David Jamesc0f158a2011-02-22 16:07:29 -0800410 options.sync_binhost_conf = True
David James4058b0d2011-12-08 21:24:50 -0800411 options.slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
David Jamesc0f158a2011-02-22 16:07:29 -0800412 self.mox.StubOutWithMock(prebuilt, 'ParseOptions')
Mike Frysinger86509232014-05-24 13:18:37 -0400413 prebuilt.ParseOptions([]).AndReturn(tuple([options, target]))
Brian Harring99718532012-06-10 05:12:14 -0700414 self.mox.StubOutWithMock(binpkg, 'GrabRemotePackageIndex')
415 binpkg.GrabRemotePackageIndex(old_binhost).AndReturn(True)
David Jamesfd0b0852011-02-23 11:15:36 -0800416 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '__init__')
David Jamese5867812012-10-19 12:02:20 -0700417 self.mox.StubOutWithMock(prebuilt, 'GetBoardOverlay')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700418 fake_overlay_path = '/fake_path'
David Jamese5867812012-10-19 12:02:20 -0700419 prebuilt.GetBoardOverlay(
Peter Mayo950e41a2014-02-06 21:07:33 +0000420 options.build_path, options.board).AndReturn(fake_overlay_path)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700421 expected_gs_acl_path = os.path.join(fake_overlay_path,
422 prebuilt._GOOGLESTORAGE_ACL_FILE)
423 prebuilt.PrebuiltUploader.__init__(options.upload, expected_gs_acl_path,
David James615e5b52011-06-03 11:10:15 -0700424 options.upload, mox.IgnoreArg(),
David James8ece7ee2011-06-29 16:02:30 -0700425 options.build_path, options.packages,
David Jamese2488642011-11-14 16:15:20 -0800426 False, options.binhost_conf_dir, False,
Mike Frysinger8092a632014-05-24 13:25:46 -0400427 target, options.slave_targets,
428 mox.IgnoreArg())
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700429 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, 'SyncHostPrebuilts')
Mike Frysinger8092a632014-05-24 13:25:46 -0400430 prebuilt.PrebuiltUploader.SyncHostPrebuilts(
431 options.key, options.git_sync, options.sync_binhost_conf)
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700432 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, 'SyncBoardPrebuilts')
433 prebuilt.PrebuiltUploader.SyncBoardPrebuilts(
Mike Frysinger8092a632014-05-24 13:25:46 -0400434 options.key, options.git_sync,
Mike Frysinger9e979b92012-11-29 02:55:09 -0500435 options.sync_binhost_conf, options.upload_board_tarball, None, [], '')
David Jamesc0f158a2011-02-22 16:07:29 -0800436 self.mox.ReplayAll()
David Jamesc5cbd472012-06-19 16:25:45 -0700437 prebuilt.main([])
David Jamesc0f158a2011-02-22 16:07:29 -0800438
Mike Frysinger9e979b92012-11-29 02:55:09 -0500439
440class TestSdk(cros_test_lib.MoxTestCase):
441 """Test logic related to uploading SDK binaries"""
442
443 def setUp(self):
444 self.mox.StubOutWithMock(prebuilt, '_GsUpload')
445 self.mox.StubOutWithMock(prebuilt, 'UpdateBinhostConfFile')
446
447 self.acl = 'magic-acl'
448
449 # All these args pretty much get ignored. Whee.
450 self.uploader = prebuilt.PrebuiltUploader(
451 'gs://foo', self.acl, 'prebuilt', [], '/', [],
Mike Frysinger8092a632014-05-24 13:25:46 -0400452 False, 'foo', False, 'x86-foo', [], 'chroot-1234')
Mike Frysinger9e979b92012-11-29 02:55:09 -0500453
454 def testSdkUpload(self, cb=lambda:None, tc_tarballs=(),
455 tc_upload_path=None):
456 """Make sure we can upload just an SDK tarball"""
457 tar = 'sdk.tar.xz'
458 ver = '1234'
459 vtar = 'cros-sdk-%s.tar.xz' % ver
460
Mike Frysinger540883b2014-05-24 13:46:16 -0400461 prebuilt._GsUpload(mox.IgnoreArg(), self.acl, '%s.Manifest' % tar,
462 'gs://chromiumos-sdk/%s.Manifest' % vtar)
463 prebuilt._GsUpload(mox.IgnoreArg(), self.acl, tar,
464 'gs://chromiumos-sdk/%s' % vtar)
Mike Frysinger9e979b92012-11-29 02:55:09 -0500465 cb()
Mike Frysinger540883b2014-05-24 13:46:16 -0400466 prebuilt._GsUpload(mox.IgnoreArg(), self.acl, mox.IgnoreArg(),
467 'gs://chromiumos-sdk/cros-sdk-latest.conf')
Mike Frysinger9e979b92012-11-29 02:55:09 -0500468 self.mox.ReplayAll()
469
Mike Frysinger8092a632014-05-24 13:25:46 -0400470 self.uploader._UploadSdkTarball('amd64-host', '',
Mike Frysinger9e979b92012-11-29 02:55:09 -0500471 tar, tc_tarballs, tc_upload_path)
472
473 def testTarballUpload(self):
474 """Make sure processing of toolchain tarballs works"""
475 tc_tarballs = (
476 'i686:/some/i686.tar.xz',
477 'arm-none:/some/arm.tar.xz',
478 )
479 tc_upload_path = '1994/04/%(target)s-1994.04.02.tar.xz'
480 def cb():
481 for tc in tc_tarballs:
482 tc = tc.split(':')
483 prebuilt._GsUpload(
Mike Frysinger540883b2014-05-24 13:46:16 -0400484 mox.IgnoreArg(), self.acl, tc[1],
485 ('gs://chromiumos-sdk/' + tc_upload_path) % {'target': tc[0]})
Mike Frysinger9e979b92012-11-29 02:55:09 -0500486 self.testSdkUpload(cb, tc_tarballs, tc_upload_path)
487
488
David James8c846492011-01-25 17:07:29 -0800489if __name__ == '__main__':
Brian Harringc92788f2012-09-21 18:07:15 -0700490 cros_test_lib.main()