blob: 8a7dabe86e4094789bc7e42d0fafd24deeff9e21 [file] [log] [blame]
Tiancong Wangaf050172019-07-10 11:52:03 -07001# 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 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
Tiancong Wang24a3df72019-08-20 15:48:51 -070027class UpdateEbuildWithAFDOArtifactsTest(cros_test_lib.MockTestCase,
28 api_config.ApiConfigMixin):
29 """Unittests for UpdateEbuildWithAFDOArtifacts."""
30
31 @staticmethod
32 def mock_die(message, *args):
33 raise cros_build_lib.DieSystemExit(message % args)
Tiancong Wangaf050172019-07-10 11:52:03 -070034
35 def setUp(self):
Tiancong Wangaf050172019-07-10 11:52:03 -070036 self.board = 'board'
Tiancong Wang24a3df72019-08-20 15:48:51 -070037 self.response = toolchain_pb2.VerifyAFDOArtifactsResponse()
38 self.invalid_artifact_type = toolchain_pb2.BENCHMARK_AFDO
Tiancong Wang24a3df72019-08-20 15:48:51 -070039 self.PatchObject(cros_build_lib, 'Die', new=self.mock_die)
40
41 def _GetRequest(self, build_target=None, artifact_type=None):
42 return toolchain_pb2.VerifyAFDOArtifactsRequest(
43 build_target={'name': build_target},
44 artifact_type=artifact_type,
45 )
Tiancong Wangaf050172019-07-10 11:52:03 -070046
LaMont Jonesb20b3d92019-11-23 11:47:48 -070047
LaMont Jones4579e8c2019-12-06 14:20:37 -070048class PrepareForBuildTest(cros_test_lib.MockTempDirTestCase,
LaMont Jonesb20b3d92019-11-23 11:47:48 -070049 api_config.ApiConfigMixin):
50 """Unittests for PrepareForBuild."""
51
52 def setUp(self):
53 self.response = toolchain_pb2.PrepareForToolchainBuildResponse()
LaMont Jones5d2edcb2019-12-23 11:32:03 -070054 self.prep = self.PatchObject(
Tiancong Wangba2a1c22021-01-19 10:45:06 -080055 toolchain_util,
56 'PrepareForBuild',
LaMont Jones5d2edcb2019-12-23 11:32:03 -070057 return_value=toolchain_util.PrepareForBuildReturn.NEEDED)
58 self.bundle = self.PatchObject(
59 toolchain_util, 'BundleArtifacts', return_value=[])
Tiancong Wangba2a1c22021-01-19 10:45:06 -080060 self.PatchObject(
61 toolchain, '_TOOLCHAIN_ARTIFACT_HANDLERS', {
62 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE:
63 toolchain._Handlers('UnverifiedChromeLlvmOrderfile', self.prep,
64 self.bundle),
65 })
LaMont Jonesb20b3d92019-11-23 11:47:48 -070066
Tiancong Wangba2a1c22021-01-19 10:45:06 -080067 def _GetRequest(self,
68 artifact_types=None,
69 input_artifacts=None,
70 additional_args=None):
Mike Frysinger3bb61cb2022-04-14 16:07:44 -040071 chroot = common_pb2.Chroot(path=str(self.tempdir))
LaMont Jones4579e8c2019-12-06 14:20:37 -070072 sysroot = sysroot_pb2.Sysroot(
73 path='/build/board', build_target=common_pb2.BuildTarget(name='board'))
LaMont Jonesb20b3d92019-11-23 11:47:48 -070074 return toolchain_pb2.PrepareForToolchainBuildRequest(
Tiancong Wangba2a1c22021-01-19 10:45:06 -080075 artifact_types=artifact_types,
76 chroot=chroot,
77 sysroot=sysroot,
78 input_artifacts=input_artifacts,
79 additional_args=additional_args)
LaMont Jonesb20b3d92019-11-23 11:47:48 -070080
LaMont Jones5d2edcb2019-12-23 11:32:03 -070081 def testRaisesForUnknown(self):
LaMont Jonesb20b3d92019-11-23 11:47:48 -070082 request = self._GetRequest([BuilderConfig.Artifacts.IMAGE_ARCHIVES])
Tiancong Wangba2a1c22021-01-19 10:45:06 -080083 self.assertRaises(KeyError, toolchain.PrepareForBuild, request,
84 self.response, self.api_config)
LaMont Jones5d2edcb2019-12-23 11:32:03 -070085
86 def testAcceptsNone(self):
87 request = toolchain_pb2.PrepareForToolchainBuildRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -070088 artifact_types=[
Tiancong Wangba2a1c22021-01-19 10:45:06 -080089 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
90 ],
91 chroot=None,
92 sysroot=None)
LaMont Jonesb20b3d92019-11-23 11:47:48 -070093 toolchain.PrepareForBuild(request, self.response, self.api_config)
Tiancong Wangba2a1c22021-01-19 10:45:06 -080094 self.prep.assert_called_once_with('UnverifiedChromeLlvmOrderfile', None, '',
95 '', {}, {})
LaMont Jones5d2edcb2019-12-23 11:32:03 -070096
97 def testHandlesUnknownInputArtifacts(self):
98 request = toolchain_pb2.PrepareForToolchainBuildRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -070099 artifact_types=[
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800100 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
101 ],
102 chroot=None,
103 sysroot=None,
104 input_artifacts=[
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700105 BuilderConfig.Artifacts.InputArtifactInfo(
106 input_artifact_type=BuilderConfig.Artifacts.IMAGE_ZIP,
107 input_artifact_gs_locations=['path1']),
108 ])
109 toolchain.PrepareForBuild(request, self.response, self.api_config)
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800110 self.prep.assert_called_once_with('UnverifiedChromeLlvmOrderfile', None, '',
111 '', {}, {})
LaMont Jones45ca6c42020-02-05 09:39:09 -0700112
LaMont Jonese7821672020-04-09 08:56:26 -0600113 def testPassesProfileInfo(self):
LaMont Jones45ca6c42020-02-05 09:39:09 -0700114 request = toolchain_pb2.PrepareForToolchainBuildRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700115 artifact_types=[
116 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE],
LaMont Jones45ca6c42020-02-05 09:39:09 -0700117 chroot=None, sysroot=None, input_artifacts=[
118 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400119 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600120 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jones45ca6c42020-02-05 09:39:09 -0700121 input_artifact_gs_locations=['path1', 'path2']),
122 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400123 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600124 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jones45ca6c42020-02-05 09:39:09 -0700125 input_artifact_gs_locations=['path3']),
126 ],
LaMont Jonese7821672020-04-09 08:56:26 -0600127 profile_info=common_pb2.ArtifactProfileInfo(
LaMont Jones45ca6c42020-02-05 09:39:09 -0700128 chrome_cwp_profile='CWPVERSION'),
129 )
130 toolchain.PrepareForBuild(request, self.response, self.api_config)
131 self.prep.assert_called_once_with(
LaMont Jonesd3944582020-03-04 10:37:05 -0700132 'UnverifiedChromeLlvmOrderfile', None, '', '', {
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800133 'UnverifiedChromeLlvmOrderfile':
134 ['gs://path1', 'gs://path2', 'gs://path3'],
135 }, {'chrome_cwp_profile': 'CWPVERSION'})
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700136
LaMont Jonese7821672020-04-09 08:56:26 -0600137 def testPassesProfileInfoAfdoRelease(self):
138 request = toolchain_pb2.PrepareForToolchainBuildRequest(
139 artifact_types=[
140 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE],
141 chroot=None, sysroot=None, input_artifacts=[
142 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400143 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600144 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jonese7821672020-04-09 08:56:26 -0600145 input_artifact_gs_locations=['path1', 'path2']),
146 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400147 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600148 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jonese7821672020-04-09 08:56:26 -0600149 input_artifact_gs_locations=['path3']),
150 ],
151 profile_info=common_pb2.ArtifactProfileInfo(
152 afdo_release=common_pb2.AfdoRelease(
153 chrome_cwp_profile='CWPVERSION',
154 image_build_id=1234)),
155 )
156 toolchain.PrepareForBuild(request, self.response, self.api_config)
157 self.prep.assert_called_once_with(
158 'UnverifiedChromeLlvmOrderfile', None, '', '', {
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800159 'UnverifiedChromeLlvmOrderfile':
160 ['gs://path1', 'gs://path2', 'gs://path3'],
161 }, {
162 'chrome_cwp_profile': 'CWPVERSION',
163 'image_build_id': 1234
164 })
LaMont Jonese7821672020-04-09 08:56:26 -0600165
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700166 def testHandlesDuplicateInputArtifacts(self):
167 request = toolchain_pb2.PrepareForToolchainBuildRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700168 artifact_types=[
169 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE],
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700170 chroot=None, sysroot=None, input_artifacts=[
171 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400172 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600173 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700174 input_artifact_gs_locations=['path1', 'path2']),
175 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400176 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600177 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700178 input_artifact_gs_locations=['path3']),
179 ])
180 toolchain.PrepareForBuild(request, self.response, self.api_config)
181 self.prep.assert_called_once_with(
LaMont Jonesd3944582020-03-04 10:37:05 -0700182 'UnverifiedChromeLlvmOrderfile', None, '', '', {
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800183 'UnverifiedChromeLlvmOrderfile':
184 ['gs://path1', 'gs://path2', 'gs://path3'],
LaMont Jonesd3944582020-03-04 10:37:05 -0700185 }, {})
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700186
187
188class BundleToolchainTest(cros_test_lib.MockTempDirTestCase,
189 api_config.ApiConfigMixin):
190 """Unittests for BundleToolchain."""
191
192 def setUp(self):
193 self.response = toolchain_pb2.BundleToolchainResponse()
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700194 self.prep = self.PatchObject(
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800195 toolchain_util,
196 'PrepareForBuild',
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700197 return_value=toolchain_util.PrepareForBuildReturn.NEEDED)
198 self.bundle = self.PatchObject(
199 toolchain_util, 'BundleArtifacts', return_value=[])
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800200 self.PatchObject(
201 toolchain, '_TOOLCHAIN_ARTIFACT_HANDLERS', {
202 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE:
203 toolchain._Handlers('UnverifiedChromeLlvmOrderfile', self.prep,
204 self.bundle),
205 })
Alex Kleincd03a5e2021-10-18 13:23:47 -0600206 osutils.WriteFile(os.path.join(self.tempdir, 'artifact.txt'), 'test')
207 osutils.Touch(os.path.join(self.tempdir, 'empty'))
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700208
209 def _GetRequest(self, artifact_types=None):
Mike Frysinger3bb61cb2022-04-14 16:07:44 -0400210 chroot = common_pb2.Chroot(path=str(self.tempdir))
LaMont Jones4579e8c2019-12-06 14:20:37 -0700211 sysroot = sysroot_pb2.Sysroot(
212 path='/build/board', build_target=common_pb2.BuildTarget(name='board'))
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700213 return toolchain_pb2.BundleToolchainRequest(
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800214 chroot=chroot,
215 sysroot=sysroot,
Mike Frysinger3bb61cb2022-04-14 16:07:44 -0400216 output_dir=str(self.tempdir),
LaMont Jones4579e8c2019-12-06 14:20:37 -0700217 artifact_types=artifact_types,
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700218 )
219
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700220 def testRaisesForUnknown(self):
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700221 request = self._GetRequest([BuilderConfig.Artifacts.IMAGE_ARCHIVES])
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700222 self.assertEqual(
223 controller.RETURN_CODE_UNRECOVERABLE,
224 toolchain.BundleArtifacts(request, self.response, self.api_config))
Michael Mortensen3232ab32020-01-05 19:14:36 -0700225
226 def testValidateOnly(self):
227 """Sanity check that a validate only call does not execute any logic."""
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700228 request = self._GetRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700229 [BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE])
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800230 toolchain.BundleArtifacts(request, self.response, self.validate_only_config)
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700231 self.bundle.assert_not_called()
232
233 def testSetsArtifactsInfo(self):
234 request = self._GetRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700235 [BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE])
Alex Kleincd03a5e2021-10-18 13:23:47 -0600236 self.bundle.return_value = ['artifact.txt', 'empty', 'does_not_exist']
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700237 toolchain.BundleArtifacts(request, self.response, self.api_config)
238 self.assertEqual(1, len(self.response.artifacts_info))
239 self.assertEqual(
240 self.response.artifacts_info[0],
241 toolchain_pb2.ArtifactInfo(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700242 artifact_type=(
243 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE),
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700244 artifacts=[
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800245 artifacts_pb2.Artifact(path=self.bundle.return_value[0])
246 ]))
Tiancong Wangd5214132021-01-12 10:43:57 -0800247
248
249class GetUpdatedFilesTest(cros_test_lib.MockTempDirTestCase,
250 api_config.ApiConfigMixin):
251 """Unittests for GetUpdatedFiles."""
252
253 def setUp(self):
254 self.response = toolchain_pb2.GetUpdatedFilesResponse()
255 self.artifact_path = '/any/path/to/metadata'
256 self.profile_info = common_pb2.ArtifactProfileInfo(kernel_version='4.4')
257 self.update = self.PatchObject(
258 toolchain_util, 'GetUpdatedFiles', return_value=([], ''))
259
260 def _GetRequest(self, uploaded_artifacts):
261 uploaded = []
262 for artifact_type, artifact_path, profile_info in uploaded_artifacts:
263 uploaded.append(
264 toolchain_pb2.GetUpdatedFilesRequest.UploadedArtifacts(
265 artifact_info=toolchain_pb2.ArtifactInfo(
266 artifact_type=artifact_type,
267 artifacts=[artifacts_pb2.Artifact(path=artifact_path)]),
268 profile_info=profile_info))
269 return toolchain_pb2.GetUpdatedFilesRequest(uploaded_artifacts=uploaded)
270
271 def testRaisesForUnknown(self):
272 request = self._GetRequest([
273 (BuilderConfig.Artifacts.UNVERIFIED_KERNEL_CWP_AFDO_FILE,
274 self.artifact_path, self.profile_info)
275 ])
276 self.assertEqual(
277 controller.RETURN_CODE_UNRECOVERABLE,
278 toolchain.GetUpdatedFiles(request, self.response, self.api_config))
279
280 def testValidateOnly(self):
281 """Sanity check that a validate only call does not execute any logic."""
282 request = self._GetRequest([
283 (BuilderConfig.Artifacts.VERIFIED_KERNEL_CWP_AFDO_FILE,
284 self.artifact_path, self.profile_info)
285 ])
286 toolchain.GetUpdatedFiles(request, self.response, self.validate_only_config)
287
288 def testUpdateSuccess(self):
289 updated_file = '/path/to/updated_file'
290 self.update.return_value = ([updated_file], 'Commit Message')
291 request = self._GetRequest([
292 (BuilderConfig.Artifacts.VERIFIED_KERNEL_CWP_AFDO_FILE,
293 self.artifact_path, self.profile_info)
294 ])
295 toolchain.GetUpdatedFiles(request, self.response, self.api_config)
296 print(self.response.updated_files)
297 self.assertEqual(len(self.response.updated_files), 1)
298 self.assertEqual(
299 self.response.updated_files[0],
300 toolchain_pb2.GetUpdatedFilesResponse.UpdatedFile(path=updated_file),
301 )
302 self.assertIn('Commit Message', self.response.commit_message)
303 self.assertEqual(len(self.response.commit_footer), 0)
Jack Neus4ee7b1d2022-06-27 19:54:18 +0000304
305
306class GetToolchainsForBoardTest(cros_test_lib.MockTempDirTestCase,
307 api_config.ApiConfigMixin):
308 """Unittests for GetToolchainsForBoard."""
309
310 def setUp(self):
311 self.response = toolchain_pb2.ToolchainsResponse()
312
313 def _GetRequest(self, board='betty-pi-arc'):
314 return toolchain_pb2.ToolchainsRequest(board=board)
315
316 def testValidateOnly(self):
317 """Confidence check that a validate only call does not execute any logic."""
318 request = self._GetRequest()
319 toolchain.GetToolchainsForBoard(request, self.response,
320 self.validate_only_config)
321
322 def testUpdateSuccess(self):
323 toolchain_info = {
324 'default-a': {'default': True},
325 'default-b': {'default': True},
326 'nondefault-a': {'default': False},
327 'nondefault-b': {'default': False},
328 }
329 self.PatchObject(toolchain_lib, 'GetToolchainsForBoard',
330 return_value=toolchain_info)
331
332 request = self._GetRequest()
333 toolchain.GetToolchainsForBoard(request, self.response, self.api_config)
334
335 self.assertEqual(self.response.default_toolchains,
336 ['default-a', 'default-b'])
337 self.assertEqual(self.response.nondefault_toolchains,
338 ['nondefault-a', 'nondefault-b'])