1#!/usr/bin/python3 2# 3# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7"""Unit tests for client/common_lib/cros/control_file_getter.py.""" 8 9import unittest 10from unittest.mock import patch 11 12import common 13 14from autotest_lib.client.common_lib import error 15from autotest_lib.client.common_lib.cros import dev_server 16from autotest_lib.server.cros.dynamic_suite import control_file_getter 17 18 19class DevServerGetterTest(unittest.TestCase): 20 """Unit tests for control_file_getter.DevServerGetter. 21 22 @var _HOST: fake dev server host address. 23 """ 24 25 _BUILD = 'fake/build' 26 _FILES = ['a/b/control', 'b/c/control'] 27 _CONTENTS = 'Multi-line\nControl File Contents\n' 28 _403 = dev_server.DevServerException('HTTP 403 Forbidden!') 29 30 def setUp(self): 31 super(DevServerGetterTest, self).setUp() 32 patcher = patch.object(dev_server, 'ImageServer') 33 self.dev_server = patcher.start() 34 self.addCleanup(patcher.stop) 35 36 self.getter = control_file_getter.DevServerGetter(self._BUILD, 37 self.dev_server) 38 39 def tearDown(self): 40 if self.dev_server.resolve.call_count > 0: 41 self.dev_server.resolve.assert_called_with(self._BUILD, 42 None, 43 ban_list=None) 44 45 def testListControlFiles(self): 46 """Should successfully list control files from the dev server.""" 47 self.dev_server.list_control_files.return_value = self._FILES 48 self.assertEquals(self.getter.get_control_file_list(), self._FILES) 49 self.assertEquals(self.getter._files, self._FILES) 50 self.dev_server.list_control_files.assert_called_with(self._BUILD, 51 suite_name='') 52 53 def testListControlFilesFail(self): 54 """Should fail to list control files from the dev server.""" 55 self.dev_server.list_control_files.return_value = None 56 57 self.dev_server.list_control_files.side_effect = self._403 58 self.assertRaises(error.NoControlFileList, 59 self.getter.get_control_file_list) 60 self.dev_server.list_control_files.assert_called_with(self._BUILD, 61 suite_name='') 62 63 def testGetControlFile(self): 64 """Should successfully get a control file from the dev server.""" 65 path = self._FILES[0] 66 self.dev_server.get_control_file.return_value = self._CONTENTS 67 self.assertEquals(self.getter.get_control_file_contents(path), 68 self._CONTENTS) 69 self.dev_server.get_control_file.assert_called_with(self._BUILD, path) 70 71 def testGetSuiteInfo(self): 72 """ 73 Should successfully list control files' path and contents from the 74 dev server. 75 """ 76 file_contents = {f:self._CONTENTS for f in self._FILES} 77 self.dev_server.list_suite_controls.return_value = file_contents 78 79 suite_info = self.getter.get_suite_info() 80 for k in suite_info.keys(): 81 self.assertEquals(suite_info[k], file_contents[k]) 82 self.assertEquals(sorted(self.getter._files), sorted(self._FILES)) 83 self.dev_server.list_suite_controls.assert_called_with(self._BUILD, 84 suite_name='') 85 86 def testListSuiteControlisFail(self): 87 """ 88 Should fail to list all control file's contents from the dev server. 89 """ 90 self.dev_server.list_suite_controls.side_effect = self._403 91 self.assertRaises(error.SuiteControlFileException, 92 self.getter.get_suite_info, 93 '') 94 self.dev_server.list_suite_controls.assert_called_with(self._BUILD, 95 suite_name='') 96 97 def testGetControlFileFail(self): 98 """Should fail to get a control file from the dev server.""" 99 path = self._FILES[0] 100 self.dev_server.get_control_file.side_effect = self._403 101 102 self.assertRaises(error.ControlFileNotFound, 103 self.getter.get_control_file_contents, 104 path) 105 self.dev_server.get_control_file.assert_called_with(self._BUILD, path) 106 107 def testGetControlFileByNameCached(self): 108 """\ 109 Should successfully get a cf by name from the dev server, using a cache. 110 """ 111 name = 'one' 112 path = "file/%s/control" % name 113 114 self.getter._files = self._FILES + [path] 115 self.dev_server.get_control_file.return_value = self._CONTENTS 116 self.assertEquals(self.getter.get_control_file_contents_by_name(name), 117 self._CONTENTS) 118 self.dev_server.get_control_file.assert_called_with(self._BUILD, path) 119 120 def testGetControlFileByName(self): 121 """\ 122 Should successfully get a control file from the dev server by name. 123 """ 124 name = 'one' 125 path = "file/%s/control" % name 126 127 files = self._FILES + [path] 128 self.dev_server.list_control_files.return_value = files 129 self.dev_server.get_control_file.return_value = self._CONTENTS 130 self.assertEquals(self.getter.get_control_file_contents_by_name(name), 131 self._CONTENTS) 132 self.dev_server.list_control_files.assert_called_with(self._BUILD, 133 suite_name='') 134 self.dev_server.get_control_file.assert_called_with(self._BUILD, path) 135 136 def testGetSuiteControlFileByName(self): 137 """\ 138 Should successfully get a suite control file from the devserver by name. 139 """ 140 name = 'control.bvt' 141 path = "file/" + name 142 143 files = self._FILES + [path] 144 self.dev_server.list_control_files.return_value = files 145 self.dev_server.get_control_file.return_value = self._CONTENTS 146 self.assertEquals(self.getter.get_control_file_contents_by_name(name), 147 self._CONTENTS) 148 self.dev_server.list_control_files.assert_called_with(self._BUILD, 149 suite_name='') 150 self.dev_server.get_control_file.assert_called_with(self._BUILD, path) 151 152 def testGetControlFileByNameFail(self): 153 """Should fail to get a control file from the dev server by name.""" 154 name = 'one' 155 156 self.dev_server.list_control_files.return_value = self._FILES 157 self.assertRaises(error.ControlFileNotFound, 158 self.getter.get_control_file_contents_by_name, 159 name) 160 161 162if __name__ == '__main__': 163 unittest.main() 164