blob: 62b60e4a4c01f93b7693f065bd178e310f95e610 [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):
Alex Kleinab87ceb2023-01-24 12:00:51 -070047 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -060048 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):
Alex Kleinab87ceb2023-01-24 12:00:51 -070054 """Fails if 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):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700108 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600109 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):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700115 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600116 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 Kleinab87ceb2023-01-24 12:00:51 -0700207 # This has the side effect of making sure that input and output proto
208 # are not actually used.
Alex Klein1699fab2022-09-08 08:46:06 -0600209 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):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700213 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600214 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
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900234 # Mock milestone for FindRuntimeArtifactsPin().
235 self.PatchObject(
236 packages,
237 "determine_milestone_version",
238 return_value="999",
239 )
240
Alex Klein1699fab2022-09-08 08:46:06 -0600241 def testValidateOnly(self):
242 """Test that a validate only call does not execute any logic."""
243 mock_write_lkgb = self.PatchObject(service_android, "WriteLKGB")
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900244
Alex Klein1699fab2022-09-08 08:46:06 -0600245 req = android_pb2.WriteLKGBRequest(
246 android_package="android-package", android_version="android-version"
247 )
248 android.WriteLKGB(req, self._output_proto, self.validate_only_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900249
Alex Klein1699fab2022-09-08 08:46:06 -0600250 mock_write_lkgb.assert_not_called()
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900251
Alex Klein1699fab2022-09-08 08:46:06 -0600252 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700253 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -0600254 mock_write_lkgb = self.PatchObject(service_android, "WriteLKGB")
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900255
Alex Klein1699fab2022-09-08 08:46:06 -0600256 req = android_pb2.WriteLKGBRequest(
257 android_package="android-package", android_version="android-version"
258 )
259 android.WriteLKGB(req, self._output_proto, self.mock_call_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900260
Alex Klein1699fab2022-09-08 08:46:06 -0600261 mock_write_lkgb.assert_not_called()
262 self.assertSequenceEqual(
263 self._output_proto.modified_files, ["fake_file"]
264 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900265
Alex Klein1699fab2022-09-08 08:46:06 -0600266 def testFailsIfAndroidPackageMissing(self):
267 """Fails if android_package is missing."""
268 req = android_pb2.WriteLKGBRequest(android_version="android-version")
269 with self.assertRaises(cros_build_lib.DieSystemExit):
270 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900271
Alex Klein1699fab2022-09-08 08:46:06 -0600272 def testFailsIfAndroidVersionMissing(self):
273 """Fails if android_version is missing."""
274 req = android_pb2.WriteLKGBRequest(android_package="android-package")
275 with self.assertRaises(cros_build_lib.DieSystemExit):
276 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900277
Alex Klein1699fab2022-09-08 08:46:06 -0600278 def testSuccess(self):
279 """Successful request."""
280 mock_read_lkgb = self.PatchObject(
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900281 service_android,
282 "ReadLKGB",
283 return_value=dict(build_id="old-version"),
Alex Klein1699fab2022-09-08 08:46:06 -0600284 )
285 mock_write_lkgb = self.PatchObject(
286 service_android, "WriteLKGB", return_value="mock_file"
287 )
288 self.PatchObject(
289 service_android,
290 "GetAndroidPackageDir",
291 return_value="android-package-dir",
292 )
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900293 self.PatchObject(
294 service_android,
295 "FindRuntimeArtifactsPin",
296 return_value=None,
297 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900298
Alex Klein1699fab2022-09-08 08:46:06 -0600299 req = android_pb2.WriteLKGBRequest(
300 android_package="android-package", android_version="android-version"
301 )
302 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900303
Alex Klein1699fab2022-09-08 08:46:06 -0600304 mock_read_lkgb.assert_called_once_with("android-package-dir")
305 mock_write_lkgb.assert_called_once_with(
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900306 "android-package-dir",
307 dict(build_id="android-version"),
Alex Klein1699fab2022-09-08 08:46:06 -0600308 )
309 self.assertSequenceEqual(
310 self._output_proto.modified_files, ["mock_file"]
311 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900312
Alex Klein1699fab2022-09-08 08:46:06 -0600313 def testSameVersion(self):
314 """Nothing is modified if LKGB is already the same version."""
315 mock_read_lkgb = self.PatchObject(
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900316 service_android,
317 "ReadLKGB",
318 return_value=dict(
319 build_id="android-version",
320 runtime_artifacts_pin="runtime-artifacts-pin",
321 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600322 )
323 mock_write_lkgb = self.PatchObject(service_android, "WriteLKGB")
324 self.PatchObject(
325 service_android,
326 "GetAndroidPackageDir",
327 return_value="android-package-dir",
328 )
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900329 self.PatchObject(
330 service_android,
331 "FindRuntimeArtifactsPin",
332 return_value="runtime-artifacts-pin",
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_not_called()
342 self.assertSequenceEqual(self._output_proto.modified_files, [])
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900343
Alex Klein1699fab2022-09-08 08:46:06 -0600344 def testMissingLKGB(self):
345 """Proceed if LKGB file is currently missing."""
346 mock_read_lkgb = self.PatchObject(
347 service_android,
348 "ReadLKGB",
349 side_effect=service_android.MissingLKGBError(),
350 )
351 mock_write_lkgb = self.PatchObject(
352 service_android, "WriteLKGB", return_value="mock_file"
353 )
354 self.PatchObject(
355 service_android,
356 "GetAndroidPackageDir",
357 return_value="android-package-dir",
358 )
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900359 self.PatchObject(
360 service_android,
361 "FindRuntimeArtifactsPin",
362 return_value=None,
363 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900364
Alex Klein1699fab2022-09-08 08:46:06 -0600365 req = android_pb2.WriteLKGBRequest(
366 android_package="android-package", android_version="android-version"
367 )
368 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900369
Alex Klein1699fab2022-09-08 08:46:06 -0600370 mock_read_lkgb.assert_called_once_with("android-package-dir")
371 mock_write_lkgb.assert_called_once_with(
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900372 "android-package-dir",
373 dict(build_id="android-version"),
Alex Klein1699fab2022-09-08 08:46:06 -0600374 )
375 self.assertSequenceEqual(
376 self._output_proto.modified_files, ["mock_file"]
377 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900378
Alex Klein1699fab2022-09-08 08:46:06 -0600379 def testInvalidLKGB(self):
380 """Proceed if LKGB file currently contains invalid content."""
381 mock_read_lkgb = self.PatchObject(
382 service_android,
383 "ReadLKGB",
384 side_effect=service_android.InvalidLKGBError(),
385 )
386 mock_write_lkgb = self.PatchObject(
387 service_android, "WriteLKGB", return_value="mock_file"
388 )
389 self.PatchObject(
390 service_android,
391 "GetAndroidPackageDir",
392 return_value="android-package-dir",
393 )
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900394 self.PatchObject(
395 service_android,
396 "FindRuntimeArtifactsPin",
397 return_value=None,
398 )
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900399
Alex Klein1699fab2022-09-08 08:46:06 -0600400 req = android_pb2.WriteLKGBRequest(
401 android_package="android-package", android_version="android-version"
402 )
403 android.WriteLKGB(req, self._output_proto, self.api_config)
Shao-Chuan Leeddcca812021-12-10 15:11:16 +0900404
Alex Klein1699fab2022-09-08 08:46:06 -0600405 mock_read_lkgb.assert_called_once_with("android-package-dir")
406 mock_write_lkgb.assert_called_once_with(
Shao-Chuan Leee0b9ba92023-01-18 19:35:36 +0900407 "android-package-dir",
408 dict(build_id="android-version"),
409 )
410 self.assertSequenceEqual(
411 self._output_proto.modified_files, ["mock_file"]
412 )
413
414 def testNewRuntimeArtifactsPin(self):
415 """Proceed if a new runtime artifacts pin is found."""
416 mock_read_lkgb = self.PatchObject(
417 service_android,
418 "ReadLKGB",
419 return_value=dict(build_id="android-version"),
420 )
421 mock_write_lkgb = self.PatchObject(
422 service_android,
423 "WriteLKGB",
424 return_value="mock_file",
425 )
426 self.PatchObject(
427 service_android,
428 "GetAndroidPackageDir",
429 return_value="android-package-dir",
430 )
431 self.PatchObject(
432 service_android,
433 "FindRuntimeArtifactsPin",
434 return_value="runtime-artifacts-pin",
435 )
436
437 req = android_pb2.WriteLKGBRequest(
438 android_package="android-package", android_version="android-version"
439 )
440 android.WriteLKGB(req, self._output_proto, self.api_config)
441
442 mock_read_lkgb.assert_called_once_with("android-package-dir")
443 mock_write_lkgb.assert_called_once_with(
444 "android-package-dir",
445 dict(
446 build_id="android-version",
447 runtime_artifacts_pin="runtime-artifacts-pin",
448 ),
Alex Klein1699fab2022-09-08 08:46:06 -0600449 )
450 self.assertSequenceEqual(
451 self._output_proto.modified_files, ["mock_file"]
452 )