blob: d7ef9f27ef59c93e36223d841b62e52526ece1db [file] [log] [blame]
Alex Kleineb77ffa2019-05-28 14:47:44 -06001# -*- coding: utf-8 -*-
2# Copyright 2019 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
6"""Packages service tests."""
7
8from __future__ import print_function
9
Andrew Lamb2bde9e42019-11-04 13:24:09 -070010import json
11import os
Michael Mortensen009cb662019-10-21 11:38:43 -060012import re
13
Andrew Lamb2bde9e42019-11-04 13:24:09 -070014from google.protobuf import json_format
15from google.protobuf.field_mask_pb2 import FieldMask
16
17from chromite.api.gen.config.replication_config_pb2 import (
18 ReplicationConfig, FileReplicationRule, FILE_TYPE_JSON,
19 REPLICATION_TYPE_FILTER
20)
Michael Mortensen009cb662019-10-21 11:38:43 -060021from chromite.cbuildbot import manifest_version
Alex Klein2960c752020-03-09 13:43:38 -060022from chromite.lib import build_target_lib
Andrew Lamb2bde9e42019-11-04 13:24:09 -070023from chromite.lib import constants
Michael Mortensene0f4b542019-10-24 15:30:23 -060024from chromite.lib import cros_build_lib
Alex Kleineb77ffa2019-05-28 14:47:44 -060025from chromite.lib import cros_test_lib
Michael Mortensenb70e8a82019-10-10 18:43:41 -060026from chromite.lib import osutils
Mike Frysinger88d96362020-02-14 19:05:45 -050027from chromite.lib import partial_mock
Alex Klein87531182019-08-12 15:23:37 -060028from chromite.lib import portage_util
29from chromite.lib.chroot_lib import Chroot
Andrew Lamb2bde9e42019-11-04 13:24:09 -070030from chromite.lib.uprev_lib import GitRef
Alex Kleineb77ffa2019-05-28 14:47:44 -060031from chromite.service import packages
32
Mike Frysingerbafb3182020-02-21 03:15:43 -050033
Andrew Lamb2bde9e42019-11-04 13:24:09 -070034D = cros_test_lib.Directory
35
Alex Kleineb77ffa2019-05-28 14:47:44 -060036
Alex Klein4de25e82019-08-05 15:58:39 -060037class UprevAndroidTest(cros_test_lib.RunCommandTestCase):
38 """Uprev android tests."""
39
40 def test_success(self):
41 """Test successful run handling."""
Mike Frysinger88d96362020-02-14 19:05:45 -050042 self.rc.AddCmdResult(partial_mock.In('cros_mark_android_as_stable'),
43 stdout='ANDROID_ATOM=android/android-1.0\n')
Alex Klein2960c752020-03-09 13:43:38 -060044 build_targets = [build_target_lib.BuildTarget(t) for t in ['foo', 'bar']]
Alex Klein4de25e82019-08-05 15:58:39 -060045
46 packages.uprev_android('refs/tracking-branch', 'android/package',
47 'refs/android-build-branch', Chroot(),
48 build_targets=build_targets)
49 self.assertCommandContains(['cros_mark_android_as_stable',
50 '--boards=foo:bar'])
51 self.assertCommandContains(['emerge-foo'])
52 self.assertCommandContains(['emerge-bar'])
53
54 def test_no_uprev(self):
55 """Test no uprev handling."""
Mike Frysinger88d96362020-02-14 19:05:45 -050056 self.rc.AddCmdResult(partial_mock.In('cros_mark_android_as_stable'),
57 stdout='')
Alex Klein2960c752020-03-09 13:43:38 -060058 build_targets = [build_target_lib.BuildTarget(t) for t in ['foo', 'bar']]
Alex Klein4de25e82019-08-05 15:58:39 -060059 packages.uprev_android('refs/tracking-branch', 'android/package',
60 'refs/android-build-branch', Chroot(),
61 build_targets=build_targets)
62
63 self.assertCommandContains(['cros_mark_android_as_stable',
64 '--boards=foo:bar'])
65 self.assertCommandContains(['emerge-foo'], expected=False)
66 self.assertCommandContains(['emerge-bar'], expected=False)
67
68
Alex Kleineb77ffa2019-05-28 14:47:44 -060069class UprevBuildTargetsTest(cros_test_lib.RunCommandTestCase):
70 """uprev_build_targets tests."""
71
72 def test_invalid_type_fails(self):
73 """Test invalid type fails."""
74 with self.assertRaises(AssertionError):
Alex Klein2960c752020-03-09 13:43:38 -060075 packages.uprev_build_targets([build_target_lib.BuildTarget('foo')],
Alex Kleineb77ffa2019-05-28 14:47:44 -060076 'invalid')
77
78 def test_none_type_fails(self):
79 """Test None type fails."""
80 with self.assertRaises(AssertionError):
Alex Klein2960c752020-03-09 13:43:38 -060081 packages.uprev_build_targets([build_target_lib.BuildTarget('foo')],
Alex Kleineb77ffa2019-05-28 14:47:44 -060082 None)
83
84
Alex Klein87531182019-08-12 15:23:37 -060085class UprevsVersionedPackageTest(cros_test_lib.MockTestCase):
86 """uprevs_versioned_package decorator test."""
87
88 @packages.uprevs_versioned_package('category/package')
89 def uprev_category_package(self, *args, **kwargs):
90 """Registered function for testing."""
91
92 def test_calls_function(self):
93 """Test calling a registered function."""
94 patch = self.PatchObject(self, 'uprev_category_package')
95
96 cpv = portage_util.SplitCPV('category/package', strict=False)
97 packages.uprev_versioned_package(cpv, [], [], Chroot())
98
Chris McDonald3c689d32020-03-26 17:20:23 -060099 # TODO(crbug/1065172): Invalid assertion that had previously been mocked.
100 # patch.assert_called()
Alex Klein87531182019-08-12 15:23:37 -0600101
102 def test_unregistered_package(self):
103 """Test calling with an unregistered package."""
104 cpv = portage_util.SplitCPV('does-not/exist', strict=False)
105
106 with self.assertRaises(packages.UnknownPackageError):
107 packages.uprev_versioned_package(cpv, [], [], Chroot())
108
109
Trent Begin6daa8702020-01-29 14:58:12 -0700110class UprevEbuildFromPinTest(cros_test_lib.RunCommandTempDirTestCase):
Trent Begin315d9d92019-12-03 21:55:53 -0700111 """Tests uprev_ebuild_from_pin function"""
112
113 package = 'category/package'
114 version = '1.2.3'
115 new_version = '1.2.4'
116 ebuild_template = 'package-%s-r1.ebuild'
117 ebuild = ebuild_template % version
118 version_pin = 'VERSION-PIN'
Trent Begin6daa8702020-01-29 14:58:12 -0700119 manifest = 'Manifest'
Trent Begin315d9d92019-12-03 21:55:53 -0700120
121 def test_uprev_ebuild(self):
122 """Tests uprev of ebuild with version path"""
123 file_layout = (
Trent Begin6daa8702020-01-29 14:58:12 -0700124 D(self.package, [self.ebuild, self.version_pin, self.manifest]),
Trent Begin315d9d92019-12-03 21:55:53 -0700125 )
126 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
127
128 package_path = os.path.join(self.tempdir, self.package)
129 version_pin_path = os.path.join(package_path, self.version_pin)
130 self.WriteTempFile(version_pin_path, self.new_version)
131
Trent Begin6daa8702020-01-29 14:58:12 -0700132 result = packages.uprev_ebuild_from_pin(package_path, version_pin_path,
133 chroot=Chroot())
Trent Begin315d9d92019-12-03 21:55:53 -0700134 self.assertEqual(len(result.modified), 1,
135 'unexpected number of results: %s' % len(result.modified))
136
137 mod = result.modified[0]
138 self.assertEqual(mod.new_version, self.new_version,
139 'unexpected version number: %s' % mod.new_version)
Trent Begin315d9d92019-12-03 21:55:53 -0700140
David Burger15d104b2020-01-21 21:03:13 -0700141 old_ebuild_path = os.path.join(package_path,
142 self.ebuild_template % self.version)
Trent Begin315d9d92019-12-03 21:55:53 -0700143 new_ebuild_path = os.path.join(package_path,
144 self.ebuild_template % self.new_version)
Trent Begin4a11a632020-02-28 12:59:58 -0700145 manifest_path = os.path.join(package_path, 'Manifest')
Trent Begin2e5344f2020-03-02 10:46:55 -0700146
147 expected_modified_files = [old_ebuild_path, new_ebuild_path, manifest_path]
148 self.assertCountEqual(mod.files, expected_modified_files)
Trent Begin4a11a632020-02-28 12:59:58 -0700149
Trent Beginec16cf32020-02-24 11:26:02 -0700150 self.assertCommandContains(['ebuild', 'manifest'])
Trent Begin6daa8702020-01-29 14:58:12 -0700151
Trent Begin315d9d92019-12-03 21:55:53 -0700152 def test_no_ebuild(self):
153 """Tests assertion is raised if package has no ebuilds"""
154 file_layout = (
Trent Begin6daa8702020-01-29 14:58:12 -0700155 D(self.package, [self.version_pin, self.manifest]),
Trent Begin315d9d92019-12-03 21:55:53 -0700156 )
157 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
158
159 package_path = os.path.join(self.tempdir, self.package)
160 version_pin_path = os.path.join(package_path, self.version_pin)
161 self.WriteTempFile(version_pin_path, self.new_version)
162
163 with self.assertRaises(packages.UprevError):
Trent Begin6daa8702020-01-29 14:58:12 -0700164 packages.uprev_ebuild_from_pin(package_path, version_pin_path,
165 chroot=Chroot())
Trent Begin315d9d92019-12-03 21:55:53 -0700166
167 def test_multiple_ebuilds(self):
168 """Tests assertion is raised if multiple ebuilds are present for package"""
169 file_layout = (
170 D(self.package, [self.version_pin, self.ebuild,
Trent Begin6daa8702020-01-29 14:58:12 -0700171 self.ebuild_template % '1.2.1',
172 self.manifest]),
Trent Begin315d9d92019-12-03 21:55:53 -0700173 )
174 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
175
176 package_path = os.path.join(self.tempdir, self.package)
177 version_pin_path = os.path.join(package_path, self.version_pin)
178 self.WriteTempFile(version_pin_path, self.new_version)
179
180 with self.assertRaises(packages.UprevError):
Trent Begin6daa8702020-01-29 14:58:12 -0700181 packages.uprev_ebuild_from_pin(package_path, version_pin_path,
182 chroot=Chroot())
Trent Begin315d9d92019-12-03 21:55:53 -0700183
184
Andrew Lamb9563a152019-12-04 11:42:18 -0700185class ReplicatePrivateConfigTest(cros_test_lib.RunCommandTempDirTestCase):
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700186 """replicate_private_config tests."""
187
188 def setUp(self):
189 # Set up fake public and private chromeos-config overlays.
190 private_package_root = (
Andrew Lambe836f222019-12-09 12:27:38 -0700191 'src/private-overlays/overlay-coral-private/chromeos-base/'
Andrew Lambea9a8a22019-12-12 14:03:43 -0700192 'chromeos-config-bsp'
193 )
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700194 self.public_package_root = (
Andrew Lambea9a8a22019-12-12 14:03:43 -0700195 'src/overlays/overlay-coral/chromeos-base/chromeos-config-bsp')
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700196 file_layout = (
197 D(os.path.join(private_package_root, 'files'), ['build_config.json']),
198 D(private_package_root, ['replication_config.jsonpb']),
199 D(
200 os.path.join(self.public_package_root, 'files'),
201 ['build_config.json']),
202 )
203
204 cros_test_lib.CreateOnDiskHierarchy(self.tempdir, file_layout)
205
206 # Private config contains 'a' and 'b' fields.
Andrew Lamb9563a152019-12-04 11:42:18 -0700207 self.private_config_path = os.path.join(private_package_root, 'files',
208 'build_config.json')
Andrew Lambca1f35b2019-12-04 09:37:11 -0700209 self.WriteTempFile(
Andrew Lamb9563a152019-12-04 11:42:18 -0700210 self.private_config_path,
Andrew Lambca1f35b2019-12-04 09:37:11 -0700211 json.dumps({'chromeos': {
212 'configs': [{
213 'a': 3,
214 'b': 2
215 }]
216 }}))
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700217
218 # Public config only contains the 'a' field. Note that the value of 'a' is
219 # 1 in the public config; it will get updated to 3 when the private config
220 # is replicated.
Andrew Lambca1f35b2019-12-04 09:37:11 -0700221 self.public_config_path = os.path.join(self.public_package_root, 'files',
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700222 'build_config.json')
Andrew Lambca1f35b2019-12-04 09:37:11 -0700223 self.WriteTempFile(self.public_config_path,
224 json.dumps({'chromeos': {
225 'configs': [{
226 'a': 1
227 }]
228 }}))
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700229
230 # Put a ReplicationConfig JSONPB in the private package. Note that it
231 # specifies only the 'a' field is replicated.
232 self.replication_config_path = os.path.join(self.tempdir,
233 private_package_root,
234 'replication_config.jsonpb')
235 replication_config = ReplicationConfig(file_replication_rules=[
236 FileReplicationRule(
Andrew Lamb9563a152019-12-04 11:42:18 -0700237 source_path=self.private_config_path,
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700238 destination_path=self.public_config_path,
239 file_type=FILE_TYPE_JSON,
240 replication_type=REPLICATION_TYPE_FILTER,
241 destination_fields=FieldMask(paths=['a']))
242 ])
243
244 osutils.WriteFile(self.replication_config_path,
245 json_format.MessageToJson(replication_config))
246 self.PatchObject(constants, 'SOURCE_ROOT', new=self.tempdir)
247
Andrew Lamb9563a152019-12-04 11:42:18 -0700248 self.rc.SetDefaultCmdResult(side_effect=self._write_generated_c_files)
249
250 def _write_generated_c_files(self, *_args, **_kwargs):
251 """Write fake generated C files to the public output dir.
252
253 Note that this function accepts args and kwargs so it can be used as a side
254 effect.
255 """
256 output_dir = os.path.join(self.public_package_root, 'files')
257 self.WriteTempFile(os.path.join(output_dir, 'config.c'), '')
258 self.WriteTempFile(os.path.join(output_dir, 'ec_config.c'), '')
259 self.WriteTempFile(os.path.join(output_dir, 'ec_config.h'), '')
260
261 def _write_incorrect_generated_c_files(self, *_args, **_kwargs):
262 """Similar to _write_generated_c_files, with an expected file missing.
263
264 Note that this function accepts args and kwargs so it can be used as a side
265 effect.
266 """
267 output_dir = os.path.join(self.public_package_root, 'files')
268 self.WriteTempFile(os.path.join(output_dir, 'config.c'), '')
269 self.WriteTempFile(os.path.join(output_dir, 'ec_config.c'), '')
270
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700271 def test_replicate_private_config(self):
272 """Basic replication test."""
Andrew Lambe836f222019-12-09 12:27:38 -0700273 refs = [
274 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700275 path='/chromeos/overlays/overlay-coral-private',
Andrew Lambe836f222019-12-09 12:27:38 -0700276 ref='master',
277 revision='123')
278 ]
Andrew Lamb9563a152019-12-04 11:42:18 -0700279 chroot = Chroot()
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700280 result = packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700281 _build_targets=None, refs=refs, chroot=chroot)
Andrew Lamb9563a152019-12-04 11:42:18 -0700282
283 self.assertCommandContains([
284 'cros_config_schema', '-m',
285 os.path.join(constants.CHROOT_SOURCE_ROOT, self.public_config_path),
286 '-g',
287 os.path.join(constants.CHROOT_SOURCE_ROOT, self.public_package_root,
288 'files'), '-f', '"TRUE"'
289 ],
290 enter_chroot=True,
291 chroot_args=chroot.get_enter_args())
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700292
293 self.assertEqual(len(result.modified), 1)
Andrew Lamb9563a152019-12-04 11:42:18 -0700294 # The public build_config.json and generated C files were modified.
295 expected_modified_files = [
Andrew Lamb988f4da2019-12-10 10:16:43 -0700296 os.path.join(self.tempdir, self.public_config_path),
297 os.path.join(self.tempdir, self.public_package_root, 'files',
298 'config.c'),
299 os.path.join(self.tempdir, self.public_package_root, 'files',
300 'ec_config.c'),
301 os.path.join(self.tempdir, self.public_package_root, 'files',
302 'ec_config.h'),
Andrew Lamb9563a152019-12-04 11:42:18 -0700303 ]
304 self.assertEqual(result.modified[0].files, expected_modified_files)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700305 self.assertEqual(result.modified[0].new_version, '123')
306
307 # The update from the private build_config.json was copied to the public.
308 # Note that only the 'a' field is present, as per destination_fields.
Andrew Lambca1f35b2019-12-04 09:37:11 -0700309 self.assertEqual(
310 json.loads(self.ReadTempFile(self.public_config_path)),
311 {'chromeos': {
312 'configs': [{
313 'a': 3
314 }]
315 }})
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700316
Andrew Lamb9563a152019-12-04 11:42:18 -0700317 def test_replicate_private_config_no_build_config(self):
318 """If there is no build config, don't generate C files."""
319 # Modify the replication config to write to "other_config.json" instead of
320 # "build_config.json"
321 modified_destination_path = self.public_config_path.replace(
322 'build_config', 'other_config')
323 replication_config = ReplicationConfig(file_replication_rules=[
324 FileReplicationRule(
325 source_path=self.private_config_path,
326 destination_path=modified_destination_path,
327 file_type=FILE_TYPE_JSON,
328 replication_type=REPLICATION_TYPE_FILTER,
329 destination_fields=FieldMask(paths=['a']))
330 ])
331 osutils.WriteFile(self.replication_config_path,
332 json_format.MessageToJson(replication_config))
333
Andrew Lambe836f222019-12-09 12:27:38 -0700334 refs = [
335 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700336 path='/chromeos/overlays/overlay-coral-private',
Andrew Lambe836f222019-12-09 12:27:38 -0700337 ref='master',
338 revision='123')
339 ]
Andrew Lamb9563a152019-12-04 11:42:18 -0700340 result = packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700341 _build_targets=None, refs=refs, chroot=Chroot())
Andrew Lamb9563a152019-12-04 11:42:18 -0700342
343 self.assertEqual(len(result.modified), 1)
Andrew Lamb988f4da2019-12-10 10:16:43 -0700344 self.assertEqual(result.modified[0].files,
345 [os.path.join(self.tempdir, modified_destination_path)])
Andrew Lamb9563a152019-12-04 11:42:18 -0700346
347 def test_replicate_private_config_multiple_build_configs(self):
348 """An error is thrown if there is more than one build config."""
349 replication_config = ReplicationConfig(file_replication_rules=[
350 FileReplicationRule(
351 source_path=self.private_config_path,
352 destination_path=self.public_config_path,
353 file_type=FILE_TYPE_JSON,
354 replication_type=REPLICATION_TYPE_FILTER,
355 destination_fields=FieldMask(paths=['a'])),
356 FileReplicationRule(
357 source_path=self.private_config_path,
358 destination_path=self.public_config_path,
359 file_type=FILE_TYPE_JSON,
360 replication_type=REPLICATION_TYPE_FILTER,
361 destination_fields=FieldMask(paths=['a']))
362 ])
363
364 osutils.WriteFile(self.replication_config_path,
365 json_format.MessageToJson(replication_config))
366
Andrew Lambe836f222019-12-09 12:27:38 -0700367 refs = [
368 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700369 path='/chromeos/overlays/overlay-coral-private',
Andrew Lambe836f222019-12-09 12:27:38 -0700370 ref='master',
371 revision='123')
372 ]
Andrew Lamb9563a152019-12-04 11:42:18 -0700373 with self.assertRaisesRegex(
374 ValueError, 'Expected at most one build_config.json destination path.'):
375 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700376 _build_targets=None, refs=refs, chroot=Chroot())
Andrew Lamb9563a152019-12-04 11:42:18 -0700377
378 def test_replicate_private_config_generated_files_incorrect(self):
379 """An error is thrown if generated C files are missing."""
380 self.rc.SetDefaultCmdResult(
381 side_effect=self._write_incorrect_generated_c_files)
382
Andrew Lambe836f222019-12-09 12:27:38 -0700383 refs = [
384 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700385 path='/chromeos/overlays/overlay-coral-private',
Andrew Lambe836f222019-12-09 12:27:38 -0700386 ref='master',
387 revision='123')
388 ]
Andrew Lamb9563a152019-12-04 11:42:18 -0700389 chroot = Chroot()
390
391 with self.assertRaisesRegex(packages.GeneratedCrosConfigFilesError,
392 'Expected to find generated C files'):
393 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700394 _build_targets=None, refs=refs, chroot=chroot)
Andrew Lamb9563a152019-12-04 11:42:18 -0700395
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700396 def test_replicate_private_config_wrong_number_of_refs(self):
397 """An error is thrown if there is not exactly one ref."""
398 with self.assertRaisesRegex(ValueError, 'Expected exactly one ref'):
399 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700400 _build_targets=None, refs=[], chroot=None)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700401
402 with self.assertRaisesRegex(ValueError, 'Expected exactly one ref'):
403 refs = [
404 GitRef(path='a', ref='master', revision='1'),
405 GitRef(path='a', ref='master', revision='2')
406 ]
407 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700408 _build_targets=None, refs=refs, chroot=None)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700409
410 def test_replicate_private_config_replication_config_missing(self):
411 """An error is thrown if there is not a replication config."""
412 os.remove(self.replication_config_path)
413 with self.assertRaisesRegex(
414 ValueError, 'Expected ReplicationConfig missing at %s' %
415 self.replication_config_path):
416 refs = [
Andrew Lambe836f222019-12-09 12:27:38 -0700417 GitRef(
Andrew Lamb4aa09912020-01-08 13:55:56 -0700418 path='/chromeos/overlays/overlay-coral-private',
Andrew Lambe836f222019-12-09 12:27:38 -0700419 ref='master',
420 revision='123')
421 ]
422 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700423 _build_targets=None, refs=refs, chroot=None)
Andrew Lambe836f222019-12-09 12:27:38 -0700424
425 def test_replicate_private_config_wrong_git_ref_path(self):
426 """An error is thrown if the git ref doesn't point to a private overlay."""
427 with self.assertRaisesRegex(ValueError, 'ref.path must match the pattern'):
Andrew Lambea9a8a22019-12-12 14:03:43 -0700428 refs = [
429 GitRef(
430 path='a/b/c',
431 ref='master',
432 revision='123')
433 ]
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700434 packages.replicate_private_config(
Andrew Lambea9a8a22019-12-12 14:03:43 -0700435 _build_targets=None, refs=refs, chroot=None)
Andrew Lamb2bde9e42019-11-04 13:24:09 -0700436
437
Alex Kleinda39c6d2019-09-16 14:36:36 -0600438class GetBestVisibleTest(cros_test_lib.TestCase):
David Burger1e0fe232019-07-01 14:52:07 -0600439 """get_best_visible tests."""
440
441 def test_empty_atom_fails(self):
442 with self.assertRaises(AssertionError):
443 packages.get_best_visible('')
Alex Kleinda39c6d2019-09-16 14:36:36 -0600444
445
Alex Klein149fd3b2019-12-16 16:01:05 -0700446class HasPrebuiltTest(cros_test_lib.MockTestCase):
Alex Kleinda39c6d2019-09-16 14:36:36 -0600447 """has_prebuilt tests."""
448
449 def test_empty_atom_fails(self):
Alex Klein149fd3b2019-12-16 16:01:05 -0700450 """Test an empty atom results in an error."""
Alex Kleinda39c6d2019-09-16 14:36:36 -0600451 with self.assertRaises(AssertionError):
452 packages.has_prebuilt('')
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600453
Alex Klein149fd3b2019-12-16 16:01:05 -0700454 def test_use_flags(self):
455 """Test use flags get propagated correctly."""
456 # We don't really care about the result, just the env handling.
457 patch = self.PatchObject(portage_util, 'HasPrebuilt', return_value=True)
458
459 packages.has_prebuilt('cat/pkg-1.2.3', useflags='useflag')
460 patch.assert_called_with('cat/pkg-1.2.3', board=None,
461 extra_env={'USE': 'useflag'})
462
463 def test_env_use_flags(self):
464 """Test env use flags get propagated correctly with passed useflags."""
465 # We don't really care about the result, just the env handling.
466 patch = self.PatchObject(portage_util, 'HasPrebuilt', return_value=True)
467 # Add some flags to the environment.
468 existing_flags = 'already set flags'
469 self.PatchObject(os.environ, 'get', return_value=existing_flags)
470
471 new_flags = 'useflag'
472 packages.has_prebuilt('cat/pkg-1.2.3', useflags=new_flags)
473 expected = '%s %s' % (existing_flags, new_flags)
474 patch.assert_called_with('cat/pkg-1.2.3', board=None,
475 extra_env={'USE': expected})
476
477
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600478
479class AndroidVersionsTest(cros_test_lib.MockTestCase):
480 """Tests getting android versions."""
Michael Mortensen14960d02019-10-18 07:53:59 -0600481
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600482 def setUp(self):
483 package_result = [
484 'chromeos-base/android-container-nyc-4717008-r1',
485 'chromeos-base/update_engine-0.0.3-r3408']
486 self.PatchObject(portage_util, 'GetPackageDependencies',
487 return_value=package_result)
488 self.board = 'board'
489 self.PatchObject(portage_util, 'FindEbuildForBoardPackage',
490 return_value='chromeos-base/android-container-nyc')
491 FakeEnvironment = {
492 'ARM_TARGET': '3-linux-target'
493 }
494 self.PatchObject(osutils, 'SourceEnvironment',
495 return_value=FakeEnvironment)
496
497 def test_determine_android_version(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600498 """Tests that a valid android version is returned."""
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600499 version = packages.determine_android_version(self.board)
500 self.assertEqual(version, '4717008')
501
Michael Mortensenedf76532019-10-16 14:22:37 -0600502 def test_determine_android_version_when_not_present(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600503 """Tests that a None is returned for version when android is not present."""
Michael Mortensenedf76532019-10-16 14:22:37 -0600504 package_result = ['chromeos-base/update_engine-0.0.3-r3408']
505 self.PatchObject(portage_util, 'GetPackageDependencies',
506 return_value=package_result)
507 version = packages.determine_android_version(self.board)
508 self.assertEqual(version, None)
509
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600510 def test_determine_android_branch(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600511 """Tests that a valid android branch is returned."""
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600512 branch = packages.determine_android_branch(self.board)
513 self.assertEqual(branch, '3')
514
Michael Mortensenedf76532019-10-16 14:22:37 -0600515 def test_determine_android_branch_when_not_present(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600516 """Tests that a None is returned for branch when android is not present."""
Michael Mortensenedf76532019-10-16 14:22:37 -0600517 package_result = ['chromeos-base/update_engine-0.0.3-r3408']
518 self.PatchObject(portage_util, 'GetPackageDependencies',
519 return_value=package_result)
520 branch = packages.determine_android_branch(self.board)
521 self.assertEqual(branch, None)
522
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600523 def test_determine_android_target(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600524 """Tests that a valid android target is returned."""
Michael Mortensenb70e8a82019-10-10 18:43:41 -0600525 target = packages.determine_android_target(self.board)
526 self.assertEqual(target, 'cheets')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600527
Michael Mortensenedf76532019-10-16 14:22:37 -0600528 def test_determine_android_target_when_not_present(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600529 """Tests that a None is returned for target when android is not present."""
Michael Mortensenedf76532019-10-16 14:22:37 -0600530 package_result = ['chromeos-base/update_engine-0.0.3-r3408']
531 self.PatchObject(portage_util, 'GetPackageDependencies',
532 return_value=package_result)
533 target = packages.determine_android_target(self.board)
534 self.assertEqual(target, None)
535
Michael Mortensene0f4b542019-10-24 15:30:23 -0600536 def test_determine_android_version_handle_exception(self):
537 """Tests handling RunCommandError inside determine_android_version."""
538 # Mock what happens when portage returns that bubbles up (via RunCommand)
539 # inside portage_util.GetPackageDependencies.
540 self.PatchObject(portage_util, 'GetPackageDependencies',
541 side_effect=cros_build_lib.RunCommandError('error'))
542 target = packages.determine_android_version(self.board)
543 self.assertEqual(target, None)
544
545 def test_determine_android_package_handle_exception(self):
546 """Tests handling RunCommandError inside determine_android_package."""
547 # Mock what happens when portage returns that bubbles up (via RunCommand)
548 # inside portage_util.GetPackageDependencies.
549 self.PatchObject(portage_util, 'GetPackageDependencies',
550 side_effect=cros_build_lib.RunCommandError('error'))
551 target = packages.determine_android_package(self.board)
552 self.assertEqual(target, None)
553
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600554 def test_determine_android_package_callers_handle_exception(self):
555 """Tests handling RunCommandError by determine_android_package callers."""
556 # Mock what happens when portage returns that bubbles up (via RunCommand)
557 # inside portage_util.GetPackageDependencies.
558 self.PatchObject(portage_util, 'GetPackageDependencies',
559 side_effect=cros_build_lib.RunCommandError('error'))
560 # Verify that target is None, as expected.
561 target = packages.determine_android_package(self.board)
562 self.assertEqual(target, None)
563 # determine_android_branch calls determine_android_package
564 branch = packages.determine_android_branch(self.board)
565 self.assertEqual(branch, None)
566 # determine_android_target calls determine_android_package
567 target = packages.determine_android_target(self.board)
568 self.assertEqual(target, None)
569
Michael Mortensene0f4b542019-10-24 15:30:23 -0600570
Michael Mortensenc2615b72019-10-15 08:12:24 -0600571class ChromeVersionsTest(cros_test_lib.MockTestCase):
572 """Tests getting chrome version."""
Michael Mortensen14960d02019-10-18 07:53:59 -0600573
Michael Mortensenc2615b72019-10-15 08:12:24 -0600574 def setUp(self):
Alex Klein2960c752020-03-09 13:43:38 -0600575 self.build_target = build_target_lib.BuildTarget('board')
Michael Mortensenc2615b72019-10-15 08:12:24 -0600576
577 def test_determine_chrome_version(self):
Michael Mortensen14960d02019-10-18 07:53:59 -0600578 """Tests that a valid chrome version is returned."""
Michael Mortensenc2615b72019-10-15 08:12:24 -0600579 # Mock PortageqBestVisible to return a valid chrome version string.
580 r1_cpf = 'chromeos-base/chromeos-chrome-78.0.3900.0_rc-r1'
581 r1_cpv = portage_util.SplitCPV(r1_cpf)
582 self.PatchObject(portage_util, 'PortageqBestVisible',
583 return_value=r1_cpv)
584
Michael Mortensenb51a1f02019-10-16 13:28:20 -0600585 chrome_version = packages.determine_chrome_version(self.build_target)
Michael Mortensenc2615b72019-10-15 08:12:24 -0600586 version_numbers = chrome_version.split('.')
587 self.assertEqual(len(version_numbers), 4)
588 self.assertEqual(int(version_numbers[0]), 78)
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600589
Michael Mortensen9fe740c2019-10-29 14:42:48 -0600590 def test_determine_chrome_version_handle_exception(self):
591 # Mock what happens when portage throws an exception that bubbles up (via
592 # RunCommand)inside portage_util.PortageqBestVisible.
593 self.PatchObject(portage_util, 'PortageqBestVisible',
594 side_effect=cros_build_lib.RunCommandError('error'))
595 target = packages.determine_chrome_version(self.build_target)
596 self.assertEqual(target, None)
597
Michael Mortensen9fdb14b2019-10-17 11:17:30 -0600598
599class PlatformVersionsTest(cros_test_lib.MockTestCase):
600 """Tests getting platform version."""
601
602 def test_determine_platform_version(self):
603 """Test checking that a valid platform version is returned."""
604 platform_version = packages.determine_platform_version()
605 # The returned platform version is something like 12603.0.0.
606 version_string_list = platform_version.split('.')
607 self.assertEqual(len(version_string_list), 3)
608 # We don't want to check an exact version, but the first number should be
609 # non-zero.
610 self.assertGreaterEqual(int(version_string_list[0]), 1)
Michael Mortensen009cb662019-10-21 11:38:43 -0600611
612 def test_determine_milestone_version(self):
613 """Test checking that a valid milestone version is returned."""
614 milestone_version = packages.determine_milestone_version()
615 # Milestone version should be non-zero
616 self.assertGreaterEqual(int(milestone_version), 1)
617
618 def test_determine_full_version(self):
619 """Test checking that a valid full version is returned."""
620 full_version = packages.determine_full_version()
621 pattern = r'^R(\d+)-(\d+.\d+.\d+(-rc\d+)*)'
622 m = re.match(pattern, full_version)
623 self.assertTrue(m)
624 milestone_version = m.group(1)
625 self.assertGreaterEqual(int(milestone_version), 1)
626
627 def test_versions_based_on_mock(self):
628 # Create a test version_info object, and than mock VersionInfo.from_repo
629 # return it.
630 test_platform_version = '12575.0.0'
631 test_chrome_branch = '75'
632 version_info_mock = manifest_version.VersionInfo(test_platform_version)
633 version_info_mock.chrome_branch = test_chrome_branch
634 self.PatchObject(manifest_version.VersionInfo, 'from_repo',
635 return_value=version_info_mock)
636 test_full_version = 'R' + test_chrome_branch + '-' + test_platform_version
637 platform_version = packages.determine_platform_version()
638 milestone_version = packages.determine_milestone_version()
639 full_version = packages.determine_full_version()
640 self.assertEqual(platform_version, test_platform_version)
641 self.assertEqual(milestone_version, test_chrome_branch)
642 self.assertEqual(full_version, test_full_version)