blob: 1f4332a15481e637b86a4656596e0481515a65b9 [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2019 The ChromiumOS Authors
Tiancong Wangaf050172019-07-10 11:52:03 -07002# 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 Toolchain-related operations."""
6
Alex Kleincd03a5e2021-10-18 13:23:47 -06007import os
8
Alex Klein231d2da2019-07-22 16:44:45 -06009from chromite.api import api_config
LaMont Jones5d2edcb2019-12-23 11:32:03 -070010from chromite.api import controller
Tiancong Wangaf050172019-07-10 11:52:03 -070011from chromite.api.controller import toolchain
LaMont Jones5d2edcb2019-12-23 11:32:03 -070012from chromite.api.gen.chromite.api import artifacts_pb2
LaMont Jones4579e8c2019-12-06 14:20:37 -070013from chromite.api.gen.chromite.api import sysroot_pb2
Tiancong Wangaf050172019-07-10 11:52:03 -070014from chromite.api.gen.chromite.api import toolchain_pb2
LaMont Jones4579e8c2019-12-06 14:20:37 -070015from chromite.api.gen.chromiumos import common_pb2
Mike Frysinger1cc8f1f2022-04-28 22:40:40 -040016from chromite.api.gen.chromiumos.builder_config_pb2 import BuilderConfig
Tiancong Wang24a3df72019-08-20 15:48:51 -070017from chromite.lib import cros_build_lib
Tiancong Wangaf050172019-07-10 11:52:03 -070018from chromite.lib import cros_test_lib
Alex Kleincd03a5e2021-10-18 13:23:47 -060019from chromite.lib import osutils
Jack Neus4ee7b1d2022-06-27 19:54:18 +000020from chromite.lib import toolchain as toolchain_lib
Tiancong Wangaf050172019-07-10 11:52:03 -070021from chromite.lib import toolchain_util
Greg Edelstondae510a2023-06-30 15:25:36 -060022from chromite.service import toolchain as toolchain_service
Tiancong Wangaf050172019-07-10 11:52:03 -070023
Mike Frysinger1cc8f1f2022-04-28 22:40:40 -040024
LaMont Jones5d2edcb2019-12-23 11:32:03 -070025# pylint: disable=protected-access
Tiancong Wangaf050172019-07-10 11:52:03 -070026
Tiancong Wangba2a1c22021-01-19 10:45:06 -080027
Alex Klein1699fab2022-09-08 08:46:06 -060028class UpdateEbuildWithAFDOArtifactsTest(
29 cros_test_lib.MockTestCase, api_config.ApiConfigMixin
30):
31 """Unittests for UpdateEbuildWithAFDOArtifacts."""
Tiancong Wang24a3df72019-08-20 15:48:51 -070032
Alex Klein1699fab2022-09-08 08:46:06 -060033 @staticmethod
34 def mock_die(message, *args):
35 raise cros_build_lib.DieSystemExit(message % args)
Tiancong Wangaf050172019-07-10 11:52:03 -070036
Alex Klein1699fab2022-09-08 08:46:06 -060037 def setUp(self):
38 self.board = "board"
39 self.response = toolchain_pb2.VerifyAFDOArtifactsResponse()
40 self.invalid_artifact_type = toolchain_pb2.BENCHMARK_AFDO
41 self.PatchObject(cros_build_lib, "Die", new=self.mock_die)
Tiancong Wang24a3df72019-08-20 15:48:51 -070042
Alex Klein1699fab2022-09-08 08:46:06 -060043 def _GetRequest(self, build_target=None, artifact_type=None):
44 return toolchain_pb2.VerifyAFDOArtifactsRequest(
45 build_target={"name": build_target},
46 artifact_type=artifact_type,
47 )
Tiancong Wangaf050172019-07-10 11:52:03 -070048
LaMont Jonesb20b3d92019-11-23 11:47:48 -070049
Alex Klein1699fab2022-09-08 08:46:06 -060050class PrepareForBuildTest(
51 cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin
52):
53 """Unittests for PrepareForBuild."""
LaMont Jonesb20b3d92019-11-23 11:47:48 -070054
Alex Klein1699fab2022-09-08 08:46:06 -060055 def setUp(self):
56 self.response = toolchain_pb2.PrepareForToolchainBuildResponse()
57 self.prep = self.PatchObject(
58 toolchain_util,
59 "PrepareForBuild",
60 return_value=toolchain_util.PrepareForBuildReturn.NEEDED,
61 )
62 self.bundle = self.PatchObject(
63 toolchain_util, "BundleArtifacts", return_value=[]
64 )
65 self.PatchObject(
66 toolchain,
67 "_TOOLCHAIN_ARTIFACT_HANDLERS",
68 {
Alex Kleinab87ceb2023-01-24 12:00:51 -070069 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE: (
70 toolchain._Handlers(
71 "UnverifiedChromeLlvmOrderfile", self.prep, self.bundle
72 )
Alex Klein1699fab2022-09-08 08:46:06 -060073 ),
74 },
75 )
LaMont Jonesb20b3d92019-11-23 11:47:48 -070076
Alex Klein1699fab2022-09-08 08:46:06 -060077 def _GetRequest(
78 self, artifact_types=None, input_artifacts=None, additional_args=None
79 ):
80 chroot = common_pb2.Chroot(path=str(self.tempdir))
81 sysroot = sysroot_pb2.Sysroot(
82 path="/build/board",
83 build_target=common_pb2.BuildTarget(name="board"),
84 )
85 return toolchain_pb2.PrepareForToolchainBuildRequest(
86 artifact_types=artifact_types,
87 chroot=chroot,
88 sysroot=sysroot,
89 input_artifacts=input_artifacts,
90 additional_args=additional_args,
91 )
LaMont Jonesb20b3d92019-11-23 11:47:48 -070092
Alex Klein1699fab2022-09-08 08:46:06 -060093 def testRaisesForUnknown(self):
94 request = self._GetRequest([BuilderConfig.Artifacts.IMAGE_ARCHIVES])
95 self.assertRaises(
96 KeyError,
97 toolchain.PrepareForBuild,
98 request,
99 self.response,
100 self.api_config,
101 )
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700102
Alex Klein1699fab2022-09-08 08:46:06 -0600103 def testAcceptsNone(self):
104 request = toolchain_pb2.PrepareForToolchainBuildRequest(
105 artifact_types=[
106 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
107 ],
108 chroot=None,
109 sysroot=None,
110 )
111 toolchain.PrepareForBuild(request, self.response, self.api_config)
112 self.prep.assert_called_once_with(
113 "UnverifiedChromeLlvmOrderfile", None, "", "", {}, {}
114 )
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700115
Alex Klein1699fab2022-09-08 08:46:06 -0600116 def testHandlesUnknownInputArtifacts(self):
117 request = toolchain_pb2.PrepareForToolchainBuildRequest(
118 artifact_types=[
119 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
120 ],
121 chroot=None,
122 sysroot=None,
123 input_artifacts=[
124 BuilderConfig.Artifacts.InputArtifactInfo(
125 input_artifact_type=BuilderConfig.Artifacts.IMAGE_ZIP,
126 input_artifact_gs_locations=["path1"],
127 ),
128 ],
129 )
130 toolchain.PrepareForBuild(request, self.response, self.api_config)
131 self.prep.assert_called_once_with(
132 "UnverifiedChromeLlvmOrderfile", None, "", "", {}, {}
133 )
LaMont Jones45ca6c42020-02-05 09:39:09 -0700134
Alex Klein1699fab2022-09-08 08:46:06 -0600135 def testPassesProfileInfo(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700136 # pylint: disable=line-too-long
Alex Klein1699fab2022-09-08 08:46:06 -0600137 request = toolchain_pb2.PrepareForToolchainBuildRequest(
138 artifact_types=[
139 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
140 ],
141 chroot=None,
142 sysroot=None,
143 input_artifacts=[
144 BuilderConfig.Artifacts.InputArtifactInfo(
145 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
146 input_artifact_gs_locations=["path1", "path2"],
147 ),
148 BuilderConfig.Artifacts.InputArtifactInfo(
149 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
150 input_artifact_gs_locations=["path3"],
151 ),
152 ],
153 profile_info=common_pb2.ArtifactProfileInfo(
Denis Nikitin62e69862023-02-13 23:37:00 -0800154 chrome_cwp_profile="CWPVERSION",
155 arch="amd64",
Alex Klein1699fab2022-09-08 08:46:06 -0600156 ),
157 )
Alex Kleinab87ceb2023-01-24 12:00:51 -0700158 # pylint: enable=line-too-long
Alex Klein1699fab2022-09-08 08:46:06 -0600159 toolchain.PrepareForBuild(request, self.response, self.api_config)
160 self.prep.assert_called_once_with(
161 "UnverifiedChromeLlvmOrderfile",
162 None,
163 "",
164 "",
165 {
166 "UnverifiedChromeLlvmOrderfile": [
167 "gs://path1",
168 "gs://path2",
169 "gs://path3",
170 ],
171 },
Denis Nikitin62e69862023-02-13 23:37:00 -0800172 {
173 "chrome_cwp_profile": "CWPVERSION",
174 "arch": "amd64",
175 },
Alex Klein1699fab2022-09-08 08:46:06 -0600176 )
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700177
Alex Klein1699fab2022-09-08 08:46:06 -0600178 def testPassesProfileInfoAfdoRelease(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700179 # pylint: disable=line-too-long
Alex Klein1699fab2022-09-08 08:46:06 -0600180 request = toolchain_pb2.PrepareForToolchainBuildRequest(
181 artifact_types=[
182 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
183 ],
184 chroot=None,
185 sysroot=None,
186 input_artifacts=[
187 BuilderConfig.Artifacts.InputArtifactInfo(
188 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
189 input_artifact_gs_locations=["path1", "path2"],
190 ),
191 BuilderConfig.Artifacts.InputArtifactInfo(
192 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
193 input_artifact_gs_locations=["path3"],
194 ),
195 ],
196 profile_info=common_pb2.ArtifactProfileInfo(
197 afdo_release=common_pb2.AfdoRelease(
Denis Nikitin62e69862023-02-13 23:37:00 -0800198 chrome_cwp_profile="CWPVERSION",
199 image_build_id=1234,
200 ),
201 arch="amd64",
Alex Klein1699fab2022-09-08 08:46:06 -0600202 ),
203 )
Alex Kleinab87ceb2023-01-24 12:00:51 -0700204 # pylint: enable=line-too-long
Alex Klein1699fab2022-09-08 08:46:06 -0600205 toolchain.PrepareForBuild(request, self.response, self.api_config)
206 self.prep.assert_called_once_with(
207 "UnverifiedChromeLlvmOrderfile",
208 None,
209 "",
210 "",
211 {
212 "UnverifiedChromeLlvmOrderfile": [
213 "gs://path1",
214 "gs://path2",
215 "gs://path3",
216 ],
217 },
Denis Nikitin62e69862023-02-13 23:37:00 -0800218 {
219 "chrome_cwp_profile": "CWPVERSION",
220 "image_build_id": 1234,
221 "arch": "amd64",
222 },
Alex Klein1699fab2022-09-08 08:46:06 -0600223 )
LaMont Jonese7821672020-04-09 08:56:26 -0600224
Alex Klein1699fab2022-09-08 08:46:06 -0600225 def testHandlesDuplicateInputArtifacts(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700226 # pylint: disable=line-too-long
Alex Klein1699fab2022-09-08 08:46:06 -0600227 request = toolchain_pb2.PrepareForToolchainBuildRequest(
228 artifact_types=[
229 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
230 ],
231 chroot=None,
232 sysroot=None,
233 input_artifacts=[
234 BuilderConfig.Artifacts.InputArtifactInfo(
235 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
236 input_artifact_gs_locations=["path1", "path2"],
237 ),
238 BuilderConfig.Artifacts.InputArtifactInfo(
239 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
240 input_artifact_gs_locations=["path3"],
241 ),
242 ],
243 )
Alex Kleinab87ceb2023-01-24 12:00:51 -0700244 # pylint: enable=line-too-long
Alex Klein1699fab2022-09-08 08:46:06 -0600245 toolchain.PrepareForBuild(request, self.response, self.api_config)
246 self.prep.assert_called_once_with(
247 "UnverifiedChromeLlvmOrderfile",
248 None,
249 "",
250 "",
251 {
252 "UnverifiedChromeLlvmOrderfile": [
253 "gs://path1",
254 "gs://path2",
255 "gs://path3",
256 ],
257 },
258 {},
259 )
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700260
261
Alex Klein1699fab2022-09-08 08:46:06 -0600262class BundleToolchainTest(
263 cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin
264):
265 """Unittests for BundleToolchain."""
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700266
Alex Klein1699fab2022-09-08 08:46:06 -0600267 def setUp(self):
268 self.response = toolchain_pb2.BundleToolchainResponse()
269 self.prep = self.PatchObject(
270 toolchain_util,
271 "PrepareForBuild",
272 return_value=toolchain_util.PrepareForBuildReturn.NEEDED,
273 )
274 self.bundle = self.PatchObject(
275 toolchain_util, "BundleArtifacts", return_value=[]
276 )
277 self.PatchObject(
278 toolchain,
279 "_TOOLCHAIN_ARTIFACT_HANDLERS",
280 {
Alex Kleinab87ceb2023-01-24 12:00:51 -0700281 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE: (
282 toolchain._Handlers(
283 "UnverifiedChromeLlvmOrderfile", self.prep, self.bundle
284 )
Alex Klein1699fab2022-09-08 08:46:06 -0600285 ),
286 },
287 )
288 osutils.WriteFile(os.path.join(self.tempdir, "artifact.txt"), "test")
289 osutils.Touch(os.path.join(self.tempdir, "empty"))
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700290
Alex Klein1699fab2022-09-08 08:46:06 -0600291 def _GetRequest(self, artifact_types=None):
292 chroot = common_pb2.Chroot(path=str(self.tempdir))
293 sysroot = sysroot_pb2.Sysroot(
294 path="/build/board",
295 build_target=common_pb2.BuildTarget(name="board"),
296 )
297 return toolchain_pb2.BundleToolchainRequest(
298 chroot=chroot,
299 sysroot=sysroot,
300 output_dir=str(self.tempdir),
301 artifact_types=artifact_types,
302 )
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700303
Alex Klein1699fab2022-09-08 08:46:06 -0600304 def testRaisesForUnknown(self):
305 request = self._GetRequest([BuilderConfig.Artifacts.IMAGE_ARCHIVES])
306 self.assertEqual(
307 controller.RETURN_CODE_UNRECOVERABLE,
308 toolchain.BundleArtifacts(request, self.response, self.api_config),
309 )
Michael Mortensen3232ab32020-01-05 19:14:36 -0700310
Alex Klein1699fab2022-09-08 08:46:06 -0600311 def testValidateOnly(self):
312 """Sanity check that a validate only call does not execute any logic."""
313 request = self._GetRequest(
314 [BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE]
315 )
316 toolchain.BundleArtifacts(
317 request, self.response, self.validate_only_config
318 )
319 self.bundle.assert_not_called()
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700320
Alex Klein1699fab2022-09-08 08:46:06 -0600321 def testSetsArtifactsInfo(self):
322 request = self._GetRequest(
323 [BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE]
324 )
325 self.bundle.return_value = ["artifact.txt", "empty", "does_not_exist"]
326 toolchain.BundleArtifacts(request, self.response, self.api_config)
327 self.assertEqual(1, len(self.response.artifacts_info))
328 self.assertEqual(
329 self.response.artifacts_info[0],
330 toolchain_pb2.ArtifactInfo(
331 artifact_type=(
332 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
333 ),
334 artifacts=[
335 artifacts_pb2.Artifact(path=self.bundle.return_value[0])
336 ],
337 ),
338 )
Tiancong Wangd5214132021-01-12 10:43:57 -0800339
340
Alex Klein1699fab2022-09-08 08:46:06 -0600341class GetUpdatedFilesTest(
342 cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin
343):
344 """Unittests for GetUpdatedFiles."""
Tiancong Wangd5214132021-01-12 10:43:57 -0800345
Alex Klein1699fab2022-09-08 08:46:06 -0600346 def setUp(self):
347 self.response = toolchain_pb2.GetUpdatedFilesResponse()
348 self.artifact_path = "/any/path/to/metadata"
Denis Nikitin62e69862023-02-13 23:37:00 -0800349 self.profile_info = common_pb2.ArtifactProfileInfo(
350 kernel_version="4.4", arch="amd64"
351 )
Alex Klein1699fab2022-09-08 08:46:06 -0600352 self.update = self.PatchObject(
353 toolchain_util, "GetUpdatedFiles", return_value=([], "")
354 )
Tiancong Wangd5214132021-01-12 10:43:57 -0800355
Alex Klein1699fab2022-09-08 08:46:06 -0600356 def _GetRequest(self, uploaded_artifacts):
357 uploaded = []
358 for artifact_type, artifact_path, profile_info in uploaded_artifacts:
359 uploaded.append(
360 toolchain_pb2.GetUpdatedFilesRequest.UploadedArtifacts(
361 artifact_info=toolchain_pb2.ArtifactInfo(
362 artifact_type=artifact_type,
363 artifacts=[artifacts_pb2.Artifact(path=artifact_path)],
364 ),
365 profile_info=profile_info,
366 )
367 )
368 return toolchain_pb2.GetUpdatedFilesRequest(uploaded_artifacts=uploaded)
Tiancong Wangd5214132021-01-12 10:43:57 -0800369
Alex Klein1699fab2022-09-08 08:46:06 -0600370 def testRaisesForUnknown(self):
371 request = self._GetRequest(
372 [
373 (
374 BuilderConfig.Artifacts.UNVERIFIED_KERNEL_CWP_AFDO_FILE,
375 self.artifact_path,
376 self.profile_info,
377 )
378 ]
379 )
380 self.assertEqual(
381 controller.RETURN_CODE_UNRECOVERABLE,
382 toolchain.GetUpdatedFiles(request, self.response, self.api_config),
383 )
Tiancong Wangd5214132021-01-12 10:43:57 -0800384
Alex Klein1699fab2022-09-08 08:46:06 -0600385 def testValidateOnly(self):
386 """Sanity check that a validate only call does not execute any logic."""
387 request = self._GetRequest(
388 [
389 (
390 BuilderConfig.Artifacts.VERIFIED_KERNEL_CWP_AFDO_FILE,
391 self.artifact_path,
392 self.profile_info,
393 )
394 ]
395 )
396 toolchain.GetUpdatedFiles(
397 request, self.response, self.validate_only_config
398 )
Tiancong Wangd5214132021-01-12 10:43:57 -0800399
Alex Klein1699fab2022-09-08 08:46:06 -0600400 def testUpdateSuccess(self):
401 updated_file = "/path/to/updated_file"
402 self.update.return_value = ([updated_file], "Commit Message")
403 request = self._GetRequest(
404 [
405 (
406 BuilderConfig.Artifacts.VERIFIED_KERNEL_CWP_AFDO_FILE,
407 self.artifact_path,
408 self.profile_info,
409 )
410 ]
411 )
412 toolchain.GetUpdatedFiles(request, self.response, self.api_config)
413 print(self.response.updated_files)
414 self.assertEqual(len(self.response.updated_files), 1)
415 self.assertEqual(
416 self.response.updated_files[0],
417 toolchain_pb2.GetUpdatedFilesResponse.UpdatedFile(
418 path=updated_file
419 ),
420 )
421 self.assertIn("Commit Message", self.response.commit_message)
422 self.assertEqual(len(self.response.commit_footer), 0)
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000423
424
Alex Klein1699fab2022-09-08 08:46:06 -0600425class GetToolchainsForBoardTest(
426 cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin
427):
428 """Unittests for GetToolchainsForBoard."""
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000429
Alex Klein1699fab2022-09-08 08:46:06 -0600430 def setUp(self):
431 self.response = toolchain_pb2.ToolchainsResponse()
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000432
Alex Klein1699fab2022-09-08 08:46:06 -0600433 def _GetRequest(self, board="betty-pi-arc"):
434 return toolchain_pb2.ToolchainsRequest(board=board)
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000435
Alex Klein1699fab2022-09-08 08:46:06 -0600436 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -0700437 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -0600438 request = self._GetRequest()
439 toolchain.GetToolchainsForBoard(
440 request, self.response, self.validate_only_config
441 )
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000442
Alex Klein1699fab2022-09-08 08:46:06 -0600443 def testUpdateSuccess(self):
444 toolchain_info = {
445 "default-a": {"default": True},
446 "default-b": {"default": True},
447 "nondefault-a": {"default": False},
448 "nondefault-b": {"default": False},
449 }
450 self.PatchObject(
451 toolchain_lib, "GetToolchainsForBoard", return_value=toolchain_info
452 )
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000453
Alex Klein1699fab2022-09-08 08:46:06 -0600454 request = self._GetRequest()
455 toolchain.GetToolchainsForBoard(request, self.response, self.api_config)
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000456
Alex Klein1699fab2022-09-08 08:46:06 -0600457 self.assertEqual(
458 self.response.default_toolchains, ["default-a", "default-b"]
459 )
460 self.assertEqual(
461 self.response.nondefault_toolchains,
462 ["nondefault-a", "nondefault-b"],
463 )
Greg Edelstondae510a2023-06-30 15:25:36 -0600464
465
466class SetupToolchainsTest(cros_test_lib.MockTestCase,
467 api_config.ApiConfigMixin):
468 """Unit tests for ToolchainService.SetupToolchains."""
469 def setUp(self) -> None:
470 self.response = toolchain_pb2.SetupToolchainsResponse()
471 self.chroot = common_pb2.Chroot(path='/path/to/chroot')
472
473 def test_outside_chroot(self) -> None:
474 """Test the behavior if run from outside the chroot."""
475 self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=False)
476 self.PatchObject(toolchain_service, "setup_toolchains")
477 request = toolchain_pb2.SetupToolchainsRequest(chroot=self.chroot)
478 with self.assertRaises(cros_build_lib.DieSystemExit):
479 toolchain.SetupToolchains(request, self.response, self.api_config)
480
481 def test_with_empty_request(self) -> None:
482 """Test the behavior if the request object is empty."""
483 self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=True)
484 service_mock = self.PatchObject(toolchain_service, "setup_toolchains")
485 request = toolchain_pb2.SetupToolchainsRequest(chroot=self.chroot)
486 toolchain.SetupToolchains(
487 request,
488 self.response,
489 self.api_config,
490 )
491 service_mock.assert_called_once_with(include_boards=[])
492
493 def test_with_boards(self) -> None:
494 """Test the behavior if the request object specifies boards."""
495 self.PatchObject(cros_build_lib, "IsInsideChroot", return_value=True)
496 service_mock = self.PatchObject(toolchain_service, "setup_toolchains")
497 request = toolchain_pb2.SetupToolchainsRequest(
498 chroot=self.chroot,
499 boards=[
500 common_pb2.BuildTarget(name="amd64-generic"),
501 common_pb2.BuildTarget(name="arm-generic"),
502 ])
503 toolchain.SetupToolchains(
504 request,
505 self.response,
506 self.api_config,
507 )
508 service_mock.assert_called_once_with(
509 include_boards=["amd64-generic", "arm-generic"], )