blob: a3906a21c1d5d7610440b4a796fd1f0a7180444c [file] [log] [blame]
LaMont Jones8a1644f2019-04-16 14:30:17 -06001# Copyright 2019 The Chromium OS Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""Unittests for Android operations."""
6
Alex Klein231d2da2019-07-22 16:44:45 -06007from chromite.api import api_config
LaMont Jones8a1644f2019-04-16 14:30:17 -06008from chromite.api.controller import android
9from chromite.api.gen.chromite.api import android_pb2
10from chromite.api.gen.chromiumos import common_pb2
Mike Frysinger40ffb532021-02-12 07:36:08 -050011from chromite.lib import build_target_lib
LaMont Jones8a1644f2019-04-16 14:30:17 -060012from chromite.lib import constants
13from chromite.lib import cros_build_lib
14from chromite.lib import cros_test_lib
15from chromite.lib import osutils
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090016from chromite.service import android as service_android
Alex Klein4de25e82019-08-05 15:58:39 -060017from chromite.service import packages
Mike Frysinger40ffb532021-02-12 07:36:08 -050018from chromite.third_party import mock
Alex Klein4de25e82019-08-05 15:58:39 -060019
LaMont Jones8a1644f2019-04-16 14:30:17 -060020
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090021class GetLatestBuildTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
22 """Unittests for GetLatestBuild."""
23
24 def setUp(self):
25 self._mock = self.PatchObject(service_android, 'GetLatestBuild')
26 self._mock.return_value = ('7123456', {})
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090027 self._mock_branch_for_package = self.PatchObject(
28 service_android, 'GetAndroidBranchForPackage',
29 return_value='android-branch-for-package')
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090030 self._output_proto = android_pb2.GetLatestBuildResponse()
31
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090032 def _GetRequest(self, android_build_branch=None, android_package=None):
33 req = android_pb2.GetLatestBuildRequest()
34 if android_build_branch is not None:
35 req.android_build_branch = android_build_branch
36 if android_package is not None:
37 req.android_package = android_package
38 return req
39
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090040 def testValidateOnly(self):
41 """Test that a validate only call does not execute any logic."""
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090042 req = self._GetRequest(android_package='android-package')
43 android.GetLatestBuild(req, self._output_proto, self.validate_only_config)
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090044 self._mock.assert_not_called()
45
46 def testMockCall(self):
47 """Test that a mock call does not execute logic, returns mocked value."""
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090048 req = self._GetRequest(android_package='android-package')
49 android.GetLatestBuild(req, self._output_proto, self.mock_call_config)
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090050 self._mock.assert_not_called()
51 self.assertEqual(self._output_proto.android_version, '7123456')
52
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090053 def testFailsIfBranchAndPackageMissing(self):
54 """Fails if both android_build_branch and android_package are missing."""
55 req = self._GetRequest()
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090056 with self.assertRaises(cros_build_lib.DieSystemExit):
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090057 android.GetLatestBuild(req, self._output_proto, self.api_config)
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090058 self._mock.assert_not_called()
59
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090060 def testBranchSpecified(self):
61 """Test calling with Android branch specified."""
62 req = self._GetRequest(android_build_branch='android-branch')
63 android.GetLatestBuild(req, self._output_proto, self.api_config)
64 self._mock.assert_called_once_with('android-branch')
65 self._mock_branch_for_package.assert_not_called()
66 self.assertEqual(self._output_proto.android_version, '7123456')
67
68 def testPackageSpecified(self):
69 """Test calling with Android package specified."""
70 req = self._GetRequest(android_package='android-package')
71 android.GetLatestBuild(req, self._output_proto, self.api_config)
72 self._mock.assert_called_once_with('android-branch-for-package')
73 self._mock_branch_for_package.assert_called_once_with('android-package')
74 self.assertEqual(self._output_proto.android_version, '7123456')
75
76 def testBranchAndPackageSpecified(self):
77 """Test calling with both Android branch and package specified."""
78 req = self._GetRequest(android_build_branch='android-branch',
79 android_package='android-package')
80 android.GetLatestBuild(req, self._output_proto, self.api_config)
81 self._mock.assert_called_once_with('android-branch')
82 self._mock_branch_for_package.assert_not_called()
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090083 self.assertEqual(self._output_proto.android_version, '7123456')
84
85
Alex Klein231d2da2019-07-22 16:44:45 -060086class MarkStableTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
LaMont Jones8a1644f2019-04-16 14:30:17 -060087 """Unittests for MarkStable."""
88
89 def setUp(self):
Alex Klein4de25e82019-08-05 15:58:39 -060090 self.uprev = self.PatchObject(packages, 'uprev_android')
LaMont Jones8a1644f2019-04-16 14:30:17 -060091
92 self.input_proto = android_pb2.MarkStableRequest()
LaMont Jones8a1644f2019-04-16 14:30:17 -060093 self.input_proto.package_name = 'android-package-name'
94 self.input_proto.android_build_branch = 'android_build_branch'
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090095 self.input_proto.android_version = 'android-version'
Alex Klein4de25e82019-08-05 15:58:39 -060096 self.input_proto.build_targets.add().name = 'foo'
97 self.input_proto.build_targets.add().name = 'bar'
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +090098 self.input_proto.skip_commit = True
Alex Klein4de25e82019-08-05 15:58:39 -060099
Alex Klein26e472b2020-03-10 14:35:01 -0600100 self.build_targets = [build_target_lib.BuildTarget('foo'),
101 build_target_lib.BuildTarget('bar')]
LaMont Jones8a1644f2019-04-16 14:30:17 -0600102
Alex Klein231d2da2019-07-22 16:44:45 -0600103 self.response = android_pb2.MarkStableResponse()
104
105 def testValidateOnly(self):
106 """Sanity check that a validate only call does not execute any logic."""
Alex Klein231d2da2019-07-22 16:44:45 -0600107 android.MarkStable(self.input_proto, self.response,
108 self.validate_only_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600109 self.uprev.assert_not_called()
Alex Klein231d2da2019-07-22 16:44:45 -0600110
Michael Mortensen25626442019-11-22 10:06:59 -0700111 def testMockCall(self):
112 """Test that a mock call does not execute logic, returns mocked value."""
113 android.MarkStable(self.input_proto, self.response,
114 self.mock_call_config)
115 self.uprev.assert_not_called()
116 self.assertEqual(self.response.status,
117 android_pb2.MARK_STABLE_STATUS_SUCCESS)
118 self.assertEqual(self.response.android_atom.category, 'category')
119 self.assertEqual(self.response.android_atom.package_name,
120 'android-package-name')
121 self.assertEqual(self.response.android_atom.version, '1.2')
122
LaMont Jones8a1644f2019-04-16 14:30:17 -0600123 def testFailsIfPackageNameMissing(self):
124 """Fails if package_name is missing."""
125 self.input_proto.package_name = ''
LaMont Jones8a1644f2019-04-16 14:30:17 -0600126 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600127 android.MarkStable(self.input_proto, self.response, self.api_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600128 self.uprev.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -0600129
LaMont Jones8a1644f2019-04-16 14:30:17 -0600130 def testCallsCommandCorrectly(self):
131 """Test that commands.MarkAndroidAsStable is called correctly."""
Alex Klein4de25e82019-08-05 15:58:39 -0600132 self.uprev.return_value = 'cat/android-1.2.3'
LaMont Jones8a1644f2019-04-16 14:30:17 -0600133 atom = common_pb2.PackageInfo()
134 atom.category = 'cat'
135 atom.package_name = 'android'
136 atom.version = '1.2.3'
Alex Klein231d2da2019-07-22 16:44:45 -0600137 android.MarkStable(self.input_proto, self.response, self.api_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600138 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -0600139 android_package=self.input_proto.package_name,
Alex Klein4de25e82019-08-05 15:58:39 -0600140 chroot=mock.ANY,
141 build_targets=self.build_targets,
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +0900142 android_build_branch=self.input_proto.android_build_branch,
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900143 android_version=self.input_proto.android_version,
144 skip_commit=self.input_proto.skip_commit,
145 )
Alex Klein231d2da2019-07-22 16:44:45 -0600146 self.assertEqual(self.response.android_atom, atom)
147 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600148 android_pb2.MARK_STABLE_STATUS_SUCCESS)
149
150 def testHandlesEarlyExit(self):
151 """Test that early exit is handled correctly."""
Alex Klein4de25e82019-08-05 15:58:39 -0600152 self.uprev.return_value = ''
Alex Klein231d2da2019-07-22 16:44:45 -0600153 android.MarkStable(self.input_proto, self.response, self.api_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600154 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -0600155 android_package=self.input_proto.package_name,
Alex Klein4de25e82019-08-05 15:58:39 -0600156 chroot=mock.ANY,
157 build_targets=self.build_targets,
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +0900158 android_build_branch=self.input_proto.android_build_branch,
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900159 android_version=self.input_proto.android_version,
160 skip_commit=self.input_proto.skip_commit,
161 )
Alex Klein231d2da2019-07-22 16:44:45 -0600162 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600163 android_pb2.MARK_STABLE_STATUS_EARLY_EXIT)
164
165 def testHandlesPinnedUprevError(self):
166 """Test that pinned error is handled correctly."""
Alex Klein4de25e82019-08-05 15:58:39 -0600167 self.uprev.side_effect = packages.AndroidIsPinnedUprevError('pin/xx-1.1')
LaMont Jones8a1644f2019-04-16 14:30:17 -0600168 atom = common_pb2.PackageInfo()
169 atom.category = 'pin'
170 atom.package_name = 'xx'
171 atom.version = '1.1'
Alex Klein231d2da2019-07-22 16:44:45 -0600172 android.MarkStable(self.input_proto, self.response, self.api_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600173 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -0600174 android_package=self.input_proto.package_name,
Alex Klein4de25e82019-08-05 15:58:39 -0600175 chroot=mock.ANY,
176 build_targets=self.build_targets,
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +0900177 android_build_branch=self.input_proto.android_build_branch,
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900178 android_version=self.input_proto.android_version,
179 skip_commit=self.input_proto.skip_commit,
180 )
Alex Klein231d2da2019-07-22 16:44:45 -0600181 self.assertEqual(self.response.android_atom, atom)
182 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600183 android_pb2.MARK_STABLE_STATUS_PINNED)
184
185
Alex Klein231d2da2019-07-22 16:44:45 -0600186class UnpinVersionTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
LaMont Jones8a1644f2019-04-16 14:30:17 -0600187 """Unittests for UnpinVersion."""
188
189 def testCallsUnlink(self):
190 """SetAndroid calls service with correct args."""
191 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
192 self.PatchObject(constants, '_FindSourceRoot', return_value='SRCROOT')
193
194 # This has the side effect of making sure that input and output proto are
195 # not actually used.
Alex Klein231d2da2019-07-22 16:44:45 -0600196 android.UnpinVersion(None, None, self.api_config)
LaMont Jones8a1644f2019-04-16 14:30:17 -0600197 safeunlink.assert_called_once_with(android.ANDROIDPIN_MASK_PATH)
Alex Klein231d2da2019-07-22 16:44:45 -0600198
199 def testValidateOnly(self):
200 """Sanity check that a validate only call does not execute any logic."""
201 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
202
203 android.UnpinVersion(None, None, self.validate_only_config)
204 safeunlink.assert_not_called()
Michael Mortensen25626442019-11-22 10:06:59 -0700205
206 def testMockCall(self):
207 """Test that a mock call does not execute logic."""
208 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
209
210 android.UnpinVersion(None, None, self.mock_call_config)
211 safeunlink.assert_not_called()
212 # android.UnpinVersion does not modify the response.