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