1#!/usr/bin/env python3 2# -*- coding: utf-8 -*- 3# Copyright 2019 The ChromiumOS Authors 4# Use of this source code is governed by a BSD-style license that can be 5# found in the LICENSE file. 6 7"""unittest for settings.""" 8 9 10import unittest 11import unittest.mock as mock 12 13from cros_utils import logger 14import download_images 15from field import IntegerField 16from field import ListField 17import settings 18import settings_factory 19 20 21class TestSettings(unittest.TestCase): 22 """setting test class.""" 23 24 def setUp(self): 25 self.settings = settings.Settings("global_name", "global") 26 27 def test_init(self): 28 self.assertEqual(self.settings.name, "global_name") 29 self.assertEqual(self.settings.settings_type, "global") 30 self.assertIsNone(self.settings.parent) 31 32 def test_set_parent_settings(self): 33 self.assertIsNone(self.settings.parent) 34 settings_parent = {"fake_parent_entry": 0} 35 self.settings.SetParentSettings(settings_parent) 36 self.assertIsNotNone(self.settings.parent) 37 self.assertTrue(isinstance(self.settings.parent, dict)) 38 self.assertEqual(self.settings.parent, settings_parent) 39 40 def test_add_field(self): 41 self.assertEqual(self.settings.fields, {}) 42 self.settings.AddField( 43 IntegerField( 44 "iterations", 45 default=1, 46 required=False, 47 description="Number of iterations to " "run the test.", 48 ) 49 ) 50 self.assertEqual(len(self.settings.fields), 1) 51 # Adding the same field twice raises an exception. 52 self.assertRaises( 53 Exception, 54 self.settings.AddField, 55 ( 56 IntegerField( 57 "iterations", 58 default=1, 59 required=False, 60 description="Number of iterations to run " "the test.", 61 ) 62 ), 63 ) 64 res = self.settings.fields["iterations"] 65 self.assertIsInstance(res, IntegerField) 66 self.assertEqual(res.Get(), 1) 67 68 def test_set_field(self): 69 self.assertEqual(self.settings.fields, {}) 70 self.settings.AddField( 71 IntegerField( 72 "iterations", 73 default=1, 74 required=False, 75 description="Number of iterations to run the " "test.", 76 ) 77 ) 78 res = self.settings.fields["iterations"] 79 self.assertEqual(res.Get(), 1) 80 81 self.settings.SetField("iterations", 10) 82 res = self.settings.fields["iterations"] 83 self.assertEqual(res.Get(), 10) 84 85 # Setting a field that's not there raises an exception. 86 self.assertRaises( 87 Exception, self.settings.SetField, "remote", "lumpy1.cros" 88 ) 89 90 self.settings.AddField( 91 ListField( 92 "remote", 93 default=[], 94 description="A comma-separated list of ip's of " 95 "chromeos devices to run " 96 "experiments on.", 97 ) 98 ) 99 self.assertTrue(isinstance(self.settings.fields, dict)) 100 self.assertEqual(len(self.settings.fields), 2) 101 res = self.settings.fields["remote"] 102 self.assertEqual(res.Get(), []) 103 self.settings.SetField("remote", "lumpy1.cros", append=True) 104 self.settings.SetField("remote", "lumpy2.cros", append=True) 105 res = self.settings.fields["remote"] 106 self.assertEqual(res.Get(), ["lumpy1.cros", "lumpy2.cros"]) 107 108 def test_get_field(self): 109 # Getting a field that's not there raises an exception. 110 self.assertRaises(Exception, self.settings.GetField, "iterations") 111 112 # Getting a required field that hasn't been assigned raises an exception. 113 self.settings.AddField( 114 IntegerField( 115 "iterations", 116 required=True, 117 description="Number of iterations to " "run the test.", 118 ) 119 ) 120 self.assertIsNotNone(self.settings.fields["iterations"]) 121 self.assertRaises(Exception, self.settings.GetField, "iterations") 122 123 # Set the value, then get it. 124 self.settings.SetField("iterations", 5) 125 res = self.settings.GetField("iterations") 126 self.assertEqual(res, 5) 127 128 def test_inherit(self): 129 parent_settings = settings_factory.SettingsFactory().GetSettings( 130 "global", "global" 131 ) 132 label_settings = settings_factory.SettingsFactory().GetSettings( 133 "label", "label" 134 ) 135 self.assertEqual(parent_settings.GetField("chromeos_root"), "") 136 self.assertEqual(label_settings.GetField("chromeos_root"), "") 137 self.assertIsNone(label_settings.parent) 138 139 parent_settings.SetField("chromeos_root", "/tmp/chromeos") 140 label_settings.SetParentSettings(parent_settings) 141 self.assertEqual( 142 parent_settings.GetField("chromeos_root"), "/tmp/chromeos" 143 ) 144 self.assertEqual(label_settings.GetField("chromeos_root"), "") 145 label_settings.Inherit() 146 self.assertEqual( 147 label_settings.GetField("chromeos_root"), "/tmp/chromeos" 148 ) 149 150 def test_override(self): 151 self.settings.AddField( 152 ListField( 153 "email", 154 default=[], 155 description="Space-seperated" 156 "list of email addresses to send " 157 "email to.", 158 ) 159 ) 160 161 global_settings = settings_factory.SettingsFactory().GetSettings( 162 "global", "global" 163 ) 164 165 global_settings.SetField("email", "[email protected]", append=True) 166 global_settings.SetField("email", "[email protected]", append=True) 167 168 res = self.settings.GetField("email") 169 self.assertEqual(res, []) 170 171 self.settings.Override(global_settings) 172 res = self.settings.GetField("email") 173 self.assertEqual(res, ["[email protected]", "[email protected]"]) 174 175 def test_validate(self): 176 177 self.settings.AddField( 178 IntegerField( 179 "iterations", 180 required=True, 181 description="Number of iterations " "to run the test.", 182 ) 183 ) 184 self.settings.AddField( 185 ListField( 186 "remote", 187 default=[], 188 required=True, 189 description="A comma-separated list " 190 "of ip's of chromeos " 191 "devices to run experiments on.", 192 ) 193 ) 194 self.settings.AddField( 195 ListField( 196 "email", 197 default=[], 198 description="Space-seperated" 199 "list of email addresses to " 200 "send email to.", 201 ) 202 ) 203 204 # 'required' fields have not been assigned; should raise an exception. 205 self.assertRaises(Exception, self.settings.Validate) 206 self.settings.SetField("iterations", 2) 207 self.settings.SetField("remote", "x86-alex.cros", append=True) 208 # Should run without exception now. 209 self.settings.Validate() 210 211 @mock.patch.object(logger, "GetLogger") 212 @mock.patch.object(download_images.ImageDownloader, "Run") 213 @mock.patch.object(download_images, "ImageDownloader") 214 def test_get_xbuddy_path(self, mock_downloader, mock_run, mock_logger): 215 216 mock_run.return_value = "fake_xbuddy_translation" 217 mock_downloader.Run = mock_run 218 board = "lumpy" 219 chromeos_root = "/tmp/chromeos" 220 log_level = "average" 221 222 trybot_str = "trybot-lumpy-paladin/R34-5417.0.0-b1506" 223 official_str = "lumpy-release/R34-5417.0.0" 224 xbuddy_str = "latest-dev" 225 autotest_path = "" 226 debug_path = "" 227 download_debug = False 228 229 self.settings.GetXbuddyPath( 230 trybot_str, 231 autotest_path, 232 debug_path, 233 board, 234 chromeos_root, 235 log_level, 236 download_debug, 237 ) 238 self.assertEqual(mock_run.call_count, 1) 239 self.assertEqual( 240 mock_run.call_args_list[0][0], 241 ( 242 "/tmp/chromeos", 243 "remote/trybot-lumpy-paladin/R34-5417.0.0-b1506", 244 "", 245 "", 246 False, 247 ), 248 ) 249 250 mock_run.reset_mock() 251 self.settings.GetXbuddyPath( 252 official_str, 253 autotest_path, 254 debug_path, 255 board, 256 chromeos_root, 257 log_level, 258 download_debug, 259 ) 260 self.assertEqual(mock_run.call_count, 1) 261 self.assertEqual( 262 mock_run.call_args_list[0][0], 263 ( 264 "/tmp/chromeos", 265 "remote/lumpy-release/R34-5417.0.0", 266 "", 267 "", 268 False, 269 ), 270 ) 271 272 mock_run.reset_mock() 273 self.settings.GetXbuddyPath( 274 xbuddy_str, 275 autotest_path, 276 debug_path, 277 board, 278 chromeos_root, 279 log_level, 280 download_debug, 281 ) 282 self.assertEqual(mock_run.call_count, 1) 283 self.assertEqual( 284 mock_run.call_args_list[0][0], 285 ("/tmp/chromeos", "remote/lumpy/latest-dev", "", "", False), 286 ) 287 288 if mock_logger: 289 return 290 291 292if __name__ == "__main__": 293 unittest.main() 294