blob: 8cb0eae10ff22b3c5d49d6fcf42c7d59dc27f58d [file] [log] [blame]
LaMont Jones8a1644f2019-04-16 14:30:17 -06001# -*- coding: utf-8 -*-
2# Copyright 2019 The Chromium OS Authors. All rights reserved.
3# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""Unittests for Android operations."""
7
8from __future__ import print_function
9
Alex Klein231d2da2019-07-22 16:44:45 -060010from chromite.api import api_config
LaMont Jones8a1644f2019-04-16 14:30:17 -060011from chromite.api.controller import android
12from chromite.api.gen.chromite.api import android_pb2
13from chromite.api.gen.chromiumos import common_pb2
Mike Frysinger40ffb532021-02-12 07:36:08 -050014from chromite.lib import build_target_lib
LaMont Jones8a1644f2019-04-16 14:30:17 -060015from chromite.lib import constants
16from chromite.lib import cros_build_lib
17from chromite.lib import cros_test_lib
18from chromite.lib import osutils
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090019from chromite.service import android as service_android
Alex Klein4de25e82019-08-05 15:58:39 -060020from chromite.service import packages
Mike Frysinger40ffb532021-02-12 07:36:08 -050021from chromite.third_party import mock
Alex Klein4de25e82019-08-05 15:58:39 -060022
LaMont Jones8a1644f2019-04-16 14:30:17 -060023
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090024class GetLatestBuildTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
25 """Unittests for GetLatestBuild."""
26
27 def setUp(self):
28 self._mock = self.PatchObject(service_android, 'GetLatestBuild')
29 self._mock.return_value = ('7123456', {})
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090030 self._mock_branch_for_package = self.PatchObject(
31 service_android, 'GetAndroidBranchForPackage',
32 return_value='android-branch-for-package')
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090033 self._output_proto = android_pb2.GetLatestBuildResponse()
34
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090035 def _GetRequest(self, android_build_branch=None, android_package=None):
36 req = android_pb2.GetLatestBuildRequest()
37 if android_build_branch is not None:
38 req.android_build_branch = android_build_branch
39 if android_package is not None:
40 req.android_package = android_package
41 return req
42
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090043 def testValidateOnly(self):
44 """Test that a validate only call does not execute any logic."""
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090045 req = self._GetRequest(android_package='android-package')
46 android.GetLatestBuild(req, self._output_proto, self.validate_only_config)
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090047 self._mock.assert_not_called()
48
49 def testMockCall(self):
50 """Test that a mock call does not execute logic, returns mocked value."""
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090051 req = self._GetRequest(android_package='android-package')
52 android.GetLatestBuild(req, self._output_proto, self.mock_call_config)
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090053 self._mock.assert_not_called()
54 self.assertEqual(self._output_proto.android_version, '7123456')
55
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090056 def testFailsIfBranchAndPackageMissing(self):
57 """Fails if both android_build_branch and android_package are missing."""
58 req = self._GetRequest()
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090059 with self.assertRaises(cros_build_lib.DieSystemExit):
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090060 android.GetLatestBuild(req, self._output_proto, self.api_config)
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090061 self._mock.assert_not_called()
62
Shao-Chuan Lee6e8784a2021-05-13 09:34:46 +090063 def testBranchSpecified(self):
64 """Test calling with Android branch specified."""
65 req = self._GetRequest(android_build_branch='android-branch')
66 android.GetLatestBuild(req, self._output_proto, self.api_config)
67 self._mock.assert_called_once_with('android-branch')
68 self._mock_branch_for_package.assert_not_called()
69 self.assertEqual(self._output_proto.android_version, '7123456')
70
71 def testPackageSpecified(self):
72 """Test calling with Android package specified."""
73 req = self._GetRequest(android_package='android-package')
74 android.GetLatestBuild(req, self._output_proto, self.api_config)
75 self._mock.assert_called_once_with('android-branch-for-package')
76 self._mock_branch_for_package.assert_called_once_with('android-package')
77 self.assertEqual(self._output_proto.android_version, '7123456')
78
79 def testBranchAndPackageSpecified(self):
80 """Test calling with both Android branch and package specified."""
81 req = self._GetRequest(android_build_branch='android-branch',
82 android_package='android-package')
83 android.GetLatestBuild(req, self._output_proto, self.api_config)
84 self._mock.assert_called_once_with('android-branch')
85 self._mock_branch_for_package.assert_not_called()
Shao-Chuan Lee01dee222021-04-09 15:28:08 +090086 self.assertEqual(self._output_proto.android_version, '7123456')
87
88
Alex Klein231d2da2019-07-22 16:44:45 -060089class MarkStableTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
LaMont Jones8a1644f2019-04-16 14:30:17 -060090 """Unittests for MarkStable."""
91
92 def setUp(self):
Alex Klein4de25e82019-08-05 15:58:39 -060093 self.uprev = self.PatchObject(packages, 'uprev_android')
LaMont Jones8a1644f2019-04-16 14:30:17 -060094
95 self.input_proto = android_pb2.MarkStableRequest()
LaMont Jones8a1644f2019-04-16 14:30:17 -060096 self.input_proto.package_name = 'android-package-name'
97 self.input_proto.android_build_branch = 'android_build_branch'
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +090098 self.input_proto.android_version = 'android-version'
Alex Klein4de25e82019-08-05 15:58:39 -060099 self.input_proto.build_targets.add().name = 'foo'
100 self.input_proto.build_targets.add().name = 'bar'
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900101 self.input_proto.skip_commit = True
Alex Klein4de25e82019-08-05 15:58:39 -0600102
Alex Klein26e472b2020-03-10 14:35:01 -0600103 self.build_targets = [build_target_lib.BuildTarget('foo'),
104 build_target_lib.BuildTarget('bar')]
LaMont Jones8a1644f2019-04-16 14:30:17 -0600105
Alex Klein231d2da2019-07-22 16:44:45 -0600106 self.response = android_pb2.MarkStableResponse()
107
108 def testValidateOnly(self):
109 """Sanity check that a validate only call does not execute any logic."""
Alex Klein231d2da2019-07-22 16:44:45 -0600110 android.MarkStable(self.input_proto, self.response,
111 self.validate_only_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600112 self.uprev.assert_not_called()
Alex Klein231d2da2019-07-22 16:44:45 -0600113
Michael Mortensen25626442019-11-22 10:06:59 -0700114 def testMockCall(self):
115 """Test that a mock call does not execute logic, returns mocked value."""
116 android.MarkStable(self.input_proto, self.response,
117 self.mock_call_config)
118 self.uprev.assert_not_called()
119 self.assertEqual(self.response.status,
120 android_pb2.MARK_STABLE_STATUS_SUCCESS)
121 self.assertEqual(self.response.android_atom.category, 'category')
122 self.assertEqual(self.response.android_atom.package_name,
123 'android-package-name')
124 self.assertEqual(self.response.android_atom.version, '1.2')
125
LaMont Jones8a1644f2019-04-16 14:30:17 -0600126 def testFailsIfPackageNameMissing(self):
127 """Fails if package_name is missing."""
128 self.input_proto.package_name = ''
LaMont Jones8a1644f2019-04-16 14:30:17 -0600129 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -0600130 android.MarkStable(self.input_proto, self.response, self.api_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600131 self.uprev.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -0600132
LaMont Jones8a1644f2019-04-16 14:30:17 -0600133 def testCallsCommandCorrectly(self):
134 """Test that commands.MarkAndroidAsStable is called correctly."""
Alex Klein4de25e82019-08-05 15:58:39 -0600135 self.uprev.return_value = 'cat/android-1.2.3'
LaMont Jones8a1644f2019-04-16 14:30:17 -0600136 atom = common_pb2.PackageInfo()
137 atom.category = 'cat'
138 atom.package_name = 'android'
139 atom.version = '1.2.3'
Alex Klein231d2da2019-07-22 16:44:45 -0600140 android.MarkStable(self.input_proto, self.response, self.api_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600141 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -0600142 android_package=self.input_proto.package_name,
Alex Klein4de25e82019-08-05 15:58:39 -0600143 chroot=mock.ANY,
144 build_targets=self.build_targets,
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +0900145 android_build_branch=self.input_proto.android_build_branch,
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900146 android_version=self.input_proto.android_version,
147 skip_commit=self.input_proto.skip_commit,
148 )
Alex Klein231d2da2019-07-22 16:44:45 -0600149 self.assertEqual(self.response.android_atom, atom)
150 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600151 android_pb2.MARK_STABLE_STATUS_SUCCESS)
152
153 def testHandlesEarlyExit(self):
154 """Test that early exit is handled correctly."""
Alex Klein4de25e82019-08-05 15:58:39 -0600155 self.uprev.return_value = ''
Alex Klein231d2da2019-07-22 16:44:45 -0600156 android.MarkStable(self.input_proto, self.response, self.api_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600157 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -0600158 android_package=self.input_proto.package_name,
Alex Klein4de25e82019-08-05 15:58:39 -0600159 chroot=mock.ANY,
160 build_targets=self.build_targets,
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +0900161 android_build_branch=self.input_proto.android_build_branch,
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900162 android_version=self.input_proto.android_version,
163 skip_commit=self.input_proto.skip_commit,
164 )
Alex Klein231d2da2019-07-22 16:44:45 -0600165 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600166 android_pb2.MARK_STABLE_STATUS_EARLY_EXIT)
167
168 def testHandlesPinnedUprevError(self):
169 """Test that pinned error is handled correctly."""
Alex Klein4de25e82019-08-05 15:58:39 -0600170 self.uprev.side_effect = packages.AndroidIsPinnedUprevError('pin/xx-1.1')
LaMont Jones8a1644f2019-04-16 14:30:17 -0600171 atom = common_pb2.PackageInfo()
172 atom.category = 'pin'
173 atom.package_name = 'xx'
174 atom.version = '1.1'
Alex Klein231d2da2019-07-22 16:44:45 -0600175 android.MarkStable(self.input_proto, self.response, self.api_config)
Alex Klein4de25e82019-08-05 15:58:39 -0600176 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -0600177 android_package=self.input_proto.package_name,
Alex Klein4de25e82019-08-05 15:58:39 -0600178 chroot=mock.ANY,
179 build_targets=self.build_targets,
Shao-Chuan Leea4b4f302021-05-12 14:40:20 +0900180 android_build_branch=self.input_proto.android_build_branch,
Shao-Chuan Lee85ba7ce2021-02-09 13:50:11 +0900181 android_version=self.input_proto.android_version,
182 skip_commit=self.input_proto.skip_commit,
183 )
Alex Klein231d2da2019-07-22 16:44:45 -0600184 self.assertEqual(self.response.android_atom, atom)
185 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600186 android_pb2.MARK_STABLE_STATUS_PINNED)
187
188
Alex Klein231d2da2019-07-22 16:44:45 -0600189class UnpinVersionTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
LaMont Jones8a1644f2019-04-16 14:30:17 -0600190 """Unittests for UnpinVersion."""
191
192 def testCallsUnlink(self):
193 """SetAndroid calls service with correct args."""
194 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
195 self.PatchObject(constants, '_FindSourceRoot', return_value='SRCROOT')
196
197 # This has the side effect of making sure that input and output proto are
198 # not actually used.
Alex Klein231d2da2019-07-22 16:44:45 -0600199 android.UnpinVersion(None, None, self.api_config)
LaMont Jones8a1644f2019-04-16 14:30:17 -0600200 safeunlink.assert_called_once_with(android.ANDROIDPIN_MASK_PATH)
Alex Klein231d2da2019-07-22 16:44:45 -0600201
202 def testValidateOnly(self):
203 """Sanity check that a validate only call does not execute any logic."""
204 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
205
206 android.UnpinVersion(None, None, self.validate_only_config)
207 safeunlink.assert_not_called()
Michael Mortensen25626442019-11-22 10:06:59 -0700208
209 def testMockCall(self):
210 """Test that a mock call does not execute logic."""
211 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
212
213 android.UnpinVersion(None, None, self.mock_call_config)
214 safeunlink.assert_not_called()
215 # android.UnpinVersion does not modify the response.