blob: b7287127915b6c6314970c8069a240e143de1fa7 [file] [log] [blame]
Alex Kleineb77ffa2019-05-28 14:47:44 -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"""packages controller unit tests."""
7
8from __future__ import print_function
9
10import mock
11
12from chromite.api.controller import packages as packages_controller
13from chromite.api.gen.chromite.api import binhost_pb2
14from chromite.api.gen.chromite.api import packages_pb2
15from chromite.lib import constants
16from chromite.lib import cros_build_lib
17from chromite.lib import cros_test_lib
David Burger1e0fe232019-07-01 14:52:07 -060018from chromite.lib import portage_util
Alex Kleineb77ffa2019-05-28 14:47:44 -060019from chromite.service import packages as packages_service
20
21
22class UprevTest(cros_test_lib.MockTestCase):
23 """Uprev tests."""
24
25 _PUBLIC = binhost_pb2.OVERLAYTYPE_PUBLIC
26 _PRIVATE = binhost_pb2.OVERLAYTYPE_PRIVATE
27 _BOTH = binhost_pb2.OVERLAYTYPE_BOTH
28 _NONE = binhost_pb2.OVERLAYTYPE_NONE
29
30 def setUp(self):
31 self.uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets')
32
33 def _GetRequest(self, targets=None, overlay_type=None, output_dir=None):
34 return packages_pb2.UprevPackagesRequest(
35 build_targets=[{'name': name} for name in targets or []],
36 overlay_type=overlay_type,
37 output_dir=output_dir,
38 )
39
40 def _GetResponse(self):
41 return packages_pb2.UprevPackagesResponse()
42
43 def testNoOverlayTypeFails(self):
44 """No overlay type provided should fail."""
45 request = self._GetRequest(targets=['foo'])
46 response = self._GetResponse()
47
48 with self.assertRaises(cros_build_lib.DieSystemExit):
49 packages_controller.Uprev(request, response)
50
51 def testOverlayTypeNoneFails(self):
52 """Overlay type none means nothing here and should fail."""
53 request = self._GetRequest(targets=['foo'], overlay_type=self._NONE)
54 response = self._GetResponse()
55
56 with self.assertRaises(cros_build_lib.DieSystemExit):
57 packages_controller.Uprev(request, response)
58
59 def testSuccess(self):
60 """Test overall successful argument handling."""
61 targets = ['foo', 'bar']
62 output_dir = '/tmp/uprev_output_dir'
Alex Klein5dd6b1e2019-07-31 15:45:24 -060063 changed = ['/ebuild-1.0-r1.ebuild', '/ebuild-1.0-r2.ebuild']
Alex Kleineb77ffa2019-05-28 14:47:44 -060064 expected_type = constants.BOTH_OVERLAYS
65 request = self._GetRequest(targets=targets, overlay_type=self._BOTH,
66 output_dir=output_dir)
67 response = self._GetResponse()
Alex Klein5dd6b1e2019-07-31 15:45:24 -060068 uprev_patch = self.PatchObject(packages_service, 'uprev_build_targets',
69 return_value=changed)
Alex Kleineb77ffa2019-05-28 14:47:44 -060070
71 packages_controller.Uprev(request, response)
72
73 # Make sure the type is right, verify build targets after.
74 uprev_patch.assert_called_once_with(mock.ANY, expected_type, mock.ANY,
75 output_dir)
76 # First argument (build targets) of the first (only) call.
77 call_targets = uprev_patch.call_args[0][0]
78 self.assertItemsEqual(targets, [t.name for t in call_targets])
David Burger1e0fe232019-07-01 14:52:07 -060079
Alex Klein5dd6b1e2019-07-31 15:45:24 -060080 for ebuild in response.modified_ebuilds:
81 self.assertIn(ebuild.path, changed)
82 changed.remove(ebuild.path)
83 self.assertFalse(changed)
84
David Burger1e0fe232019-07-01 14:52:07 -060085
86class GetBestVisibleTest(cros_test_lib.MockTestCase):
87 """GetBestVisible tests."""
88
89 def _GetRequest(self, atom=None):
90 return packages_pb2.GetBestVisibleRequest(
91 atom=atom,
92 )
93
94 def _GetResponse(self):
95 return packages_pb2.GetBestVisibleResponse()
96
97 def _MakeCpv(self, category, package, version):
98 unused = {
99 'cp': None,
100 'cpv': None,
101 'cpf': None,
102 'pv': None,
103 'version_no_rev': None,
104 'rev': None,
105 }
106 return portage_util.CPV(
107 category=category,
108 package=package,
109 version=version,
110 **unused
111 )
112
113 def testNoAtomFails(self):
114 """No atom provided should fail."""
115 request = self._GetRequest()
116 response = self._GetResponse()
117
118 with self.assertRaises(cros_build_lib.DieSystemExit):
119 packages_controller.GetBestVisible(request, response)
120
121 def testSuccess(self):
122 """Test overall success, argument handling, result forwarding."""
123 cpv = self._MakeCpv('category', 'package', 'version')
124 self.PatchObject(packages_service, 'get_best_visible', return_value=cpv)
125
126 request = self._GetRequest(atom='chromeos-chrome')
127 response = self._GetResponse()
128
129 packages_controller.GetBestVisible(request, response)
130
131 package_info = response.package_info
132 self.assertEqual(package_info.category, cpv.category)
133 self.assertEqual(package_info.package_name, cpv.package)
134 self.assertEqual(package_info.version, cpv.version)