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