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