blob: 4029ad961d1949dea5d8aebc12337201c6847310 [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 Jonesb20b3d92019-11-23 11:47:48 -070015from chromite.api.gen.chromiumos.builder_config_pb2 import BuilderConfig
LaMont Jones4579e8c2019-12-06 14:20:37 -070016from chromite.api.gen.chromiumos import common_pb2
Tiancong Wangaf050172019-07-10 11:52:03 -070017
Tiancong Wang24a3df72019-08-20 15:48:51 -070018from chromite.lib import cros_build_lib
Tiancong Wangaf050172019-07-10 11:52:03 -070019from chromite.lib import cros_test_lib
Alex Kleincd03a5e2021-10-18 13:23:47 -060020from chromite.lib import osutils
Tiancong Wangaf050172019-07-10 11:52:03 -070021from chromite.lib import toolchain_util
22
LaMont Jones5d2edcb2019-12-23 11:32:03 -070023# pylint: disable=protected-access
Tiancong Wangaf050172019-07-10 11:52:03 -070024
Tiancong Wangba2a1c22021-01-19 10:45:06 -080025
Tiancong Wang24a3df72019-08-20 15:48:51 -070026class UpdateEbuildWithAFDOArtifactsTest(cros_test_lib.MockTestCase,
27 api_config.ApiConfigMixin):
28 """Unittests for UpdateEbuildWithAFDOArtifacts."""
29
30 @staticmethod
31 def mock_die(message, *args):
32 raise cros_build_lib.DieSystemExit(message % args)
Tiancong Wangaf050172019-07-10 11:52:03 -070033
34 def setUp(self):
Tiancong Wangaf050172019-07-10 11:52:03 -070035 self.board = 'board'
Tiancong Wang24a3df72019-08-20 15:48:51 -070036 self.response = toolchain_pb2.VerifyAFDOArtifactsResponse()
37 self.invalid_artifact_type = toolchain_pb2.BENCHMARK_AFDO
Tiancong Wang24a3df72019-08-20 15:48:51 -070038 self.PatchObject(cros_build_lib, 'Die', new=self.mock_die)
39
40 def _GetRequest(self, build_target=None, artifact_type=None):
41 return toolchain_pb2.VerifyAFDOArtifactsRequest(
42 build_target={'name': build_target},
43 artifact_type=artifact_type,
44 )
Tiancong Wangaf050172019-07-10 11:52:03 -070045
LaMont Jonesb20b3d92019-11-23 11:47:48 -070046
LaMont Jones4579e8c2019-12-06 14:20:37 -070047class PrepareForBuildTest(cros_test_lib.MockTempDirTestCase,
LaMont Jonesb20b3d92019-11-23 11:47:48 -070048 api_config.ApiConfigMixin):
49 """Unittests for PrepareForBuild."""
50
51 def setUp(self):
52 self.response = toolchain_pb2.PrepareForToolchainBuildResponse()
LaMont Jones5d2edcb2019-12-23 11:32:03 -070053 self.prep = self.PatchObject(
Tiancong Wangba2a1c22021-01-19 10:45:06 -080054 toolchain_util,
55 'PrepareForBuild',
LaMont Jones5d2edcb2019-12-23 11:32:03 -070056 return_value=toolchain_util.PrepareForBuildReturn.NEEDED)
57 self.bundle = self.PatchObject(
58 toolchain_util, 'BundleArtifacts', return_value=[])
Tiancong Wangba2a1c22021-01-19 10:45:06 -080059 self.PatchObject(
60 toolchain, '_TOOLCHAIN_ARTIFACT_HANDLERS', {
61 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE:
62 toolchain._Handlers('UnverifiedChromeLlvmOrderfile', self.prep,
63 self.bundle),
64 })
LaMont Jonesb20b3d92019-11-23 11:47:48 -070065
Tiancong Wangba2a1c22021-01-19 10:45:06 -080066 def _GetRequest(self,
67 artifact_types=None,
68 input_artifacts=None,
69 additional_args=None):
LaMont Jones4579e8c2019-12-06 14:20:37 -070070 chroot = common_pb2.Chroot(path=self.tempdir)
71 sysroot = sysroot_pb2.Sysroot(
72 path='/build/board', build_target=common_pb2.BuildTarget(name='board'))
LaMont Jonesb20b3d92019-11-23 11:47:48 -070073 return toolchain_pb2.PrepareForToolchainBuildRequest(
Tiancong Wangba2a1c22021-01-19 10:45:06 -080074 artifact_types=artifact_types,
75 chroot=chroot,
76 sysroot=sysroot,
77 input_artifacts=input_artifacts,
78 additional_args=additional_args)
LaMont Jonesb20b3d92019-11-23 11:47:48 -070079
LaMont Jones5d2edcb2019-12-23 11:32:03 -070080 def testRaisesForUnknown(self):
LaMont Jonesb20b3d92019-11-23 11:47:48 -070081 request = self._GetRequest([BuilderConfig.Artifacts.IMAGE_ARCHIVES])
Tiancong Wangba2a1c22021-01-19 10:45:06 -080082 self.assertRaises(KeyError, toolchain.PrepareForBuild, request,
83 self.response, self.api_config)
LaMont Jones5d2edcb2019-12-23 11:32:03 -070084
85 def testAcceptsNone(self):
86 request = toolchain_pb2.PrepareForToolchainBuildRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -070087 artifact_types=[
Tiancong Wangba2a1c22021-01-19 10:45:06 -080088 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
89 ],
90 chroot=None,
91 sysroot=None)
LaMont Jonesb20b3d92019-11-23 11:47:48 -070092 toolchain.PrepareForBuild(request, self.response, self.api_config)
Tiancong Wangba2a1c22021-01-19 10:45:06 -080093 self.prep.assert_called_once_with('UnverifiedChromeLlvmOrderfile', None, '',
94 '', {}, {})
LaMont Jones5d2edcb2019-12-23 11:32:03 -070095
96 def testHandlesUnknownInputArtifacts(self):
97 request = toolchain_pb2.PrepareForToolchainBuildRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -070098 artifact_types=[
Tiancong Wangba2a1c22021-01-19 10:45:06 -080099 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE
100 ],
101 chroot=None,
102 sysroot=None,
103 input_artifacts=[
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700104 BuilderConfig.Artifacts.InputArtifactInfo(
105 input_artifact_type=BuilderConfig.Artifacts.IMAGE_ZIP,
106 input_artifact_gs_locations=['path1']),
107 ])
108 toolchain.PrepareForBuild(request, self.response, self.api_config)
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800109 self.prep.assert_called_once_with('UnverifiedChromeLlvmOrderfile', None, '',
110 '', {}, {})
LaMont Jones45ca6c42020-02-05 09:39:09 -0700111
LaMont Jonese7821672020-04-09 08:56:26 -0600112 def testPassesProfileInfo(self):
LaMont Jones45ca6c42020-02-05 09:39:09 -0700113 request = toolchain_pb2.PrepareForToolchainBuildRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700114 artifact_types=[
115 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE],
LaMont Jones45ca6c42020-02-05 09:39:09 -0700116 chroot=None, sysroot=None, input_artifacts=[
117 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400118 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600119 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jones45ca6c42020-02-05 09:39:09 -0700120 input_artifact_gs_locations=['path1', 'path2']),
121 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400122 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600123 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jones45ca6c42020-02-05 09:39:09 -0700124 input_artifact_gs_locations=['path3']),
125 ],
LaMont Jonese7821672020-04-09 08:56:26 -0600126 profile_info=common_pb2.ArtifactProfileInfo(
LaMont Jones45ca6c42020-02-05 09:39:09 -0700127 chrome_cwp_profile='CWPVERSION'),
128 )
129 toolchain.PrepareForBuild(request, self.response, self.api_config)
130 self.prep.assert_called_once_with(
LaMont Jonesd3944582020-03-04 10:37:05 -0700131 'UnverifiedChromeLlvmOrderfile', None, '', '', {
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800132 'UnverifiedChromeLlvmOrderfile':
133 ['gs://path1', 'gs://path2', 'gs://path3'],
134 }, {'chrome_cwp_profile': 'CWPVERSION'})
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700135
LaMont Jonese7821672020-04-09 08:56:26 -0600136 def testPassesProfileInfoAfdoRelease(self):
137 request = toolchain_pb2.PrepareForToolchainBuildRequest(
138 artifact_types=[
139 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE],
140 chroot=None, sysroot=None, input_artifacts=[
141 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400142 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600143 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jonese7821672020-04-09 08:56:26 -0600144 input_artifact_gs_locations=['path1', 'path2']),
145 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400146 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600147 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jonese7821672020-04-09 08:56:26 -0600148 input_artifact_gs_locations=['path3']),
149 ],
150 profile_info=common_pb2.ArtifactProfileInfo(
151 afdo_release=common_pb2.AfdoRelease(
152 chrome_cwp_profile='CWPVERSION',
153 image_build_id=1234)),
154 )
155 toolchain.PrepareForBuild(request, self.response, self.api_config)
156 self.prep.assert_called_once_with(
157 'UnverifiedChromeLlvmOrderfile', None, '', '', {
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800158 'UnverifiedChromeLlvmOrderfile':
159 ['gs://path1', 'gs://path2', 'gs://path3'],
160 }, {
161 'chrome_cwp_profile': 'CWPVERSION',
162 'image_build_id': 1234
163 })
LaMont Jonese7821672020-04-09 08:56:26 -0600164
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700165 def testHandlesDuplicateInputArtifacts(self):
166 request = toolchain_pb2.PrepareForToolchainBuildRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700167 artifact_types=[
168 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE],
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700169 chroot=None, sysroot=None, input_artifacts=[
170 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400171 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600172 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700173 input_artifact_gs_locations=['path1', 'path2']),
174 BuilderConfig.Artifacts.InputArtifactInfo(
Mike Frysingerfcca49e2021-03-17 01:09:20 -0400175 input_artifact_type=
Alex Kleincd03a5e2021-10-18 13:23:47 -0600176 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE,
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700177 input_artifact_gs_locations=['path3']),
178 ])
179 toolchain.PrepareForBuild(request, self.response, self.api_config)
180 self.prep.assert_called_once_with(
LaMont Jonesd3944582020-03-04 10:37:05 -0700181 'UnverifiedChromeLlvmOrderfile', None, '', '', {
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800182 'UnverifiedChromeLlvmOrderfile':
183 ['gs://path1', 'gs://path2', 'gs://path3'],
LaMont Jonesd3944582020-03-04 10:37:05 -0700184 }, {})
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700185
186
187class BundleToolchainTest(cros_test_lib.MockTempDirTestCase,
188 api_config.ApiConfigMixin):
189 """Unittests for BundleToolchain."""
190
191 def setUp(self):
192 self.response = toolchain_pb2.BundleToolchainResponse()
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700193 self.prep = self.PatchObject(
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800194 toolchain_util,
195 'PrepareForBuild',
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700196 return_value=toolchain_util.PrepareForBuildReturn.NEEDED)
197 self.bundle = self.PatchObject(
198 toolchain_util, 'BundleArtifacts', return_value=[])
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800199 self.PatchObject(
200 toolchain, '_TOOLCHAIN_ARTIFACT_HANDLERS', {
201 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE:
202 toolchain._Handlers('UnverifiedChromeLlvmOrderfile', self.prep,
203 self.bundle),
204 })
Alex Kleincd03a5e2021-10-18 13:23:47 -0600205 osutils.WriteFile(os.path.join(self.tempdir, 'artifact.txt'), 'test')
206 osutils.Touch(os.path.join(self.tempdir, 'empty'))
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700207
208 def _GetRequest(self, artifact_types=None):
LaMont Jones4579e8c2019-12-06 14:20:37 -0700209 chroot = common_pb2.Chroot(path=self.tempdir)
210 sysroot = sysroot_pb2.Sysroot(
211 path='/build/board', build_target=common_pb2.BuildTarget(name='board'))
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700212 return toolchain_pb2.BundleToolchainRequest(
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800213 chroot=chroot,
214 sysroot=sysroot,
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700215 output_dir=self.tempdir,
LaMont Jones4579e8c2019-12-06 14:20:37 -0700216 artifact_types=artifact_types,
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700217 )
218
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700219 def testRaisesForUnknown(self):
LaMont Jonesb20b3d92019-11-23 11:47:48 -0700220 request = self._GetRequest([BuilderConfig.Artifacts.IMAGE_ARCHIVES])
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700221 self.assertEqual(
222 controller.RETURN_CODE_UNRECOVERABLE,
223 toolchain.BundleArtifacts(request, self.response, self.api_config))
Michael Mortensen3232ab32020-01-05 19:14:36 -0700224
225 def testValidateOnly(self):
226 """Sanity check that a validate only call does not execute any logic."""
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700227 request = self._GetRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700228 [BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE])
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800229 toolchain.BundleArtifacts(request, self.response, self.validate_only_config)
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700230 self.bundle.assert_not_called()
231
232 def testSetsArtifactsInfo(self):
233 request = self._GetRequest(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700234 [BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE])
Alex Kleincd03a5e2021-10-18 13:23:47 -0600235 self.bundle.return_value = ['artifact.txt', 'empty', 'does_not_exist']
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700236 toolchain.BundleArtifacts(request, self.response, self.api_config)
237 self.assertEqual(1, len(self.response.artifacts_info))
238 self.assertEqual(
239 self.response.artifacts_info[0],
240 toolchain_pb2.ArtifactInfo(
LaMont Jonescd1503d2020-03-04 09:09:59 -0700241 artifact_type=(
242 BuilderConfig.Artifacts.UNVERIFIED_CHROME_LLVM_ORDERFILE),
LaMont Jones5d2edcb2019-12-23 11:32:03 -0700243 artifacts=[
Tiancong Wangba2a1c22021-01-19 10:45:06 -0800244 artifacts_pb2.Artifact(path=self.bundle.return_value[0])
245 ]))
Tiancong Wangd5214132021-01-12 10:43:57 -0800246
247
248class GetUpdatedFilesTest(cros_test_lib.MockTempDirTestCase,
249 api_config.ApiConfigMixin):
250 """Unittests for GetUpdatedFiles."""
251
252 def setUp(self):
253 self.response = toolchain_pb2.GetUpdatedFilesResponse()
254 self.artifact_path = '/any/path/to/metadata'
255 self.profile_info = common_pb2.ArtifactProfileInfo(kernel_version='4.4')
256 self.update = self.PatchObject(
257 toolchain_util, 'GetUpdatedFiles', return_value=([], ''))
258
259 def _GetRequest(self, uploaded_artifacts):
260 uploaded = []
261 for artifact_type, artifact_path, profile_info in uploaded_artifacts:
262 uploaded.append(
263 toolchain_pb2.GetUpdatedFilesRequest.UploadedArtifacts(
264 artifact_info=toolchain_pb2.ArtifactInfo(
265 artifact_type=artifact_type,
266 artifacts=[artifacts_pb2.Artifact(path=artifact_path)]),
267 profile_info=profile_info))
268 return toolchain_pb2.GetUpdatedFilesRequest(uploaded_artifacts=uploaded)
269
270 def testRaisesForUnknown(self):
271 request = self._GetRequest([
272 (BuilderConfig.Artifacts.UNVERIFIED_KERNEL_CWP_AFDO_FILE,
273 self.artifact_path, self.profile_info)
274 ])
275 self.assertEqual(
276 controller.RETURN_CODE_UNRECOVERABLE,
277 toolchain.GetUpdatedFiles(request, self.response, self.api_config))
278
279 def testValidateOnly(self):
280 """Sanity check that a validate only call does not execute any logic."""
281 request = self._GetRequest([
282 (BuilderConfig.Artifacts.VERIFIED_KERNEL_CWP_AFDO_FILE,
283 self.artifact_path, self.profile_info)
284 ])
285 toolchain.GetUpdatedFiles(request, self.response, self.validate_only_config)
286
287 def testUpdateSuccess(self):
288 updated_file = '/path/to/updated_file'
289 self.update.return_value = ([updated_file], 'Commit Message')
290 request = self._GetRequest([
291 (BuilderConfig.Artifacts.VERIFIED_KERNEL_CWP_AFDO_FILE,
292 self.artifact_path, self.profile_info)
293 ])
294 toolchain.GetUpdatedFiles(request, self.response, self.api_config)
295 print(self.response.updated_files)
296 self.assertEqual(len(self.response.updated_files), 1)
297 self.assertEqual(
298 self.response.updated_files[0],
299 toolchain_pb2.GetUpdatedFilesResponse.UpdatedFile(path=updated_file),
300 )
301 self.assertIn('Commit Message', self.response.commit_message)
302 self.assertEqual(len(self.response.commit_footer), 0)