blob: 491711851f1938e4e377d18eedf05b2b9f9c741a [file] [log] [blame]
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08001#!/usr/bin/python
2
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.
Ahmad Sharif4467f002012-12-20 12:09:49 -08006
7"""Testing of benchmark_run."""
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -08008
cmtice87ae9a02014-05-08 10:56:54 -07009import mock
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080010import unittest
cmtice87ae9a02014-05-08 10:56:54 -070011import inspect
Ahmad Sharif4467f002012-12-20 12:09:49 -080012
Caroline Tice7057cf62015-12-10 12:09:40 -080013from cros_utils import logger
Ahmad Sharif4467f002012-12-20 12:09:49 -080014
cmtice87ae9a02014-05-08 10:56:54 -070015import benchmark_run
16
Yunlian Jiang04dc5dc2013-04-23 15:05:05 -070017from suite_runner import MockSuiteRunner
cmtice87ae9a02014-05-08 10:56:54 -070018from suite_runner import SuiteRunner
Ahmad Sharif4467f002012-12-20 12:09:49 -080019from label import MockLabel
20from benchmark import Benchmark
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080021from machine_manager import MockMachineManager
cmtice87ae9a02014-05-08 10:56:54 -070022from machine_manager import MachineManager
23from machine_manager import MockCrosMachine
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080024from results_cache import MockResultsCache
cmtice87ae9a02014-05-08 10:56:54 -070025from results_cache import CacheConditions
26from results_cache import Result
27from results_cache import ResultsCache
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080028
29
30class BenchmarkRunTest(unittest.TestCase):
cmtice87ae9a02014-05-08 10:56:54 -070031 """
32 Unit tests for the BenchmarkRun class and all of its methods.
33 """
34
35 def setUp(self):
36 self.test_benchmark = Benchmark("page_cycler.netsim.top_10", # name
37 "page_cycler.netsim.top_10", # test_name
38 "", # test_args
39 1, # iterations
40 False, # rm_chroot_tmp
41 "", # perf_args
42 suite="telemetry_Crosperf") # suite
43
44 self.test_label = MockLabel("test1", "image1", "/tmp/test_benchmark_run",
45 "x86-alex", "chromeos2-row1-rack4-host9.cros",
Caroline Tice7057cf62015-12-10 12:09:40 -080046 image_args="", cache_dir="", cache_only=False,
47 log_level="average", compiler="gcc")
48
cmtice87ae9a02014-05-08 10:56:54 -070049
50 self.test_cache_conditions = [CacheConditions.CACHE_FILE_EXISTS,
51 CacheConditions.CHECKSUMS_MATCH]
52
53 self.mock_logger = logger.GetLogger(log_dir="", mock=True)
54
55 self.mock_machine_manager = mock.Mock(spec=MachineManager)
56
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080057 def testDryRun(self):
Ahmad Sharif4467f002012-12-20 12:09:49 -080058 my_label = MockLabel("test1", "image1", "/tmp/test_benchmark_run",
cmticec454cee2014-04-09 10:58:51 -070059 "x86-alex", "chromeos2-row1-rack4-host9.cros",
Caroline Tice7057cf62015-12-10 12:09:40 -080060 image_args="", cache_dir="", cache_only=False,
61 log_level="average", compiler="gcc")
62
cmtice87ae9a02014-05-08 10:56:54 -070063 logging_level = "average"
cmticed96e4572015-05-19 16:19:25 -070064 m = MockMachineManager("/tmp/chromeos_root", 0, logging_level, '')
cmticec454cee2014-04-09 10:58:51 -070065 m.AddMachine("chromeos2-row1-rack4-host9.cros")
66 bench = Benchmark("page_cycler.netsim.top_10", # name
67 "page_cycler.netsim.top_10", # test_name
68 "", # test_args
Caroline Tice7057cf62015-12-10 12:09:40 -080069 1, # iterations
cmticec454cee2014-04-09 10:58:51 -070070 False, # rm_chroot_tmp
71 "", # perf_args
72 suite="telemetry_Crosperf") # suite
cmtice87ae9a02014-05-08 10:56:54 -070073 b = benchmark_run.MockBenchmarkRun("test run",
Ahmad Sharif4467f002012-12-20 12:09:49 -080074 bench,
75 my_label,
76 1,
77 [],
78 m,
Luis Lozanof81680c2013-03-15 14:44:13 -070079 logger.GetLogger(),
cmticec454cee2014-04-09 10:58:51 -070080 logging_level,
Luis Lozanof81680c2013-03-15 14:44:13 -070081 "")
Ahmad Sharif4467f002012-12-20 12:09:49 -080082 b.cache = MockResultsCache()
Yunlian Jiang9e533332013-09-30 15:45:46 -070083 b.suite_runner = MockSuiteRunner()
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -080084 b.start()
85
cmtice87ae9a02014-05-08 10:56:54 -070086 # Make sure the arguments to BenchmarkRun.__init__ have not changed
87 # since the last time this test was updated:
88 args_list = ['self', 'name', 'benchmark', 'label', 'iteration',
89 'cache_conditions', 'machine_manager', 'logger_to_use',
cmtice1a224362014-10-16 15:49:56 -070090 'log_level', 'share_cache']
cmtice87ae9a02014-05-08 10:56:54 -070091 arg_spec = inspect.getargspec(benchmark_run.BenchmarkRun.__init__)
92 self.assertEqual(len(arg_spec.args), len(args_list))
93 self.assertEqual (arg_spec.args, args_list)
94
95
96 def test_init(self):
97 # Nothing really worth testing here; just field assignments.
98 pass
99
100 def test_read_cache(self):
101 # Nothing really worth testing here, either.
102 pass
103
104 def test_run(self):
105 br = benchmark_run.BenchmarkRun("test_run", self.test_benchmark,
106 self.test_label, 1, self.test_cache_conditions,
107 self.mock_machine_manager,
108 self.mock_logger,
109 "average", "")
110
111 def MockLogOutput(msg, print_to_console=False):
112 "Helper function for test_run."
113 self.log_output.append(msg)
114
115 def MockLogError(msg, print_to_console=False):
116 "Helper function for test_run."
117 self.log_error.append(msg)
118
119 def MockRecordStatus(msg):
120 "Helper function for test_run."
121 self.status.append(msg)
122
123 def FakeReadCache():
124 "Helper function for test_run."
125 br.cache = mock.Mock(spec=ResultsCache)
126 self.called_ReadCache = True
127 return 0
128
129 def FakeReadCacheSucceed():
130 "Helper function for test_run."
131 br.cache = mock.Mock(spec=ResultsCache)
132 br.result = mock.Mock(spec=Result)
133 br.result.out = "result.out stuff"
134 br.result.err = "result.err stuff"
135 br.result.retval = 0
136 self.called_ReadCache = True
137 return 0
138
139 def FakeReadCacheException():
140 "Helper function for test_run."
141 raise Exception("This is an exception test; it is supposed to happen")
142
143 def FakeAcquireMachine():
144 "Helper function for test_run."
145 mock_machine = MockCrosMachine ('chromeos1-row3-rack5-host7.cros',
146 'chromeos', 'average')
147 return mock_machine
148
149 def FakeRunTest(_machine):
150 "Helper function for test_run."
151 mock_result = mock.Mock(spec=Result)
152 mock_result.retval = 0
153 return mock_result
154
155 def FakeRunTestFail(_machine):
156 "Helper function for test_run."
157 mock_result = mock.Mock(spec=Result)
158 mock_result.retval = 1
159 return mock_result
160
161 def ResetTestValues():
162 "Helper function for test_run."
163 self.log_output = []
164 self.log_error = []
165 self.status = []
166 br.result = None
167 self.called_ReadCache = False
168
169 # Assign all the fake functions to the appropriate objects.
170 br._logger.LogOutput = MockLogOutput
171 br._logger.LogError = MockLogError
172 br.timeline.Record = MockRecordStatus
173 br.ReadCache = FakeReadCache
174 br.RunTest = FakeRunTest
175 br.AcquireMachine = FakeAcquireMachine
176
177 # First test: No cache hit, all goes well.
178 ResetTestValues()
179 br.run()
180 self.assertTrue (self.called_ReadCache)
181 self.assertEqual (self.log_output,
182 ['test_run: No cache hit.',
183 'Releasing machine: chromeos1-row3-rack5-host7.cros',
184 'Released machine: chromeos1-row3-rack5-host7.cros'])
185 self.assertEqual (len(self.log_error), 0)
186 self.assertEqual (self.status, ['WAITING', 'SUCCEEDED'])
187
188 # Second test: No cached result found; test run was "terminated" for some
189 # reason.
190 ResetTestValues()
191 br.terminated = True
192 br.run()
193 self.assertTrue (self.called_ReadCache)
194 self.assertEqual (self.log_output,
195 ['test_run: No cache hit.',
196 'Releasing machine: chromeos1-row3-rack5-host7.cros',
197 'Released machine: chromeos1-row3-rack5-host7.cros'])
198 self.assertEqual (len(self.log_error), 0)
199 self.assertEqual (self.status, ['WAITING'])
200
201 # Third test. No cached result found; RunTest failed for some reason.
202 ResetTestValues()
203 br.terminated = False
204 br.RunTest = FakeRunTestFail
205 br.run()
206 self.assertTrue (self.called_ReadCache)
207 self.assertEqual (self.log_output,
208 ['test_run: No cache hit.',
209 'Releasing machine: chromeos1-row3-rack5-host7.cros',
210 'Released machine: chromeos1-row3-rack5-host7.cros'])
211 self.assertEqual (len(self.log_error), 0)
212 self.assertEqual (self.status, ['WAITING', 'FAILED'])
213
214 # Fourth test: ReadCache found a cached result.
215 ResetTestValues()
216 br.RunTest = FakeRunTest
217 br.ReadCache = FakeReadCacheSucceed
218 br.run()
219 self.assertTrue (self.called_ReadCache)
220 self.assertEqual (self.log_output,
221 ['test_run: Cache hit.',
222 'result.out stuff',
223 'Releasing machine: chromeos1-row3-rack5-host7.cros',
224 'Released machine: chromeos1-row3-rack5-host7.cros'])
225 self.assertEqual (self.log_error, ['result.err stuff'])
226 self.assertEqual (self.status, ['SUCCEEDED'])
227
228 # Fifth test: ReadCache generates an exception; does the try/finally block
229 # work?
230 ResetTestValues()
231 br.ReadCache = FakeReadCacheException
232 br.machine = FakeAcquireMachine()
233 br.run()
234 self.assertEqual (self.log_output,
235 ['Releasing machine: chromeos1-row3-rack5-host7.cros',
236 'Released machine: chromeos1-row3-rack5-host7.cros'])
237 self.assertEqual (self.log_error,
238 ["Benchmark run: 'test_run' failed: This is an exception test; it is supposed to happen"])
239 self.assertEqual (self.status, ['FAILED'])
240
241
242 def test_terminate_pass(self):
243 br = benchmark_run.BenchmarkRun("test_run", self.test_benchmark,
244 self.test_label, 1, self.test_cache_conditions,
245 self.mock_machine_manager,
246 self.mock_logger,
247 "average", "")
248
249 def GetLastEventPassed():
250 "Helper function for test_terminate_pass"
251 return benchmark_run.STATUS_SUCCEEDED
252
253 def RecordStub(status):
254 "Helper function for test_terminate_pass"
255 self.status = status
256
257 self.status = benchmark_run.STATUS_SUCCEEDED
258 self.assertFalse (br.terminated)
259 self.assertFalse (br.suite_runner._ct.IsTerminated())
260
261 br.timeline.GetLastEvent = GetLastEventPassed
262 br.timeline.Record = RecordStub
263
264 br.Terminate()
265
266 self.assertTrue (br.terminated)
267 self.assertTrue (br.suite_runner._ct.IsTerminated())
268 self.assertEqual (self.status, benchmark_run.STATUS_FAILED)
269
270
271
272 def test_terminate_fail(self):
273 br = benchmark_run.BenchmarkRun("test_run", self.test_benchmark,
274 self.test_label, 1, self.test_cache_conditions,
275 self.mock_machine_manager,
276 self.mock_logger,
277 "average", "")
278
279 def GetLastEventFailed():
280 "Helper function for test_terminate_fail"
281 return benchmark_run.STATUS_FAILED
282
283 def RecordStub(status):
284 "Helper function for test_terminate_fail"
285 self.status = status
286
287 self.status = benchmark_run.STATUS_SUCCEEDED
288 self.assertFalse (br.terminated)
289 self.assertFalse (br.suite_runner._ct.IsTerminated())
290
291 br.timeline.GetLastEvent = GetLastEventFailed
292 br.timeline.Record = RecordStub
293
294 br.Terminate()
295
296 self.assertTrue (br.terminated)
297 self.assertTrue (br.suite_runner._ct.IsTerminated())
298 self.assertEqual (self.status, benchmark_run.STATUS_SUCCEEDED)
299
300
301 def test_acquire_machine(self):
302 br = benchmark_run.BenchmarkRun("test_run", self.test_benchmark,
303 self.test_label, 1, self.test_cache_conditions,
304 self.mock_machine_manager,
305 self.mock_logger,
306 "average", "")
307
308
309 br.terminated = True
310 self.assertRaises (Exception, br.AcquireMachine)
311
312 br.terminated = False
313 mock_machine = MockCrosMachine ('chromeos1-row3-rack5-host7.cros',
314 'chromeos', 'average')
315 self.mock_machine_manager.AcquireMachine.return_value = mock_machine
316
317 machine = br.AcquireMachine()
318 self.assertEqual (machine.name, 'chromeos1-row3-rack5-host7.cros')
319
320
321 def test_get_extra_autotest_args(self):
322 br = benchmark_run.BenchmarkRun("test_run", self.test_benchmark,
323 self.test_label, 1, self.test_cache_conditions,
324 self.mock_machine_manager,
325 self.mock_logger,
326 "average", "")
327
328 def MockLogError(err_msg):
329 "Helper function for test_get_extra_autotest_args"
330 self.err_msg = err_msg
331
332 self.mock_logger.LogError = MockLogError
333
334 result = br._GetExtraAutotestArgs()
335 self.assertEqual(result, "")
336
337 self.test_benchmark.perf_args = "record -e cycles"
338 result = br._GetExtraAutotestArgs()
339 self.assertEqual(result,
340"--profiler=custom_perf --profiler_args='perf_options=\"record -a -e cycles\"'")
341
342 self.test_benchmark.suite = "telemetry"
343 result = br._GetExtraAutotestArgs()
344 self.assertEqual(result, "")
345 self.assertEqual(self.err_msg, "Telemetry does not support profiler.")
346
347 self.test_benchmark.perf_args = "record -e cycles"
348 self.test_benchmark.suite = "test_that"
349 result = br._GetExtraAutotestArgs()
350 self.assertEqual(result, "")
351 self.assertEqual(self.err_msg, "test_that does not support profiler.")
352
353 self.test_benchmark.perf_args = "junk args"
354 self.test_benchmark.suite = "telemetry_Crosperf"
355 self.assertRaises(Exception, br._GetExtraAutotestArgs)
356
357
358 @mock.patch.object(SuiteRunner, 'Run')
359 @mock.patch.object(Result, 'CreateFromRun')
360 def test_run_test(self, mock_result, mock_runner):
361 br = benchmark_run.BenchmarkRun("test_run", self.test_benchmark,
362 self.test_label, 1, self.test_cache_conditions,
363 self.mock_machine_manager,
364 self.mock_logger,
365 "average", "")
366
367 self.status = []
368 def MockRecord(status):
369 self.status.append(status)
370
371 br.timeline.Record = MockRecord
372 mock_machine = MockCrosMachine ('chromeos1-row3-rack5-host7.cros',
373 'chromeos', 'average')
374 mock_runner.return_value = [0, "{'Score':100}", ""]
375
376 br.RunTest(mock_machine)
377
378 self.assertTrue(br.run_completed)
379 self.assertEqual (self.status, [ benchmark_run.STATUS_IMAGING,
380 benchmark_run.STATUS_RUNNING])
381
382 self.assertEqual (br.machine_manager.ImageMachine.call_count, 1)
383 br.machine_manager.ImageMachine.assert_called_with (mock_machine,
384 self.test_label)
385 self.assertEqual (mock_runner.call_count, 1)
386 mock_runner.assert_called_with (mock_machine.name, br.label,
387 br.benchmark, "", br.profiler_args)
388
389 self.assertEqual (mock_result.call_count, 1)
390 mock_result.assert_called_with (self.mock_logger, 'average',
Caroline Tice7057cf62015-12-10 12:09:40 -0800391 self.test_label, None, "{'Score':100}",
cmtice87ae9a02014-05-08 10:56:54 -0700392 "", 0, False, 'page_cycler.netsim.top_10',
393 'telemetry_Crosperf')
394
395
396
397 def test_set_cache_conditions(self):
398 br = benchmark_run.BenchmarkRun("test_run", self.test_benchmark,
399 self.test_label, 1, self.test_cache_conditions,
400 self.mock_machine_manager,
401 self.mock_logger,
402 "average", "")
403
404 phony_cache_conditions = [ 123, 456, True, False ]
405
406 self.assertEqual(br.cache_conditions, self.test_cache_conditions)
407
408 br.SetCacheConditions (phony_cache_conditions)
409 self.assertEqual(br.cache_conditions, phony_cache_conditions)
410
411 br.SetCacheConditions(self.test_cache_conditions)
412 self.assertEqual(br.cache_conditions, self.test_cache_conditions)
413
Ahmad Sharif0dcbc4b2012-02-02 16:37:18 -0800414
415if __name__ == "__main__":
416 unittest.main()