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