blob: 25adec0a27cf25f9be6c1931a78aa65612a8ca2f [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
22
Mike Frysinger1cc8f1f2022-04-28 22:40:40 -040023
LaMont Jones5d2edcb2019-12-23 11:32:03 -070024# pylint: disable=protected-access
Tiancong Wangaf050172019-07-10 11:52:03 -070025
Tiancong Wangba2a1c22021-01-19 10:45:06 -080026
Alex Klein1699fab2022-09-08 08:46:06 -060027class UpdateEbuildWithAFDOArtifactsTest(
28 cros_test_lib.MockTestCase, api_config.ApiConfigMixin
29):
30 """Unittests for UpdateEbuildWithAFDOArtifacts."""
Tiancong Wang24a3df72019-08-20 15:48:51 -070031
Alex Klein1699fab2022-09-08 08:46:06 -060032 @staticmethod
33 def mock_die(message, *args):
34 raise cros_build_lib.DieSystemExit(message % args)
Tiancong Wangaf050172019-07-10 11:52:03 -070035
Alex Klein1699fab2022-09-08 08:46:06 -060036 def setUp(self):
37 self.board = "board"
38 self.response = toolchain_pb2.VerifyAFDOArtifactsResponse()
39 self.invalid_artifact_type = toolchain_pb2.BENCHMARK_AFDO
40 self.PatchObject(cros_build_lib, "Die", new=self.mock_die)
Tiancong Wang24a3df72019-08-20 15:48:51 -070041
Alex Klein1699fab2022-09-08 08:46:06 -060042 def _GetRequest(self, build_target=None, artifact_type=None):
43 return toolchain_pb2.VerifyAFDOArtifactsRequest(
44 build_target={"name": build_target},
45 artifact_type=artifact_type,
46 )
Tiancong Wangaf050172019-07-10 11:52:03 -070047
LaMont Jonesb20b3d92019-11-23 11:47:48 -070048
Alex Klein1699fab2022-09-08 08:46:06 -060049class PrepareForBuildTest(
50 cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin
51):
52 """Unittests for PrepareForBuild."""
LaMont Jonesb20b3d92019-11-23 11:47:48 -070053
Alex Klein1699fab2022-09-08 08:46:06 -060054 def setUp(self):
55 self.response = toolchain_pb2.PrepareForToolchainBuildResponse()
56 self.prep = self.PatchObject(
57 toolchain_util,
58 "PrepareForBuild",
59 return_value=toolchain_util.PrepareForBuildReturn.NEEDED,
60 )
61 self.bundle = self.PatchObject(
62 toolchain_util, "BundleArtifacts", return_value=[]
63 )
64 self.PatchObject(
65 toolchain,
66 "_TOOLCHAIN_ARTIFACT_HANDLERS",
67 {
68 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE: toolchain._Handlers(
69 "UnverifiedChromeLlvmOrderfile", self.prep, self.bundle
70 ),
71 },
72 )
LaMont Jonesb20b3d92019-11-23 11:47:48 -070073
Alex Klein1699fab2022-09-08 08:46:06 -060074 def _GetRequest(
75 self, artifact_types=None, input_artifacts=None, additional_args=None
76 ):
77 chroot = common_pb2.Chroot(path=str(self.tempdir))
78 sysroot = sysroot_pb2.Sysroot(
79 path="/build/board",
80 build_target=common_pb2.BuildTarget(name="board"),
81 )
82 return toolchain_pb2.PrepareForToolchainBuildRequest(
83 artifact_types=artifact_types,
84 chroot=chroot,
85 sysroot=sysroot,
86 input_artifacts=input_artifacts,
87 additional_args=additional_args,
88 )
LaMont Jonesb20b3d92019-11-23 11:47:48 -070089
Alex Klein1699fab2022-09-08 08:46:06 -060090 def testRaisesForUnknown(self):
91 request = self._GetRequest([BuilderConfig.Artifacts.IMAGE_ARCHIVES])
92 self.assertRaises(
93 KeyError,
94 toolchain.PrepareForBuild,
95 request,
96 self.response,
97 self.api_config,
98 )
LaMont Jones5d2edcb2019-12-23 11:32:03 -070099
Alex Klein1699fab2022-09-08 08:46:06 -0600100 def testAcceptsNone(self):
101 request = toolchain_pb2.PrepareForToolchainBuildRequest(
102 artifact_types=[
103 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
104 ],
105 chroot=None,
106 sysroot=None,
107 )
108 toolchain.PrepareForBuild(request, self.response, self.api_config)
109 self.prep.assert_called_once_with(
110 "UnverifiedChromeLlvmOrderfile", None, "", "", {}, {}
111 )
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700112
Alex Klein1699fab2022-09-08 08:46:06 -0600113 def testHandlesUnknownInputArtifacts(self):
114 request = toolchain_pb2.PrepareForToolchainBuildRequest(
115 artifact_types=[
116 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
117 ],
118 chroot=None,
119 sysroot=None,
120 input_artifacts=[
121 BuilderConfig.Artifacts.InputArtifactInfo(
122 input_artifact_type=BuilderConfig.Artifacts.IMAGE_ZIP,
123 input_artifact_gs_locations=["path1"],
124 ),
125 ],
126 )
127 toolchain.PrepareForBuild(request, self.response, self.api_config)
128 self.prep.assert_called_once_with(
129 "UnverifiedChromeLlvmOrderfile", None, "", "", {}, {}
130 )
LaMont Jones45ca6c42020-02-05 09:39:09 -0700131
Alex Klein1699fab2022-09-08 08:46:06 -0600132 def testPassesProfileInfo(self):
133 request = toolchain_pb2.PrepareForToolchainBuildRequest(
134 artifact_types=[
135 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
136 ],
137 chroot=None,
138 sysroot=None,
139 input_artifacts=[
140 BuilderConfig.Artifacts.InputArtifactInfo(
141 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
142 input_artifact_gs_locations=["path1", "path2"],
143 ),
144 BuilderConfig.Artifacts.InputArtifactInfo(
145 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
146 input_artifact_gs_locations=["path3"],
147 ),
148 ],
149 profile_info=common_pb2.ArtifactProfileInfo(
150 chrome_cwp_profile="CWPVERSION"
151 ),
152 )
153 toolchain.PrepareForBuild(request, self.response, self.api_config)
154 self.prep.assert_called_once_with(
155 "UnverifiedChromeLlvmOrderfile",
156 None,
157 "",
158 "",
159 {
160 "UnverifiedChromeLlvmOrderfile": [
161 "gs://path1",
162 "gs://path2",
163 "gs://path3",
164 ],
165 },
166 {"chrome_cwp_profile": "CWPVERSION"},
167 )
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700168
Alex Klein1699fab2022-09-08 08:46:06 -0600169 def testPassesProfileInfoAfdoRelease(self):
170 request = toolchain_pb2.PrepareForToolchainBuildRequest(
171 artifact_types=[
172 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
173 ],
174 chroot=None,
175 sysroot=None,
176 input_artifacts=[
177 BuilderConfig.Artifacts.InputArtifactInfo(
178 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
179 input_artifact_gs_locations=["path1", "path2"],
180 ),
181 BuilderConfig.Artifacts.InputArtifactInfo(
182 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
183 input_artifact_gs_locations=["path3"],
184 ),
185 ],
186 profile_info=common_pb2.ArtifactProfileInfo(
187 afdo_release=common_pb2.AfdoRelease(
188 chrome_cwp_profile="CWPVERSION", image_build_id=1234
189 )
190 ),
191 )
192 toolchain.PrepareForBuild(request, self.response, self.api_config)
193 self.prep.assert_called_once_with(
194 "UnverifiedChromeLlvmOrderfile",
195 None,
196 "",
197 "",
198 {
199 "UnverifiedChromeLlvmOrderfile": [
200 "gs://path1",
201 "gs://path2",
202 "gs://path3",
203 ],
204 },
205 {"chrome_cwp_profile": "CWPVERSION", "image_build_id": 1234},
206 )
LaMont Jonese7821672020-04-09 08:56:26 -0600207
Alex Klein1699fab2022-09-08 08:46:06 -0600208 def testHandlesDuplicateInputArtifacts(self):
209 request = toolchain_pb2.PrepareForToolchainBuildRequest(
210 artifact_types=[
211 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
212 ],
213 chroot=None,
214 sysroot=None,
215 input_artifacts=[
216 BuilderConfig.Artifacts.InputArtifactInfo(
217 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
218 input_artifact_gs_locations=["path1", "path2"],
219 ),
220 BuilderConfig.Artifacts.InputArtifactInfo(
221 input_artifact_type=BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
222 input_artifact_gs_locations=["path3"],
223 ),
224 ],
225 )
226 toolchain.PrepareForBuild(request, self.response, self.api_config)
227 self.prep.assert_called_once_with(
228 "UnverifiedChromeLlvmOrderfile",
229 None,
230 "",
231 "",
232 {
233 "UnverifiedChromeLlvmOrderfile": [
234 "gs://path1",
235 "gs://path2",
236 "gs://path3",
237 ],
238 },
239 {},
240 )
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700241
242
Alex Klein1699fab2022-09-08 08:46:06 -0600243class BundleToolchainTest(
244 cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin
245):
246 """Unittests for BundleToolchain."""
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700247
Alex Klein1699fab2022-09-08 08:46:06 -0600248 def setUp(self):
249 self.response = toolchain_pb2.BundleToolchainResponse()
250 self.prep = self.PatchObject(
251 toolchain_util,
252 "PrepareForBuild",
253 return_value=toolchain_util.PrepareForBuildReturn.NEEDED,
254 )
255 self.bundle = self.PatchObject(
256 toolchain_util, "BundleArtifacts", return_value=[]
257 )
258 self.PatchObject(
259 toolchain,
260 "_TOOLCHAIN_ARTIFACT_HANDLERS",
261 {
262 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE: toolchain._Handlers(
263 "UnverifiedChromeLlvmOrderfile", self.prep, self.bundle
264 ),
265 },
266 )
267 osutils.WriteFile(os.path.join(self.tempdir, "artifact.txt"), "test")
268 osutils.Touch(os.path.join(self.tempdir, "empty"))
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700269
Alex Klein1699fab2022-09-08 08:46:06 -0600270 def _GetRequest(self, artifact_types=None):
271 chroot = common_pb2.Chroot(path=str(self.tempdir))
272 sysroot = sysroot_pb2.Sysroot(
273 path="/build/board",
274 build_target=common_pb2.BuildTarget(name="board"),
275 )
276 return toolchain_pb2.BundleToolchainRequest(
277 chroot=chroot,
278 sysroot=sysroot,
279 output_dir=str(self.tempdir),
280 artifact_types=artifact_types,
281 )
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700282
Alex Klein1699fab2022-09-08 08:46:06 -0600283 def testRaisesForUnknown(self):
284 request = self._GetRequest([BuilderConfig.Artifacts.IMAGE_ARCHIVES])
285 self.assertEqual(
286 controller.RETURN_CODE_UNRECOVERABLE,
287 toolchain.BundleArtifacts(request, self.response, self.api_config),
288 )
Michael Mortensen3232ab32020-01-05 19:14:36 -0700289
Alex Klein1699fab2022-09-08 08:46:06 -0600290 def testValidateOnly(self):
291 """Sanity check that a validate only call does not execute any logic."""
292 request = self._GetRequest(
293 [BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE]
294 )
295 toolchain.BundleArtifacts(
296 request, self.response, self.validate_only_config
297 )
298 self.bundle.assert_not_called()
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700299
Alex Klein1699fab2022-09-08 08:46:06 -0600300 def testSetsArtifactsInfo(self):
301 request = self._GetRequest(
302 [BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE]
303 )
304 self.bundle.return_value = ["artifact.txt", "empty", "does_not_exist"]
305 toolchain.BundleArtifacts(request, self.response, self.api_config)
306 self.assertEqual(1, len(self.response.artifacts_info))
307 self.assertEqual(
308 self.response.artifacts_info[0],
309 toolchain_pb2.ArtifactInfo(
310 artifact_type=(
311 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
312 ),
313 artifacts=[
314 artifacts_pb2.Artifact(path=self.bundle.return_value[0])
315 ],
316 ),
317 )
Tiancong Wangd5214132021-01-12 10:43:57 -0800318
319
Alex Klein1699fab2022-09-08 08:46:06 -0600320class GetUpdatedFilesTest(
321 cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin
322):
323 """Unittests for GetUpdatedFiles."""
Tiancong Wangd5214132021-01-12 10:43:57 -0800324
Alex Klein1699fab2022-09-08 08:46:06 -0600325 def setUp(self):
326 self.response = toolchain_pb2.GetUpdatedFilesResponse()
327 self.artifact_path = "/any/path/to/metadata"
328 self.profile_info = common_pb2.ArtifactProfileInfo(kernel_version="4.4")
329 self.update = self.PatchObject(
330 toolchain_util, "GetUpdatedFiles", return_value=([], "")
331 )
Tiancong Wangd5214132021-01-12 10:43:57 -0800332
Alex Klein1699fab2022-09-08 08:46:06 -0600333 def _GetRequest(self, uploaded_artifacts):
334 uploaded = []
335 for artifact_type, artifact_path, profile_info in uploaded_artifacts:
336 uploaded.append(
337 toolchain_pb2.GetUpdatedFilesRequest.UploadedArtifacts(
338 artifact_info=toolchain_pb2.ArtifactInfo(
339 artifact_type=artifact_type,
340 artifacts=[artifacts_pb2.Artifact(path=artifact_path)],
341 ),
342 profile_info=profile_info,
343 )
344 )
345 return toolchain_pb2.GetUpdatedFilesRequest(uploaded_artifacts=uploaded)
Tiancong Wangd5214132021-01-12 10:43:57 -0800346
Alex Klein1699fab2022-09-08 08:46:06 -0600347 def testRaisesForUnknown(self):
348 request = self._GetRequest(
349 [
350 (
351 BuilderConfig.Artifacts.UNVERIFIED_KERNEL_CWP_AFDO_FILE,
352 self.artifact_path,
353 self.profile_info,
354 )
355 ]
356 )
357 self.assertEqual(
358 controller.RETURN_CODE_UNRECOVERABLE,
359 toolchain.GetUpdatedFiles(request, self.response, self.api_config),
360 )
Tiancong Wangd5214132021-01-12 10:43:57 -0800361
Alex Klein1699fab2022-09-08 08:46:06 -0600362 def testValidateOnly(self):
363 """Sanity check that a validate only call does not execute any logic."""
364 request = self._GetRequest(
365 [
366 (
367 BuilderConfig.Artifacts.VERIFIED_KERNEL_CWP_AFDO_FILE,
368 self.artifact_path,
369 self.profile_info,
370 )
371 ]
372 )
373 toolchain.GetUpdatedFiles(
374 request, self.response, self.validate_only_config
375 )
Tiancong Wangd5214132021-01-12 10:43:57 -0800376
Alex Klein1699fab2022-09-08 08:46:06 -0600377 def testUpdateSuccess(self):
378 updated_file = "/path/to/updated_file"
379 self.update.return_value = ([updated_file], "Commit Message")
380 request = self._GetRequest(
381 [
382 (
383 BuilderConfig.Artifacts.VERIFIED_KERNEL_CWP_AFDO_FILE,
384 self.artifact_path,
385 self.profile_info,
386 )
387 ]
388 )
389 toolchain.GetUpdatedFiles(request, self.response, self.api_config)
390 print(self.response.updated_files)
391 self.assertEqual(len(self.response.updated_files), 1)
392 self.assertEqual(
393 self.response.updated_files[0],
394 toolchain_pb2.GetUpdatedFilesResponse.UpdatedFile(
395 path=updated_file
396 ),
397 )
398 self.assertIn("Commit Message", self.response.commit_message)
399 self.assertEqual(len(self.response.commit_footer), 0)
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000400
401
Alex Klein1699fab2022-09-08 08:46:06 -0600402class GetToolchainsForBoardTest(
403 cros_test_lib.MockTempDirTestCase, api_config.ApiConfigMixin
404):
405 """Unittests for GetToolchainsForBoard."""
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000406
Alex Klein1699fab2022-09-08 08:46:06 -0600407 def setUp(self):
408 self.response = toolchain_pb2.ToolchainsResponse()
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000409
Alex Klein1699fab2022-09-08 08:46:06 -0600410 def _GetRequest(self, board="betty-pi-arc"):
411 return toolchain_pb2.ToolchainsRequest(board=board)
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000412
Alex Klein1699fab2022-09-08 08:46:06 -0600413 def testValidateOnly(self):
414 """Confidence check that a validate only call does not execute any logic."""
415 request = self._GetRequest()
416 toolchain.GetToolchainsForBoard(
417 request, self.response, self.validate_only_config
418 )
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000419
Alex Klein1699fab2022-09-08 08:46:06 -0600420 def testUpdateSuccess(self):
421 toolchain_info = {
422 "default-a": {"default": True},
423 "default-b": {"default": True},
424 "nondefault-a": {"default": False},
425 "nondefault-b": {"default": False},
426 }
427 self.PatchObject(
428 toolchain_lib, "GetToolchainsForBoard", return_value=toolchain_info
429 )
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000430
Alex Klein1699fab2022-09-08 08:46:06 -0600431 request = self._GetRequest()
432 toolchain.GetToolchainsForBoard(request, self.response, self.api_config)
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000433
Alex Klein1699fab2022-09-08 08:46:06 -0600434 self.assertEqual(
435 self.response.default_toolchains, ["default-a", "default-b"]
436 )
437 self.assertEqual(
438 self.response.nondefault_toolchains,
439 ["nondefault-a", "nondefault-b"],
440 )