suite_runner_unittest.py revision f2a3ef46f75d2196a93d3ed27f4d1fcf22b54fbe
1#!/usr/bin/python
2#
3# Copyright 2014 Google Inc. All Rights Reserved.
4"""Unittest for machine_manager."""
5import os.path
6import time
7import hashlib
8
9import mock
10import unittest
11
12import suite_runner
13import machine_manager
14import image_checksummer
15import label
16import test_flag
17
18from benchmark import Benchmark
19from benchmark_run import MockBenchmarkRun
20
21from cros_utils import command_executer
22from cros_utils import logger
23
24
25class SuiteRunnerTest(unittest.TestCase):
26
27  real_logger = logger.GetLogger()
28
29  mock_cmd_exec = mock.Mock(spec=command_executer.CommandExecuter)
30  mock_cmd_term = mock.Mock(spec=command_executer.CommandTerminator)
31  mock_logger = mock.Mock(spec=logger.Logger)
32  mock_label = label.MockLabel('lumpy', 'lumpy_chromeos_image', '/tmp/chromeos',
33                               'lumpy', ['lumpy1.cros', 'lumpy.cros2'], '', '',
34                               False, 'average', 'gcc', '')
35  telemetry_crosperf_bench = Benchmark('b1_test',  # name
36                                       'octane',  # test_name
37                                       '',  # test_args
38                                       3,  # iterations
39                                       False,  # rm_chroot_tmp
40                                       'record -e cycles',  # perf_args
41                                       'telemetry_Crosperf',  # suite
42                                       True)  # show_all_results
43
44  test_that_bench = Benchmark('b2_test',  # name
45                              'octane',  # test_name
46                              '',  # test_args
47                              3,  # iterations
48                              False,  # rm_chroot_tmp
49                              'record -e cycles')  # perf_args
50
51  telemetry_bench = Benchmark('b3_test',  # name
52                              'octane',  # test_name
53                              '',  # test_args
54                              3,  # iterations
55                              False,  # rm_chroot_tmp
56                              'record -e cycles',  # perf_args
57                              'telemetry',  # suite
58                              False)  # show_all_results
59
60  def setUp(self):
61    self.runner = suite_runner.SuiteRunner(
62        self.mock_logger, 'verbose', self.mock_cmd_exec, self.mock_cmd_term)
63
64  def test_get_profiler_args(self):
65    input_str = ('--profiler=custom_perf --profiler_args=\'perf_options'
66                 '="record -a -e cycles,instructions"\'')
67    output_str = ("profiler=custom_perf profiler_args='record -a -e "
68                  "cycles,instructions'")
69    res = suite_runner.GetProfilerArgs(input_str)
70    self.assertEqual(res, output_str)
71
72  def test_run(self):
73
74    def reset():
75      self.call_pin_governor = False
76      self.call_test_that_run = False
77      self.call_telemetry_run = False
78      self.call_telemetry_crosperf_run = False
79      self.pin_governor_args = []
80      self.test_that_args = []
81      self.telemetry_run_args = []
82      self.telemetry_crosperf_args = []
83
84    def FakePinGovernor(machine, chroot):
85      self.call_pin_governor = True
86      self.pin_governor_args = [machine, chroot]
87
88    def FakeTelemetryRun(machine, label, benchmark, profiler_args):
89      self.telemetry_run_args = [machine, label, benchmark, profiler_args]
90      self.call_telemetry_run = True
91      return 'Ran FakeTelemetryRun'
92
93    def FakeTelemetryCrosperfRun(machine, label, benchmark, test_args,
94                                 profiler_args):
95      self.telemetry_crosperf_args = [machine, label, benchmark, test_args,
96                                      profiler_args]
97      self.call_telemetry_crosperf_run = True
98      return 'Ran FakeTelemetryCrosperfRun'
99
100    def FakeTestThatRun(machine, label, benchmark, test_args, profiler_args):
101      self.test_that_args = [machine, label, benchmark, test_args, profiler_args
102                            ]
103      self.call_test_that_run = True
104      return 'Ran FakeTestThatRun'
105
106    self.runner.PinGovernorExecutionFrequencies = FakePinGovernor
107    self.runner.Telemetry_Run = FakeTelemetryRun
108    self.runner.Telemetry_Crosperf_Run = FakeTelemetryCrosperfRun
109    self.runner.Test_That_Run = FakeTestThatRun
110
111    machine = 'fake_machine'
112    test_args = ''
113    profiler_args = ''
114    reset()
115    res = self.runner.Run(machine, self.mock_label, self.telemetry_bench,
116                          test_args, profiler_args)
117    self.assertTrue(self.call_pin_governor)
118    self.assertTrue(self.call_telemetry_run)
119    self.assertFalse(self.call_test_that_run)
120    self.assertFalse(self.call_telemetry_crosperf_run)
121    self.assertEqual(
122        self.telemetry_run_args,
123        ['fake_machine', self.mock_label, self.telemetry_bench, ''])
124
125    reset()
126    res = self.runner.Run(machine, self.mock_label, self.test_that_bench,
127                          test_args, profiler_args)
128    self.assertTrue(self.call_pin_governor)
129    self.assertFalse(self.call_telemetry_run)
130    self.assertTrue(self.call_test_that_run)
131    self.assertFalse(self.call_telemetry_crosperf_run)
132    self.assertEqual(self.test_that_args, ['fake_machine', self.mock_label,
133                                           self.test_that_bench, '', ''])
134
135    reset()
136    res = self.runner.Run(machine, self.mock_label,
137                          self.telemetry_crosperf_bench, test_args,
138                          profiler_args)
139    self.assertTrue(self.call_pin_governor)
140    self.assertFalse(self.call_telemetry_run)
141    self.assertFalse(self.call_test_that_run)
142    self.assertTrue(self.call_telemetry_crosperf_run)
143    self.assertEqual(self.telemetry_crosperf_args,
144                     ['fake_machine', self.mock_label,
145                      self.telemetry_crosperf_bench, '', ''])
146
147  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommandWOutput')
148  def test_get_highest_static_frequency(self, mock_cros_runcmd):
149
150    self.mock_cmd_exec.CrosRunCommandWOutput = mock_cros_runcmd
151    mock_cros_runcmd.return_value = [0, '1666000 1333000 1000000', '']
152    freq = self.runner.GetHighestStaticFrequency('lumpy1.cros', '/tmp/chromeos')
153    self.assertEqual(freq, '1666000')
154
155    mock_cros_runcmd.return_value = [0, '1333000', '']
156    freq = self.runner.GetHighestStaticFrequency('lumpy1.cros', '/tmp/chromeos')
157    self.assertEqual(freq, '1333000')
158
159    mock_cros_runcmd.return_value = [0, '1661000 1333000 1000000', '']
160    freq = self.runner.GetHighestStaticFrequency('lumpy1.cros', '/tmp/chromeos')
161    self.assertEqual(freq, '1333000')
162
163  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommand')
164  def test_pin_governor_execution_frequencies(self, mock_cros_runcmd):
165
166    def FakeGetHighestFreq(machine_name, chromeos_root):
167      return '1666000'
168
169    self.mock_cmd_exec.CrosRunCommand = mock_cros_runcmd
170    self.runner.GetHighestStaticFrequency = FakeGetHighestFreq
171    self.runner.PinGovernorExecutionFrequencies('lumpy1.cros', '/tmp/chromeos')
172    self.assertEqual(mock_cros_runcmd.call_count, 1)
173    cmd = mock_cros_runcmd.call_args_list[0][0]
174    self.assertEqual(cmd, (
175        'set -e  && for f in '
176                     '/sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq; do echo '
177                     '1666000 > $f; done && for f in '
178                     '/sys/devices/system/cpu/cpu*/cpufreq/scaling_min_freq; do echo '
179                     '1666000 > $f; done && for f in '
180                     '/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo '
181                     'performance > $f; done',
182    ))
183
184  @mock.patch.object(time, 'sleep')
185  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommand')
186  def test_reboot_machine(self, mock_cros_runcmd, mock_sleep):
187
188    def FakePinGovernor(machine_name, chromeos_root):
189      pass
190
191    self.mock_cmd_exec.CrosRunCommand = mock_cros_runcmd
192    self.runner.PinGovernorExecutionFrequencies = FakePinGovernor
193    self.runner.RebootMachine('lumpy1.cros', '/tmp/chromeos')
194    self.assertEqual(mock_cros_runcmd.call_count, 1)
195    self.assertEqual(mock_cros_runcmd.call_args_list[0][0], ('reboot && exit',))
196    self.assertEqual(mock_sleep.call_count, 1)
197    self.assertEqual(mock_sleep.call_args_list[0][0], (60,))
198
199  @mock.patch.object(command_executer.CommandExecuter, 'CrosRunCommand')
200  @mock.patch.object(command_executer.CommandExecuter,
201                     'ChrootRunCommandWOutput')
202  def test_test_that_run(self, mock_chroot_runcmd, mock_cros_runcmd):
203
204    def FakeRebootMachine(machine, chroot):
205      pass
206
207    def FakeLogMsg(fd, termfd, msg, flush):
208      pass
209
210    save_log_msg = self.real_logger._LogMsg
211    self.real_logger._LogMsg = FakeLogMsg
212    self.runner._logger = self.real_logger
213    self.runner.RebootMachine = FakeRebootMachine
214
215    raised_exception = False
216    try:
217      self.runner.Test_That_Run('lumpy1.cros', self.mock_label,
218                                self.test_that_bench, '', 'record -a -e cycles')
219    except:
220      raised_exception = True
221    self.assertTrue(raised_exception)
222
223    mock_chroot_runcmd.return_value = 0
224    self.mock_cmd_exec.ChrootRunCommandWOutput = mock_chroot_runcmd
225    self.mock_cmd_exec.CrosRunCommand = mock_cros_runcmd
226    res = self.runner.Test_That_Run('lumpy1.cros', self.mock_label,
227                                    self.test_that_bench, '--iterations=2', '')
228    self.assertEqual(mock_cros_runcmd.call_count, 1)
229    self.assertEqual(mock_chroot_runcmd.call_count, 1)
230    self.assertEqual(res, 0)
231    self.assertEqual(mock_cros_runcmd.call_args_list[0][0],
232                     ('rm -rf /usr/local/autotest/results/*',))
233    args_list = mock_chroot_runcmd.call_args_list[0][0]
234    args_dict = mock_chroot_runcmd.call_args_list[0][1]
235    self.assertEqual(len(args_list), 2)
236    self.assertEqual(args_list[0], '/tmp/chromeos')
237    self.assertEqual(args_list[1], ('/usr/bin/test_that --autotest_dir '
238                                    '~/trunk/src/third_party/autotest/files '
239                                    '--fast  --board=lumpy '
240                                    '--iterations=2 lumpy1.cros octane'))
241    self.assertEqual(args_dict['command_terminator'], self.mock_cmd_term)
242    self.real_logger._LogMsg = save_log_msg
243
244  @mock.patch.object(os.path, 'isdir')
245  @mock.patch.object(command_executer.CommandExecuter,
246                     'ChrootRunCommandWOutput')
247  def test_telemetry_crosperf_run(self, mock_chroot_runcmd, mock_isdir):
248
249    mock_isdir.return_value = True
250    mock_chroot_runcmd.return_value = 0
251    self.mock_cmd_exec.ChrootRunCommandWOutput = mock_chroot_runcmd
252    profiler_args = ('--profiler=custom_perf --profiler_args=\'perf_options'
253                     '="record -a -e cycles,instructions"\'')
254    res = self.runner.Telemetry_Crosperf_Run('lumpy1.cros', self.mock_label,
255                                             self.telemetry_crosperf_bench, '',
256                                             profiler_args)
257    self.assertEqual(res, 0)
258    self.assertEqual(mock_chroot_runcmd.call_count, 1)
259    args_list = mock_chroot_runcmd.call_args_list[0][0]
260    args_dict = mock_chroot_runcmd.call_args_list[0][1]
261    self.assertEqual(args_list[0], '/tmp/chromeos')
262    self.assertEqual(args_list[1],
263                     ('/usr/bin/test_that --autotest_dir '
264                      '~/trunk/src/third_party/autotest/files '
265                      ' --board=lumpy --args=" run_local=False test=octane '
266                      'profiler=custom_perf profiler_args=\'record -a -e '
267                      'cycles,instructions\'" lumpy1.cros telemetry_Crosperf'))
268    self.assertEqual(args_dict['cros_sdk_options'],
269                     ('--no-ns-pid --chrome_root= '
270                      '--chrome_root_mount=/tmp/chrome_root '
271                      'FEATURES="-usersandbox" CHROME_ROOT=/tmp/chrome_root'))
272    self.assertEqual(args_dict['command_terminator'], self.mock_cmd_term)
273    self.assertEqual(len(args_dict), 2)
274
275  @mock.patch.object(os.path, 'isdir')
276  @mock.patch.object(os.path, 'exists')
277  @mock.patch.object(command_executer.CommandExecuter, 'RunCommandWOutput')
278  def test_telemetry_run(self, mock_runcmd, mock_exists, mock_isdir):
279
280    def FakeLogMsg(fd, termfd, msg, flush):
281      pass
282
283    save_log_msg = self.real_logger._LogMsg
284    self.real_logger._LogMsg = FakeLogMsg
285    mock_runcmd.return_value = 0
286
287    self.mock_cmd_exec.RunCommandWOutput = mock_runcmd
288    self.runner._logger = self.real_logger
289
290    profiler_args = ('--profiler=custom_perf --profiler_args=\'perf_options'
291                     '="record -a -e cycles,instructions"\'')
292
293    raises_exception = False
294    mock_isdir.return_value = False
295    try:
296      self.runner.Telemetry_Run('lumpy1.cros', self.mock_label,
297                                self.telemetry_bench, '')
298    except:
299      raises_exception = True
300    self.assertTrue(raises_exception)
301
302    raises_exception = False
303    mock_isdir.return_value = True
304    mock_exists.return_value = False
305    try:
306      self.runner.Telemetry_Run('lumpy1.cros', self.mock_label,
307                                self.telemetry_bench, '')
308    except:
309      raises_exception = True
310    self.assertTrue(raises_exception)
311
312    raises_exception = False
313    mock_isdir.return_value = True
314    mock_exists.return_value = True
315    try:
316      self.runner.Telemetry_Run('lumpy1.cros', self.mock_label,
317                                self.telemetry_bench, profiler_args)
318    except:
319      raises_exception = True
320    self.assertTrue(raises_exception)
321
322    test_flag.SetTestMode(True)
323    res = self.runner.Telemetry_Run('lumpy1.cros', self.mock_label,
324                                    self.telemetry_bench, '')
325    self.assertEqual(res, 0)
326    self.assertEqual(mock_runcmd.call_count, 1)
327    self.assertEqual(mock_runcmd.call_args_list[0][0], (
328        ('cd src/tools/perf && ./run_measurement '
329         '--browser=cros-chrome --output-format=csv '
330         '--remote=lumpy1.cros --identity /tmp/chromeos/src/scripts'
331         '/mod_for_test_scripts/ssh_keys/testing_rsa octane '),))
332
333    self.real_logger._LogMsg = save_log_msg
334
335
336if __name__ == '__main__':
337  unittest.main()
338