Mike Frysinger | d03e6b5 | 2019-08-03 12:49:01 -0400 | [diff] [blame] | 1 | #!/usr/bin/python2 |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 2 | |
Allen Li | d68a75c | 2017-01-19 14:04:23 -0800 | [diff] [blame] | 3 | import collections |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 4 | import os |
| 5 | import mox |
| 6 | import types |
| 7 | import unittest |
| 8 | |
mbligh | 4205d89 | 2008-07-14 16:23:20 +0000 | [diff] [blame] | 9 | import common |
mbligh | 6a242df | 2009-07-02 19:00:02 +0000 | [diff] [blame] | 10 | from autotest_lib.client.common_lib import autotemp |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 11 | from autotest_lib.client.common_lib import global_config |
| 12 | from autotest_lib.client.common_lib import lsbrelease_utils |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 13 | |
| 14 | |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 15 | global_config_ini_contents = """ |
| 16 | [SECTION_A] |
| 17 | value_1: 6.0 |
| 18 | value_2: hello |
| 19 | value_3: true |
| 20 | value_4: FALSE |
| 21 | value_5: tRuE |
| 22 | value_6: falsE |
| 23 | |
| 24 | [SECTION_B] |
| 25 | value_1: -5 |
| 26 | value_2: 2.3 |
| 27 | value_3: 0 |
| 28 | value_4: 7 |
| 29 | |
| 30 | [SECTION_C] |
| 31 | value_1: nobody@localhost |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 32 | |
| 33 | [SECTION_D] |
| 34 | value_1: 1 |
Dan Shi | 42ffd3d | 2016-01-28 13:55:23 -0800 | [diff] [blame] | 35 | |
| 36 | [SECTION_E] |
| 37 | value_1: 1 |
| 38 | value_2: 2 |
| 39 | value_a: A |
| 40 | random: 1 |
| 41 | wireless_ssid_1.2.3.4/24: ssid_1 |
| 42 | wireless_ssid_4.3.2.1/16: ssid_2 |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 43 | """ |
| 44 | |
| 45 | moblab_config_ini_contents = """ |
| 46 | [SECTION_C] |
| 47 | value_1: moblab@remotehost |
| 48 | |
| 49 | [SECTION_D] |
| 50 | value_1: 2 |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 51 | """ |
| 52 | |
| 53 | shadow_config_ini_contents = """ |
| 54 | [SECTION_C] |
| 55 | value_1: somebody@remotehost |
| 56 | """ |
| 57 | |
| 58 | |
| 59 | def create_config_files(): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 60 | """Create config files to be used for test.""" |
| 61 | global_temp = autotemp.tempfile("global", ".ini", text=True) |
mbligh | 6a242df | 2009-07-02 19:00:02 +0000 | [diff] [blame] | 62 | os.write(global_temp.fd, global_config_ini_contents) |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 63 | |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 64 | moblab_temp = autotemp.tempfile("moblab", ".ini", text=True) |
| 65 | os.write(moblab_temp.fd, moblab_config_ini_contents) |
| 66 | |
| 67 | shadow_temp = autotemp.tempfile("shadow", ".ini", text=True) |
mbligh | 6a242df | 2009-07-02 19:00:02 +0000 | [diff] [blame] | 68 | os.write(shadow_temp.fd, shadow_config_ini_contents) |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 69 | |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 70 | return (global_temp, shadow_temp, moblab_temp) |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 71 | |
| 72 | |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 73 | class global_config_test(mox.MoxTestBase): |
| 74 | """Test class""" |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 75 | # grab the singelton |
| 76 | conf = global_config.global_config |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 77 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 78 | def setUp(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 79 | """Setup config files for test.""" |
| 80 | super(global_config_test, self).setUp() |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 81 | # set the config files to our test files |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 82 | (self.global_temp, self.shadow_temp, |
| 83 | self.moblab_temp) = create_config_files() |
mbligh | 6a242df | 2009-07-02 19:00:02 +0000 | [diff] [blame] | 84 | |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 85 | self.conf.set_config_files(self.global_temp.name, self.shadow_temp.name, |
| 86 | self.moblab_temp.name) |
mbligh | 9b907d6 | 2008-05-13 17:56:24 +0000 | [diff] [blame] | 87 | |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 88 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 89 | def tearDown(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 90 | """Cleanup and reset config settings.""" |
mbligh | 6a242df | 2009-07-02 19:00:02 +0000 | [diff] [blame] | 91 | self.shadow_temp.clean() |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 92 | self.moblab_temp.clean() |
mbligh | 6a242df | 2009-07-02 19:00:02 +0000 | [diff] [blame] | 93 | self.global_temp.clean() |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 94 | self.conf.set_config_files(global_config.DEFAULT_CONFIG_FILE, |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 95 | global_config.DEFAULT_SHADOW_FILE, |
| 96 | global_config.DEFAULT_MOBLAB_FILE) |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 97 | |
| 98 | |
mbligh | 4f4e311 | 2008-07-11 17:58:02 +0000 | [diff] [blame] | 99 | def test_float(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 100 | """Test converting float value.""" |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 101 | val = self.conf.get_config_value("SECTION_A", "value_1", float) |
| 102 | self.assertEquals(type(val), types.FloatType) |
| 103 | self.assertEquals(val, 6.0) |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 104 | |
| 105 | |
mbligh | 4f4e311 | 2008-07-11 17:58:02 +0000 | [diff] [blame] | 106 | def test_int(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 107 | """Test converting int value.""" |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 108 | val = self.conf.get_config_value("SECTION_B", "value_1", int) |
| 109 | self.assertEquals(type(val), types.IntType) |
| 110 | self.assertTrue(val < 0) |
| 111 | val = self.conf.get_config_value("SECTION_B", "value_3", int) |
| 112 | self.assertEquals(val, 0) |
| 113 | val = self.conf.get_config_value("SECTION_B", "value_4", int) |
| 114 | self.assertTrue(val > 0) |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 115 | |
| 116 | |
mbligh | 4f4e311 | 2008-07-11 17:58:02 +0000 | [diff] [blame] | 117 | def test_string(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 118 | """Test converting string value.""" |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 119 | val = self.conf.get_config_value("SECTION_A", "value_2") |
| 120 | self.assertEquals(type(val),types.StringType) |
| 121 | self.assertEquals(val, "hello") |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 122 | |
| 123 | |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 124 | def setIsMoblab(self, is_moblab): |
| 125 | """Set lsbrelease_utils.is_moblab result. |
| 126 | |
| 127 | @param is_moblab: Value to have lsbrelease_utils.is_moblab to return. |
| 128 | """ |
| 129 | self.mox.StubOutWithMock(lsbrelease_utils, 'is_moblab') |
| 130 | lsbrelease_utils.is_moblab().AndReturn(is_moblab) |
| 131 | |
| 132 | |
| 133 | def test_override_non_moblab(self): |
| 134 | """Test value overriding works in non-moblab setup.""" |
| 135 | self.setIsMoblab(False) |
| 136 | self.mox.ReplayAll() |
| 137 | |
| 138 | self.conf.reset_config_values() |
| 139 | |
| 140 | # Confirm shadow config overrides global config. |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 141 | val = self.conf.get_config_value("SECTION_C", "value_1") |
| 142 | self.assertEquals(val, "somebody@remotehost") |
| 143 | |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 144 | # Confirm moblab config should be ignored in non-moblab environment.. |
| 145 | val = self.conf.get_config_value("SECTION_D", "value_1") |
| 146 | self.assertEquals(val, "1") |
| 147 | |
| 148 | |
| 149 | def test_override_moblab(self): |
| 150 | """Test value overriding works in moblab setup.""" |
| 151 | self.setIsMoblab(True) |
| 152 | self.mox.ReplayAll() |
| 153 | |
| 154 | self.conf.reset_config_values() |
| 155 | |
| 156 | # Confirm shadow config overrides both moblab and global config. |
| 157 | val = self.conf.get_config_value("SECTION_C", "value_1") |
| 158 | self.assertEquals(val, "somebody@remotehost") |
| 159 | |
| 160 | # Confirm moblab config should override global config in moblab. |
| 161 | val = self.conf.get_config_value("SECTION_D", "value_1") |
| 162 | self.assertEquals(val, "2") |
| 163 | |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 164 | |
mbligh | 4f4e311 | 2008-07-11 17:58:02 +0000 | [diff] [blame] | 165 | def test_exception(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 166 | """Test exception to be raised on invalid config value.""" |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 167 | error = 0 |
| 168 | try: |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 169 | val = self.conf.get_config_value("SECTION_B", "value_2", int) |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 170 | except: |
| 171 | error = 1 |
| 172 | self.assertEquals(error, 1) |
| 173 | |
| 174 | |
mbligh | 4f4e311 | 2008-07-11 17:58:02 +0000 | [diff] [blame] | 175 | def test_boolean(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 176 | """Test converting boolean value.""" |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 177 | val = self.conf.get_config_value("SECTION_A", "value_3", bool) |
| 178 | self.assertEquals(val, True) |
| 179 | val = self.conf.get_config_value("SECTION_A", "value_4", bool) |
| 180 | self.assertEquals(val, False) |
| 181 | val = self.conf.get_config_value("SECTION_A", "value_5", bool) |
| 182 | self.assertEquals(val, True) |
| 183 | val = self.conf.get_config_value("SECTION_A", "value_6", bool) |
| 184 | self.assertEquals(val, False) |
| 185 | |
| 186 | |
mbligh | 4f4e311 | 2008-07-11 17:58:02 +0000 | [diff] [blame] | 187 | def test_defaults(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 188 | """Test default value works.""" |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 189 | val = self.conf.get_config_value("MISSING", "foo", float, 3.6) |
| 190 | self.assertEquals(val, 3.6) |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 191 | val = self.conf.get_config_value("SECTION_A", "novalue", str, "default") |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 192 | self.assertEquals(val, "default") |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 193 | |
| 194 | |
Jakob Juelich | f9c43d1 | 2014-10-14 18:11:56 -0700 | [diff] [blame] | 195 | def test_fallback_key(self): |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 196 | """Test fallback value works.""" |
Jakob Juelich | f9c43d1 | 2014-10-14 18:11:56 -0700 | [diff] [blame] | 197 | val = self.conf.get_config_value_with_fallback( |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 198 | "SECTION_A", "value_3", "value_4", bool) |
Jakob Juelich | f9c43d1 | 2014-10-14 18:11:56 -0700 | [diff] [blame] | 199 | self.assertEquals(val, True) |
| 200 | |
| 201 | val = self.conf.get_config_value_with_fallback( |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 202 | "SECTION_A", "not_existing", "value_4", bool) |
Jakob Juelich | f9c43d1 | 2014-10-14 18:11:56 -0700 | [diff] [blame] | 203 | self.assertEquals(val, False) |
| 204 | |
| 205 | val = self.conf.get_config_value_with_fallback( |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 206 | "SECTION_A", "not_existing", "value_4", |
| 207 | fallback_section='SECTION_B') |
Jakob Juelich | f9c43d1 | 2014-10-14 18:11:56 -0700 | [diff] [blame] | 208 | self.assertEquals(val, '7') |
| 209 | |
| 210 | self.assertRaises( |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 211 | Exception, self.conf.get_config_value_with_fallback, |
| 212 | "SECTION_A", "not_existing", "also_not_existing", bool) |
Jakob Juelich | f9c43d1 | 2014-10-14 18:11:56 -0700 | [diff] [blame] | 213 | |
| 214 | |
Dan Shi | 42ffd3d | 2016-01-28 13:55:23 -0800 | [diff] [blame] | 215 | def test_get_config_value_regex(self): |
| 216 | """Test get_config_value_regex works.""" |
| 217 | configs = self.conf.get_config_value_regex('SECTION_E', 'value_\d+', |
| 218 | int) |
| 219 | self.assertEquals(configs, {'value_1': 1, 'value_2': 2}) |
| 220 | configs = self.conf.get_config_value_regex('SECTION_E', 'value_.*') |
| 221 | self.assertEquals(configs, {'value_1': '1', 'value_2': '2', |
| 222 | 'value_a': 'A'}) |
| 223 | configs = self.conf.get_config_value_regex('SECTION_E', |
| 224 | 'wireless_ssid_.*') |
| 225 | self.assertEquals(configs, {'wireless_ssid_1.2.3.4/24': 'ssid_1', |
| 226 | 'wireless_ssid_4.3.2.1/16': 'ssid_2'}) |
| 227 | |
| 228 | |
Allen Li | d68a75c | 2017-01-19 14:04:23 -0800 | [diff] [blame] | 229 | def test_get_section_as_dict(self): |
| 230 | """Test get_section_as_dict.""" |
| 231 | got = self.conf.get_section_as_dict('SECTION_D') |
| 232 | self.assertEqual(got, collections.OrderedDict([('value_1', '1')])) |
| 233 | |
| 234 | |
| 235 | def test_get_section_as_dict_missing(self): |
| 236 | """Test get_section_as_dict with missing section.""" |
| 237 | got = self.conf.get_section_as_dict('FOOBAR') |
| 238 | self.assertEqual(got, collections.OrderedDict()) |
| 239 | |
| 240 | |
mbligh | f975133 | 2008-04-08 18:25:33 +0000 | [diff] [blame] | 241 | # this is so the test can be run in standalone mode |
| 242 | if __name__ == '__main__': |
Dan Shi | 60cf6a9 | 2015-01-29 17:22:49 -0800 | [diff] [blame] | 243 | """Main""" |
jadmanski | 0afbb63 | 2008-06-06 21:10:57 +0000 | [diff] [blame] | 244 | unittest.main() |