blob: efa16697396c5666be651b9628cc798c5891fc2d [file] [log] [blame]
Alex Kleinf4dc4f52018-12-05 13:55:12 -07001# -*- coding: utf-8 -*-
2# Copyright 2018 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
Alex Klein2bfacb22019-02-04 11:42:17 -07006"""Tests for the build_api script covering the base Build API functionality."""
7
Alex Kleinf4dc4f52018-12-05 13:55:12 -07008from __future__ import print_function
9
Alex Klein5bcb4d22019-03-21 13:51:54 -060010import os
11
Alex Klein7107bdd2019-03-14 17:14:31 -060012from chromite.api.gen.chromite.api import build_api_test_pb2
Alex Klein2bfacb22019-02-04 11:42:17 -070013from chromite.lib import cros_build_lib
Alex Kleinf4dc4f52018-12-05 13:55:12 -070014from chromite.lib import cros_test_lib
Alex Klein5bcb4d22019-03-21 13:51:54 -060015from chromite.lib import osutils
Ned Nguyen5aa5d9a2019-02-25 10:34:23 -070016from chromite.scripts import build_api
Alex Kleinf4dc4f52018-12-05 13:55:12 -070017
18
Alex Klein5bcb4d22019-03-21 13:51:54 -060019class RouterTest(cros_test_lib.MockTempDirTestCase):
Alex Kleinf4dc4f52018-12-05 13:55:12 -070020 """Test Router functionality."""
21 _INPUT_JSON = '{"id":"Input ID"}'
22
23 def setUp(self):
24 self.router = build_api.Router()
25 self.router.Register(build_api_test_pb2)
26
Alex Klein5bcb4d22019-03-21 13:51:54 -060027 self.input_file = os.path.join(self.tempdir, 'input.json')
28 self.output_file = os.path.join(self.tempdir, 'output.json')
29
30 osutils.WriteFile(self.input_file, self._INPUT_JSON)
31
Alex Kleinf4dc4f52018-12-05 13:55:12 -070032 def testInputOutputMethod(self):
33 """Test input/output handling."""
34 def impl(input_msg, output_msg):
35 self.assertIsInstance(input_msg, build_api_test_pb2.TestRequestMessage)
36 self.assertIsInstance(output_msg, build_api_test_pb2.TestResultMessage)
37
38 self.PatchObject(self.router, '_GetMethod', return_value=impl)
39
40 self.router.Route('chromite.api.TestApiService', 'InputOutputMethod',
Alex Klein5bcb4d22019-03-21 13:51:54 -060041 self.input_file, self.output_file)
Alex Kleinf4dc4f52018-12-05 13:55:12 -070042
Alex Klein2bfacb22019-02-04 11:42:17 -070043 def testRenameMethod(self):
44 """Test implementation name config."""
45 def _GetMethod(_, method_name):
46 self.assertEqual('CorrectName', method_name)
Alex Klein7a115172019-02-08 14:14:20 -070047 return lambda x, y: None
Alex Klein2bfacb22019-02-04 11:42:17 -070048
49 self.PatchObject(self.router, '_GetMethod', side_effect=_GetMethod)
50
51 self.router.Route('chromite.api.TestApiService', 'RenamedMethod',
Alex Klein5bcb4d22019-03-21 13:51:54 -060052 self.input_file, self.output_file)
Alex Klein2bfacb22019-02-04 11:42:17 -070053
54 def testInsideServiceChrootAsserts(self):
55 """Test the chroot assertion handling with service inside configured."""
56 # Helper variables/functions to make the patches simpler.
57 should_be_called = False
58 is_inside = False
Alex Klein7a115172019-02-08 14:14:20 -070059 def impl(_input_msg, _output_msg):
Alex Klein2bfacb22019-02-04 11:42:17 -070060 self.assertTrue(should_be_called,
61 'The implementation should not have been called.')
62 def inside():
63 return is_inside
64
65 self.PatchObject(self.router, '_GetMethod', return_value=impl)
66 self.PatchObject(cros_build_lib, 'IsInsideChroot', side_effect=inside)
67
68 # Not inside chroot with inside requirement should raise an error.
69 with self.assertRaises(cros_build_lib.DieSystemExit):
70 self.router.Route('chromite.api.InsideChrootApiService',
Alex Klein5bcb4d22019-03-21 13:51:54 -060071 'InsideServiceInsideMethod', self.input_file,
72 self.output_file)
Alex Klein2bfacb22019-02-04 11:42:17 -070073
74 # Inside chroot with inside requirement.
75 is_inside = should_be_called = True
76 self.router.Route('chromite.api.InsideChrootApiService',
Alex Klein5bcb4d22019-03-21 13:51:54 -060077 'InsideServiceInsideMethod', self.input_file,
78 self.output_file)
Alex Klein2bfacb22019-02-04 11:42:17 -070079
80 # Inside chroot with outside override should raise assertion.
81 is_inside = True
82 should_be_called = False
83 with self.assertRaises(cros_build_lib.DieSystemExit):
84 self.router.Route('chromite.api.InsideChrootApiService',
Alex Klein5bcb4d22019-03-21 13:51:54 -060085 'InsideServiceOutsideMethod', self.input_file,
86 self.output_file)
Alex Klein2bfacb22019-02-04 11:42:17 -070087
88 is_inside = False
89 should_be_called = True
90 self.router.Route('chromite.api.InsideChrootApiService',
Alex Klein5bcb4d22019-03-21 13:51:54 -060091 'InsideServiceOutsideMethod', self.input_file,
92 self.output_file)
Alex Klein2bfacb22019-02-04 11:42:17 -070093
94 def testOutsideServiceChrootAsserts(self):
95 """Test the chroot assertion handling with service outside configured."""
96 # Helper variables/functions to make the patches simpler.
97 should_be_called = False
98 is_inside = False
Alex Klein7a115172019-02-08 14:14:20 -070099 def impl(_input_msg, _output_msg):
Alex Klein2bfacb22019-02-04 11:42:17 -0700100 self.assertTrue(should_be_called,
101 'The implementation should not have been called.')
102
103 self.PatchObject(self.router, '_GetMethod', return_value=impl)
104 self.PatchObject(cros_build_lib, 'IsInsideChroot',
105 side_effect=lambda: is_inside)
106
107 # Outside chroot with outside requirement should be fine.
108 is_inside = False
109 should_be_called = True
110 self.router.Route('chromite.api.OutsideChrootApiService',
Alex Klein5bcb4d22019-03-21 13:51:54 -0600111 'OutsideServiceOutsideMethod', self.input_file,
112 self.output_file)
Alex Klein2bfacb22019-02-04 11:42:17 -0700113
114 # Inside chroot with outside requirement should raise error.
115 is_inside = True
116 should_be_called = False
117 with self.assertRaises(cros_build_lib.DieSystemExit):
118 self.router.Route('chromite.api.OutsideChrootApiService',
Alex Klein5bcb4d22019-03-21 13:51:54 -0600119 'OutsideServiceOutsideMethod', self.input_file,
120 self.output_file)
Alex Klein2bfacb22019-02-04 11:42:17 -0700121
122 # Outside chroot with inside override should raise error.
123 is_inside = should_be_called = False
124 with self.assertRaises(cros_build_lib.DieSystemExit):
125 self.router.Route('chromite.api.OutsideChrootApiService',
Alex Klein5bcb4d22019-03-21 13:51:54 -0600126 'OutsideServiceInsideMethod', self.input_file,
127 self.output_file)
Alex Klein2bfacb22019-02-04 11:42:17 -0700128
129 # Inside chroot with inside override should be fine.
130 is_inside = should_be_called = True
131 self.router.Route('chromite.api.OutsideChrootApiService',
Alex Klein5bcb4d22019-03-21 13:51:54 -0600132 'OutsideServiceInsideMethod', self.input_file,
133 self.output_file)