experiment_factory_unittest.py revision f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbe
1#!/usr/bin/python
2
3# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7import StringIO
8import socket
9import mock
10import unittest
11
12from cros_utils.file_utils import FileUtils
13
14from experiment_factory import ExperimentFactory
15from experiment_file import ExperimentFile
16import test_flag
17import benchmark
18import label
19import experiment
20import experiment_factory
21import machine_manager
22import settings_factory
23import test_flag
24
25EXPERIMENT_FILE_1 = """
26  board: x86-alex
27  remote: chromeos-alex3
28
29  benchmark: PageCycler {
30    iterations: 3
31  }
32
33  image1 {
34    chromeos_image: /usr/local/google/cros_image1.bin
35  }
36
37  image2 {
38    chromeos_image: /usr/local/google/cros_image2.bin
39  }
40  """
41
42
43class ExperimentFactoryTest(unittest.TestCase):
44
45  def testLoadExperimentFile1(self):
46    experiment_file = ExperimentFile(StringIO.StringIO(EXPERIMENT_FILE_1))
47    experiment = ExperimentFactory().GetExperiment(experiment_file,
48                                                   working_directory='',
49                                                   log_dir='')
50    self.assertEqual(experiment.remote, ['chromeos-alex3'])
51
52    self.assertEqual(len(experiment.benchmarks), 1)
53    self.assertEqual(experiment.benchmarks[0].name, 'PageCycler')
54    self.assertEqual(experiment.benchmarks[0].test_name, 'PageCycler')
55    self.assertEqual(experiment.benchmarks[0].iterations, 3)
56
57    self.assertEqual(len(experiment.labels), 2)
58    self.assertEqual(experiment.labels[0].chromeos_image,
59                     '/usr/local/google/cros_image1.bin')
60    self.assertEqual(experiment.labels[0].board, 'x86-alex')
61
62  def test_append_benchmark_set(self):
63    ef = ExperimentFactory()
64
65    bench_list = []
66    ef._AppendBenchmarkSet(bench_list,
67                           experiment_factory.telemetry_perfv2_tests, '', 1,
68                           False, '', 'telemetry_Crosperf', False, 0, False)
69    self.assertEqual(
70        len(bench_list), len(experiment_factory.telemetry_perfv2_tests))
71    self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
72
73    bench_list = []
74    ef._AppendBenchmarkSet(bench_list,
75                           experiment_factory.telemetry_pagecycler_tests, '', 1,
76                           False, '', 'telemetry_Crosperf', False, 0, False)
77    self.assertEqual(
78        len(bench_list), len(experiment_factory.telemetry_pagecycler_tests))
79    self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
80
81    bench_list = []
82    ef._AppendBenchmarkSet(
83        bench_list, experiment_factory.telemetry_toolchain_perf_tests, '', 1,
84        False, '', 'telemetry_Crosperf', False, 0, False)
85    self.assertEqual(
86        len(bench_list), len(experiment_factory.telemetry_toolchain_perf_tests))
87    self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
88
89  @mock.patch.object(socket, 'gethostname')
90  @mock.patch.object(machine_manager.MachineManager, 'AddMachine')
91  def test_get_experiment(self, mock_machine_manager, mock_socket):
92
93    test_flag.SetTestMode(False)
94    self.append_benchmark_call_args = []
95
96    def FakeAppendBenchmarkSet(bench_list, set_list, args, iters, rm_ch,
97                               perf_args, suite, show_all):
98      'Helper function for test_get_experiment'
99      arg_list = [bench_list, set_list, args, iters, rm_ch, perf_args, suite,
100                  show_all]
101      self.append_benchmark_call_args.append(args_list)
102
103    def FakeGetDefaultRemotes(board):
104      return ['fake_chromeos_machine1.cros', 'fake_chromeos_machine2.cros']
105
106    def FakeGetXbuddyPath(build, board, chroot, log_level):
107      return 'fake_image_path'
108
109    ef = ExperimentFactory()
110    ef._AppendBenchmarkSet = FakeAppendBenchmarkSet
111    ef.GetDefaultRemotes = FakeGetDefaultRemotes
112
113    label_settings = settings_factory.LabelSettings('image_label')
114    benchmark_settings = settings_factory.BenchmarkSettings('bench_test')
115    global_settings = settings_factory.GlobalSettings('test_name')
116
117    label_settings.GetXbuddyPath = FakeGetXbuddyPath
118
119    mock_experiment_file = ExperimentFile(StringIO.StringIO(''))
120    mock_experiment_file.all_settings = []
121
122    test_flag.SetTestMode(True)
123    # Basic test.
124    global_settings.SetField('name', 'unittest_test')
125    global_settings.SetField('board', 'lumpy')
126    global_settings.SetField('remote', '123.45.67.89 123.45.76.80')
127    benchmark_settings.SetField('test_name', 'kraken')
128    benchmark_settings.SetField('suite', 'telemetry_Crosperf')
129    benchmark_settings.SetField('iterations', 1)
130    label_settings.SetField(
131        'chromeos_image',
132        'chromeos/src/build/images/lumpy/latest/chromiumos_test_image.bin')
133    label_settings.SetField('chrome_src', '/usr/local/google/home/chrome-top')
134
135    mock_experiment_file.global_settings = global_settings
136    mock_experiment_file.all_settings.append(label_settings)
137    mock_experiment_file.all_settings.append(benchmark_settings)
138    mock_experiment_file.all_settings.append(global_settings)
139
140    mock_socket.return_value = ''
141
142    # First test. General test.
143    exp = ef.GetExperiment(mock_experiment_file, '', '')
144    self.assertEqual(exp.remote, ['123.45.67.89', '123.45.76.80'])
145    self.assertEqual(exp.cache_conditions, [0, 2, 1])
146    self.assertEqual(exp.log_level, 'average')
147
148    self.assertEqual(len(exp.benchmarks), 1)
149    self.assertEqual(exp.benchmarks[0].name, 'kraken')
150    self.assertEqual(exp.benchmarks[0].test_name, 'kraken')
151    self.assertEqual(exp.benchmarks[0].iterations, 1)
152    self.assertEqual(exp.benchmarks[0].suite, 'telemetry_Crosperf')
153    self.assertFalse(exp.benchmarks[0].show_all_results)
154
155    self.assertEqual(len(exp.labels), 1)
156    self.assertEqual(exp.labels[0].chromeos_image,
157                     'chromeos/src/build/images/lumpy/latest/'
158                     'chromiumos_test_image.bin')
159    self.assertEqual(exp.labels[0].board, 'lumpy')
160
161    # Second test: Remotes listed in labels.
162    test_flag.SetTestMode(True)
163    label_settings.SetField('remote', 'chromeos1.cros chromeos2.cros')
164    exp = ef.GetExperiment(mock_experiment_file, '', '')
165    self.assertEqual(exp.remote, ['chromeos1.cros',
166                                  'chromeos2.cros',
167                                  '123.45.67.89',
168                                  '123.45.76.80'])
169
170    # Third test: Automatic fixing of bad  logging_level param:
171    global_settings.SetField('logging_level', 'really loud!')
172    exp = ef.GetExperiment(mock_experiment_file, '', '')
173    self.assertEqual(exp.log_level, 'verbose')
174
175    # Fourth test: Setting cache conditions; only 1 remote with "same_machine"
176    global_settings.SetField('rerun_if_failed', 'true')
177    global_settings.SetField('rerun', 'true')
178    global_settings.SetField('same_machine', 'true')
179    global_settings.SetField('same_specs', 'true')
180
181    self.assertRaises(Exception, ef.GetExperiment, mock_experiment_file, '', '')
182    label_settings.SetField('remote', '')
183    global_settings.SetField('remote', '123.45.67.89')
184    exp = ef.GetExperiment(mock_experiment_file, '', '')
185    self.assertEqual(exp.cache_conditions, [0, 2, 3, 4, 6, 1])
186
187    # Fifth Test: Adding a second label; calling GetXbuddyPath; omitting all
188    # remotes (Call GetDefaultRemotes).
189    mock_socket.return_value = 'test.corp.google.com'
190    global_settings.SetField('remote', '')
191    global_settings.SetField('same_machine', 'false')
192
193    label_settings_2 = settings_factory.LabelSettings('official_image_label')
194    label_settings_2.SetField('chromeos_root', 'chromeos')
195    label_settings_2.SetField('build', 'official-dev')
196    label_settings_2.GetXbuddyPath = FakeGetXbuddyPath
197
198    mock_experiment_file.all_settings.append(label_settings_2)
199    exp = ef.GetExperiment(mock_experiment_file, '', '')
200    self.assertEqual(len(exp.labels), 2)
201    self.assertEqual(exp.labels[1].chromeos_image, 'fake_image_path')
202    self.assertEqual(exp.remote, ['fake_chromeos_machine1.cros',
203                                  'fake_chromeos_machine2.cros'])
204
205  def test_get_default_remotes(self):
206    board_list = ['x86-alex', 'lumpy', 'stumpy', 'parrot', 'daisy', 'peach_pit',
207                  'peppy', 'squawks']
208
209    ef = ExperimentFactory()
210    self.assertRaises(Exception, ef.GetDefaultRemotes, 'bad-board')
211
212    # Verify that we have entries for every board, and that we get three
213    # machines back for each board.
214    for b in board_list:
215      remotes = ef.GetDefaultRemotes(b)
216      self.assertEqual(len(remotes), 3)
217
218
219if __name__ == '__main__':
220  FileUtils.Configure(True)
221  test_flag.SetTestMode(True)
222  unittest.main()
223