blob: 02bfd0a1bf1945dd2d46170ff2ce705a4afe35b1 [file] [log] [blame]
George Burgess IVed696762016-09-12 18:24:54 -07001#!/usr/bin/env python2
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08002
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.
Caroline Tice88272d42016-01-13 09:48:29 -08006"""Unit test for experiment_factory.py"""
7
8from __future__ import print_function
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08009
10import StringIO
cmtice2250df92014-05-09 13:58:58 -070011import socket
12import mock
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080013import unittest
Ahmad Sharif4467f002012-12-20 12:09:49 -080014
Yunlian Jiang0d1a9f32015-12-09 10:47:11 -080015from cros_utils.file_utils import FileUtils
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080016
Ahmad Sharif4467f002012-12-20 12:09:49 -080017from experiment_factory import ExperimentFactory
18from experiment_file import ExperimentFile
19import test_flag
cmtice2250df92014-05-09 13:58:58 -070020import benchmark
cmtice2250df92014-05-09 13:58:58 -070021import experiment_factory
cmtice2250df92014-05-09 13:58:58 -070022import 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
Caroline Tice88272d42016-01-13 09:48:29 -080041# pylint: disable=too-many-function-args
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080042
Caroline Ticed768dc12016-10-28 14:35:21 -070043
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080044class ExperimentFactoryTest(unittest.TestCase):
Caroline Tice88272d42016-01-13 09:48:29 -080045 """Class for running experiment factory unittests."""
46
47 def setUp(self):
48 self.append_benchmark_call_args = []
cmtice2250df92014-05-09 13:58:58 -070049
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080050 def testLoadExperimentFile1(self):
51 experiment_file = ExperimentFile(StringIO.StringIO(EXPERIMENT_FILE_1))
Caroline Ticed768dc12016-10-28 14:35:21 -070052 exp = ExperimentFactory().GetExperiment(
53 experiment_file, working_directory='', log_dir='')
Caroline Tice88272d42016-01-13 09:48:29 -080054 self.assertEqual(exp.remote, ['chromeos-alex3'])
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080055
Caroline Tice88272d42016-01-13 09:48:29 -080056 self.assertEqual(len(exp.benchmarks), 1)
57 self.assertEqual(exp.benchmarks[0].name, 'PageCycler')
58 self.assertEqual(exp.benchmarks[0].test_name, 'PageCycler')
59 self.assertEqual(exp.benchmarks[0].iterations, 3)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080060
Caroline Tice88272d42016-01-13 09:48:29 -080061 self.assertEqual(len(exp.labels), 2)
62 self.assertEqual(exp.labels[0].chromeos_image,
Luis Lozanof2a3ef42015-12-15 13:49:30 -080063 '/usr/local/google/cros_image1.bin')
Caroline Tice88272d42016-01-13 09:48:29 -080064 self.assertEqual(exp.labels[0].board, 'x86-alex')
cmtice2250df92014-05-09 13:58:58 -070065
66 def test_append_benchmark_set(self):
67 ef = ExperimentFactory()
68
69 bench_list = []
Caroline Ticed768dc12016-10-28 14:35:21 -070070 ef.AppendBenchmarkSet(bench_list, experiment_factory.telemetry_perfv2_tests,
71 '', 1, False, '', 'telemetry_Crosperf', False, 0,
Caroline Tice88272d42016-01-13 09:48:29 -080072 False)
Luis Lozanof2a3ef42015-12-15 13:49:30 -080073 self.assertEqual(
74 len(bench_list), len(experiment_factory.telemetry_perfv2_tests))
cmtice2250df92014-05-09 13:58:58 -070075 self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
76
77 bench_list = []
Caroline Tice88272d42016-01-13 09:48:29 -080078 ef.AppendBenchmarkSet(bench_list,
79 experiment_factory.telemetry_pagecycler_tests, '', 1,
80 False, '', 'telemetry_Crosperf', False, 0, False)
Luis Lozanof2a3ef42015-12-15 13:49:30 -080081 self.assertEqual(
82 len(bench_list), len(experiment_factory.telemetry_pagecycler_tests))
cmtice2250df92014-05-09 13:58:58 -070083 self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
84
85 bench_list = []
Caroline Ticed768dc12016-10-28 14:35:21 -070086 ef.AppendBenchmarkSet(bench_list,
87 experiment_factory.telemetry_toolchain_perf_tests, '',
88 1, False, '', 'telemetry_Crosperf', False, 0, False)
Luis Lozanof2a3ef42015-12-15 13:49:30 -080089 self.assertEqual(
90 len(bench_list), len(experiment_factory.telemetry_toolchain_perf_tests))
cmtice2250df92014-05-09 13:58:58 -070091 self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
92
cmtice2250df92014-05-09 13:58:58 -070093 @mock.patch.object(socket, 'gethostname')
Caroline Tice88272d42016-01-13 09:48:29 -080094 def test_get_experiment(self, mock_socket):
cmtice2250df92014-05-09 13:58:58 -070095
96 test_flag.SetTestMode(False)
97 self.append_benchmark_call_args = []
Luis Lozanof2a3ef42015-12-15 13:49:30 -080098
cmtice2250df92014-05-09 13:58:58 -070099 def FakeAppendBenchmarkSet(bench_list, set_list, args, iters, rm_ch,
100 perf_args, suite, show_all):
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800101 'Helper function for test_get_experiment'
Caroline Ticed768dc12016-10-28 14:35:21 -0700102 arg_list = [
103 bench_list, set_list, args, iters, rm_ch, perf_args, suite, show_all
104 ]
Caroline Tice88272d42016-01-13 09:48:29 -0800105 self.append_benchmark_call_args.append(arg_list)
cmtice2250df92014-05-09 13:58:58 -0700106
107 def FakeGetDefaultRemotes(board):
Caroline Tice88272d42016-01-13 09:48:29 -0800108 if not board:
109 return []
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800110 return ['fake_chromeos_machine1.cros', 'fake_chromeos_machine2.cros']
cmtice2250df92014-05-09 13:58:58 -0700111
Manoj Gupta4b133962016-11-02 10:03:17 -0700112 def FakeGetXbuddyPath(build, autotest_dir, board, chroot, log_level):
113 autotest_path = autotest_dir
114 if not autotest_path:
115 autotest_path = 'fake_autotest_path'
Caroline Tice88272d42016-01-13 09:48:29 -0800116 if not build or not board or not chroot or not log_level:
Manoj Gupta4b133962016-11-02 10:03:17 -0700117 return '', autotest_path
118 return 'fake_image_path', autotest_path
cmtice2250df92014-05-09 13:58:58 -0700119
cmtice2250df92014-05-09 13:58:58 -0700120 ef = ExperimentFactory()
Caroline Tice88272d42016-01-13 09:48:29 -0800121 ef.AppendBenchmarkSet = FakeAppendBenchmarkSet
cmtice2250df92014-05-09 13:58:58 -0700122 ef.GetDefaultRemotes = FakeGetDefaultRemotes
123
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800124 label_settings = settings_factory.LabelSettings('image_label')
125 benchmark_settings = settings_factory.BenchmarkSettings('bench_test')
126 global_settings = settings_factory.GlobalSettings('test_name')
cmtice2250df92014-05-09 13:58:58 -0700127
128 label_settings.GetXbuddyPath = FakeGetXbuddyPath
129
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800130 mock_experiment_file = ExperimentFile(StringIO.StringIO(''))
cmtice2250df92014-05-09 13:58:58 -0700131 mock_experiment_file.all_settings = []
132
Caroline Tice7057cf62015-12-10 12:09:40 -0800133 test_flag.SetTestMode(True)
134 # Basic test.
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800135 global_settings.SetField('name', 'unittest_test')
136 global_settings.SetField('board', 'lumpy')
137 global_settings.SetField('remote', '123.45.67.89 123.45.76.80')
138 benchmark_settings.SetField('test_name', 'kraken')
139 benchmark_settings.SetField('suite', 'telemetry_Crosperf')
140 benchmark_settings.SetField('iterations', 1)
141 label_settings.SetField(
142 'chromeos_image',
143 'chromeos/src/build/images/lumpy/latest/chromiumos_test_image.bin')
144 label_settings.SetField('chrome_src', '/usr/local/google/home/chrome-top')
Manoj Gupta4b133962016-11-02 10:03:17 -0700145 label_settings.SetField('autotest_path', '/tmp/autotest')
cmtice2250df92014-05-09 13:58:58 -0700146
147 mock_experiment_file.global_settings = global_settings
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800148 mock_experiment_file.all_settings.append(label_settings)
149 mock_experiment_file.all_settings.append(benchmark_settings)
150 mock_experiment_file.all_settings.append(global_settings)
cmtice2250df92014-05-09 13:58:58 -0700151
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800152 mock_socket.return_value = ''
cmtice2250df92014-05-09 13:58:58 -0700153
154 # First test. General test.
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800155 exp = ef.GetExperiment(mock_experiment_file, '', '')
156 self.assertEqual(exp.remote, ['123.45.67.89', '123.45.76.80'])
cmtice2250df92014-05-09 13:58:58 -0700157 self.assertEqual(exp.cache_conditions, [0, 2, 1])
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800158 self.assertEqual(exp.log_level, 'average')
cmtice2250df92014-05-09 13:58:58 -0700159
160 self.assertEqual(len(exp.benchmarks), 1)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800161 self.assertEqual(exp.benchmarks[0].name, 'kraken')
162 self.assertEqual(exp.benchmarks[0].test_name, 'kraken')
cmtice2250df92014-05-09 13:58:58 -0700163 self.assertEqual(exp.benchmarks[0].iterations, 1)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800164 self.assertEqual(exp.benchmarks[0].suite, 'telemetry_Crosperf')
cmtice2250df92014-05-09 13:58:58 -0700165 self.assertFalse(exp.benchmarks[0].show_all_results)
166
167 self.assertEqual(len(exp.labels), 1)
168 self.assertEqual(exp.labels[0].chromeos_image,
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800169 'chromeos/src/build/images/lumpy/latest/'
170 'chromiumos_test_image.bin')
Manoj Gupta4b133962016-11-02 10:03:17 -0700171 self.assertEqual(exp.labels[0].autotest_path, '/tmp/autotest')
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800172 self.assertEqual(exp.labels[0].board, 'lumpy')
cmtice2250df92014-05-09 13:58:58 -0700173
174 # Second test: Remotes listed in labels.
Caroline Tice7057cf62015-12-10 12:09:40 -0800175 test_flag.SetTestMode(True)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800176 label_settings.SetField('remote', 'chromeos1.cros chromeos2.cros')
177 exp = ef.GetExperiment(mock_experiment_file, '', '')
Caroline Ticed768dc12016-10-28 14:35:21 -0700178 self.assertEqual(
179 exp.remote,
180 ['chromeos1.cros', 'chromeos2.cros', '123.45.67.89', '123.45.76.80'])
cmtice2250df92014-05-09 13:58:58 -0700181
182 # Third test: Automatic fixing of bad logging_level param:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800183 global_settings.SetField('logging_level', 'really loud!')
184 exp = ef.GetExperiment(mock_experiment_file, '', '')
185 self.assertEqual(exp.log_level, 'verbose')
cmtice2250df92014-05-09 13:58:58 -0700186
187 # Fourth test: Setting cache conditions; only 1 remote with "same_machine"
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800188 global_settings.SetField('rerun_if_failed', 'true')
189 global_settings.SetField('rerun', 'true')
190 global_settings.SetField('same_machine', 'true')
191 global_settings.SetField('same_specs', 'true')
cmtice2250df92014-05-09 13:58:58 -0700192
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800193 self.assertRaises(Exception, ef.GetExperiment, mock_experiment_file, '', '')
194 label_settings.SetField('remote', '')
195 global_settings.SetField('remote', '123.45.67.89')
196 exp = ef.GetExperiment(mock_experiment_file, '', '')
cmtice2250df92014-05-09 13:58:58 -0700197 self.assertEqual(exp.cache_conditions, [0, 2, 3, 4, 6, 1])
198
199 # Fifth Test: Adding a second label; calling GetXbuddyPath; omitting all
200 # remotes (Call GetDefaultRemotes).
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800201 mock_socket.return_value = 'test.corp.google.com'
202 global_settings.SetField('remote', '')
203 global_settings.SetField('same_machine', 'false')
cmtice2250df92014-05-09 13:58:58 -0700204
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800205 label_settings_2 = settings_factory.LabelSettings('official_image_label')
206 label_settings_2.SetField('chromeos_root', 'chromeos')
207 label_settings_2.SetField('build', 'official-dev')
Manoj Gupta4b133962016-11-02 10:03:17 -0700208 label_settings_2.SetField('autotest_path', '')
cmtice2250df92014-05-09 13:58:58 -0700209 label_settings_2.GetXbuddyPath = FakeGetXbuddyPath
210
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800211 mock_experiment_file.all_settings.append(label_settings_2)
212 exp = ef.GetExperiment(mock_experiment_file, '', '')
cmtice2250df92014-05-09 13:58:58 -0700213 self.assertEqual(len(exp.labels), 2)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800214 self.assertEqual(exp.labels[1].chromeos_image, 'fake_image_path')
Manoj Gupta4b133962016-11-02 10:03:17 -0700215 self.assertEqual(exp.labels[1].autotest_path, 'fake_autotest_path')
Caroline Ticed768dc12016-10-28 14:35:21 -0700216 self.assertEqual(
217 exp.remote,
218 ['fake_chromeos_machine1.cros', 'fake_chromeos_machine2.cros'])
cmtice2250df92014-05-09 13:58:58 -0700219
220 def test_get_default_remotes(self):
Caroline Ticed768dc12016-10-28 14:35:21 -0700221 board_list = [
222 'x86-alex', 'lumpy', 'elm', 'parrot', 'daisy', 'peach_pit', 'peppy',
223 'squawks'
224 ]
cmtice2250df92014-05-09 13:58:58 -0700225
226 ef = ExperimentFactory()
227 self.assertRaises(Exception, ef.GetDefaultRemotes, 'bad-board')
228
229 # Verify that we have entries for every board, and that we get three
230 # machines back for each board.
231 for b in board_list:
232 remotes = ef.GetDefaultRemotes(b)
Caroline Ticed768dc12016-10-28 14:35:21 -0700233 if b == 'elm':
234 self.assertEqual(len(remotes), 2)
235 else:
236 self.assertEqual(len(remotes), 3)
cmtice2250df92014-05-09 13:58:58 -0700237
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800238
239if __name__ == '__main__':
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800240 FileUtils.Configure(True)
Ahmad Sharif4467f002012-12-20 12:09:49 -0800241 test_flag.SetTestMode(True)
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800242 unittest.main()