blob: 9b86630d9454c25404caa4a90fe52a8df738536f [file] [log] [blame]
George Engelbrechtfe63c8c2019-08-31 22:51:29 -06001# 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"""Payload operations."""
6
George Engelbrechtfe63c8c2019-08-31 22:51:29 -06007from chromite.api import api_config
8from chromite.api import controller
9from chromite.api.controller import payload
10from chromite.api.gen.chromite.api import payload_pb2
11from chromite.api.gen.chromiumos import common_pb2
12from chromite.lib import cros_test_lib
13from chromite.lib.paygen import paygen_payload_lib
14
15
Alex Kleinc07a48b2022-08-26 15:58:44 -060016class PayloadApiTests(cros_test_lib.MockTempDirTestCase,
17 api_config.ApiConfigMixin):
George Engelbrecht52d0dba2020-11-12 11:49:02 -070018 """Unittests for PayloadApi."""
George Engelbrechtfe63c8c2019-08-31 22:51:29 -060019
20 def setUp(self):
Alex Klein10b9fed2020-09-23 14:56:18 -060021 self.response = payload_pb2.GenerationResponse()
George Engelbrechtfe63c8c2019-08-31 22:51:29 -060022
23 src_build = payload_pb2.Build(version='1.0.0', bucket='test',
24 channel='test-channel', build_target=
25 common_pb2.BuildTarget(name='cave'))
26
27 src_image = payload_pb2.UnsignedImage(
28 build=src_build, image_type=6, milestone='R70')
29
30 tgt_build = payload_pb2.Build(version='2.0.0', bucket='test',
31 channel='test-channel', build_target=
32 common_pb2.BuildTarget(name='cave'))
33
34 tgt_image = payload_pb2.UnsignedImage(
35 build=tgt_build, image_type=6, milestone='R70')
36
Alex Klein10b9fed2020-09-23 14:56:18 -060037 self.req = payload_pb2.GenerationRequest(
Navil Perezf5482be2020-04-09 23:18:14 -060038 tgt_unsigned_image=tgt_image,
39 src_unsigned_image=src_image,
40 bucket='test-destination-bucket',
41 verify=True,
42 keyset='update_signer',
43 dryrun=False)
George Engelbrechtfe63c8c2019-08-31 22:51:29 -060044
Greg Edelston629468c2022-02-11 14:54:56 -070045 self.minios_req = payload_pb2.GenerationRequest(
46 tgt_unsigned_image=tgt_image,
47 src_unsigned_image=src_image,
48 bucket='test-destination-bucket',
49 minios=True,
50 verify=True,
51 keyset='update_signer',
52 dryrun=False)
53
George Engelbrecht52d0dba2020-11-12 11:49:02 -070054 self.result = payload_pb2.GenerationResponse(
55 success=True,
56 local_path='/tmp/aohiwdadoi/delta.bin',
57 remote_uri='gs://something')
George Engelbrechtfe63c8c2019-08-31 22:51:29 -060058
Alex Kleinc07a48b2022-08-26 15:58:44 -060059 self.PatchObject(payload, '_DEFAULT_PAYGEN_CACHE_DIR',
60 new=str(self.tempdir))
61
George Engelbrechtfe63c8c2019-08-31 22:51:29 -060062 def testValidateOnly(self):
Greg Edelston629468c2022-02-11 14:54:56 -070063 """Basic check that a validate only call does not execute any logic."""
George Engelbrechtfe63c8c2019-08-31 22:51:29 -060064
65 res = payload.GeneratePayload(self.req, self.result,
66 self.validate_only_config)
67 self.assertEqual(res, controller.RETURN_CODE_VALID_INPUT)
68
69 def testCallSucceeds(self):
Alex Klein10b9fed2020-09-23 14:56:18 -060070 """Check that a call is made successfully."""
George Engelbrechtfe63c8c2019-08-31 22:51:29 -060071 # Deep patch the paygen lib, this is a full run through service as well.
Jae Hoon Kim18846ba2022-08-26 22:08:22 +000072 patch_obj = self.PatchObject(paygen_payload_lib, 'PaygenPayload')
73 patch_obj.return_value.Run.return_value = 'gs://something'
George Engelbrechtfe63c8c2019-08-31 22:51:29 -060074 res = payload.GeneratePayload(self.req, self.result, self.api_config)
75 self.assertEqual(res, controller.RETURN_CODE_SUCCESS)
Michael Mortensen85d38402019-12-12 09:50:29 -070076
77 def testMockError(self):
78 """Test mock error call does not execute any logic, returns error."""
79 patch = self.PatchObject(paygen_payload_lib, 'PaygenPayload')
80
81 res = payload.GeneratePayload(self.req, self.result,
82 self.mock_error_config)
83 patch.assert_not_called()
84 self.assertEqual(controller.RETURN_CODE_COMPLETED_UNSUCCESSFULLY, res)
85
86 def testMockCall(self):
87 """Test mock call does not execute any logic, returns success."""
88 patch = self.PatchObject(paygen_payload_lib, 'PaygenPayload')
89
90 res = payload.GeneratePayload(self.req, self.result,
91 self.mock_call_config)
92 patch.assert_not_called()
93 self.assertEqual(controller.RETURN_CODE_SUCCESS, res)
Greg Edelston629468c2022-02-11 14:54:56 -070094
95 def testMiniOSSuccess(self):
96 """Test a miniOS paygen request."""
Jae Hoon Kim18846ba2022-08-26 22:08:22 +000097 patch = self.PatchObject(paygen_payload_lib, 'PaygenPayload')
98 patch.return_value.Run.return_value = 'gs://minios/something'
Greg Edelston629468c2022-02-11 14:54:56 -070099 res = payload.GeneratePayload(self.minios_req, self.result, self.api_config)
100 self.assertEqual(res, controller.RETURN_CODE_SUCCESS)
101
102 def testNoMiniOSPartition(self):
103 """Test a miniOS paygen request on an image with no miniOS part."""
104 patch = self.PatchObject(paygen_payload_lib, 'PaygenPayload')
105 patch.side_effect = paygen_payload_lib.NoMiniOSPartitionException
Benjamin Shai6e97bc02022-03-07 21:34:39 +0000106 response_code = payload.GeneratePayload(self.minios_req, self.result,
107 self.api_config)
Greg Edelston629468c2022-02-11 14:54:56 -0700108 self.assertEqual(self.result.failure_reason,
109 payload_pb2.GenerationResponse.NOT_MINIOS_COMPATIBLE)
Benjamin Shai6e97bc02022-03-07 21:34:39 +0000110 self.assertEqual(response_code,
111 controller.RETURN_CODE_UNSUCCESSFUL_RESPONSE_AVAILABLE)