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