xref: /aosp_15_r20/external/autotest/frontend/afe/rpc_utils_unittest.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li#!/usr/bin/env python3
2*9c5db199SXin Li#
3*9c5db199SXin Li# Copyright (c) 2016 The Chromium OS Authors. All rights reserved.
4*9c5db199SXin Li# Use of this source code is governed by a BSD-style license that can be
5*9c5db199SXin Li# found in the LICENSE file.
6*9c5db199SXin Li
7*9c5db199SXin Li"""Unit tests for frontend/afe/rpc_utils.py."""
8*9c5db199SXin Li
9*9c5db199SXin Liimport unittest
10*9c5db199SXin Lifrom unittest import mock
11*9c5db199SXin Li
12*9c5db199SXin Liimport common
13*9c5db199SXin Lifrom autotest_lib.client.common_lib import control_data
14*9c5db199SXin Lifrom autotest_lib.frontend import setup_django_environment
15*9c5db199SXin Lifrom autotest_lib.frontend.afe import frontend_test_utils
16*9c5db199SXin Lifrom autotest_lib.frontend.afe import models
17*9c5db199SXin Lifrom autotest_lib.frontend.afe import rpc_utils
18*9c5db199SXin Li
19*9c5db199SXin Li
20*9c5db199SXin Liclass DjangoModelTest(unittest.TestCase):
21*9c5db199SXin Li    """Unit tests for verifying Django behavior."""
22*9c5db199SXin Li
23*9c5db199SXin Li    def test_model_equal_by_id(self):
24*9c5db199SXin Li        """Test that model instances compare equal by id."""
25*9c5db199SXin Li        x = models.Host(id=10, hostname='foo')
26*9c5db199SXin Li        y = models.Host(id=10, hostname='bar')
27*9c5db199SXin Li        self.assertEqual(x, y)
28*9c5db199SXin Li
29*9c5db199SXin Li
30*9c5db199SXin Liclass RpcUtilsTest(unittest.TestCase,
31*9c5db199SXin Li                   frontend_test_utils.FrontendTestMixin):
32*9c5db199SXin Li    """Unit tests for functions in rpc_utils.py."""
33*9c5db199SXin Li    def setUp(self):
34*9c5db199SXin Li        self._frontend_common_setup()
35*9c5db199SXin Li
36*9c5db199SXin Li
37*9c5db199SXin Li    def tearDown(self):
38*9c5db199SXin Li        self._frontend_common_teardown()
39*9c5db199SXin Li
40*9c5db199SXin Li
41*9c5db199SXin Li    def testCheckIsServer(self):
42*9c5db199SXin Li        """Ensure that test type check is correct."""
43*9c5db199SXin Li        self.assertFalse(rpc_utils._check_is_server_test(None))
44*9c5db199SXin Li        self.assertFalse(rpc_utils._check_is_server_test(
45*9c5db199SXin Li            control_data.CONTROL_TYPE.CLIENT))
46*9c5db199SXin Li        self.assertFalse(rpc_utils._check_is_server_test('Client'))
47*9c5db199SXin Li        self.assertTrue(rpc_utils._check_is_server_test(
48*9c5db199SXin Li            control_data.CONTROL_TYPE.SERVER))
49*9c5db199SXin Li        self.assertTrue(rpc_utils._check_is_server_test('Server'))
50*9c5db199SXin Li        self.assertFalse(rpc_utils._check_is_server_test('InvalidType'))
51*9c5db199SXin Li
52*9c5db199SXin Li
53*9c5db199SXin Liclass ConvertToKwargsOnlyTest(unittest.TestCase):
54*9c5db199SXin Li    """Unit tests for _convert_to_kwargs_only()."""
55*9c5db199SXin Li
56*9c5db199SXin Li    # pylint: disable=unused-argument,missing-docstring
57*9c5db199SXin Li
58*9c5db199SXin Li    def test_no_kwargs_in_spec(self):
59*9c5db199SXin Li        """Test with function without kwargs."""
60*9c5db199SXin Li        def func(a, b):
61*9c5db199SXin Li            pass
62*9c5db199SXin Li        got = rpc_utils._convert_to_kwargs_only(func, (1, 2), {})
63*9c5db199SXin Li        self.assertEquals(got, {'a': 1, 'b': 2})
64*9c5db199SXin Li
65*9c5db199SXin Li    def test_pass_by_keyword(self):
66*9c5db199SXin Li        """Test passing required args by keyword."""
67*9c5db199SXin Li        def func(a, b):
68*9c5db199SXin Li            pass
69*9c5db199SXin Li        got = rpc_utils._convert_to_kwargs_only(func, (), {'a': 1, 'b': 2})
70*9c5db199SXin Li        self.assertEquals(got, {'a': 1, 'b': 2})
71*9c5db199SXin Li
72*9c5db199SXin Li    def test_with_kwargs(self):
73*9c5db199SXin Li        """Test with custom keyword arg."""
74*9c5db199SXin Li        def func(a, b, **kwargs):
75*9c5db199SXin Li            pass
76*9c5db199SXin Li        got = rpc_utils._convert_to_kwargs_only(func, (1, 2), {'c': 3})
77*9c5db199SXin Li        self.assertEquals(got, {'a': 1, 'b': 2, 'c': 3})
78*9c5db199SXin Li
79*9c5db199SXin Li    def test_with_kwargs_pass_by_keyword(self):
80*9c5db199SXin Li        """Test passing required parameter by keyword."""
81*9c5db199SXin Li        def func(a, b, **kwargs):
82*9c5db199SXin Li            pass
83*9c5db199SXin Li        got = rpc_utils._convert_to_kwargs_only(func, (1,), {'b': 2, 'c': 3})
84*9c5db199SXin Li        self.assertEquals(got, {'a': 1, 'b': 2, 'c': 3})
85*9c5db199SXin Li
86*9c5db199SXin Li    def test_empty_kwargs(self):
87*9c5db199SXin Li        """Test without passing kwargs."""
88*9c5db199SXin Li        def func(a, b, **kwargs):
89*9c5db199SXin Li            pass
90*9c5db199SXin Li        got = rpc_utils._convert_to_kwargs_only(func, (1, 2), {})
91*9c5db199SXin Li        self.assertEquals(got, {'a': 1, 'b': 2})
92*9c5db199SXin Li
93*9c5db199SXin Li    def test_with_varargs(self):
94*9c5db199SXin Li        """Test against vararg function."""
95*9c5db199SXin Li        def func(a, b, *args):
96*9c5db199SXin Li            pass
97*9c5db199SXin Li        got = rpc_utils._convert_to_kwargs_only(func, (1, 2, 3), {})
98*9c5db199SXin Li        self.assertEquals(got, {'a': 1, 'b': 2, 'args': (3,)})
99*9c5db199SXin Li
100*9c5db199SXin Li
101*9c5db199SXin Liclass AllowedHostsForMainJobTest(unittest.TestCase):
102*9c5db199SXin Li    """Unit tests for _allowed_hosts_for_main_job()."""
103*9c5db199SXin Li
104*9c5db199SXin Li    # pylint: disable=missing-docstring
105*9c5db199SXin Li
106*9c5db199SXin Li    @mock.patch.object(rpc_utils, 'bucket_hosts_by_shard', autospec=True)
107*9c5db199SXin Li    def test_multiple_shards(self, bucket_mock):
108*9c5db199SXin Li        bucket_mock.return_value = {
109*9c5db199SXin Li            'shard1': [],
110*9c5db199SXin Li            'shard2': [],
111*9c5db199SXin Li        }
112*9c5db199SXin Li        got = rpc_utils._allowed_hosts_for_main_job([])
113*9c5db199SXin Li        self.assertFalse(got)
114*9c5db199SXin Li
115*9c5db199SXin Li    @mock.patch.object(rpc_utils, 'bucket_hosts_by_shard', autospec=True)
116*9c5db199SXin Li    def test_one_shard_with_less_hosts(self, bucket_mock):
117*9c5db199SXin Li        bucket_mock.return_value = {
118*9c5db199SXin Li            'shard1': [1],
119*9c5db199SXin Li        }
120*9c5db199SXin Li        got = rpc_utils._allowed_hosts_for_main_job([1, 2])
121*9c5db199SXin Li        self.assertFalse(got)
122*9c5db199SXin Li
123*9c5db199SXin Li    @mock.patch.object(rpc_utils, 'bucket_hosts_by_shard', autospec=True)
124*9c5db199SXin Li    def test_one_shard_with_equal_hosts(self, bucket_mock):
125*9c5db199SXin Li        bucket_mock.return_value = {
126*9c5db199SXin Li            'shard1': [1, 2],
127*9c5db199SXin Li        }
128*9c5db199SXin Li        got = rpc_utils._allowed_hosts_for_main_job([1, 2])
129*9c5db199SXin Li        self.assertTrue(got)
130*9c5db199SXin Li
131*9c5db199SXin Li    @mock.patch.object(rpc_utils, 'bucket_hosts_by_shard', autospec=True)
132*9c5db199SXin Li    def test_no_shards(self, bucket_mock):
133*9c5db199SXin Li        bucket_mock.return_value = {}
134*9c5db199SXin Li        got = rpc_utils._allowed_hosts_for_main_job([1, 2])
135*9c5db199SXin Li        self.assertTrue(got)
136*9c5db199SXin Li
137*9c5db199SXin Li
138*9c5db199SXin Liif __name__ == '__main__':
139*9c5db199SXin Li    unittest.main()
140