blob: 5c09ee06e1be7b0e98d15ad18f436924bed076f4 [file] [log] [blame]
#!/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()