settings_unittest.py revision 4b133961b76c2cb8bc58f0ea2cded9e3438ffb6f
1#!/usr/bin/env python2 2# 3# Copyright 2014 Google Inc. All Rights Reserved. 4"""unittest for settings.""" 5 6from __future__ import print_function 7 8import mock 9import unittest 10 11import settings 12import settings_factory 13 14from field import IntegerField 15from field import ListField 16import download_images 17 18from cros_utils import logger 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.assertEqual(type(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 ' 48 'run the test.')) 49 self.assertEqual(len(self.settings.fields), 1) 50 # Adding the same field twice raises an exception. 51 self.assertRaises( 52 Exception, 53 self.settings.AddField, (IntegerField( 54 'iterations', 55 default=1, 56 required=False, 57 description='Number of iterations to run ' 58 'the test.'))) 59 res = self.settings.fields['iterations'] 60 self.assertIsInstance(res, IntegerField) 61 self.assertEqual(res.Get(), 1) 62 63 def test_set_field(self): 64 self.assertEqual(self.settings.fields, {}) 65 self.settings.AddField( 66 IntegerField( 67 'iterations', 68 default=1, 69 required=False, 70 description='Number of iterations to run the ' 71 'test.')) 72 res = self.settings.fields['iterations'] 73 self.assertEqual(res.Get(), 1) 74 75 self.settings.SetField('iterations', 10) 76 res = self.settings.fields['iterations'] 77 self.assertEqual(res.Get(), 10) 78 79 # Setting a field that's not there raises an exception. 80 self.assertRaises(Exception, self.settings.SetField, 'remote', 81 'lumpy1.cros') 82 83 self.settings.AddField( 84 ListField( 85 'remote', 86 default=[], 87 description="A comma-separated list of ip's of " 88 'chromeos devices to run ' 89 'experiments on.')) 90 self.assertEqual(type(self.settings.fields), dict) 91 self.assertEqual(len(self.settings.fields), 2) 92 res = self.settings.fields['remote'] 93 self.assertEqual(res.Get(), []) 94 self.settings.SetField('remote', 'lumpy1.cros', append=True) 95 self.settings.SetField('remote', 'lumpy2.cros', append=True) 96 res = self.settings.fields['remote'] 97 self.assertEqual(res.Get(), ['lumpy1.cros', 'lumpy2.cros']) 98 99 def test_get_field(self): 100 # Getting a field that's not there raises an exception. 101 self.assertRaises(Exception, self.settings.GetField, 'iterations') 102 103 # Getting a required field that hasn't been assigned raises an exception. 104 self.settings.AddField( 105 IntegerField( 106 'iterations', 107 required=True, 108 description='Number of iterations to ' 109 'run the test.')) 110 self.assertIsNotNone(self.settings.fields['iterations']) 111 self.assertRaises(Exception, self.settings.GetField, 'iterations') 112 113 # Set the value, then get it. 114 self.settings.SetField('iterations', 5) 115 res = self.settings.GetField('iterations') 116 self.assertEqual(res, 5) 117 118 def test_inherit(self): 119 parent_settings = settings_factory.SettingsFactory().GetSettings('global', 120 'global') 121 label_settings = settings_factory.SettingsFactory().GetSettings('label', 122 'label') 123 self.assertEqual(parent_settings.GetField('chromeos_root'), '') 124 self.assertEqual(label_settings.GetField('chromeos_root'), '') 125 self.assertIsNone(label_settings.parent) 126 127 parent_settings.SetField('chromeos_root', '/tmp/chromeos') 128 label_settings.SetParentSettings(parent_settings) 129 self.assertEqual(parent_settings.GetField('chromeos_root'), '/tmp/chromeos') 130 self.assertEqual(label_settings.GetField('chromeos_root'), '') 131 label_settings.Inherit() 132 self.assertEqual(label_settings.GetField('chromeos_root'), '/tmp/chromeos') 133 134 def test_override(self): 135 self.settings.AddField( 136 ListField( 137 'email', 138 default=[], 139 description='Space-seperated' 140 'list of email addresses to send ' 141 'email to.')) 142 143 global_settings = settings_factory.SettingsFactory().GetSettings('global', 144 'global') 145 146 global_settings.SetField('email', 'john.doe@google.com', append=True) 147 global_settings.SetField('email', 'jane.smith@google.com', append=True) 148 149 res = self.settings.GetField('email') 150 self.assertEqual(res, []) 151 152 self.settings.Override(global_settings) 153 res = self.settings.GetField('email') 154 self.assertEqual(res, ['john.doe@google.com', 'jane.smith@google.com']) 155 156 def test_validate(self): 157 158 self.settings.AddField( 159 IntegerField( 160 'iterations', 161 required=True, 162 description='Number of iterations ' 163 'to run the test.')) 164 self.settings.AddField( 165 ListField( 166 'remote', 167 default=[], 168 required=True, 169 description='A comma-separated list ' 170 "of ip's of chromeos " 171 'devices to run experiments on.')) 172 self.settings.AddField( 173 ListField( 174 'email', 175 default=[], 176 description='Space-seperated' 177 'list of email addresses to ' 178 'send email to.')) 179 180 # 'required' fields have not been assigned; should raise an exception. 181 self.assertRaises(Exception, self.settings.Validate) 182 self.settings.SetField('iterations', 2) 183 self.settings.SetField('remote', 'x86-alex.cros', append=True) 184 # Should run without exception now. 185 self.settings.Validate() 186 187 @mock.patch.object(logger, 'GetLogger') 188 @mock.patch.object(download_images.ImageDownloader, 'Run') 189 @mock.patch.object(download_images, 'ImageDownloader') 190 def test_get_xbuddy_path(self, mock_downloader, mock_run, mock_logger): 191 192 mock_run.return_value = 'fake_xbuddy_translation' 193 mock_downloader.Run = mock_run 194 board = 'lumpy' 195 chromeos_root = '/tmp/chromeos' 196 log_level = 'average' 197 198 trybot_str = 'trybot-lumpy-paladin/R34-5417.0.0-b1506' 199 official_str = 'lumpy-release/R34-5417.0.0' 200 xbuddy_str = 'latest-dev' 201 autotest_path = '' 202 203 self.settings.GetXbuddyPath(trybot_str, autotest_path, board, chromeos_root, 204 log_level) 205 self.assertEqual(mock_run.call_count, 1) 206 self.assertEqual(mock_run.call_args_list[0][0], 207 ('/tmp/chromeos', 208 'remote/trybot-lumpy-paladin/R34-5417.0.0-b1506', '')) 209 210 mock_run.reset_mock() 211 self.settings.GetXbuddyPath(official_str, autotest_path, board, 212 chromeos_root, log_level) 213 self.assertEqual(mock_run.call_count, 1) 214 self.assertEqual(mock_run.call_args_list[0][0], 215 ('/tmp/chromeos', 'remote/lumpy-release/R34-5417.0.0', '')) 216 217 mock_run.reset_mock() 218 self.settings.GetXbuddyPath(xbuddy_str, autotest_path, board, chromeos_root, 219 log_level) 220 self.assertEqual(mock_run.call_count, 1) 221 self.assertEqual(mock_run.call_args_list[0][0], 222 ('/tmp/chromeos', 'remote/lumpy/latest-dev', '')) 223 224 if mock_logger: 225 return 226 227 228if __name__ == '__main__': 229 unittest.main() 230