blob: ea9ec7a104c6d42c781a4d0e814c9c73d7e8cb13 [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 Kleineb8616c2019-06-28 12:26:23 -060010import mock
11
LaMont Jones8a1644f2019-04-16 14:30:17 -060012from chromite.api.controller import android
13from chromite.api.gen.chromite.api import android_pb2
14from chromite.api.gen.chromiumos import common_pb2
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
Alex Kleineb8616c2019-06-28 12:26:23 -060019from chromite.service import packages as packages_service
20
LaMont Jones8a1644f2019-04-16 14:30:17 -060021
22class MarkStableTest(cros_test_lib.MockTestCase):
23 """Unittests for MarkStable."""
24
25 def setUp(self):
Alex Kleineb8616c2019-06-28 12:26:23 -060026 self.uprev = self.PatchObject(packages_service, 'uprev_android')
LaMont Jones8a1644f2019-04-16 14:30:17 -060027
28 self.input_proto = android_pb2.MarkStableRequest()
29 self.input_proto.tracking_branch = 'tracking-branch'
30 self.input_proto.package_name = 'android-package-name'
31 self.input_proto.android_build_branch = 'android_build_branch'
Alex Kleineb8616c2019-06-28 12:26:23 -060032 self.board1 = self.input_proto.build_targets.add()
LaMont Jones8a1644f2019-04-16 14:30:17 -060033 self.board1.name = 'board1'
Alex Kleineb8616c2019-06-28 12:26:23 -060034 self.board2 = self.input_proto.build_targets.add()
LaMont Jones8a1644f2019-04-16 14:30:17 -060035 self.board2.name = 'board2'
36
37 def testFailsIfTrackingBranchMissing(self):
38 """Fails if tracking_branch is missing."""
39 self.input_proto.tracking_branch = ''
40 output_proto = android_pb2.MarkStableResponse()
41 with self.assertRaises(cros_build_lib.DieSystemExit):
42 android.MarkStable(self.input_proto, output_proto)
Alex Kleineb8616c2019-06-28 12:26:23 -060043 self.uprev.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -060044
45 def testFailsIfPackageNameMissing(self):
46 """Fails if package_name is missing."""
47 self.input_proto.package_name = ''
48 output_proto = android_pb2.MarkStableResponse()
49 with self.assertRaises(cros_build_lib.DieSystemExit):
50 android.MarkStable(self.input_proto, output_proto)
Alex Kleineb8616c2019-06-28 12:26:23 -060051 self.uprev.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -060052
53 def testFailsIfAndroidBuildBranchMissing(self):
54 """Fails if android_build_branch is missing."""
55 self.input_proto.android_build_branch = ''
56 output_proto = android_pb2.MarkStableResponse()
57 with self.assertRaises(cros_build_lib.DieSystemExit):
58 android.MarkStable(self.input_proto, output_proto)
Alex Kleineb8616c2019-06-28 12:26:23 -060059 self.uprev.assert_not_called()
LaMont Jones8a1644f2019-04-16 14:30:17 -060060
61 def testCallsCommandCorrectly(self):
62 """Test that commands.MarkAndroidAsStable is called correctly."""
63 output_proto = android_pb2.MarkStableResponse()
64 self.input_proto.android_version = 'android-version'
65 self.input_proto.android_gts_build_branch = 'gts-branch'
Alex Kleineb8616c2019-06-28 12:26:23 -060066 self.uprev.return_value = 'cat/android-1.2.3'
LaMont Jones8a1644f2019-04-16 14:30:17 -060067 atom = common_pb2.PackageInfo()
68 atom.category = 'cat'
69 atom.package_name = 'android'
70 atom.version = '1.2.3'
71 android.MarkStable(self.input_proto, output_proto)
Alex Kleineb8616c2019-06-28 12:26:23 -060072 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -060073 tracking_branch=self.input_proto.tracking_branch,
74 android_package=self.input_proto.package_name,
75 android_build_branch=self.input_proto.android_build_branch,
Alex Kleineb8616c2019-06-28 12:26:23 -060076 chroot=mock.ANY,
77 build_targets=mock.ANY,
LaMont Jones8a1644f2019-04-16 14:30:17 -060078 android_version=self.input_proto.android_version,
79 android_gts_build_branch=self.input_proto.android_gts_build_branch)
80 self.assertEqual(output_proto.android_atom, atom)
81 self.assertEqual(output_proto.status,
82 android_pb2.MARK_STABLE_STATUS_SUCCESS)
83
84 def testHandlesEarlyExit(self):
85 """Test that early exit is handled correctly."""
86 output_proto = android_pb2.MarkStableResponse()
87 self.input_proto.android_version = 'android-version'
88 self.input_proto.android_gts_build_branch = 'gts-branch'
Alex Kleineb8616c2019-06-28 12:26:23 -060089 self.uprev.return_value = ''
LaMont Jones8a1644f2019-04-16 14:30:17 -060090 android.MarkStable(self.input_proto, output_proto)
Alex Kleineb8616c2019-06-28 12:26:23 -060091 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -060092 tracking_branch=self.input_proto.tracking_branch,
93 android_package=self.input_proto.package_name,
94 android_build_branch=self.input_proto.android_build_branch,
Alex Kleineb8616c2019-06-28 12:26:23 -060095 chroot=mock.ANY,
96 build_targets=mock.ANY,
LaMont Jones8a1644f2019-04-16 14:30:17 -060097 android_version=self.input_proto.android_version,
98 android_gts_build_branch=self.input_proto.android_gts_build_branch)
99 self.assertEqual(output_proto.status,
100 android_pb2.MARK_STABLE_STATUS_EARLY_EXIT)
101
102 def testHandlesPinnedUprevError(self):
103 """Test that pinned error is handled correctly."""
104 output_proto = android_pb2.MarkStableResponse()
105 self.input_proto.android_version = 'android-version'
106 self.input_proto.android_gts_build_branch = 'gts-branch'
Alex Kleineb8616c2019-06-28 12:26:23 -0600107 self.uprev.side_effect = packages_service.AndroidIsPinnedUprevError(
108 'pin/xx-1.1')
LaMont Jones8a1644f2019-04-16 14:30:17 -0600109 atom = common_pb2.PackageInfo()
110 atom.category = 'pin'
111 atom.package_name = 'xx'
112 atom.version = '1.1'
113 android.MarkStable(self.input_proto, output_proto)
Alex Kleineb8616c2019-06-28 12:26:23 -0600114 self.uprev.assert_called_once_with(
LaMont Jones8a1644f2019-04-16 14:30:17 -0600115 tracking_branch=self.input_proto.tracking_branch,
116 android_package=self.input_proto.package_name,
117 android_build_branch=self.input_proto.android_build_branch,
Alex Kleineb8616c2019-06-28 12:26:23 -0600118 chroot=mock.ANY,
119 build_targets=mock.ANY,
LaMont Jones8a1644f2019-04-16 14:30:17 -0600120 android_version=self.input_proto.android_version,
121 android_gts_build_branch=self.input_proto.android_gts_build_branch)
122 self.assertEqual(output_proto.android_atom, atom)
123 self.assertEqual(output_proto.status,
124 android_pb2.MARK_STABLE_STATUS_PINNED)
125
126
127class UnpinVersionTest(cros_test_lib.MockTestCase):
128 """Unittests for UnpinVersion."""
129
130 def testCallsUnlink(self):
131 """SetAndroid calls service with correct args."""
132 safeunlink = self.PatchObject(osutils, 'SafeUnlink')
133 self.PatchObject(constants, '_FindSourceRoot', return_value='SRCROOT')
134
135 # This has the side effect of making sure that input and output proto are
136 # not actually used.
137 android.UnpinVersion(None, None)
138 safeunlink.assert_called_once_with(android.ANDROIDPIN_MASK_PATH)