blob: 59f2342b1e3d5390cff172b76238c384782813df [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
David Burgerff1a92c2019-07-09 00:27:54 +000014# TODO(crbug/904939): implement service/android.py
15from chromite.cbuildbot import commands
LaMont Jones8a1644f2019-04-16 14:30:17 -060016from chromite.lib import constants
17from chromite.lib import cros_build_lib
18from chromite.lib import cros_test_lib
19from chromite.lib import osutils
20
Alex Klein231d2da2019-07-22 16:44:45 -060021class MarkStableTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
LaMont Jones8a1644f2019-04-16 14:30:17 -060022 """Unittests for MarkStable."""
23
24 def setUp(self):
David Burgerff1a92c2019-07-09 00:27:54 +000025 self.command = self.PatchObject(commands, 'MarkAndroidAsStable')
LaMont Jones8a1644f2019-04-16 14:30:17 -060026
27 self.input_proto = android_pb2.MarkStableRequest()
28 self.input_proto.tracking_branch = 'tracking-branch'
29 self.input_proto.package_name = 'android-package-name'
30 self.input_proto.android_build_branch = 'android_build_branch'
David Burgerff1a92c2019-07-09 00:27:54 +000031 self.board1 = self.input_proto.boards.add()
LaMont Jones8a1644f2019-04-16 14:30:17 -060032 self.board1.name = 'board1'
David Burgerff1a92c2019-07-09 00:27:54 +000033 self.board2 = self.input_proto.boards.add()
LaMont Jones8a1644f2019-04-16 14:30:17 -060034 self.board2.name = 'board2'
35
Alex Klein231d2da2019-07-22 16:44:45 -060036 self.response = android_pb2.MarkStableResponse()
37
38 def testValidateOnly(self):
39 """Sanity check that a validate only call does not execute any logic."""
40 patch = self.PatchObject(commands, 'MarkAndroidAsStable')
41
42 android.MarkStable(self.input_proto, self.response,
43 self.validate_only_config)
44 patch.assert_not_called()
45
LaMont Jones8a1644f2019-04-16 14:30:17 -060046 def testFailsIfTrackingBranchMissing(self):
47 """Fails if tracking_branch is missing."""
48 self.input_proto.tracking_branch = ''
LaMont Jones8a1644f2019-04-16 14:30:17 -060049 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060050 android.MarkStable(self.input_proto, self.response, self.api_config)
David Burgerff1a92c2019-07-09 00:27:54 +000051 self.command.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -060052
53 def testFailsIfPackageNameMissing(self):
54 """Fails if package_name is missing."""
55 self.input_proto.package_name = ''
LaMont Jones8a1644f2019-04-16 14:30:17 -060056 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060057 android.MarkStable(self.input_proto, self.response, self.api_config)
David Burgerff1a92c2019-07-09 00:27:54 +000058 self.command.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -060059
60 def testFailsIfAndroidBuildBranchMissing(self):
61 """Fails if android_build_branch is missing."""
62 self.input_proto.android_build_branch = ''
LaMont Jones8a1644f2019-04-16 14:30:17 -060063 with self.assertRaises(cros_build_lib.DieSystemExit):
Alex Klein231d2da2019-07-22 16:44:45 -060064 android.MarkStable(self.input_proto, self.response, self.api_config)
David Burgerff1a92c2019-07-09 00:27:54 +000065 self.command.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -060066
67 def testCallsCommandCorrectly(self):
68 """Test that commands.MarkAndroidAsStable is called correctly."""
LaMont Jones8a1644f2019-04-16 14:30:17 -060069 self.input_proto.android_version = 'android-version'
70 self.input_proto.android_gts_build_branch = 'gts-branch'
David Burgerff1a92c2019-07-09 00:27:54 +000071 self.command.return_value = 'cat/android-1.2.3'
LaMont Jones8a1644f2019-04-16 14:30:17 -060072 atom = common_pb2.PackageInfo()
73 atom.category = 'cat'
74 atom.package_name = 'android'
75 atom.version = '1.2.3'
Alex Klein231d2da2019-07-22 16:44:45 -060076 android.MarkStable(self.input_proto, self.response, self.api_config)
David Burgerff1a92c2019-07-09 00:27:54 +000077 self.command.assert_called_once_with(
78 buildroot=self.input_proto.buildroot,
LaMont Jones8a1644f2019-04-16 14:30:17 -060079 tracking_branch=self.input_proto.tracking_branch,
80 android_package=self.input_proto.package_name,
81 android_build_branch=self.input_proto.android_build_branch,
David Burgerff1a92c2019-07-09 00:27:54 +000082 boards=self.input_proto.boards,
LaMont Jones8a1644f2019-04-16 14:30:17 -060083 android_version=self.input_proto.android_version,
84 android_gts_build_branch=self.input_proto.android_gts_build_branch)
Alex Klein231d2da2019-07-22 16:44:45 -060085 self.assertEqual(self.response.android_atom, atom)
86 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -060087 android_pb2.MARK_STABLE_STATUS_SUCCESS)
88
89 def testHandlesEarlyExit(self):
90 """Test that early exit is handled correctly."""
LaMont Jones8a1644f2019-04-16 14:30:17 -060091 self.input_proto.android_version = 'android-version'
92 self.input_proto.android_gts_build_branch = 'gts-branch'
David Burgerff1a92c2019-07-09 00:27:54 +000093 self.command.return_value = ''
Alex Klein231d2da2019-07-22 16:44:45 -060094 android.MarkStable(self.input_proto, self.response, self.api_config)
David Burgerff1a92c2019-07-09 00:27:54 +000095 self.command.assert_called_once_with(
96 buildroot=self.input_proto.buildroot,
LaMont Jones8a1644f2019-04-16 14:30:17 -060097 tracking_branch=self.input_proto.tracking_branch,
98 android_package=self.input_proto.package_name,
99 android_build_branch=self.input_proto.android_build_branch,
David Burgerff1a92c2019-07-09 00:27:54 +0000100 boards=self.input_proto.boards,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600101 android_version=self.input_proto.android_version,
102 android_gts_build_branch=self.input_proto.android_gts_build_branch)
Alex Klein231d2da2019-07-22 16:44:45 -0600103 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600104 android_pb2.MARK_STABLE_STATUS_EARLY_EXIT)
105
106 def testHandlesPinnedUprevError(self):
107 """Test that pinned error is handled correctly."""
LaMont Jones8a1644f2019-04-16 14:30:17 -0600108 self.input_proto.android_version = 'android-version'
109 self.input_proto.android_gts_build_branch = 'gts-branch'
David Burgerff1a92c2019-07-09 00:27:54 +0000110 self.command.side_effect = commands.AndroidIsPinnedUprevError('pin/xx-1.1')
LaMont Jones8a1644f2019-04-16 14:30:17 -0600111 atom = common_pb2.PackageInfo()
112 atom.category = 'pin'
113 atom.package_name = 'xx'
114 atom.version = '1.1'
Alex Klein231d2da2019-07-22 16:44:45 -0600115 android.MarkStable(self.input_proto, self.response, self.api_config)
David Burgerff1a92c2019-07-09 00:27:54 +0000116 self.command.assert_called_once_with(
117 buildroot=self.input_proto.buildroot,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600118 tracking_branch=self.input_proto.tracking_branch,
119 android_package=self.input_proto.package_name,
120 android_build_branch=self.input_proto.android_build_branch,
David Burgerff1a92c2019-07-09 00:27:54 +0000121 boards=self.input_proto.boards,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600122 android_version=self.input_proto.android_version,
123 android_gts_build_branch=self.input_proto.android_gts_build_branch)
Alex Klein231d2da2019-07-22 16:44:45 -0600124 self.assertEqual(self.response.android_atom, atom)
125 self.assertEqual(self.response.status,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600126 android_pb2.MARK_STABLE_STATUS_PINNED)
127
128
Alex Klein231d2da2019-07-22 16:44:45 -0600129class UnpinVersionTest(cros_test_lib.MockTestCase, api_config.ApiConfigMixin):
LaMont Jones8a1644f2019-04-16 14:30:17 -0600130 """Unittests for UnpinVersion."""
131
132 def testCallsUnlink(self):
133 """SetAndroid calls service with correct args."""
134 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
135 self.PatchObject(constants, '_FindSourceRoot', return_value='SRCROOT')
136
137 # This has the side effect of making sure that input and output proto are
138 # not actually used.
Alex Klein231d2da2019-07-22 16:44:45 -0600139 android.UnpinVersion(None, None, self.api_config)
LaMont Jones8a1644f2019-04-16 14:30:17 -0600140 safeunlink.assert_called_once_with(android.ANDROIDPIN_MASK_PATH)
Alex Klein231d2da2019-07-22 16:44:45 -0600141
142 def testValidateOnly(self):
143 """Sanity check that a validate only call does not execute any logic."""
144 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
145
146 android.UnpinVersion(None, None, self.validate_only_config)
147 safeunlink.assert_not_called()