blob: c8279e97ad0cf5e21ff456fd96210a10e1c7e003 [file] [log] [blame]
Mike Frysingerd03e6b52019-08-03 12:49:01 -04001#!/usr/bin/python2
mblighf9751332008-04-08 18:25:33 +00002
Allen Lid68a75c2017-01-19 14:04:23 -08003import collections
Dan Shi60cf6a92015-01-29 17:22:49 -08004import os
5import mox
6import types
7import unittest
8
mbligh4205d892008-07-14 16:23:20 +00009import common
mbligh6a242df2009-07-02 19:00:02 +000010from autotest_lib.client.common_lib import autotemp
Dan Shi60cf6a92015-01-29 17:22:49 -080011from autotest_lib.client.common_lib import global_config
12from autotest_lib.client.common_lib import lsbrelease_utils
mblighf9751332008-04-08 18:25:33 +000013
14
mblighf9751332008-04-08 18:25:33 +000015global_config_ini_contents = """
16[SECTION_A]
17value_1: 6.0
18value_2: hello
19value_3: true
20value_4: FALSE
21value_5: tRuE
22value_6: falsE
23
24[SECTION_B]
25value_1: -5
26value_2: 2.3
27value_3: 0
28value_4: 7
29
30[SECTION_C]
31value_1: nobody@localhost
Dan Shi60cf6a92015-01-29 17:22:49 -080032
33[SECTION_D]
34value_1: 1
Dan Shi42ffd3d2016-01-28 13:55:23 -080035
36[SECTION_E]
37value_1: 1
38value_2: 2
39value_a: A
40random: 1
41wireless_ssid_1.2.3.4/24: ssid_1
42wireless_ssid_4.3.2.1/16: ssid_2
Dan Shi60cf6a92015-01-29 17:22:49 -080043"""
44
45moblab_config_ini_contents = """
46[SECTION_C]
47value_1: moblab@remotehost
48
49[SECTION_D]
50value_1: 2
mblighf9751332008-04-08 18:25:33 +000051"""
52
53shadow_config_ini_contents = """
54[SECTION_C]
55value_1: somebody@remotehost
56"""
57
58
59def create_config_files():
Dan Shi60cf6a92015-01-29 17:22:49 -080060 """Create config files to be used for test."""
61 global_temp = autotemp.tempfile("global", ".ini", text=True)
mbligh6a242df2009-07-02 19:00:02 +000062 os.write(global_temp.fd, global_config_ini_contents)
jadmanski0afbb632008-06-06 21:10:57 +000063
Dan Shi60cf6a92015-01-29 17:22:49 -080064 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)
mbligh6a242df2009-07-02 19:00:02 +000068 os.write(shadow_temp.fd, shadow_config_ini_contents)
jadmanski0afbb632008-06-06 21:10:57 +000069
Dan Shi60cf6a92015-01-29 17:22:49 -080070 return (global_temp, shadow_temp, moblab_temp)
mblighf9751332008-04-08 18:25:33 +000071
72
Dan Shi60cf6a92015-01-29 17:22:49 -080073class global_config_test(mox.MoxTestBase):
74 """Test class"""
jadmanski0afbb632008-06-06 21:10:57 +000075 # grab the singelton
76 conf = global_config.global_config
mblighf9751332008-04-08 18:25:33 +000077
jadmanski0afbb632008-06-06 21:10:57 +000078 def setUp(self):
Dan Shi60cf6a92015-01-29 17:22:49 -080079 """Setup config files for test."""
80 super(global_config_test, self).setUp()
jadmanski0afbb632008-06-06 21:10:57 +000081 # set the config files to our test files
Dan Shi60cf6a92015-01-29 17:22:49 -080082 (self.global_temp, self.shadow_temp,
83 self.moblab_temp) = create_config_files()
mbligh6a242df2009-07-02 19:00:02 +000084
Dan Shi60cf6a92015-01-29 17:22:49 -080085 self.conf.set_config_files(self.global_temp.name, self.shadow_temp.name,
86 self.moblab_temp.name)
mbligh9b907d62008-05-13 17:56:24 +000087
mblighf9751332008-04-08 18:25:33 +000088
jadmanski0afbb632008-06-06 21:10:57 +000089 def tearDown(self):
Dan Shi60cf6a92015-01-29 17:22:49 -080090 """Cleanup and reset config settings."""
mbligh6a242df2009-07-02 19:00:02 +000091 self.shadow_temp.clean()
Dan Shi60cf6a92015-01-29 17:22:49 -080092 self.moblab_temp.clean()
mbligh6a242df2009-07-02 19:00:02 +000093 self.global_temp.clean()
jadmanski0afbb632008-06-06 21:10:57 +000094 self.conf.set_config_files(global_config.DEFAULT_CONFIG_FILE,
Dan Shi60cf6a92015-01-29 17:22:49 -080095 global_config.DEFAULT_SHADOW_FILE,
96 global_config.DEFAULT_MOBLAB_FILE)
mblighf9751332008-04-08 18:25:33 +000097
98
mbligh4f4e3112008-07-11 17:58:02 +000099 def test_float(self):
Dan Shi60cf6a92015-01-29 17:22:49 -0800100 """Test converting float value."""
jadmanski0afbb632008-06-06 21:10:57 +0000101 val = self.conf.get_config_value("SECTION_A", "value_1", float)
102 self.assertEquals(type(val), types.FloatType)
103 self.assertEquals(val, 6.0)
mblighf9751332008-04-08 18:25:33 +0000104
105
mbligh4f4e3112008-07-11 17:58:02 +0000106 def test_int(self):
Dan Shi60cf6a92015-01-29 17:22:49 -0800107 """Test converting int value."""
jadmanski0afbb632008-06-06 21:10:57 +0000108 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)
mblighf9751332008-04-08 18:25:33 +0000115
116
mbligh4f4e3112008-07-11 17:58:02 +0000117 def test_string(self):
Dan Shi60cf6a92015-01-29 17:22:49 -0800118 """Test converting string value."""
jadmanski0afbb632008-06-06 21:10:57 +0000119 val = self.conf.get_config_value("SECTION_A", "value_2")
120 self.assertEquals(type(val),types.StringType)
121 self.assertEquals(val, "hello")
mblighf9751332008-04-08 18:25:33 +0000122
123
Dan Shi60cf6a92015-01-29 17:22:49 -0800124 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.
jadmanski0afbb632008-06-06 21:10:57 +0000141 val = self.conf.get_config_value("SECTION_C", "value_1")
142 self.assertEquals(val, "somebody@remotehost")
143
Dan Shi60cf6a92015-01-29 17:22:49 -0800144 # 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
jadmanski0afbb632008-06-06 21:10:57 +0000164
mbligh4f4e3112008-07-11 17:58:02 +0000165 def test_exception(self):
Dan Shi60cf6a92015-01-29 17:22:49 -0800166 """Test exception to be raised on invalid config value."""
jadmanski0afbb632008-06-06 21:10:57 +0000167 error = 0
168 try:
Dan Shi60cf6a92015-01-29 17:22:49 -0800169 val = self.conf.get_config_value("SECTION_B", "value_2", int)
jadmanski0afbb632008-06-06 21:10:57 +0000170 except:
171 error = 1
172 self.assertEquals(error, 1)
173
174
mbligh4f4e3112008-07-11 17:58:02 +0000175 def test_boolean(self):
Dan Shi60cf6a92015-01-29 17:22:49 -0800176 """Test converting boolean value."""
jadmanski0afbb632008-06-06 21:10:57 +0000177 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
mbligh4f4e3112008-07-11 17:58:02 +0000187 def test_defaults(self):
Dan Shi60cf6a92015-01-29 17:22:49 -0800188 """Test default value works."""
jadmanski0afbb632008-06-06 21:10:57 +0000189 val = self.conf.get_config_value("MISSING", "foo", float, 3.6)
190 self.assertEquals(val, 3.6)
Dan Shi60cf6a92015-01-29 17:22:49 -0800191 val = self.conf.get_config_value("SECTION_A", "novalue", str, "default")
jadmanski0afbb632008-06-06 21:10:57 +0000192 self.assertEquals(val, "default")
mblighf9751332008-04-08 18:25:33 +0000193
194
Jakob Juelichf9c43d12014-10-14 18:11:56 -0700195 def test_fallback_key(self):
Dan Shi60cf6a92015-01-29 17:22:49 -0800196 """Test fallback value works."""
Jakob Juelichf9c43d12014-10-14 18:11:56 -0700197 val = self.conf.get_config_value_with_fallback(
Dan Shi60cf6a92015-01-29 17:22:49 -0800198 "SECTION_A", "value_3", "value_4", bool)
Jakob Juelichf9c43d12014-10-14 18:11:56 -0700199 self.assertEquals(val, True)
200
201 val = self.conf.get_config_value_with_fallback(
Dan Shi60cf6a92015-01-29 17:22:49 -0800202 "SECTION_A", "not_existing", "value_4", bool)
Jakob Juelichf9c43d12014-10-14 18:11:56 -0700203 self.assertEquals(val, False)
204
205 val = self.conf.get_config_value_with_fallback(
Dan Shi60cf6a92015-01-29 17:22:49 -0800206 "SECTION_A", "not_existing", "value_4",
207 fallback_section='SECTION_B')
Jakob Juelichf9c43d12014-10-14 18:11:56 -0700208 self.assertEquals(val, '7')
209
210 self.assertRaises(
Dan Shi60cf6a92015-01-29 17:22:49 -0800211 Exception, self.conf.get_config_value_with_fallback,
212 "SECTION_A", "not_existing", "also_not_existing", bool)
Jakob Juelichf9c43d12014-10-14 18:11:56 -0700213
214
Dan Shi42ffd3d2016-01-28 13:55:23 -0800215 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 Lid68a75c2017-01-19 14:04:23 -0800229 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
mblighf9751332008-04-08 18:25:33 +0000241# this is so the test can be run in standalone mode
242if __name__ == '__main__':
Dan Shi60cf6a92015-01-29 17:22:49 -0800243 """Main"""
jadmanski0afbb632008-06-06 21:10:57 +0000244 unittest.main()