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