#!/usr/bin/env python3 # -*- coding: utf-8 -*- # Copyright 2011 The ChromiumOS Authors # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """The unittest of experiment_file.""" import io import unittest from experiment_file import ExperimentFile EXPERIMENT_FILE_1 = """ board: x86-alex remote: chromeos-alex3 perf_args: record -a -e cycles benchmark: PageCycler { iterations: 3 } image1 { chromeos_image: /usr/local/google/cros_image1.bin } image2 { remote: chromeos-lumpy1 chromeos_image: /usr/local/google/cros_image2.bin } """ EXPERIMENT_FILE_2 = """ board: x86-alex remote: chromeos-alex3 iterations: 3 benchmark: PageCycler { } benchmark: AndroidBench { iterations: 2 } image1 { chromeos_image:/usr/local/google/cros_image1.bin } image2 { chromeos_image: /usr/local/google/cros_image2.bin } """ EXPERIMENT_FILE_3 = """ board: x86-alex remote: chromeos-alex3 iterations: 3 benchmark: PageCycler { } image1 { chromeos_image:/usr/local/google/cros_image1.bin } image1 { chromeos_image: /usr/local/google/cros_image2.bin } """ EXPERIMENT_FILE_4 = """ board: x86-alex remote: chromeos-alex3 iterations: 3 benchmark: webrtc { test_args: --story-filter=datachannel } benchmark: webrtc { test_args: --story-tag-filter=smoothness } image1 { chromeos_image:/usr/local/google/cros_image1.bin } """ DUT_CONFIG_EXPERIMENT_FILE_GOOD = """ board: kevin64 remote: chromeos-kevin.cros turbostat: False intel_pstate: no_hwp cooldown_temp: 38 cooldown_time: 5 governor: powersave cpu_usage: exclusive_cores cpu_freq_pct: 50 top_interval: 5 benchmark: speedometer { iterations: 3 suite: telemetry_Crosperf } image1 { chromeos_image:/usr/local/google/cros_image1.bin } """ DUT_CONFIG_EXPERIMENT_FILE_BAD_GOV = """ board: kevin64 remote: chromeos-kevin.cros intel_pstate: active governor: misspelled_governor benchmark: speedometer2 { iterations: 3 suite: telemetry_Crosperf } """ DUT_CONFIG_EXPERIMENT_FILE_BAD_CPUUSE = """ board: kevin64 remote: chromeos-kevin.cros turbostat: False governor: ondemand cpu_usage: unknown benchmark: speedometer2 { iterations: 3 suite: telemetry_Crosperf } image1 { chromeos_image:/usr/local/google/cros_image1.bin } """ OUTPUT_FILE = """board: x86-alex remote: chromeos-alex3 perf_args: record -a -e cycles benchmark: PageCycler { \titerations: 3 } label: image1 { \tchromeos_image: /usr/local/google/cros_image1.bin \tremote: chromeos-alex3 } label: image2 { \tchromeos_image: /usr/local/google/cros_image2.bin \tremote: chromeos-lumpy1 }\n\n""" class ExperimentFileTest(unittest.TestCase): """The main class for Experiment File test.""" def testLoadExperimentFile1(self): input_file = io.StringIO(EXPERIMENT_FILE_1) experiment_file = ExperimentFile(input_file) global_settings = experiment_file.GetGlobalSettings() self.assertEqual(global_settings.GetField("remote"), ["chromeos-alex3"]) self.assertEqual( global_settings.GetField("perf_args"), "record -a -e cycles" ) benchmark_settings = experiment_file.GetSettings("benchmark") self.assertEqual(len(benchmark_settings), 1) self.assertEqual(benchmark_settings[0].name, "PageCycler") self.assertEqual(benchmark_settings[0].GetField("iterations"), 3) label_settings = experiment_file.GetSettings("label") self.assertEqual(len(label_settings), 2) self.assertEqual(label_settings[0].name, "image1") self.assertEqual( label_settings[0].GetField("chromeos_image"), "/usr/local/google/cros_image1.bin", ) self.assertEqual( label_settings[1].GetField("remote"), ["chromeos-lumpy1"] ) self.assertEqual( label_settings[0].GetField("remote"), ["chromeos-alex3"] ) def testOverrideSetting(self): input_file = io.StringIO(EXPERIMENT_FILE_2) experiment_file = ExperimentFile(input_file) global_settings = experiment_file.GetGlobalSettings() self.assertEqual(global_settings.GetField("remote"), ["chromeos-alex3"]) benchmark_settings = experiment_file.GetSettings("benchmark") self.assertEqual(len(benchmark_settings), 2) self.assertEqual(benchmark_settings[0].name, "PageCycler") self.assertEqual(benchmark_settings[0].GetField("iterations"), 3) self.assertEqual(benchmark_settings[1].name, "AndroidBench") self.assertEqual(benchmark_settings[1].GetField("iterations"), 2) def testDuplicateLabel(self): input_file = io.StringIO(EXPERIMENT_FILE_3) self.assertRaises(Exception, ExperimentFile, input_file) def testDuplicateBenchmark(self): input_file = io.StringIO(EXPERIMENT_FILE_4) experiment_file = ExperimentFile(input_file) benchmark_settings = experiment_file.GetSettings("benchmark") self.assertEqual(benchmark_settings[0].name, "webrtc") self.assertEqual( benchmark_settings[0].GetField("test_args"), "--story-filter=datachannel", ) self.assertEqual(benchmark_settings[1].name, "webrtc") self.assertEqual( benchmark_settings[1].GetField("test_args"), "--story-tag-filter=smoothness", ) def testCanonicalize(self): input_file = io.StringIO(EXPERIMENT_FILE_1) experiment_file = ExperimentFile(input_file) res = experiment_file.Canonicalize() self.assertEqual(res, OUTPUT_FILE) def testLoadDutConfigExperimentFile_Good(self): input_file = io.StringIO(DUT_CONFIG_EXPERIMENT_FILE_GOOD) experiment_file = ExperimentFile(input_file) global_settings = experiment_file.GetGlobalSettings() self.assertEqual(global_settings.GetField("turbostat"), False) self.assertEqual(global_settings.GetField("intel_pstate"), "no_hwp") self.assertEqual(global_settings.GetField("governor"), "powersave") self.assertEqual( global_settings.GetField("cpu_usage"), "exclusive_cores" ) self.assertEqual(global_settings.GetField("cpu_freq_pct"), 50) self.assertEqual(global_settings.GetField("cooldown_time"), 5) self.assertEqual(global_settings.GetField("cooldown_temp"), 38) self.assertEqual(global_settings.GetField("top_interval"), 5) def testLoadDutConfigExperimentFile_WrongGovernor(self): input_file = io.StringIO(DUT_CONFIG_EXPERIMENT_FILE_BAD_GOV) with self.assertRaises(RuntimeError) as msg: ExperimentFile(input_file) self.assertRegex(str(msg.exception), "governor: misspelled_governor") self.assertRegex( str(msg.exception), "Invalid enum value for field 'governor'." r" Must be one of \(performance, powersave, userspace, ondemand," r" conservative, schedutils, sched, interactive\)", ) def testLoadDutConfigExperimentFile_WrongCpuUsage(self): input_file = io.StringIO(DUT_CONFIG_EXPERIMENT_FILE_BAD_CPUUSE) with self.assertRaises(RuntimeError) as msg: ExperimentFile(input_file) self.assertRegex(str(msg.exception), "cpu_usage: unknown") self.assertRegex( str(msg.exception), "Invalid enum value for field 'cpu_usage'." r" Must be one of \(all, big_only, little_only, exclusive_cores\)", ) if __name__ == "__main__": unittest.main()