blob: dcb259067bfd71ea2f6b51922895f4f417b47a64 [file] [log] [blame]
cmtice6367e172014-06-17 16:30:45 -07001#!/usr/bin/python
2#
3# Copyright 2014 Google Inc. All Rights Reserved.
4
5import mock
6import unittest
7
8import settings
9import settings_factory
10
11from field import IntegerField
12from field import ListField
13import download_images
14
15from utils import logger
16
17class TestSettings(unittest.TestCase):
18
19 def setUp(self):
20 self.settings = settings.Settings('global_name', 'global')
21
22 def test_init(self):
23 self.assertEqual(self.settings.name, 'global_name')
24 self.assertEqual(self.settings.settings_type, 'global')
25 self.assertIsNone(self.settings.parent)
26
27
28 def test_set_parent_settings(self):
29 self.assertIsNone(self.settings.parent)
30 settings_parent = { 'fake_parent_entry' : 0 }
31 self.settings.SetParentSettings(settings_parent)
32 self.assertIsNotNone(self.settings.parent)
33 self.assertEqual(type(self.settings.parent), dict)
34 self.assertEqual(self.settings.parent, settings_parent)
35
36
37 def test_add_field(self):
38 self.assertEqual (self.settings.fields, {})
39 self.settings.AddField(IntegerField("iterations", default=1, required=False,
40 description="Number of iterations to run the "
41 "test."))
42 self.assertEqual(len(self.settings.fields), 1)
43 # Adding the same field twice raises an exception.
44 self.assertRaises (Exception, self.settings.AddField,
45 (IntegerField("iterations", default=1, required=False,
46 description="Number of iterations to run the"
47 " test.")))
48 res = self.settings.fields['iterations']
49 self.assertIsInstance(res, IntegerField)
50 self.assertEqual(res.Get(), 1)
51
52
53 def test_set_field(self):
54 self.assertEqual (self.settings.fields, {})
55 self.settings.AddField(IntegerField("iterations", default=1, required=False,
56 description="Number of iterations to run the "
57 "test."))
58 res = self.settings.fields['iterations']
59 self.assertEqual(res.Get(), 1)
60
61 self.settings.SetField('iterations', 10)
62 res = self.settings.fields['iterations']
63 self.assertEqual(res.Get(), 10)
64
65 # Setting a field that's not there raises an exception.
66 self.assertRaises (Exception, self.settings.SetField, 'remote', 'lumpy1.cros')
67
68 self.settings.AddField(ListField("remote", default=[], description=
69 "A comma-separated list of ip's of chromeos"
70 "devices to run experiments on."))
71 self.assertEqual(type(self.settings.fields), dict)
72 self.assertEqual(len(self.settings.fields), 2)
73 res = self.settings.fields['remote']
74 self.assertEqual(res.Get(), [])
75 self.settings.SetField('remote', 'lumpy1.cros', append=True)
76 self.settings.SetField('remote', 'lumpy2.cros', append=True)
77 res = self.settings.fields['remote']
78 self.assertEqual(res.Get(), [ 'lumpy1.cros', 'lumpy2.cros' ])
79
80
81 def test_get_field(self):
82 # Getting a field that's not there raises an exception.
83 self.assertRaises (Exception, self.settings.GetField, 'iterations')
84
85 # Getting a required field that hasn't been assigned raises an exception.
86 self.settings.AddField(IntegerField("iterations", required=True,
87 description="Number of iterations to run "
88 "the test."))
89 self.assertIsNotNone(self.settings.fields['iterations'])
90 self.assertRaises (Exception, self.settings.GetField, 'iterations')
91
92 # Set the value, then get it.
93 self.settings.SetField('iterations', 5)
94 res = self.settings.GetField('iterations')
95 self.assertEqual(res, 5)
96
97
98 def test_inherit(self):
99 parent_settings = settings_factory.SettingsFactory().GetSettings('global',
100 'global')
101 label_settings = settings_factory.SettingsFactory().GetSettings('label',
102 'label')
103 self.assertEqual(parent_settings.GetField('chromeos_root'), '')
104 self.assertEqual(label_settings.GetField('chromeos_root'), '')
105 self.assertIsNone(label_settings.parent)
106
107 parent_settings.SetField('chromeos_root', '/tmp/chromeos')
108 label_settings.SetParentSettings (parent_settings)
109 self.assertEqual(parent_settings.GetField('chromeos_root'), '/tmp/chromeos')
110 self.assertEqual(label_settings.GetField('chromeos_root'), '')
111 label_settings.Inherit()
112 self.assertEqual(label_settings.GetField('chromeos_root'), '/tmp/chromeos')
113
114
115 def test_override(self):
116 self.settings.AddField(ListField("email", default=[],
117 description="Space-seperated"
118 "list of email addresses to send email to."))
119
120
121 global_settings = settings_factory.SettingsFactory().GetSettings('global',
122 'global')
123
124 global_settings.SetField('email', 'john.doe@google.com', append=True)
125 global_settings.SetField('email', 'jane.smith@google.com', append=True)
126
127 res = self.settings.GetField('email')
128 self.assertEqual(res, [])
129
130 self.settings.Override(global_settings)
131 res = self.settings.GetField('email')
132 self.assertEqual(res, ['john.doe@google.com', 'jane.smith@google.com'])
133
134
135 def test_validate(self):
136
137 self.settings.AddField(IntegerField("iterations", required=True,
138 description="Number of iterations to run the "
139 "test."))
140 self.settings.AddField(ListField("remote", default=[], required=True,
141 description=
142 "A comma-separated list of ip's of chromeos"
143 "devices to run experiments on."))
144 self.settings.AddField(ListField("email", default=[],
145 description="Space-seperated"
146 "list of email addresses to send email to."))
147
148 # 'required' fields have not been assigned; should raise an exception.
149 self.assertRaises (Exception, self.settings.Validate)
150 self.settings.SetField('iterations', 2)
151 self.settings.SetField('remote', 'x86-alex.cros', append=True)
152 # Should run without exception now.
153 self.settings.Validate()
154
155 @mock.patch.object (logger,'GetLogger')
156 @mock.patch.object (download_images.ImageDownloader, 'Run')
157 @mock.patch.object (download_images, 'ImageDownloader')
158 def test_get_xbuddy_path(self, mock_downloader, mock_run, mock_logger):
159
160
161 mock_run.return_value = [ 0, 'fake_xbuddy_translation' ]
162 mock_downloader.Run = mock_run
163 board = 'lumpy'
164 chromeos_root = '/tmp/chromeos'
165 log_level = 'average'
166
167 trybot_str = 'trybot-lumpy-paladin/R34-5417.0.0-b1506'
168 official_str = 'lumpy-release/R34-5417.0.0'
169 xbuddy_str = 'latest-dev'
170
171 self.settings.GetXbuddyPath(trybot_str, board, chromeos_root, log_level)
172 self.assertEqual(mock_run.call_count, 1)
173 self.assertEqual(mock_run.call_args_list[0][0],
174 ('/tmp/chromeos',
175 'remote/trybot-lumpy-paladin/R34-5417.0.0-b1506',))
176
177
178 mock_run.reset_mock()
179 self.settings.GetXbuddyPath(official_str, board, chromeos_root, log_level)
180 self.assertEqual(mock_run.call_count, 1)
181 self.assertEqual(mock_run.call_args_list[0][0],
182 ('/tmp/chromeos',
183 'remote/lumpy-release/R34-5417.0.0',))
184
185
186 mock_run.reset_mock()
187 self.settings.GetXbuddyPath(xbuddy_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/lumpy/latest-dev',))
192
193 mock_run.return_value = [ 1, 'fake_xbuddy_translation' ]
194 self.assertRaises (Exception, self.settings.GetXbuddyPath, xbuddy_str, board,
195 chromeos_root, log_level)
196
197if __name__ == "__main__":
198 unittest.main()