blob: 3bb62ec762642dc954722cd42b2e8b19fde4ac7a [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2019 The ChromiumOS Authors
LaMont Jones8a1644f2019-04-16 14:30:17 -06002# 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
Mike Frysinger166fea02021-02-12 05:30:33 -05007from unittest import mock
8
Alex Klein231d2da2019-07-22 16:44:45 -06009from chromite.api import api_config
LaMont Jones8a1644f2019-04-16 14:30:17 -060010from chromite.api.controller import android
11from chromite.api.gen.chromite.api import android_pb2
12from chromite.api.gen.chromiumos import common_pb2
Mike Frysinger40ffb532021-02-12 07:36:08 -050013from chromite.lib import build_target_lib
LaMont Jones8a1644f2019-04-16 14:30:17 -060014from chromite.lib import constants
15from chromite.lib import cros_build_lib
16from chromite.lib import cros_test_lib
17from chromite.lib import osutils
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090018from chromite.service import android as service_android
Alex Klein4de25e82019-08-05 15:58:39 -060019from chromite.service import packages
20
LaMont Jones8a1644f2019-04-16 14:30:17 -060021
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090022class GetLatestBuildTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -060023 """Unittests for GetLatestBuild."""
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090024
Alex Klein1699fab2022-09-08 08:46:06 -060025 def setUp(self):
26 self._mock = self.PatchObject(service_android, "GetLatestBuild")
27 self._mock.return_value = ("7123456", {})
Alex Klein1699fab2022-09-08 08:46:06 -060028 self._output_proto = android_pb2.GetLatestBuildResponse()
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090029
Shao-Chuan Lee81d3c432022-11-15 12:44:37 +090030 def _GetRequest(self, android_build_branch=None, android_package=None):
Alex Klein1699fab2022-09-08 08:46:06 -060031 req = android_pb2.GetLatestBuildRequest()
Shao-Chuan Lee81d3c432022-11-15 12:44:37 +090032 if android_build_branch is not None:
33 req.android_build_branch = android_build_branch
Alex Klein1699fab2022-09-08 08:46:06 -060034 if android_package is not None:
35 req.android_package = android_package
36 return req
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090037
Alex Klein1699fab2022-09-08 08:46:06 -060038 def testValidateOnly(self):
39 """Test that a validate only call does not execute any logic."""
40 req = self._GetRequest(android_package="android-package")
41 android.GetLatestBuild(
42 req, self._output_proto, self.validate_only_config
43 )
44 self._mock.assert_not_called()
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090045
Alex Klein1699fab2022-09-08 08:46:06 -060046 def testMockCall(self):
47 """Test that a mock call does not execute logic, returns mocked value."""
48 req = self._GetRequest(android_package="android-package")
49 android.GetLatestBuild(req, self._output_proto, self.mock_call_config)
50 self._mock.assert_not_called()
51 self.assertEqual(self._output_proto.android_version, "7123456")
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090052
Shao-Chuan Lee81d3c432022-11-15 12:44:37 +090053 def testFailsIfBranchAndPackageMissing(self):
54 """Fails if both android_build_branch and android_package are missing."""
Alex Klein1699fab2022-09-08 08:46:06 -060055 req = self._GetRequest()
56 with self.assertRaises(cros_build_lib.DieSystemExit):
57 android.GetLatestBuild(req, self._output_proto, self.api_config)
58 self._mock.assert_not_called()
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090059
Shao-Chuan Lee81d3c432022-11-15 12:44:37 +090060 def testFailsIfPackageMissing(self):
61 """Fails if android_package is missing."""
62 req = self._GetRequest(android_build_branch="android-branch")
63 with self.assertRaises(cros_build_lib.DieSystemExit):
64 android.GetLatestBuild(req, self._output_proto, self.api_config)
65 self._mock.assert_not_called()
66
67 def testPackageSpecified(self):
68 """Test calling with Android package specified."""
Alex Klein1699fab2022-09-08 08:46:06 -060069 req = self._GetRequest(android_package="android-package")
70 android.GetLatestBuild(req, self._output_proto, self.api_config)
Shao-Chuan Lee81d3c432022-11-15 12:44:37 +090071 self.assertEqual(self._output_proto.android_version, "7123456")
72
73 def testBranchAndPackageSpecified(self):
74 """Test calling with both Android branch and package specified."""
75 req = self._GetRequest(
76 android_build_branch="android-branch",
77 android_package="android-package",
78 )
79 android.GetLatestBuild(req, self._output_proto, self.api_config)
80 self._mock.assert_called_once_with(
81 "android-package", build_branch="android-branch"
82 )
Alex Klein1699fab2022-09-08 08:46:06 -060083 self.assertEqual(self._output_proto.android_version, "7123456")
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090084
85
Alex Klein231d2da2019-07-22 16:44:45 -060086class MarkStableTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -060087 """Unittests for MarkStable."""
LaMont Jones8a1644f2019-04-16 14:30:17 -060088
Alex Klein1699fab2022-09-08 08:46:06 -060089 def setUp(self):
90 self.uprev = self.PatchObject(packages, "uprev_android")
LaMont Jones8a1644f2019-04-16 14:30:17 -060091
Alex Klein1699fab2022-09-08 08:46:06 -060092 self.input_proto = android_pb2.MarkStableRequest()
93 self.input_proto.package_name = "android-package-name"
94 self.input_proto.android_build_branch = "android_build_branch"
95 self.input_proto.android_version = "android-version"
96 self.input_proto.build_targets.add().name = "foo"
97 self.input_proto.build_targets.add().name = "bar"
98 self.input_proto.skip_commit = True
Alex Klein4de25e82019-08-05 15:58:39 -060099
Alex Klein1699fab2022-09-08 08:46:06 -0600100 self.build_targets = [
101 build_target_lib.BuildTarget("foo"),
102 build_target_lib.BuildTarget("bar"),
103 ]
LaMont Jones8a1644f2019-04-16 14:30:17 -0600104
Alex Klein1699fab2022-09-08 08:46:06 -0600105 self.response = android_pb2.MarkStableResponse()
Alex Klein231d2da2019-07-22 16:44:45 -0600106
Alex Klein1699fab2022-09-08 08:46:06 -0600107 def testValidateOnly(self):
108 """Sanity check that a validate only call does not execute any logic."""
109 android.MarkStable(
110 self.input_proto, self.response, self.validate_only_config
111 )
112 self.uprev.assert_not_called()
Alex Klein231d2da2019-07-22 16:44:45 -0600113
Alex Klein1699fab2022-09-08 08:46:06 -0600114 def testMockCall(self):
115 """Test that a mock call does not execute logic, returns mocked value."""
116 android.MarkStable(
117 self.input_proto, self.response, self.mock_call_config
118 )
119 self.uprev.assert_not_called()
120 self.assertEqual(
121 self.response.status, android_pb2.MARK_STABLE_STATUS_SUCCESS
122 )
123 self.assertEqual(self.response.android_atom.category, "category")
124 self.assertEqual(
125 self.response.android_atom.package_name, "android-package-name"
126 )
127 self.assertEqual(self.response.android_atom.version, "1.2")
Michael Mortensen25626442019-11-22 10:06:59 -0700128
Alex Klein1699fab2022-09-08 08:46:06 -0600129 def testFailsIfPackageNameMissing(self):
130 """Fails if package_name is missing."""
131 self.input_proto.package_name = ""
132 with self.assertRaises(cros_build_lib.DieSystemExit):
133 android.MarkStable(self.input_proto, self.response, self.api_config)
134 self.uprev.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -0600135
Alex Klein1699fab2022-09-08 08:46:06 -0600136 def testCallsCommandCorrectly(self):
137 """Test that commands.MarkAndroidAsStable is called correctly."""
138 self.uprev.return_value = packages.UprevAndroidResult(
139 revved=True, android_atom="cat/android-1.2.3"
140 )
141 atom = common_pb2.PackageInfo()
142 atom.category = "cat"
143 atom.package_name = "android"
144 atom.version = "1.2.3"
145 android.MarkStable(self.input_proto, self.response, self.api_config)
146 self.uprev.assert_called_once_with(
147 android_package=self.input_proto.package_name,
148 chroot=mock.ANY,
149 build_targets=self.build_targets,
150 android_build_branch=self.input_proto.android_build_branch,
151 android_version=self.input_proto.android_version,
152 skip_commit=self.input_proto.skip_commit,
153 )
154 self.assertEqual(self.response.android_atom, atom)
155 self.assertEqual(
156 self.response.status, android_pb2.MARK_STABLE_STATUS_SUCCESS
157 )
LaMont Jones8a1644f2019-04-16 14:30:17 -0600158
Alex Klein1699fab2022-09-08 08:46:06 -0600159 def testHandlesEarlyExit(self):
160 """Test that early exit is handled correctly."""
161 self.uprev.return_value = packages.UprevAndroidResult(revved=False)
162 android.MarkStable(self.input_proto, self.response, self.api_config)
163 self.uprev.assert_called_once_with(
164 android_package=self.input_proto.package_name,
165 chroot=mock.ANY,
166 build_targets=self.build_targets,
167 android_build_branch=self.input_proto.android_build_branch,
168 android_version=self.input_proto.android_version,
169 skip_commit=self.input_proto.skip_commit,
170 )
171 self.assertEqual(
172 self.response.status, android_pb2.MARK_STABLE_STATUS_EARLY_EXIT
173 )
LaMont Jones8a1644f2019-04-16 14:30:17 -0600174
Alex Klein1699fab2022-09-08 08:46:06 -0600175 def testHandlesPinnedUprevError(self):
176 """Test that pinned error is handled correctly."""
177 self.uprev.side_effect = packages.AndroidIsPinnedUprevError(
178 "pin/xx-1.1"
179 )
180 atom = common_pb2.PackageInfo()
181 atom.category = "pin"
182 atom.package_name = "xx"
183 atom.version = "1.1"
184 android.MarkStable(self.input_proto, self.response, self.api_config)
185 self.uprev.assert_called_once_with(
186 android_package=self.input_proto.package_name,
187 chroot=mock.ANY,
188 build_targets=self.build_targets,
189 android_build_branch=self.input_proto.android_build_branch,
190 android_version=self.input_proto.android_version,
191 skip_commit=self.input_proto.skip_commit,
192 )
193 self.assertEqual(self.response.android_atom, atom)
194 self.assertEqual(
195 self.response.status, android_pb2.MARK_STABLE_STATUS_PINNED
196 )
LaMont Jones8a1644f2019-04-16 14:30:17 -0600197
198
Alex Klein231d2da2019-07-22 16:44:45 -0600199class UnpinVersionTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600200 """Unittests for UnpinVersion."""
LaMont Jones8a1644f2019-04-16 14:30:17 -0600201
Alex Klein1699fab2022-09-08 08:46:06 -0600202 def testCallsUnlink(self):
203 """SetAndroid calls service with correct args."""
204 safeunlink = self.PatchObject(osutils, "SafeUnlink")
205 self.PatchObject(constants, "_FindSourceRoot", return_value="SRCROOT")
LaMont Jones8a1644f2019-04-16 14:30:17 -0600206
Alex Klein1699fab2022-09-08 08:46:06 -0600207 # This has the side effect of making sure that input and output proto are
208 # not actually used.
209 android.UnpinVersion(None, None, self.api_config)
210 safeunlink.assert_called_once_with(android.ANDROIDPIN_MASK_PATH)
Alex Klein231d2da2019-07-22 16:44:45 -0600211
Alex Klein1699fab2022-09-08 08:46:06 -0600212 def testValidateOnly(self):
213 """Sanity check that a validate only call does not execute any logic."""
214 safeunlink = self.PatchObject(osutils, "SafeUnlink")
Alex Klein231d2da2019-07-22 16:44:45 -0600215
Alex Klein1699fab2022-09-08 08:46:06 -0600216 android.UnpinVersion(None, None, self.validate_only_config)
217 safeunlink.assert_not_called()
Michael Mortensen25626442019-11-22 10:06:59 -0700218
Alex Klein1699fab2022-09-08 08:46:06 -0600219 def testMockCall(self):
220 """Test that a mock call does not execute logic."""
221 safeunlink = self.PatchObject(osutils, "SafeUnlink")
Michael Mortensen25626442019-11-22 10:06:59 -0700222
Alex Klein1699fab2022-09-08 08:46:06 -0600223 android.UnpinVersion(None, None, self.mock_call_config)
224 safeunlink.assert_not_called()
225 # android.UnpinVersion does not modify the response.
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900226
227
228class WriteLKGBTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
Alex Klein1699fab2022-09-08 08:46:06 -0600229 """Unittests for WriteLKGB."""
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900230
Alex Klein1699fab2022-09-08 08:46:06 -0600231 def setUp(self):
232 self._output_proto = android_pb2.WriteLKGBResponse()
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900233
Alex Klein1699fab2022-09-08 08:46:06 -0600234 def testValidateOnly(self):
235 """Test that a validate only call does not execute any logic."""
236 mock_write_lkgb = self.PatchObject(service_android, "WriteLKGB")
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900237
Alex Klein1699fab2022-09-08 08:46:06 -0600238 req = android_pb2.WriteLKGBRequest(
239 android_package="android-package", android_version="android-version"
240 )
241 android.WriteLKGB(req, self._output_proto, self.validate_only_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900242
Alex Klein1699fab2022-09-08 08:46:06 -0600243 mock_write_lkgb.assert_not_called()
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900244
Alex Klein1699fab2022-09-08 08:46:06 -0600245 def testMockCall(self):
246 """Test that a mock call does not execute logic, returns mocked value."""
247 mock_write_lkgb = self.PatchObject(service_android, "WriteLKGB")
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900248
Alex Klein1699fab2022-09-08 08:46:06 -0600249 req = android_pb2.WriteLKGBRequest(
250 android_package="android-package", android_version="android-version"
251 )
252 android.WriteLKGB(req, self._output_proto, self.mock_call_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900253
Alex Klein1699fab2022-09-08 08:46:06 -0600254 mock_write_lkgb.assert_not_called()
255 self.assertSequenceEqual(
256 self._output_proto.modified_files, ["fake_file"]
257 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900258
Alex Klein1699fab2022-09-08 08:46:06 -0600259 def testFailsIfAndroidPackageMissing(self):
260 """Fails if android_package is missing."""
261 req = android_pb2.WriteLKGBRequest(android_version="android-version")
262 with self.assertRaises(cros_build_lib.DieSystemExit):
263 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900264
Alex Klein1699fab2022-09-08 08:46:06 -0600265 def testFailsIfAndroidVersionMissing(self):
266 """Fails if android_version is missing."""
267 req = android_pb2.WriteLKGBRequest(android_package="android-package")
268 with self.assertRaises(cros_build_lib.DieSystemExit):
269 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900270
Alex Klein1699fab2022-09-08 08:46:06 -0600271 def testSuccess(self):
272 """Successful request."""
273 mock_read_lkgb = self.PatchObject(
274 service_android, "ReadLKGB", return_value="old-version"
275 )
276 mock_write_lkgb = self.PatchObject(
277 service_android, "WriteLKGB", return_value="mock_file"
278 )
279 self.PatchObject(
280 service_android,
281 "GetAndroidPackageDir",
282 return_value="android-package-dir",
283 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900284
Alex Klein1699fab2022-09-08 08:46:06 -0600285 req = android_pb2.WriteLKGBRequest(
286 android_package="android-package", android_version="android-version"
287 )
288 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900289
Alex Klein1699fab2022-09-08 08:46:06 -0600290 mock_read_lkgb.assert_called_once_with("android-package-dir")
291 mock_write_lkgb.assert_called_once_with(
292 "android-package-dir", "android-version"
293 )
294 self.assertSequenceEqual(
295 self._output_proto.modified_files, ["mock_file"]
296 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900297
Alex Klein1699fab2022-09-08 08:46:06 -0600298 def testSameVersion(self):
299 """Nothing is modified if LKGB is already the same version."""
300 mock_read_lkgb = self.PatchObject(
301 service_android, "ReadLKGB", return_value="android-version"
302 )
303 mock_write_lkgb = self.PatchObject(service_android, "WriteLKGB")
304 self.PatchObject(
305 service_android,
306 "GetAndroidPackageDir",
307 return_value="android-package-dir",
308 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900309
Alex Klein1699fab2022-09-08 08:46:06 -0600310 req = android_pb2.WriteLKGBRequest(
311 android_package="android-package", android_version="android-version"
312 )
313 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900314
Alex Klein1699fab2022-09-08 08:46:06 -0600315 mock_read_lkgb.assert_called_once_with("android-package-dir")
316 mock_write_lkgb.assert_not_called()
317 self.assertSequenceEqual(self._output_proto.modified_files, [])
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900318
Alex Klein1699fab2022-09-08 08:46:06 -0600319 def testMissingLKGB(self):
320 """Proceed if LKGB file is currently missing."""
321 mock_read_lkgb = self.PatchObject(
322 service_android,
323 "ReadLKGB",
324 side_effect=service_android.MissingLKGBError(),
325 )
326 mock_write_lkgb = self.PatchObject(
327 service_android, "WriteLKGB", return_value="mock_file"
328 )
329 self.PatchObject(
330 service_android,
331 "GetAndroidPackageDir",
332 return_value="android-package-dir",
333 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900334
Alex Klein1699fab2022-09-08 08:46:06 -0600335 req = android_pb2.WriteLKGBRequest(
336 android_package="android-package", android_version="android-version"
337 )
338 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900339
Alex Klein1699fab2022-09-08 08:46:06 -0600340 mock_read_lkgb.assert_called_once_with("android-package-dir")
341 mock_write_lkgb.assert_called_once_with(
342 "android-package-dir", "android-version"
343 )
344 self.assertSequenceEqual(
345 self._output_proto.modified_files, ["mock_file"]
346 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900347
Alex Klein1699fab2022-09-08 08:46:06 -0600348 def testInvalidLKGB(self):
349 """Proceed if LKGB file currently contains invalid content."""
350 mock_read_lkgb = self.PatchObject(
351 service_android,
352 "ReadLKGB",
353 side_effect=service_android.InvalidLKGBError(),
354 )
355 mock_write_lkgb = self.PatchObject(
356 service_android, "WriteLKGB", return_value="mock_file"
357 )
358 self.PatchObject(
359 service_android,
360 "GetAndroidPackageDir",
361 return_value="android-package-dir",
362 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900363
Alex Klein1699fab2022-09-08 08:46:06 -0600364 req = android_pb2.WriteLKGBRequest(
365 android_package="android-package", android_version="android-version"
366 )
367 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900368
Alex Klein1699fab2022-09-08 08:46:06 -0600369 mock_read_lkgb.assert_called_once_with("android-package-dir")
370 mock_write_lkgb.assert_called_once_with(
371 "android-package-dir", "android-version"
372 )
373 self.assertSequenceEqual(
374 self._output_proto.modified_files, ["mock_file"]
375 )