blob: 1d1dd09ca926d6c4c063cb8e31071845bbbfc7f9 [file] [log] [blame]
Mike Frysingerf1ba7ad2022-09-12 05:42:57 -04001# Copyright 2021 The ChromiumOS Authors
Michael Mortensen7335e302021-02-23 10:42:56 -07002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
Mike Frysingera2527f82023-02-03 04:32:15 -05004
Michael Mortensen7335e302021-02-23 10:42:56 -07005"""Unittests for Firmware operations."""
6
Michael Mortensen7335e302021-02-23 10:42:56 -07007import os
Mike Frysinger166fea02021-02-12 05:30:33 -05008from unittest import mock
Michael Mortensen7335e302021-02-23 10:42:56 -07009
Michael Mortensen7335e302021-02-23 10:42:56 -070010from chromite.api import api_config
11from chromite.api.controller import firmware
12from chromite.api.gen.chromite.api import firmware_pb2
Andrew Luod08045d2021-06-17 12:06:44 -070013from chromite.api.gen.chromiumos import common_pb2
Michael Mortensen7335e302021-02-23 10:42:56 -070014from chromite.lib import constants
Michael Mortensen7335e302021-02-23 10:42:56 -070015from chromite.lib import cros_test_lib
16
17
Alex Klein1699fab2022-09-08 08:46:06 -060018class BuildAllFirmwareTestCase(
Mike Frysinger5d85a542023-07-06 16:05:54 -040019 cros_test_lib.RunCommandTempDirTestCase, api_config.ApiConfigMixin
Alex Klein1699fab2022-09-08 08:46:06 -060020):
21 """BuildAllFirmware tests."""
Michael Mortensen7335e302021-02-23 10:42:56 -070022
Alex Klein1699fab2022-09-08 08:46:06 -060023 def setUp(self):
24 self.chroot_path = "/path/to/chroot"
Michael Mortensen7335e302021-02-23 10:42:56 -070025
Alex Klein1699fab2022-09-08 08:46:06 -060026 def _GetInput(
27 self,
28 chroot_path=None,
29 fw_location=common_pb2.PLATFORM_EC,
30 code_coverage=False,
31 ):
32 """Helper for creating input message."""
33 proto = firmware_pb2.BuildAllFirmwareRequest(
34 firmware_location=fw_location,
35 chroot={"path": chroot_path},
36 code_coverage=code_coverage,
37 )
38 return proto
Michael Mortensen7335e302021-02-23 10:42:56 -070039
Alex Klein1699fab2022-09-08 08:46:06 -060040 def testBuildAllFirmware(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -070041 """Test endpoint by verifying call to cros_build_lib.run."""
Alex Klein1699fab2022-09-08 08:46:06 -060042 for fw_loc in common_pb2.FwLocation.values():
43 fw_path = firmware.get_fw_loc(fw_loc)
44 if not fw_path:
45 continue
46 request = self._GetInput(
47 chroot_path=self.chroot_path,
48 fw_location=fw_loc,
49 code_coverage=True,
50 )
Alex Klein1699fab2022-09-08 08:46:06 -060051 response = firmware_pb2.BuildAllFirmwareResponse()
52 # Call the method under test.
53 firmware.BuildAllFirmware(request, response, self.api_config)
Alex Kleinab87ceb2023-01-24 12:00:51 -070054 # Because we mock out the function, we verify that it is called as
55 # we expect it to be called.
Alex Klein1699fab2022-09-08 08:46:06 -060056 called_function = os.path.join(
57 constants.SOURCE_ROOT, fw_path, "firmware_builder.py"
58 )
Mike Frysinger5d85a542023-07-06 16:05:54 -040059 self.rc.assertCommandCalled(
Alex Klein1699fab2022-09-08 08:46:06 -060060 [
61 called_function,
62 "--metrics",
63 mock.ANY,
64 "--code-coverage",
65 "build",
66 ],
67 check=False,
68 )
Michael Mortensen7335e302021-02-23 10:42:56 -070069
Alex Klein1699fab2022-09-08 08:46:06 -060070 def testValidateOnly(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -070071 """Verify a validate-only call does not execute any logic."""
Alex Klein1699fab2022-09-08 08:46:06 -060072 for fw_loc in common_pb2.FwLocation.values():
73 if not firmware.get_fw_loc(fw_loc):
74 continue
75 request = self._GetInput(
76 chroot_path=self.chroot_path,
77 fw_location=fw_loc,
78 code_coverage=True,
79 )
80 response = firmware_pb2.BuildAllFirmwareResponse()
81 firmware.BuildAllFirmware(
82 request, response, self.validate_only_config
83 )
Mike Frysinger5d85a542023-07-06 16:05:54 -040084 self.assertFalse(self.rc.called)
Michael Mortensen515c8892021-02-26 15:37:59 -070085
Alex Klein1699fab2022-09-08 08:46:06 -060086 def testMockCall(self):
Alex Kleinab87ceb2023-01-24 12:00:51 -070087 """Test a mock call does not execute logic, returns mocked value."""
Alex Klein1699fab2022-09-08 08:46:06 -060088 for fw_loc in common_pb2.FwLocation.values():
89 if not firmware.get_fw_loc(fw_loc):
90 continue
91 request = self._GetInput(
92 chroot_path=self.chroot_path,
93 fw_location=fw_loc,
94 code_coverage=True,
95 )
96 response = firmware_pb2.BuildAllFirmwareResponse()
97 firmware.BuildAllFirmware(request, response, self.mock_call_config)
Mike Frysinger5d85a542023-07-06 16:05:54 -040098 self.assertFalse(self.rc.called)
Alex Klein1699fab2022-09-08 08:46:06 -060099 self.assertEqual(len(response.metrics.value), 1)
100 self.assertEqual(response.metrics.value[0].target_name, "foo")
101 self.assertEqual(response.metrics.value[0].platform_name, "bar")
102 self.assertEqual(len(response.metrics.value[0].fw_section), 1)
103 self.assertEqual(
104 response.metrics.value[0].fw_section[0].region, "EC_RO"
105 )
106 self.assertEqual(response.metrics.value[0].fw_section[0].used, 100)
107 self.assertEqual(response.metrics.value[0].fw_section[0].total, 150)