xref: /aosp_15_r20/external/toolchain-utils/crosperf/benchmark_run_unittest.py (revision 760c253c1ed00ce9abd48f8546f08516e57485fe)
1*760c253cSXin Li#!/usr/bin/env python3
2*760c253cSXin Li# -*- coding: utf-8 -*-
3*760c253cSXin Li
4*760c253cSXin Li# Copyright 2013 The ChromiumOS Authors
5*760c253cSXin Li# Use of this source code is governed by a BSD-style license that can be
6*760c253cSXin Li# found in the LICENSE file.
7*760c253cSXin Li
8*760c253cSXin Li"""Testing of benchmark_run."""
9*760c253cSXin Li
10*760c253cSXin Li
11*760c253cSXin Liimport inspect
12*760c253cSXin Liimport unittest
13*760c253cSXin Liimport unittest.mock as mock
14*760c253cSXin Li
15*760c253cSXin Lifrom benchmark import Benchmark
16*760c253cSXin Liimport benchmark_run
17*760c253cSXin Lifrom cros_utils import logger
18*760c253cSXin Lifrom label import MockLabel
19*760c253cSXin Lifrom machine_manager import MachineManager
20*760c253cSXin Lifrom machine_manager import MockCrosMachine
21*760c253cSXin Lifrom machine_manager import MockMachineManager
22*760c253cSXin Lifrom results_cache import CacheConditions
23*760c253cSXin Lifrom results_cache import MockResultsCache
24*760c253cSXin Lifrom results_cache import Result
25*760c253cSXin Lifrom results_cache import ResultsCache
26*760c253cSXin Lifrom suite_runner import MockSuiteRunner
27*760c253cSXin Lifrom suite_runner import SuiteRunner
28*760c253cSXin Li
29*760c253cSXin Li
30*760c253cSXin Liclass BenchmarkRunTest(unittest.TestCase):
31*760c253cSXin Li    """Unit tests for the BenchmarkRun class and all of its methods."""
32*760c253cSXin Li
33*760c253cSXin Li    def setUp(self):
34*760c253cSXin Li        self.status = []
35*760c253cSXin Li        self.called_ReadCache = None
36*760c253cSXin Li        self.log_error = []
37*760c253cSXin Li        self.log_output = []
38*760c253cSXin Li        self.err_msg = None
39*760c253cSXin Li        self.test_benchmark = Benchmark(
40*760c253cSXin Li            "page_cycler.netsim.top_10",  # name
41*760c253cSXin Li            "page_cycler.netsim.top_10",  # test_name
42*760c253cSXin Li            "",  # test_args
43*760c253cSXin Li            1,  # iterations
44*760c253cSXin Li            False,  # rm_chroot_tmp
45*760c253cSXin Li            "",  # perf_args
46*760c253cSXin Li            suite="telemetry_Crosperf",
47*760c253cSXin Li        )  # suite
48*760c253cSXin Li
49*760c253cSXin Li        self.test_label = MockLabel(
50*760c253cSXin Li            "test1",
51*760c253cSXin Li            "build",
52*760c253cSXin Li            "image1",
53*760c253cSXin Li            "autotest_dir",
54*760c253cSXin Li            "debug_dir",
55*760c253cSXin Li            "/tmp/test_benchmark_run",
56*760c253cSXin Li            "x86-alex",
57*760c253cSXin Li            "chromeos2-row1-rack4-host9.cros",
58*760c253cSXin Li            image_args="",
59*760c253cSXin Li            cache_dir="",
60*760c253cSXin Li            cache_only=False,
61*760c253cSXin Li            log_level="average",
62*760c253cSXin Li            compiler="gcc",
63*760c253cSXin Li            crosfleet=False,
64*760c253cSXin Li        )
65*760c253cSXin Li
66*760c253cSXin Li        self.test_cache_conditions = [
67*760c253cSXin Li            CacheConditions.CACHE_FILE_EXISTS,
68*760c253cSXin Li            CacheConditions.CHECKSUMS_MATCH,
69*760c253cSXin Li        ]
70*760c253cSXin Li
71*760c253cSXin Li        self.mock_logger = logger.GetLogger(log_dir="", mock=True)
72*760c253cSXin Li
73*760c253cSXin Li        self.mock_machine_manager = mock.Mock(spec=MachineManager)
74*760c253cSXin Li
75*760c253cSXin Li    def testDryRun(self):
76*760c253cSXin Li        my_label = MockLabel(
77*760c253cSXin Li            "test1",
78*760c253cSXin Li            "build",
79*760c253cSXin Li            "image1",
80*760c253cSXin Li            "autotest_dir",
81*760c253cSXin Li            "debug_dir",
82*760c253cSXin Li            "/tmp/test_benchmark_run",
83*760c253cSXin Li            "x86-alex",
84*760c253cSXin Li            "chromeos2-row1-rack4-host9.cros",
85*760c253cSXin Li            image_args="",
86*760c253cSXin Li            cache_dir="",
87*760c253cSXin Li            cache_only=False,
88*760c253cSXin Li            log_level="average",
89*760c253cSXin Li            compiler="gcc",
90*760c253cSXin Li            crosfleet=False,
91*760c253cSXin Li        )
92*760c253cSXin Li
93*760c253cSXin Li        logging_level = "average"
94*760c253cSXin Li        m = MockMachineManager("/tmp/chromeos_root", 0, logging_level, "")
95*760c253cSXin Li        m.AddMachine("chromeos2-row1-rack4-host9.cros")
96*760c253cSXin Li        bench = Benchmark(
97*760c253cSXin Li            "page_cycler.netsim.top_10",  # name
98*760c253cSXin Li            "page_cycler.netsim.top_10",  # test_name
99*760c253cSXin Li            "",  # test_args
100*760c253cSXin Li            1,  # iterations
101*760c253cSXin Li            False,  # rm_chroot_tmp
102*760c253cSXin Li            "",  # perf_args
103*760c253cSXin Li            suite="telemetry_Crosperf",
104*760c253cSXin Li        )  # suite
105*760c253cSXin Li        dut_conf = {
106*760c253cSXin Li            "cooldown_time": 5,
107*760c253cSXin Li            "cooldown_temp": 45,
108*760c253cSXin Li            "governor": "powersave",
109*760c253cSXin Li            "cpu_usage": "big_only",
110*760c253cSXin Li            "cpu_freq_pct": 80,
111*760c253cSXin Li        }
112*760c253cSXin Li        b = benchmark_run.MockBenchmarkRun(
113*760c253cSXin Li            "test run",
114*760c253cSXin Li            bench,
115*760c253cSXin Li            my_label,
116*760c253cSXin Li            1,
117*760c253cSXin Li            [],
118*760c253cSXin Li            m,
119*760c253cSXin Li            logger.GetLogger(),
120*760c253cSXin Li            logging_level,
121*760c253cSXin Li            "",
122*760c253cSXin Li            dut_conf,
123*760c253cSXin Li        )
124*760c253cSXin Li        b.cache = MockResultsCache()
125*760c253cSXin Li        b.suite_runner = MockSuiteRunner()
126*760c253cSXin Li        b.start()
127*760c253cSXin Li
128*760c253cSXin Li        # Make sure the arguments to BenchmarkRun.__init__ have not changed
129*760c253cSXin Li        # since the last time this test was updated:
130*760c253cSXin Li        args_list = [
131*760c253cSXin Li            "self",
132*760c253cSXin Li            "name",
133*760c253cSXin Li            "benchmark",
134*760c253cSXin Li            "label",
135*760c253cSXin Li            "iteration",
136*760c253cSXin Li            "cache_conditions",
137*760c253cSXin Li            "machine_manager",
138*760c253cSXin Li            "logger_to_use",
139*760c253cSXin Li            "log_level",
140*760c253cSXin Li            "share_cache",
141*760c253cSXin Li            "dut_config",
142*760c253cSXin Li        ]
143*760c253cSXin Li        arg_spec = inspect.getfullargspec(benchmark_run.BenchmarkRun.__init__)
144*760c253cSXin Li        self.assertEqual(len(arg_spec.args), len(args_list))
145*760c253cSXin Li        self.assertEqual(arg_spec.args, args_list)
146*760c253cSXin Li
147*760c253cSXin Li    def test_init(self):
148*760c253cSXin Li        # Nothing really worth testing here; just field assignments.
149*760c253cSXin Li        pass
150*760c253cSXin Li
151*760c253cSXin Li    def test_read_cache(self):
152*760c253cSXin Li        # Nothing really worth testing here, either.
153*760c253cSXin Li        pass
154*760c253cSXin Li
155*760c253cSXin Li    def test_run(self):
156*760c253cSXin Li        br = benchmark_run.BenchmarkRun(
157*760c253cSXin Li            "test_run",
158*760c253cSXin Li            self.test_benchmark,
159*760c253cSXin Li            self.test_label,
160*760c253cSXin Li            1,
161*760c253cSXin Li            self.test_cache_conditions,
162*760c253cSXin Li            self.mock_machine_manager,
163*760c253cSXin Li            self.mock_logger,
164*760c253cSXin Li            "average",
165*760c253cSXin Li            "",
166*760c253cSXin Li            {},
167*760c253cSXin Li        )
168*760c253cSXin Li
169*760c253cSXin Li        def MockLogOutput(msg, print_to_console=False):
170*760c253cSXin Li            """Helper function for test_run."""
171*760c253cSXin Li            del print_to_console
172*760c253cSXin Li            self.log_output.append(msg)
173*760c253cSXin Li
174*760c253cSXin Li        def MockLogError(msg, print_to_console=False):
175*760c253cSXin Li            """Helper function for test_run."""
176*760c253cSXin Li            del print_to_console
177*760c253cSXin Li            self.log_error.append(msg)
178*760c253cSXin Li
179*760c253cSXin Li        def MockRecordStatus(msg):
180*760c253cSXin Li            """Helper function for test_run."""
181*760c253cSXin Li            self.status.append(msg)
182*760c253cSXin Li
183*760c253cSXin Li        def FakeReadCache():
184*760c253cSXin Li            """Helper function for test_run."""
185*760c253cSXin Li            br.cache = mock.Mock(spec=ResultsCache)
186*760c253cSXin Li            self.called_ReadCache = True
187*760c253cSXin Li            return 0
188*760c253cSXin Li
189*760c253cSXin Li        def FakeReadCacheSucceed():
190*760c253cSXin Li            """Helper function for test_run."""
191*760c253cSXin Li            br.cache = mock.Mock(spec=ResultsCache)
192*760c253cSXin Li            br.result = mock.Mock(spec=Result)
193*760c253cSXin Li            br.result.out = "result.out stuff"
194*760c253cSXin Li            br.result.err = "result.err stuff"
195*760c253cSXin Li            br.result.retval = 0
196*760c253cSXin Li            self.called_ReadCache = True
197*760c253cSXin Li            return 0
198*760c253cSXin Li
199*760c253cSXin Li        def FakeReadCacheException():
200*760c253cSXin Li            """Helper function for test_run."""
201*760c253cSXin Li            raise RuntimeError(
202*760c253cSXin Li                "This is an exception test; it is supposed to happen"
203*760c253cSXin Li            )
204*760c253cSXin Li
205*760c253cSXin Li        def FakeAcquireMachine():
206*760c253cSXin Li            """Helper function for test_run."""
207*760c253cSXin Li            mock_machine = MockCrosMachine(
208*760c253cSXin Li                "chromeos1-row3-rack5-host7.cros", "chromeos", "average"
209*760c253cSXin Li            )
210*760c253cSXin Li            return mock_machine
211*760c253cSXin Li
212*760c253cSXin Li        def FakeRunTest(_machine):
213*760c253cSXin Li            """Helper function for test_run."""
214*760c253cSXin Li            mock_result = mock.Mock(spec=Result)
215*760c253cSXin Li            mock_result.retval = 0
216*760c253cSXin Li            return mock_result
217*760c253cSXin Li
218*760c253cSXin Li        def FakeRunTestFail(_machine):
219*760c253cSXin Li            """Helper function for test_run."""
220*760c253cSXin Li            mock_result = mock.Mock(spec=Result)
221*760c253cSXin Li            mock_result.retval = 1
222*760c253cSXin Li            return mock_result
223*760c253cSXin Li
224*760c253cSXin Li        def ResetTestValues():
225*760c253cSXin Li            """Helper function for test_run."""
226*760c253cSXin Li            self.log_output = []
227*760c253cSXin Li            self.log_error = []
228*760c253cSXin Li            self.status = []
229*760c253cSXin Li            br.result = None
230*760c253cSXin Li            self.called_ReadCache = False
231*760c253cSXin Li
232*760c253cSXin Li        # Assign all the fake functions to the appropriate objects.
233*760c253cSXin Li        br.logger().LogOutput = MockLogOutput
234*760c253cSXin Li        br.logger().LogError = MockLogError
235*760c253cSXin Li        br.timeline.Record = MockRecordStatus
236*760c253cSXin Li        br.ReadCache = FakeReadCache
237*760c253cSXin Li        br.RunTest = FakeRunTest
238*760c253cSXin Li        br.AcquireMachine = FakeAcquireMachine
239*760c253cSXin Li
240*760c253cSXin Li        # First test:  No cache hit, all goes well.
241*760c253cSXin Li        ResetTestValues()
242*760c253cSXin Li        br.run()
243*760c253cSXin Li        self.assertTrue(self.called_ReadCache)
244*760c253cSXin Li        self.assertEqual(
245*760c253cSXin Li            self.log_output,
246*760c253cSXin Li            [
247*760c253cSXin Li                "test_run: No cache hit.",
248*760c253cSXin Li                "Releasing machine: chromeos1-row3-rack5-host7.cros",
249*760c253cSXin Li                "Released machine: chromeos1-row3-rack5-host7.cros",
250*760c253cSXin Li            ],
251*760c253cSXin Li        )
252*760c253cSXin Li        self.assertEqual(len(self.log_error), 0)
253*760c253cSXin Li        self.assertEqual(self.status, ["WAITING", "SUCCEEDED"])
254*760c253cSXin Li
255*760c253cSXin Li        # Second test: No cached result found; test run was "terminated" for some
256*760c253cSXin Li        # reason.
257*760c253cSXin Li        ResetTestValues()
258*760c253cSXin Li        br.terminated = True
259*760c253cSXin Li        br.run()
260*760c253cSXin Li        self.assertTrue(self.called_ReadCache)
261*760c253cSXin Li        self.assertEqual(
262*760c253cSXin Li            self.log_output,
263*760c253cSXin Li            [
264*760c253cSXin Li                "test_run: No cache hit.",
265*760c253cSXin Li                "Releasing machine: chromeos1-row3-rack5-host7.cros",
266*760c253cSXin Li                "Released machine: chromeos1-row3-rack5-host7.cros",
267*760c253cSXin Li            ],
268*760c253cSXin Li        )
269*760c253cSXin Li        self.assertEqual(len(self.log_error), 0)
270*760c253cSXin Li        self.assertEqual(self.status, ["WAITING"])
271*760c253cSXin Li
272*760c253cSXin Li        # Third test.  No cached result found; RunTest failed for some reason.
273*760c253cSXin Li        ResetTestValues()
274*760c253cSXin Li        br.terminated = False
275*760c253cSXin Li        br.RunTest = FakeRunTestFail
276*760c253cSXin Li        br.run()
277*760c253cSXin Li        self.assertTrue(self.called_ReadCache)
278*760c253cSXin Li        self.assertEqual(
279*760c253cSXin Li            self.log_output,
280*760c253cSXin Li            [
281*760c253cSXin Li                "test_run: No cache hit.",
282*760c253cSXin Li                "Releasing machine: chromeos1-row3-rack5-host7.cros",
283*760c253cSXin Li                "Released machine: chromeos1-row3-rack5-host7.cros",
284*760c253cSXin Li            ],
285*760c253cSXin Li        )
286*760c253cSXin Li        self.assertEqual(len(self.log_error), 0)
287*760c253cSXin Li        self.assertEqual(self.status, ["WAITING", "FAILED"])
288*760c253cSXin Li
289*760c253cSXin Li        # Fourth test: ReadCache found a cached result.
290*760c253cSXin Li        ResetTestValues()
291*760c253cSXin Li        br.RunTest = FakeRunTest
292*760c253cSXin Li        br.ReadCache = FakeReadCacheSucceed
293*760c253cSXin Li        br.run()
294*760c253cSXin Li        self.assertTrue(self.called_ReadCache)
295*760c253cSXin Li        self.assertEqual(
296*760c253cSXin Li            self.log_output,
297*760c253cSXin Li            [
298*760c253cSXin Li                "test_run: Cache hit.",
299*760c253cSXin Li                "result.out stuff",
300*760c253cSXin Li                "Releasing machine: chromeos1-row3-rack5-host7.cros",
301*760c253cSXin Li                "Released machine: chromeos1-row3-rack5-host7.cros",
302*760c253cSXin Li            ],
303*760c253cSXin Li        )
304*760c253cSXin Li        self.assertEqual(self.log_error, ["result.err stuff"])
305*760c253cSXin Li        self.assertEqual(self.status, ["SUCCEEDED"])
306*760c253cSXin Li
307*760c253cSXin Li        # Fifth test: ReadCache generates an exception; does the try/finally block
308*760c253cSXin Li        # work?
309*760c253cSXin Li        ResetTestValues()
310*760c253cSXin Li        br.ReadCache = FakeReadCacheException
311*760c253cSXin Li        br.machine = FakeAcquireMachine()
312*760c253cSXin Li        br.run()
313*760c253cSXin Li        self.assertEqual(
314*760c253cSXin Li            self.log_error,
315*760c253cSXin Li            [
316*760c253cSXin Li                "Benchmark run: 'test_run' failed: This is an exception test; it is "
317*760c253cSXin Li                "supposed to happen"
318*760c253cSXin Li            ],
319*760c253cSXin Li        )
320*760c253cSXin Li        self.assertEqual(self.status, ["FAILED"])
321*760c253cSXin Li
322*760c253cSXin Li    def test_terminate_pass(self):
323*760c253cSXin Li        br = benchmark_run.BenchmarkRun(
324*760c253cSXin Li            "test_run",
325*760c253cSXin Li            self.test_benchmark,
326*760c253cSXin Li            self.test_label,
327*760c253cSXin Li            1,
328*760c253cSXin Li            self.test_cache_conditions,
329*760c253cSXin Li            self.mock_machine_manager,
330*760c253cSXin Li            self.mock_logger,
331*760c253cSXin Li            "average",
332*760c253cSXin Li            "",
333*760c253cSXin Li            {},
334*760c253cSXin Li        )
335*760c253cSXin Li
336*760c253cSXin Li        def GetLastEventPassed():
337*760c253cSXin Li            """Helper function for test_terminate_pass"""
338*760c253cSXin Li            return benchmark_run.STATUS_SUCCEEDED
339*760c253cSXin Li
340*760c253cSXin Li        def RecordStub(status):
341*760c253cSXin Li            """Helper function for test_terminate_pass"""
342*760c253cSXin Li            self.status = status
343*760c253cSXin Li
344*760c253cSXin Li        self.status = benchmark_run.STATUS_SUCCEEDED
345*760c253cSXin Li        self.assertFalse(br.terminated)
346*760c253cSXin Li        self.assertFalse(br.suite_runner.CommandTerminator().IsTerminated())
347*760c253cSXin Li
348*760c253cSXin Li        br.timeline.GetLastEvent = GetLastEventPassed
349*760c253cSXin Li        br.timeline.Record = RecordStub
350*760c253cSXin Li
351*760c253cSXin Li        br.Terminate()
352*760c253cSXin Li
353*760c253cSXin Li        self.assertTrue(br.terminated)
354*760c253cSXin Li        self.assertTrue(br.suite_runner.CommandTerminator().IsTerminated())
355*760c253cSXin Li        self.assertEqual(self.status, benchmark_run.STATUS_FAILED)
356*760c253cSXin Li
357*760c253cSXin Li    def test_terminate_fail(self):
358*760c253cSXin Li        br = benchmark_run.BenchmarkRun(
359*760c253cSXin Li            "test_run",
360*760c253cSXin Li            self.test_benchmark,
361*760c253cSXin Li            self.test_label,
362*760c253cSXin Li            1,
363*760c253cSXin Li            self.test_cache_conditions,
364*760c253cSXin Li            self.mock_machine_manager,
365*760c253cSXin Li            self.mock_logger,
366*760c253cSXin Li            "average",
367*760c253cSXin Li            "",
368*760c253cSXin Li            {},
369*760c253cSXin Li        )
370*760c253cSXin Li
371*760c253cSXin Li        def GetLastEventFailed():
372*760c253cSXin Li            """Helper function for test_terminate_fail"""
373*760c253cSXin Li            return benchmark_run.STATUS_FAILED
374*760c253cSXin Li
375*760c253cSXin Li        def RecordStub(status):
376*760c253cSXin Li            """Helper function for test_terminate_fail"""
377*760c253cSXin Li            self.status = status
378*760c253cSXin Li
379*760c253cSXin Li        self.status = benchmark_run.STATUS_SUCCEEDED
380*760c253cSXin Li        self.assertFalse(br.terminated)
381*760c253cSXin Li        self.assertFalse(br.suite_runner.CommandTerminator().IsTerminated())
382*760c253cSXin Li
383*760c253cSXin Li        br.timeline.GetLastEvent = GetLastEventFailed
384*760c253cSXin Li        br.timeline.Record = RecordStub
385*760c253cSXin Li
386*760c253cSXin Li        br.Terminate()
387*760c253cSXin Li
388*760c253cSXin Li        self.assertTrue(br.terminated)
389*760c253cSXin Li        self.assertTrue(br.suite_runner.CommandTerminator().IsTerminated())
390*760c253cSXin Li        self.assertEqual(self.status, benchmark_run.STATUS_SUCCEEDED)
391*760c253cSXin Li
392*760c253cSXin Li    def test_acquire_machine(self):
393*760c253cSXin Li        br = benchmark_run.BenchmarkRun(
394*760c253cSXin Li            "test_run",
395*760c253cSXin Li            self.test_benchmark,
396*760c253cSXin Li            self.test_label,
397*760c253cSXin Li            1,
398*760c253cSXin Li            self.test_cache_conditions,
399*760c253cSXin Li            self.mock_machine_manager,
400*760c253cSXin Li            self.mock_logger,
401*760c253cSXin Li            "average",
402*760c253cSXin Li            "",
403*760c253cSXin Li            {},
404*760c253cSXin Li        )
405*760c253cSXin Li
406*760c253cSXin Li        br.terminated = True
407*760c253cSXin Li        self.assertRaises(Exception, br.AcquireMachine)
408*760c253cSXin Li
409*760c253cSXin Li        br.terminated = False
410*760c253cSXin Li        mock_machine = MockCrosMachine(
411*760c253cSXin Li            "chromeos1-row3-rack5-host7.cros", "chromeos", "average"
412*760c253cSXin Li        )
413*760c253cSXin Li        self.mock_machine_manager.AcquireMachine.return_value = mock_machine
414*760c253cSXin Li
415*760c253cSXin Li        machine = br.AcquireMachine()
416*760c253cSXin Li        self.assertEqual(machine.name, "chromeos1-row3-rack5-host7.cros")
417*760c253cSXin Li
418*760c253cSXin Li    def test_get_extra_autotest_args(self):
419*760c253cSXin Li        br = benchmark_run.BenchmarkRun(
420*760c253cSXin Li            "test_run",
421*760c253cSXin Li            self.test_benchmark,
422*760c253cSXin Li            self.test_label,
423*760c253cSXin Li            1,
424*760c253cSXin Li            self.test_cache_conditions,
425*760c253cSXin Li            self.mock_machine_manager,
426*760c253cSXin Li            self.mock_logger,
427*760c253cSXin Li            "average",
428*760c253cSXin Li            "",
429*760c253cSXin Li            {},
430*760c253cSXin Li        )
431*760c253cSXin Li
432*760c253cSXin Li        def MockLogError(err_msg):
433*760c253cSXin Li            """Helper function for test_get_extra_autotest_args"""
434*760c253cSXin Li            self.err_msg = err_msg
435*760c253cSXin Li
436*760c253cSXin Li        self.mock_logger.LogError = MockLogError
437*760c253cSXin Li
438*760c253cSXin Li        result = br.GetExtraAutotestArgs()
439*760c253cSXin Li        self.assertEqual(result, "")
440*760c253cSXin Li
441*760c253cSXin Li        self.test_benchmark.perf_args = "record -e cycles"
442*760c253cSXin Li        result = br.GetExtraAutotestArgs()
443*760c253cSXin Li        self.assertEqual(
444*760c253cSXin Li            result,
445*760c253cSXin Li            "--profiler=custom_perf --profiler_args='perf_options=\"record -a -e "
446*760c253cSXin Li            "cycles\"'",
447*760c253cSXin Li        )
448*760c253cSXin Li
449*760c253cSXin Li        self.test_benchmark.perf_args = "record -e cycles"
450*760c253cSXin Li        self.test_benchmark.suite = "test_that"
451*760c253cSXin Li        result = br.GetExtraAutotestArgs()
452*760c253cSXin Li        self.assertEqual(result, "")
453*760c253cSXin Li        self.assertEqual(
454*760c253cSXin Li            self.err_msg, "Non-telemetry benchmark does not support profiler."
455*760c253cSXin Li        )
456*760c253cSXin Li
457*760c253cSXin Li        self.test_benchmark.perf_args = "junk args"
458*760c253cSXin Li        self.test_benchmark.suite = "telemetry_Crosperf"
459*760c253cSXin Li        self.assertRaises(Exception, br.GetExtraAutotestArgs)
460*760c253cSXin Li
461*760c253cSXin Li    @mock.patch.object(SuiteRunner, "Run")
462*760c253cSXin Li    @mock.patch.object(Result, "CreateFromRun")
463*760c253cSXin Li    def test_run_test(self, mock_result, mock_runner):
464*760c253cSXin Li        br = benchmark_run.BenchmarkRun(
465*760c253cSXin Li            "test_run",
466*760c253cSXin Li            self.test_benchmark,
467*760c253cSXin Li            self.test_label,
468*760c253cSXin Li            1,
469*760c253cSXin Li            self.test_cache_conditions,
470*760c253cSXin Li            self.mock_machine_manager,
471*760c253cSXin Li            self.mock_logger,
472*760c253cSXin Li            "average",
473*760c253cSXin Li            "",
474*760c253cSXin Li            {},
475*760c253cSXin Li        )
476*760c253cSXin Li
477*760c253cSXin Li        self.status = []
478*760c253cSXin Li
479*760c253cSXin Li        def MockRecord(status):
480*760c253cSXin Li            self.status.append(status)
481*760c253cSXin Li
482*760c253cSXin Li        br.timeline.Record = MockRecord
483*760c253cSXin Li        mock_machine = MockCrosMachine(
484*760c253cSXin Li            "chromeos1-row3-rack5-host7.cros", "chromeos", "average"
485*760c253cSXin Li        )
486*760c253cSXin Li        mock_runner.return_value = [0, "{'Score':100}", ""]
487*760c253cSXin Li
488*760c253cSXin Li        br.RunTest(mock_machine)
489*760c253cSXin Li
490*760c253cSXin Li        self.assertTrue(br.run_completed)
491*760c253cSXin Li        self.assertEqual(
492*760c253cSXin Li            self.status,
493*760c253cSXin Li            [benchmark_run.STATUS_IMAGING, benchmark_run.STATUS_RUNNING],
494*760c253cSXin Li        )
495*760c253cSXin Li
496*760c253cSXin Li        self.assertEqual(br.machine_manager.ImageMachine.call_count, 1)
497*760c253cSXin Li        br.machine_manager.ImageMachine.assert_called_with(
498*760c253cSXin Li            mock_machine, self.test_label
499*760c253cSXin Li        )
500*760c253cSXin Li        self.assertEqual(mock_runner.call_count, 1)
501*760c253cSXin Li        mock_runner.assert_called_with(
502*760c253cSXin Li            mock_machine, br.label, br.benchmark, "", br.profiler_args
503*760c253cSXin Li        )
504*760c253cSXin Li
505*760c253cSXin Li        self.assertEqual(mock_result.call_count, 1)
506*760c253cSXin Li        mock_result.assert_called_with(
507*760c253cSXin Li            self.mock_logger,
508*760c253cSXin Li            "average",
509*760c253cSXin Li            self.test_label,
510*760c253cSXin Li            None,
511*760c253cSXin Li            "{'Score':100}",
512*760c253cSXin Li            "",
513*760c253cSXin Li            0,
514*760c253cSXin Li            "page_cycler.netsim.top_10",
515*760c253cSXin Li            "telemetry_Crosperf",
516*760c253cSXin Li            "",
517*760c253cSXin Li        )
518*760c253cSXin Li
519*760c253cSXin Li    def test_set_cache_conditions(self):
520*760c253cSXin Li        br = benchmark_run.BenchmarkRun(
521*760c253cSXin Li            "test_run",
522*760c253cSXin Li            self.test_benchmark,
523*760c253cSXin Li            self.test_label,
524*760c253cSXin Li            1,
525*760c253cSXin Li            self.test_cache_conditions,
526*760c253cSXin Li            self.mock_machine_manager,
527*760c253cSXin Li            self.mock_logger,
528*760c253cSXin Li            "average",
529*760c253cSXin Li            "",
530*760c253cSXin Li            {},
531*760c253cSXin Li        )
532*760c253cSXin Li
533*760c253cSXin Li        phony_cache_conditions = [123, 456, True, False]
534*760c253cSXin Li
535*760c253cSXin Li        self.assertEqual(br.cache_conditions, self.test_cache_conditions)
536*760c253cSXin Li
537*760c253cSXin Li        br.SetCacheConditions(phony_cache_conditions)
538*760c253cSXin Li        self.assertEqual(br.cache_conditions, phony_cache_conditions)
539*760c253cSXin Li
540*760c253cSXin Li        br.SetCacheConditions(self.test_cache_conditions)
541*760c253cSXin Li        self.assertEqual(br.cache_conditions, self.test_cache_conditions)
542*760c253cSXin Li
543*760c253cSXin Li
544*760c253cSXin Liif __name__ == "__main__":
545*760c253cSXin Li    unittest.main()
546