blob: 30dad8859d1db0f9be6e1dec84f6b9635191e96f [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
Mike Frysinger383367e2014-09-16 15:06:17 -04008from __future__ import print_function
9
David James8c846492011-01-25 17:07:29 -080010import copy
11import mox
12import os
David James8fa34ea2011-04-15 13:00:20 -070013import multiprocessing
Chris Sosa471532a2011-02-01 15:10:06 -080014import sys
David James8c846492011-01-25 17:07:29 -080015import tempfile
Chris Sosa471532a2011-02-01 15:10:06 -080016
David Jamesc5cbd472012-06-19 16:25:45 -070017sys.path.insert(0, os.path.join(os.path.dirname(os.path.realpath(__file__)),
18 '..', '..'))
19from chromite.scripts import upload_prebuilts as prebuilt
Brian Harringc92788f2012-09-21 18:07:15 -070020from chromite.lib import cros_test_lib
David James2c7ccb42012-11-04 15:34:28 -080021from chromite.lib import gs
David James615e5b52011-06-03 11:10:15 -070022from chromite.lib import binpkg
Zdenek Behanc0e18762012-09-22 04:06:17 +020023from chromite.lib import osutils
Prathmesh Prabhu421eef22014-10-16 17:13:19 -070024from chromite.lib import portage_util
David James8c846492011-01-25 17:07:29 -080025
Mike Frysinger68182472014-11-05 22:38:39 -050026import mock
27
28
David James4058b0d2011-12-08 21:24:50 -080029# pylint: disable=E1120,W0212,R0904
David James615e5b52011-06-03 11:10:15 -070030PUBLIC_PACKAGES = [{'CPV': 'gtk+/public1', 'SHA1': '1', 'MTIME': '1'},
David James8c846492011-01-25 17:07:29 -080031 {'CPV': 'gtk+/public2', 'SHA1': '2',
David James615e5b52011-06-03 11:10:15 -070032 'PATH': 'gtk+/foo.tgz', 'MTIME': '2'}]
33PRIVATE_PACKAGES = [{'CPV': 'private', 'SHA1': '3', 'MTIME': '3'}]
David James8c846492011-01-25 17:07:29 -080034
35
36def SimplePackageIndex(header=True, packages=True):
Chris Sosa58669192011-06-30 12:45:03 -070037 pkgindex = binpkg.PackageIndex()
38 if header:
David James2c7ccb42012-11-04 15:34:28 -080039 pkgindex.header['URI'] = 'gs://example'
Chris Sosa58669192011-06-30 12:45:03 -070040 if packages:
41 pkgindex.packages = copy.deepcopy(PUBLIC_PACKAGES + PRIVATE_PACKAGES)
42 return pkgindex
David James8c846492011-01-25 17:07:29 -080043
44
Brian Harringc92788f2012-09-21 18:07:15 -070045class TestUpdateFile(cros_test_lib.TempDirTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -050046 """Tests for the UpdateLocalFile function."""
David James8c846492011-01-25 17:07:29 -080047
48 def setUp(self):
Mike Frysingerd6e2df02014-11-26 02:55:04 -050049 self.contents_str = [
50 '# comment that should be skipped',
51 'PKGDIR="/var/lib/portage/pkgs"',
52 'PORTAGE_BINHOST="http://no.thanks.com"',
53 'portage portage-20100310.tar.bz2',
54 'COMPILE_FLAGS="some_value=some_other"',
55 ]
Zdenek Behanc0e18762012-09-22 04:06:17 +020056 self.version_file = os.path.join(self.tempdir, 'version')
57 osutils.WriteFile(self.version_file, '\n'.join(self.contents_str))
David James8c846492011-01-25 17:07:29 -080058
David James8c846492011-01-25 17:07:29 -080059 def _read_version_file(self, version_file=None):
60 """Read the contents of self.version_file and return as a list."""
61 if not version_file:
62 version_file = self.version_file
63
64 version_fh = open(version_file)
65 try:
66 return [line.strip() for line in version_fh.readlines()]
67 finally:
68 version_fh.close()
69
70 def _verify_key_pair(self, key, val):
71 file_contents = self._read_version_file()
72 # ensure key for verify is wrapped on quotes
73 if '"' not in val:
74 val = '"%s"' % val
75 for entry in file_contents:
76 if '=' not in entry:
77 continue
78 file_key, file_val = entry.split('=')
79 if file_key == key:
80 if val == file_val:
81 break
82 else:
83 self.fail('Could not find "%s=%s" in version file' % (key, val))
84
85 def testAddVariableThatDoesNotExist(self):
86 """Add in a new variable that was no present in the file."""
87 key = 'PORTAGE_BINHOST'
88 value = '1234567'
89 prebuilt.UpdateLocalFile(self.version_file, value)
Mike Frysinger383367e2014-09-16 15:06:17 -040090 print(self.version_file)
Chris Sosa58669192011-06-30 12:45:03 -070091 self._read_version_file()
David James8c846492011-01-25 17:07:29 -080092 self._verify_key_pair(key, value)
Mike Frysinger383367e2014-09-16 15:06:17 -040093 print(self.version_file)
David James8c846492011-01-25 17:07:29 -080094
95 def testUpdateVariable(self):
96 """Test updating a variable that already exists."""
97 key, val = self.contents_str[2].split('=')
98 new_val = 'test_update'
99 self._verify_key_pair(key, val)
100 prebuilt.UpdateLocalFile(self.version_file, new_val)
101 self._verify_key_pair(key, new_val)
102
103 def testUpdateNonExistentFile(self):
104 key = 'PORTAGE_BINHOST'
105 value = '1234567'
106 non_existent_file = tempfile.mktemp()
107 try:
108 prebuilt.UpdateLocalFile(non_existent_file, value)
109 file_contents = self._read_version_file(non_existent_file)
Chris Sosa739c8752012-05-16 19:30:35 -0700110 self.assertEqual(file_contents, ['%s="%s"' % (key, value)])
David James8c846492011-01-25 17:07:29 -0800111 finally:
112 if os.path.exists(non_existent_file):
113 os.remove(non_existent_file)
114
115
Mike Frysinger68182472014-11-05 22:38:39 -0500116class TestPrebuilt(cros_test_lib.MockTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500117 """Tests for Prebuilt logic."""
David James8c846492011-01-25 17:07:29 -0800118
Bertrand SIMONNET811bcde2014-11-20 15:21:25 -0800119 def setUp(self):
120 self._base_local_path = '/b/cbuild/build/chroot/build/x86-dogfood/'
121 self._gs_bucket_path = 'gs://chromeos-prebuilt/host/version'
122 self._local_path = os.path.join(self._base_local_path, 'public1.tbz2')
123
David James8c846492011-01-25 17:07:29 -0800124 def testGenerateUploadDict(self):
Mike Frysinger68182472014-11-05 22:38:39 -0500125 self.PatchObject(prebuilt.os.path, 'exists', return_true=True)
Mike Frysingerd6e2df02014-11-26 02:55:04 -0500126 pkgs = [{'CPV': 'public1'}]
Bertrand SIMONNET811bcde2014-11-20 15:21:25 -0800127 result = prebuilt.GenerateUploadDict(self._base_local_path,
128 self._gs_bucket_path, pkgs)
129 expected = {self._local_path: self._gs_bucket_path + '/public1.tbz2', }
130 self.assertEqual(result, expected)
131
132 def testGenerateUploadDictWithDebug(self):
133 self.PatchObject(prebuilt.os.path, 'exists', return_true=True)
134 pkgs = [{'CPV': 'public1', 'DEBUG_SYMBOLS': 'yes'}]
135 result = prebuilt.GenerateUploadDict(self._base_local_path,
136 self._gs_bucket_path, pkgs)
137 expected = {self._local_path: self._gs_bucket_path + '/public1.tbz2',
138 self._local_path.replace('.tbz2', '.debug.tbz2'):
139 self._gs_bucket_path + '/public1.debug.tbz2'}
David James8c846492011-01-25 17:07:29 -0800140 self.assertEqual(result, expected)
141
David James8c846492011-01-25 17:07:29 -0800142 def testDeterminePrebuiltConfHost(self):
143 """Test that the host prebuilt path comes back properly."""
144 expected_path = os.path.join(prebuilt._PREBUILT_MAKE_CONF['amd64'])
145 self.assertEqual(prebuilt.DeterminePrebuiltConfFile('fake_path', 'amd64'),
146 expected_path)
147
David James8c846492011-01-25 17:07:29 -0800148
David James2c7ccb42012-11-04 15:34:28 -0800149class TestPkgIndex(cros_test_lib.TestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500150 """Helper for tests that update the Packages index file."""
David James2c7ccb42012-11-04 15:34:28 -0800151
152 def setUp(self):
153 self.db = {}
154 self.pkgindex = SimplePackageIndex()
155 self.empty = SimplePackageIndex(packages=False)
156
157 def assertURIs(self, uris):
158 """Verify that the duplicate DB has the specified URLs."""
159 expected = [v.uri for _, v in sorted(self.db.items())]
160 self.assertEqual(expected, uris)
161
162
163class TestPackagesFileFiltering(TestPkgIndex):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500164 """Tests for Packages filtering behavior."""
David James8c846492011-01-25 17:07:29 -0800165
166 def testFilterPkgIndex(self):
David James2c7ccb42012-11-04 15:34:28 -0800167 """Test filtering out of private packages."""
168 self.pkgindex.RemoveFilteredPackages(lambda pkg: pkg in PRIVATE_PACKAGES)
169 self.assertEqual(self.pkgindex.packages, PUBLIC_PACKAGES)
170 self.assertEqual(self.pkgindex.modified, True)
David James8c846492011-01-25 17:07:29 -0800171
172
David James2c7ccb42012-11-04 15:34:28 -0800173class TestPopulateDuplicateDB(TestPkgIndex):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500174 """Tests for the _PopulateDuplicateDB function."""
David James8c846492011-01-25 17:07:29 -0800175
176 def testEmptyIndex(self):
David James2c7ccb42012-11-04 15:34:28 -0800177 """Test population of the duplicate DB with an empty index."""
178 self.empty._PopulateDuplicateDB(self.db, 0)
179 self.assertEqual(self.db, {})
David James8c846492011-01-25 17:07:29 -0800180
181 def testNormalIndex(self):
David James2c7ccb42012-11-04 15:34:28 -0800182 """Test population of the duplicate DB with a full index."""
183 self.pkgindex._PopulateDuplicateDB(self.db, 0)
184 self.assertURIs(['gs://example/gtk+/public1.tbz2',
185 'gs://example/gtk+/foo.tgz',
186 'gs://example/private.tbz2'])
David James8c846492011-01-25 17:07:29 -0800187
188 def testMissingSHA1(self):
David James2c7ccb42012-11-04 15:34:28 -0800189 """Test population of the duplicate DB with a missing SHA1."""
190 del self.pkgindex.packages[0]['SHA1']
191 self.pkgindex._PopulateDuplicateDB(self.db, 0)
192 self.assertURIs(['gs://example/gtk+/foo.tgz',
193 'gs://example/private.tbz2'])
David James8c846492011-01-25 17:07:29 -0800194
195 def testFailedPopulate(self):
David James2c7ccb42012-11-04 15:34:28 -0800196 """Test failure conditions for the populate method."""
197 headerless = SimplePackageIndex(header=False)
198 self.assertRaises(KeyError, headerless._PopulateDuplicateDB, self.db, 0)
199 del self.pkgindex.packages[0]['CPV']
200 self.assertRaises(KeyError, self.pkgindex._PopulateDuplicateDB, self.db, 0)
David James8c846492011-01-25 17:07:29 -0800201
202
Mike Frysinger68182472014-11-05 22:38:39 -0500203class TestResolveDuplicateUploads(cros_test_lib.MockTestCase, TestPkgIndex):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500204 """Tests for the ResolveDuplicateUploads function."""
David James8c846492011-01-25 17:07:29 -0800205
David James615e5b52011-06-03 11:10:15 -0700206 def setUp(self):
Mike Frysinger68182472014-11-05 22:38:39 -0500207 self.PatchObject(binpkg.time, 'time', return_value=binpkg.TWO_WEEKS)
David James2c7ccb42012-11-04 15:34:28 -0800208 self.db = {}
209 self.dup = SimplePackageIndex()
210 self.expected_pkgindex = SimplePackageIndex()
211
212 def assertNoDuplicates(self, candidates):
213 """Verify no duplicates are found with the specified candidates."""
214 uploads = self.pkgindex.ResolveDuplicateUploads(candidates)
215 self.assertEqual(uploads, self.pkgindex.packages)
216 self.assertEqual(len(self.pkgindex.packages),
217 len(self.expected_pkgindex.packages))
218 for pkg1, pkg2 in zip(self.pkgindex.packages,
219 self.expected_pkgindex.packages):
220 self.assertNotEqual(pkg1['MTIME'], pkg2['MTIME'])
221 del pkg1['MTIME']
222 del pkg2['MTIME']
223 self.assertEqual(self.pkgindex.modified, False)
224 self.assertEqual(self.pkgindex.packages, self.expected_pkgindex.packages)
225
226 def assertAllDuplicates(self, candidates):
227 """Verify every package is a duplicate in the specified list."""
228 for pkg in self.expected_pkgindex.packages:
229 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
230 self.pkgindex.ResolveDuplicateUploads(candidates)
231 self.assertEqual(self.pkgindex.packages, self.expected_pkgindex.packages)
David James615e5b52011-06-03 11:10:15 -0700232
David James8c846492011-01-25 17:07:29 -0800233 def testEmptyList(self):
David James2c7ccb42012-11-04 15:34:28 -0800234 """If no candidates are supplied, no duplicates should be found."""
235 self.assertNoDuplicates([])
David James8c846492011-01-25 17:07:29 -0800236
237 def testEmptyIndex(self):
David James2c7ccb42012-11-04 15:34:28 -0800238 """If no packages are supplied, no duplicates should be found."""
239 self.assertNoDuplicates([self.empty])
David James8c846492011-01-25 17:07:29 -0800240
David James2c7ccb42012-11-04 15:34:28 -0800241 def testDifferentURI(self):
242 """If the URI differs, no duplicates should be found."""
243 self.dup.header['URI'] = 'gs://example2'
244 self.assertNoDuplicates([self.dup])
245
246 def testUpdateModificationTime(self):
247 """When duplicates are found, we should use the latest mtime."""
248 for pkg in self.expected_pkgindex.packages:
249 pkg['MTIME'] = '10'
250 for pkg in self.dup.packages:
251 pkg['MTIME'] = '4'
252 self.assertAllDuplicates([self.expected_pkgindex, self.dup])
253
254 def testCanonicalUrl(self):
255 """If the URL is in a different format, we should still find duplicates."""
256 self.dup.header['URI'] = gs.PUBLIC_BASE_HTTPS_URL + 'example'
257 self.assertAllDuplicates([self.dup])
David James8c846492011-01-25 17:07:29 -0800258
259 def testMissingSHA1(self):
David James2c7ccb42012-11-04 15:34:28 -0800260 """We should not find duplicates if there is no SHA1."""
261 del self.pkgindex.packages[0]['SHA1']
262 del self.expected_pkgindex.packages[0]['SHA1']
263 for pkg in self.expected_pkgindex.packages[1:]:
David James8c846492011-01-25 17:07:29 -0800264 pkg.setdefault('PATH', pkg['CPV'] + '.tbz2')
David James2c7ccb42012-11-04 15:34:28 -0800265 self.pkgindex.ResolveDuplicateUploads([self.dup])
266 self.assertNotEqual(self.pkgindex.packages[0]['MTIME'],
267 self.expected_pkgindex.packages[0]['MTIME'])
268 del self.pkgindex.packages[0]['MTIME']
269 del self.expected_pkgindex.packages[0]['MTIME']
270 self.assertEqual(self.pkgindex.packages, self.expected_pkgindex.packages)
David James8c846492011-01-25 17:07:29 -0800271
Bertrand SIMONNET811bcde2014-11-20 15:21:25 -0800272 def testSymbolsAvailable(self):
273 """If symbols are available remotely, re-use them and set DEBUG_SYMBOLS."""
274 self.dup.packages[0]['DEBUG_SYMBOLS'] = 'yes'
275
276 uploads = self.pkgindex.ResolveDuplicateUploads([self.dup])
277 self.assertEqual(uploads, [])
278 self.assertEqual(self.pkgindex.packages[0].get('DEBUG_SYMBOLS'), 'yes')
279
280 def testSymbolsAvailableLocallyOnly(self):
281 """If the symbols are only available locally, reupload them."""
282 self.pkgindex.packages[0]['DEBUG_SYMBOLS'] = 'yes'
283
284 uploads = self.pkgindex.ResolveDuplicateUploads([self.dup])
285 self.assertEqual(uploads, [self.pkgindex.packages[0]])
286
David James8c846492011-01-25 17:07:29 -0800287
Mike Frysinger68182472014-11-05 22:38:39 -0500288class TestWritePackageIndex(cros_test_lib.MockTestCase, TestPkgIndex):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500289 """Tests for the WriteToNamedTemporaryFile function."""
David James8c846492011-01-25 17:07:29 -0800290
291 def testSimple(self):
David James2c7ccb42012-11-04 15:34:28 -0800292 """Test simple call of WriteToNamedTemporaryFile()"""
Mike Frysinger68182472014-11-05 22:38:39 -0500293 self.PatchObject(self.pkgindex, 'Write')
David James2c7ccb42012-11-04 15:34:28 -0800294 f = self.pkgindex.WriteToNamedTemporaryFile()
David James8c846492011-01-25 17:07:29 -0800295 self.assertEqual(f.read(), '')
296
297
Alex Deymo541ea6f2014-12-23 01:18:14 -0800298class TestUploadPrebuilt(cros_test_lib.MoxTempDirTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500299 """Tests for the _UploadPrebuilt function."""
David James05bcb2b2011-02-09 09:25:47 -0800300
301 def setUp(self):
302 class MockTemporaryFile(object):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500303 """Mock out the temporary file logic."""
David James05bcb2b2011-02-09 09:25:47 -0800304 def __init__(self, name):
305 self.name = name
David James05bcb2b2011-02-09 09:25:47 -0800306 self.pkgindex = SimplePackageIndex()
Brian Harring99718532012-06-10 05:12:14 -0700307 self.mox.StubOutWithMock(binpkg, 'GrabLocalPackageIndex')
Alex Deymo541ea6f2014-12-23 01:18:14 -0800308 binpkg.GrabLocalPackageIndex(self.tempdir).AndReturn(self.pkgindex)
David James05bcb2b2011-02-09 09:25:47 -0800309 self.mox.StubOutWithMock(prebuilt, 'RemoteUpload')
310 self.mox.StubOutWithMock(self.pkgindex, 'ResolveDuplicateUploads')
311 self.pkgindex.ResolveDuplicateUploads([]).AndReturn(PRIVATE_PACKAGES)
312 self.mox.StubOutWithMock(self.pkgindex, 'WriteToNamedTemporaryFile')
Mike Frysinger212e4292014-05-24 15:15:44 -0400313 self.mox.StubOutWithMock(prebuilt, '_GsUpload')
David James05bcb2b2011-02-09 09:25:47 -0800314 fake_pkgs_file = MockTemporaryFile('fake')
315 self.pkgindex.WriteToNamedTemporaryFile().AndReturn(fake_pkgs_file)
316
David James05bcb2b2011-02-09 09:25:47 -0800317 def testSuccessfulGsUpload(self):
Alex Deymo541ea6f2014-12-23 01:18:14 -0800318 uploads = {
319 os.path.join(self.tempdir, 'private.tbz2'): 'gs://foo/private.tbz2'}
David James05bcb2b2011-02-09 09:25:47 -0800320 self.mox.StubOutWithMock(prebuilt, 'GenerateUploadDict')
Alex Deymo541ea6f2014-12-23 01:18:14 -0800321 packages = list(PRIVATE_PACKAGES)
322 packages.append({'CPV': 'dev-only-extras'})
323 osutils.Touch(os.path.join(self.tempdir, 'dev-only-extras.tbz2'), 'w')
324 prebuilt.GenerateUploadDict(self.tempdir, 'gs://foo/suffix',
325 packages).AndReturn(uploads)
David James05bcb2b2011-02-09 09:25:47 -0800326 uploads = uploads.copy()
327 uploads['fake'] = 'gs://foo/suffix/Packages'
David Jamesfd0b0852011-02-23 11:15:36 -0800328 acl = 'public-read'
Mike Frysinger540883b2014-05-24 13:46:16 -0400329 prebuilt.RemoteUpload(mox.IgnoreArg(), acl, uploads)
Mike Frysinger212e4292014-05-24 15:15:44 -0400330 prebuilt._GsUpload(mox.IgnoreArg(), mox.IgnoreArg(),
331 mox.IgnoreArg(), mox.IgnoreArg())
David James05bcb2b2011-02-09 09:25:47 -0800332 self.mox.ReplayAll()
David Jamesc0f158a2011-02-22 16:07:29 -0800333 uri = self.pkgindex.header['URI']
David James8ece7ee2011-06-29 16:02:30 -0700334 uploader = prebuilt.PrebuiltUploader('gs://foo', acl, uri, [], '/', [],
Mike Frysinger8092a632014-05-24 13:25:46 -0400335 False, 'foo', False, 'x86-foo', [], '')
Alex Deymo541ea6f2014-12-23 01:18:14 -0800336 uploader._UploadPrebuilt(self.tempdir, 'suffix')
David James05bcb2b2011-02-09 09:25:47 -0800337
David James05bcb2b2011-02-09 09:25:47 -0800338
Brian Harringc92788f2012-09-21 18:07:15 -0700339class TestSyncPrebuilts(cros_test_lib.MoxTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500340 """Tests for the SyncHostPrebuilts function."""
David James05bcb2b2011-02-09 09:25:47 -0800341
342 def setUp(self):
David James05bcb2b2011-02-09 09:25:47 -0800343 self.mox.StubOutWithMock(prebuilt, 'DeterminePrebuiltConfFile')
David James05bcb2b2011-02-09 09:25:47 -0800344 self.mox.StubOutWithMock(prebuilt, 'RevGitFile')
345 self.mox.StubOutWithMock(prebuilt, 'UpdateBinhostConfFile')
346 self.build_path = '/trunk'
347 self.upload_location = 'gs://upload/'
348 self.version = '1'
349 self.binhost = 'http://prebuilt/'
350 self.key = 'PORTAGE_BINHOST'
David James615e5b52011-06-03 11:10:15 -0700351 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '_UploadPrebuilt')
David James05bcb2b2011-02-09 09:25:47 -0800352
David James05bcb2b2011-02-09 09:25:47 -0800353 def testSyncHostPrebuilts(self):
David Jamese2488642011-11-14 16:15:20 -0800354 board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800355 target = prebuilt.BuildTarget(board, 'aura')
356 slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
David James05bcb2b2011-02-09 09:25:47 -0800357 package_path = os.path.join(self.build_path,
358 prebuilt._HOST_PACKAGES_PATH)
Mike Frysingerd6e2df02014-11-26 02:55:04 -0500359 url_suffix = prebuilt._REL_HOST_PATH % {
360 'version': self.version,
361 'host_arch': prebuilt._HOST_ARCH,
362 'target': target,
363 }
David James8fa34ea2011-04-15 13:00:20 -0700364 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
Mike Frysingerd6e2df02014-11-26 02:55:04 -0500365 prebuilt.PrebuiltUploader._UploadPrebuilt(
366 package_path, packages_url_suffix).AndReturn(True)
David Jamesf0e6fd72011-04-15 15:58:07 -0700367 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
368 packages_url_suffix.rstrip('/'))
David Jamese2488642011-11-14 16:15:20 -0800369 urls = [url_value.replace('foo', 'bar'), url_value]
David James20b2b6f2011-11-18 15:11:58 -0800370 binhost = ' '.join(urls)
Mike Frysinger5b34d732013-01-17 15:11:58 -0500371 prebuilt.RevGitFile(mox.IgnoreArg(), {self.key: binhost}, dryrun=False)
David Jamese2488642011-11-14 16:15:20 -0800372 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, binhost)
David James05bcb2b2011-02-09 09:25:47 -0800373 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.SyncHostPrebuilts(self.key, True, True)
David James05bcb2b2011-02-09 09:25:47 -0800379
380 def testSyncBoardPrebuilts(self):
David Jamese2488642011-11-14 16:15:20 -0800381 board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800382 target = prebuilt.BuildTarget(board, 'aura')
383 slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
Mike Frysinger8092a632014-05-24 13:25:46 -0400384 board_path = os.path.join(
385 self.build_path, prebuilt._BOARD_PATH % {'board': board})
David James05bcb2b2011-02-09 09:25:47 -0800386 package_path = os.path.join(board_path, 'packages')
Mike Frysingerd6e2df02014-11-26 02:55:04 -0500387 url_suffix = prebuilt._REL_BOARD_PATH % {
388 'version': self.version,
389 'target': target,
390 }
David James8fa34ea2011-04-15 13:00:20 -0700391 packages_url_suffix = '%s/packages' % url_suffix.rstrip('/')
David James8fa34ea2011-04-15 13:00:20 -0700392 self.mox.StubOutWithMock(multiprocessing.Process, '__init__')
393 self.mox.StubOutWithMock(multiprocessing.Process, 'exitcode')
394 self.mox.StubOutWithMock(multiprocessing.Process, 'start')
395 self.mox.StubOutWithMock(multiprocessing.Process, 'join')
Mike Frysinger8092a632014-05-24 13:25:46 -0400396 multiprocessing.Process.__init__(
397 target=mox.IgnoreArg(),
398 args=(board_path, url_suffix, None, None, None))
David James8fa34ea2011-04-15 13:00:20 -0700399 multiprocessing.Process.start()
Mike Frysinger8092a632014-05-24 13:25:46 -0400400 prebuilt.PrebuiltUploader._UploadPrebuilt(
401 package_path, packages_url_suffix).AndReturn(True)
David James8fa34ea2011-04-15 13:00:20 -0700402 multiprocessing.Process.join()
403 multiprocessing.Process.exitcode = 0
David Jamesf0e6fd72011-04-15 15:58:07 -0700404 url_value = '%s/%s/' % (self.binhost.rstrip('/'),
405 packages_url_suffix.rstrip('/'))
David Jamese2488642011-11-14 16:15:20 -0800406 bar_binhost = url_value.replace('foo', 'bar')
Mike Frysinger8092a632014-05-24 13:25:46 -0400407 prebuilt.DeterminePrebuiltConfFile(
408 self.build_path, slave_targets[0]).AndReturn('bar')
Mike Frysinger5b34d732013-01-17 15:11:58 -0500409 prebuilt.RevGitFile('bar', {self.key: bar_binhost}, dryrun=False)
David Jamese2488642011-11-14 16:15:20 -0800410 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, bar_binhost)
David James4058b0d2011-12-08 21:24:50 -0800411 prebuilt.DeterminePrebuiltConfFile(self.build_path, target).AndReturn('foo')
Mike Frysinger5b34d732013-01-17 15:11:58 -0500412 prebuilt.RevGitFile('foo', {self.key: url_value}, dryrun=False)
David James05bcb2b2011-02-09 09:25:47 -0800413 prebuilt.UpdateBinhostConfFile(mox.IgnoreArg(), self.key, url_value)
414 self.mox.ReplayAll()
David James615e5b52011-06-03 11:10:15 -0700415 uploader = prebuilt.PrebuiltUploader(
416 self.upload_location, 'public-read', self.binhost, [],
Mike Frysinger8092a632014-05-24 13:25:46 -0400417 self.build_path, [], False, 'foo', False, target, slave_targets,
418 self.version)
419 uploader.SyncBoardPrebuilts(self.key, True, True, True, None, None, None)
David James05bcb2b2011-02-09 09:25:47 -0800420
421
Brian Harringc92788f2012-09-21 18:07:15 -0700422class TestMain(cros_test_lib.MoxTestCase):
Mike Frysingerc6824f62014-02-03 11:09:44 -0500423 """Tests for the main() function."""
David Jamesc0f158a2011-02-22 16:07:29 -0800424
425 def testMain(self):
426 """Test that the main function works."""
427 options = mox.MockObject(object)
David Jamesc0f158a2011-02-22 16:07:29 -0800428 old_binhost = 'http://prebuilt/1'
429 options.previous_binhost_url = [old_binhost]
David Jamese2488642011-11-14 16:15:20 -0800430 options.board = 'x86-foo'
David James4058b0d2011-12-08 21:24:50 -0800431 options.profile = None
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700432 target = prebuilt.BuildTarget(options.board, options.profile)
David Jamesc0f158a2011-02-22 16:07:29 -0800433 options.build_path = '/trunk'
Mike Frysinger86509232014-05-24 13:18:37 -0400434 options.dryrun = False
David Jamesfd0b0852011-02-23 11:15:36 -0800435 options.private = True
David James615e5b52011-06-03 11:10:15 -0700436 options.packages = []
David Jamesc0f158a2011-02-22 16:07:29 -0800437 options.sync_host = True
438 options.git_sync = True
David James8fa34ea2011-04-15 13:00:20 -0700439 options.upload_board_tarball = True
Zdenek Behan62a57792012-08-31 15:09:08 +0200440 options.prepackaged_tarball = None
Mike Frysinger9e979b92012-11-29 02:55:09 -0500441 options.toolchain_tarballs = []
442 options.toolchain_upload_path = ''
David Jamesc0f158a2011-02-22 16:07:29 -0800443 options.upload = 'gs://upload/'
David Jamesfd0b0852011-02-23 11:15:36 -0800444 options.binhost_base_url = options.upload
David Jamesc0f158a2011-02-22 16:07:29 -0800445 options.prepend_version = True
David James8ece7ee2011-06-29 16:02:30 -0700446 options.set_version = None
447 options.skip_upload = False
David Jamesc0f158a2011-02-22 16:07:29 -0800448 options.filters = True
449 options.key = 'PORTAGE_BINHOST'
David Jamesb26b9312014-12-15 11:26:46 -0800450 options.binhost_conf_dir = None
David Jamesc0f158a2011-02-22 16:07:29 -0800451 options.sync_binhost_conf = True
David James4058b0d2011-12-08 21:24:50 -0800452 options.slave_targets = [prebuilt.BuildTarget('x86-bar', 'aura')]
David Jamesc0f158a2011-02-22 16:07:29 -0800453 self.mox.StubOutWithMock(prebuilt, 'ParseOptions')
Mike Frysinger86509232014-05-24 13:18:37 -0400454 prebuilt.ParseOptions([]).AndReturn(tuple([options, target]))
Brian Harring99718532012-06-10 05:12:14 -0700455 self.mox.StubOutWithMock(binpkg, 'GrabRemotePackageIndex')
456 binpkg.GrabRemotePackageIndex(old_binhost).AndReturn(True)
David Jamesfd0b0852011-02-23 11:15:36 -0800457 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, '__init__')
Prathmesh Prabhu421eef22014-10-16 17:13:19 -0700458 self.mox.StubOutWithMock(portage_util, 'FindOverlayFile')
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700459 fake_overlay_path = '/fake_path'
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700460 expected_gs_acl_path = os.path.join(fake_overlay_path,
Prathmesh Prabhu5f14da02014-10-17 15:13:56 -0700461 prebuilt._GOOGLESTORAGE_GSUTIL_FILE)
Prathmesh Prabhu421eef22014-10-16 17:13:19 -0700462 portage_util.FindOverlayFile(
463 prebuilt._GOOGLESTORAGE_GSUTIL_FILE, board=options.board,
464 buildroot=options.build_path).AndReturn(expected_gs_acl_path)
Scott Zawalskiab1bed32011-03-16 15:24:24 -0700465 prebuilt.PrebuiltUploader.__init__(options.upload, expected_gs_acl_path,
David James615e5b52011-06-03 11:10:15 -0700466 options.upload, mox.IgnoreArg(),
David James8ece7ee2011-06-29 16:02:30 -0700467 options.build_path, options.packages,
David Jamesb26b9312014-12-15 11:26:46 -0800468 False, None, False,
Mike Frysinger8092a632014-05-24 13:25:46 -0400469 target, options.slave_targets,
470 mox.IgnoreArg())
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700471 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, 'SyncHostPrebuilts')
Mike Frysinger8092a632014-05-24 13:25:46 -0400472 prebuilt.PrebuiltUploader.SyncHostPrebuilts(
473 options.key, options.git_sync, options.sync_binhost_conf)
Chris Sosa6a5dceb2012-05-14 13:48:56 -0700474 self.mox.StubOutWithMock(prebuilt.PrebuiltUploader, 'SyncBoardPrebuilts')
475 prebuilt.PrebuiltUploader.SyncBoardPrebuilts(
Mike Frysinger8092a632014-05-24 13:25:46 -0400476 options.key, options.git_sync,
Mike Frysinger9e979b92012-11-29 02:55:09 -0500477 options.sync_binhost_conf, options.upload_board_tarball, None, [], '')
David Jamesc0f158a2011-02-22 16:07:29 -0800478 self.mox.ReplayAll()
David Jamesc5cbd472012-06-19 16:25:45 -0700479 prebuilt.main([])
David Jamesc0f158a2011-02-22 16:07:29 -0800480
Mike Frysinger9e979b92012-11-29 02:55:09 -0500481
Mike Frysinger68182472014-11-05 22:38:39 -0500482class TestSdk(cros_test_lib.MockTestCase):
Mike Frysinger9e979b92012-11-29 02:55:09 -0500483 """Test logic related to uploading SDK binaries"""
484
485 def setUp(self):
Mike Frysinger68182472014-11-05 22:38:39 -0500486 self.PatchObject(prebuilt, '_GsUpload',
487 side_effect=Exception('should not get called'))
488 self.PatchObject(prebuilt, 'UpdateBinhostConfFile',
489 side_effect=Exception('should not get called'))
490 self.upload_mock = self.PatchObject(prebuilt.PrebuiltUploader, '_Upload')
Mike Frysinger9e979b92012-11-29 02:55:09 -0500491
492 self.acl = 'magic-acl'
493
494 # All these args pretty much get ignored. Whee.
495 self.uploader = prebuilt.PrebuiltUploader(
496 'gs://foo', self.acl, 'prebuilt', [], '/', [],
Mike Frysinger8092a632014-05-24 13:25:46 -0400497 False, 'foo', False, 'x86-foo', [], 'chroot-1234')
Mike Frysinger9e979b92012-11-29 02:55:09 -0500498
Mike Frysinger68182472014-11-05 22:38:39 -0500499 def testSdkUpload(self, tc_tarballs=(), tc_upload_path=None):
Mike Frysinger9e979b92012-11-29 02:55:09 -0500500 """Make sure we can upload just an SDK tarball"""
501 tar = 'sdk.tar.xz'
502 ver = '1234'
503 vtar = 'cros-sdk-%s.tar.xz' % ver
504
Mike Frysinger68182472014-11-05 22:38:39 -0500505 calls = [
506 mock.call('%s.Manifest' % tar,
507 'gs://chromiumos-sdk/%s.Manifest' % vtar),
508 mock.call(tar, 'gs://chromiumos-sdk/%s' % vtar),
509 ]
510 for tc in tc_tarballs:
511 tc = tc.split(':')
512 calls.append(mock.call(
513 tc[1], ('gs://chromiumos-sdk/' + tc_upload_path) % {'target': tc[0]}))
514 calls.append(mock.call(
515 mock.ANY, 'gs://chromiumos-sdk/cros-sdk-latest.conf'))
Mike Frysinger9e979b92012-11-29 02:55:09 -0500516
Mike Frysinger8092a632014-05-24 13:25:46 -0400517 self.uploader._UploadSdkTarball('amd64-host', '',
Mike Frysinger9e979b92012-11-29 02:55:09 -0500518 tar, tc_tarballs, tc_upload_path)
Mike Frysinger68182472014-11-05 22:38:39 -0500519 self.upload_mock.assert_has_calls(calls)
Mike Frysinger9e979b92012-11-29 02:55:09 -0500520
521 def testTarballUpload(self):
522 """Make sure processing of toolchain tarballs works"""
523 tc_tarballs = (
524 'i686:/some/i686.tar.xz',
525 'arm-none:/some/arm.tar.xz',
526 )
527 tc_upload_path = '1994/04/%(target)s-1994.04.02.tar.xz'
Mike Frysinger68182472014-11-05 22:38:39 -0500528 self.testSdkUpload(tc_tarballs, tc_upload_path)
Mike Frysinger9e979b92012-11-29 02:55:09 -0500529
530
David James8c846492011-01-25 17:07:29 -0800531if __name__ == '__main__':
Brian Harringc92788f2012-09-21 18:07:15 -0700532 cros_test_lib.main()