blob: e659693a631464f2c069c03ddc8dd5e3755db308 [file] [log] [blame]
#!/usr/bin/python
# Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import StringIO
import socket
import mock
import unittest
from utils.file_utils import FileUtils
from experiment_factory import ExperimentFactory
from experiment_file import ExperimentFile
import test_flag
import benchmark
import label
import experiment
import experiment_factory
import machine_manager
import settings_factory
EXPERIMENT_FILE_1 = """
board: x86-alex
remote: chromeos-alex3
benchmark: PageCycler {
iterations: 3
}
image1 {
chromeos_image: /usr/local/google/cros_image1.bin
}
image2 {
chromeos_image: /usr/local/google/cros_image2.bin
}
"""
class ExperimentFactoryTest(unittest.TestCase):
def testLoadExperimentFile1(self):
experiment_file = ExperimentFile(StringIO.StringIO(EXPERIMENT_FILE_1))
experiment = ExperimentFactory().GetExperiment(experiment_file,
working_directory="",
log_dir="")
self.assertEqual(experiment.remote, ["chromeos-alex3"])
self.assertEqual(len(experiment.benchmarks), 1)
self.assertEqual(experiment.benchmarks[0].name, "PageCycler")
self.assertEqual(experiment.benchmarks[0].test_name, "PageCycler")
self.assertEqual(experiment.benchmarks[0].iterations, 3)
self.assertEqual(len(experiment.labels), 2)
self.assertEqual(experiment.labels[0].chromeos_image,
"/usr/local/google/cros_image1.bin")
self.assertEqual(experiment.labels[0].board,
"x86-alex")
def test_append_benchmark_set(self):
ef = ExperimentFactory()
bench_list = []
ef._AppendBenchmarkSet(bench_list,
experiment_factory.telemetry_perfv2_tests,
"", 1, False, "", "telemetry_Crosperf", False)
self.assertEqual(len(bench_list),
len(experiment_factory.telemetry_perfv2_tests))
self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
bench_list = []
ef._AppendBenchmarkSet(bench_list,
experiment_factory.telemetry_pagecycler_tests,
"", 1, False, "", "telemetry_Crosperf", False)
self.assertEqual(len(bench_list),
len(experiment_factory.telemetry_pagecycler_tests))
self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
bench_list = []
ef._AppendBenchmarkSet(bench_list,
experiment_factory.telemetry_toolchain_perf_tests,
"", 1, False, "", "telemetry_Crosperf", False)
self.assertEqual(len(bench_list),
len(experiment_factory.telemetry_toolchain_perf_tests))
self.assertTrue(type(bench_list[0]) is benchmark.Benchmark)
@mock.patch.object(socket, 'gethostname')
@mock.patch.object(machine_manager.MachineManager, 'AddMachine')
def test_get_experiment(self, mock_machine_manager, mock_socket):
test_flag.SetTestMode(False)
self.append_benchmark_call_args = []
def FakeAppendBenchmarkSet(bench_list, set_list, args, iters, rm_ch,
perf_args, suite, show_all):
"Helper function for test_get_experiment"
arg_list = [bench_list, set_list, args, iters, rm_ch, perf_args, suite,
show_all]
self.append_benchmark_call_args.append(args_list)
def FakeGetDefaultRemotes(board):
return ["fake_chromeos_machine1.cros",
"fake_chromeos_machine2.cros"]
def FakeGetXbuddyPath(build, board, chroot, log_level):
return "fake_image_path"
ef = ExperimentFactory()
ef._AppendBenchmarkSet = FakeAppendBenchmarkSet
ef.GetDefaultRemotes = FakeGetDefaultRemotes
label_settings = settings_factory.LabelSettings("image_label")
benchmark_settings = settings_factory.BenchmarkSettings("bench_test")
global_settings = settings_factory.GlobalSettings("test_name")
label_settings.GetXbuddyPath = FakeGetXbuddyPath
mock_experiment_file = ExperimentFile(StringIO.StringIO(""))
mock_experiment_file.all_settings = []
# Basic test.
global_settings.SetField("name","unittest_test")
global_settings.SetField("board", "lumpy")
global_settings.SetField("remote", "123.45.67.89 123.45.76.80")
benchmark_settings.SetField("test_name", "kraken")
benchmark_settings.SetField("suite", "telemetry_Crosperf")
benchmark_settings.SetField("iterations", 1)
label_settings.SetField("chromeos_image", "chromeos/src/build/images/lumpy/latest/chromiumos_test_image.bin")
label_settings.SetField("chrome_src", "/usr/local/google/home/chrome-top")
mock_experiment_file.global_settings = global_settings
mock_experiment_file.all_settings.append (label_settings)
mock_experiment_file.all_settings.append (benchmark_settings)
mock_experiment_file.all_settings.append (global_settings)
mock_socket.return_value = ""
# First test. General test.
exp = ef.GetExperiment(mock_experiment_file, "", "")
self.assertEqual(exp.remote, ["123.45.67.89", "123.45.76.80"])
self.assertEqual(exp.cache_conditions, [0, 2, 1])
self.assertEqual(exp.log_level, "average")
self.assertEqual(len(exp.benchmarks), 1)
self.assertEqual(exp.benchmarks[0].name, "kraken")
self.assertEqual(exp.benchmarks[0].test_name, "kraken")
self.assertEqual(exp.benchmarks[0].iterations, 1)
self.assertEqual(exp.benchmarks[0].suite, "telemetry_Crosperf")
self.assertFalse(exp.benchmarks[0].show_all_results)
self.assertEqual(len(exp.labels), 1)
self.assertEqual(exp.labels[0].chromeos_image,
"chromeos/src/build/images/lumpy/latest/"
"chromiumos_test_image.bin")
self.assertEqual(exp.labels[0].board, "lumpy")
# Second test: Remotes listed in labels.
label_settings.SetField("remote", "chromeos1.cros chromeos2.cros")
exp = ef.GetExperiment(mock_experiment_file, "", "")
self.assertEqual(exp.remote,
["chromeos1.cros", "chromeos2.cros", "123.45.67.89",
"123.45.76.80", ])
# Third test: Automatic fixing of bad logging_level param:
global_settings.SetField("logging_level", "really loud!")
exp = ef.GetExperiment(mock_experiment_file, "", "")
self.assertEqual(exp.log_level, "verbose")
# Fourth test: Setting cache conditions; only 1 remote with "same_machine"
global_settings.SetField("rerun_if_failed", "true")
global_settings.SetField("rerun", "true")
global_settings.SetField("same_machine", "true")
global_settings.SetField("same_specs", "true")
self.assertRaises(Exception, ef.GetExperiment, mock_experiment_file, "",
"")
label_settings.SetField("remote", "")
global_settings.SetField("remote", "123.45.67.89")
exp = ef.GetExperiment(mock_experiment_file, "", "")
self.assertEqual(exp.cache_conditions, [0, 2, 3, 4, 6, 1])
# Fifth Test: Adding a second label; calling GetXbuddyPath; omitting all
# remotes (Call GetDefaultRemotes).
mock_socket.return_value = "test.corp.google.com"
global_settings.SetField("remote", "")
global_settings.SetField("same_machine", "false")
label_settings_2 = settings_factory.LabelSettings("official_image_label")
label_settings_2.SetField("chromeos_root", "chromeos")
label_settings.SetField("build", "official-dev")
label_settings_2.GetXbuddyPath = FakeGetXbuddyPath
mock_experiment_file.all_settings.append (label_settings_2)
exp = ef.GetExperiment(mock_experiment_file, "", "")
self.assertEqual(len(exp.labels), 2)
self.assertEqual(exp.labels[1].chromeos_image, "fake_image_path")
self.assertEqual(exp.remote, ["fake_chromeos_machine1.cros",
"fake_chromeos_machine2.cros"])
def test_get_default_remotes(self):
board_list = ['x86-zgb', 'x86-alex', 'lumpy', 'stumpy', 'parrot', 'daisy']
ef = ExperimentFactory()
self.assertRaises(Exception, ef.GetDefaultRemotes, 'bad-board')
# Verify that we have entries for every board, and that we get three
# machines back for each board.
for b in board_list:
remotes = ef.GetDefaultRemotes(b)
self.assertEqual(len(remotes), 3)
if __name__ == "__main__":
FileUtils.Configure(True)
test_flag.SetTestMode(True)
unittest.main()