blob: 524ca15a3d872604784d8368dddd11476282582d [file] [log] [blame]
cmtice4f0309d2014-06-15 13:36:05 -07001#!/usr/bin/python
2#
3# Copyright 2014 Google Inc. All Rights Reserved.
4
5"""Unittest for machine_manager."""
6import os.path
7import time
8import hashlib
9
10import mock
11import unittest
12
13import suite_runner
14import machine_manager
15import image_checksummer
16import label
17
18from benchmark import Benchmark
19from benchmark_run import MockBenchmarkRun
20
21from utils import command_executer
22from 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, "")
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(self.mock_logger, "verbose",
62 self.mock_cmd_exec, self.mock_cmd_term)
63
64
65 def test_get_profiler_args(self):
66 input_str = ('--profiler=custom_perf --profiler_args=\'perf_options'
67 '="record -a -e cycles,instructions"\'')
68 output_str = ("profiler=custom_perf profiler_args='record -a -e "
69 "cycles,instructions'")
70 res = suite_runner.GetProfilerArgs(input_str)
71 self.assertEqual(res, output_str)
72
73 def test_run(self):
74
75 def reset():
76 self.call_pin_governor = False
77 self.call_test_that_run = False
78 self.call_telemetry_run = False
79 self.call_telemetry_crosperf_run = False
80 self.pin_governor_args = []
81 self.test_that_args = []
82 self.telemetry_run_args = []
83 self.telemetry_crosperf_args = []
84
85
86 def FakePinGovernor(machine, chroot):
87 self.call_pin_governor = True
88 self.pin_governor_args = [machine, chroot]
89
90
91 def FakeTelemetryRun(machine, label, benchmark, profiler_args):
92 self.telemetry_run_args = [machine, label, benchmark, profiler_args]
93 self.call_telemetry_run = True
94 return "Ran FakeTelemetryRun"
95
96
97 def FakeTelemetryCrosperfRun(machine, label, benchmark, test_args,
98 profiler_args):
99 self.telemetry_crosperf_args = [machine, label, benchmark, test_args,
100 profiler_args]
101 self.call_telemetry_crosperf_run = True
102 return "Ran FakeTelemetryCrosperfRun"
103
104
105 def FakeTestThatRun(machine, label, benchmark, test_args, profiler_args):
106 self.test_that_args = [machine, label, benchmark, test_args, profiler_args]
107 self.call_test_that_run = True
108 return "Ran FakeTestThatRun"
109
110 self.runner.PinGovernorExecutionFrequencies = FakePinGovernor
111 self.runner.Telemetry_Run = FakeTelemetryRun
112 self.runner.Telemetry_Crosperf_Run = FakeTelemetryCrosperfRun
113 self.runner.Test_That_Run = FakeTestThatRun
114
115 machine = 'fake_machine'
116 test_args = ''
117 profiler_args = ''
118 reset()
119 res = self.runner.Run(machine, self.mock_label, self.telemetry_bench,
120 test_args, profiler_args)
121 self.assertTrue(self.call_pin_governor)
122 self.assertTrue(self.call_telemetry_run)
123 self.assertFalse(self.call_test_that_run)
124 self.assertFalse(self.call_telemetry_crosperf_run)
125 self.assertEqual(self.telemetry_run_args,
126 ['fake_machine', self.mock_label, self.telemetry_bench, ''])
127
128 reset()
129 res = self.runner.Run(machine, self.mock_label, self.test_that_bench,
130 test_args, profiler_args)
131 self.assertTrue(self.call_pin_governor)
132 self.assertFalse(self.call_telemetry_run)
133 self.assertTrue(self.call_test_that_run)
134 self.assertFalse(self.call_telemetry_crosperf_run)
135 self.assertEqual(self.test_that_args,
136 ['fake_machine', self.mock_label, self.test_that_bench, '',
137 ''])
138
139 reset()
140 res = self.runner.Run(machine, self.mock_label, self.telemetry_crosperf_bench,
141 test_args, profiler_args)
142 self.assertTrue(self.call_pin_governor)
143 self.assertFalse(self.call_telemetry_run)
144 self.assertFalse(self.call_test_that_run)
145 self.assertTrue(self.call_telemetry_crosperf_run)
146 self.assertEqual(self.telemetry_crosperf_args,
147 ['fake_machine', self.mock_label,
148 self.telemetry_crosperf_bench, '', ''])
149
150
151
152 @mock.patch.object (command_executer.CommandExecuter, 'CrosRunCommand')
153 def test_get_highest_static_frequency(self, mock_cros_runcmd):
154
155 self.mock_cmd_exec.CrosRunCommand = mock_cros_runcmd
156 mock_cros_runcmd.return_value = [ 0, '1666000 1333000 1000000', '']
157 freq = self.runner.GetHighestStaticFrequency ('lumpy1.cros', '/tmp/chromeos')
158 self.assertEqual(freq, '1666000')
159
160 mock_cros_runcmd.return_value = [ 0, '1333000', '']
161 freq = self.runner.GetHighestStaticFrequency ('lumpy1.cros', '/tmp/chromeos')
162 self.assertEqual(freq, '1333000')
163
164 mock_cros_runcmd.return_value = [ 0, '1661000 1333000 1000000', '']
165 freq = self.runner.GetHighestStaticFrequency ('lumpy1.cros', '/tmp/chromeos')
166 self.assertEqual(freq, '1333000')
167
168
169
170 @mock.patch.object (command_executer.CommandExecuter, 'CrosRunCommand')
171 def test_pin_governor_execution_frequencies(self, mock_cros_runcmd):
172
173 def FakeGetHighestFreq(machine_name, chromeos_root):
174 return '1666000'
175
176 self.mock_cmd_exec.CrosRunCommand = mock_cros_runcmd
177 self.runner.GetHighestStaticFrequency = FakeGetHighestFreq
178 self.runner.PinGovernorExecutionFrequencies('lumpy1.cros', '/tmp/chromeos')
179 self.assertEqual(mock_cros_runcmd.call_count, 1)
180 cmd = mock_cros_runcmd.call_args_list[0][0]
181 self.assertEqual (cmd, ('set -e && for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq; do echo 1666000 > $f; done && for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_min_freq; do echo 1666000 > $f; done && for f in /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor; do echo 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
200 @mock.patch.object (command_executer.CommandExecuter, 'CrosRunCommand')
201 @mock.patch.object (command_executer.CommandExecuter, 'ChrootRunCommand')
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.ChrootRunCommand = 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 self.assertEqual(len(args_list), 4)
235 self.assertEqual(args_list[0], '/tmp/chromeos')
236 self.assertEqual(args_list[1], ('/usr/bin/test_that --board=lumpy '
237 '--iterations=2 lumpy1.cros octane'))
238 self.assertTrue(args_list[2])
239 self.assertEqual(args_list[3], self.mock_cmd_term)
240
241 self.real_logger._LogMsg = save_log_msg
242
243
244 @mock.patch.object (os.path, 'isdir')
245 @mock.patch.object (command_executer.CommandExecuter, 'ChrootRunCommand')
246 def test_telemetry_crosperf_run(self, mock_chroot_runcmd, mock_isdir):
247
248 mock_isdir.return_value = True
249 mock_chroot_runcmd.return_value = 0
250 self.mock_cmd_exec.ChrootRunCommand = mock_chroot_runcmd
251 profiler_args = ('--profiler=custom_perf --profiler_args=\'perf_options'
252 '="record -a -e cycles,instructions"\'')
253 res = self.runner.Telemetry_Crosperf_Run ('lumpy1.cros', self.mock_label,
254 self.telemetry_crosperf_bench,
255 '', profiler_args)
256 self.assertEqual(res, 0)
257 self.assertEqual(mock_chroot_runcmd.call_count, 1)
258 args_list = mock_chroot_runcmd.call_args_list[0][0]
259 args_dict = mock_chroot_runcmd.call_args_list[0][1]
260 self.assertEqual(args_list[0], '/tmp/chromeos')
261 self.assertEqual(args_list[1],
262 ('/usr/bin/test_that --board=lumpy --args=" test=octane '
263 'profiler=custom_perf profiler_args=\'record -a -e '
264 'cycles,instructions\'" lumpy1.cros telemetry_Crosperf'))
265 self.assertEqual(args_dict['cros_sdk_options'],
266 (' --chrome_root= --chrome_root_mount=/tmp/chrome_root '
267 'FEATURES="-usersandbox" CHROME_ROOT=/tmp/chrome_root'))
268 self.assertEqual(args_dict['command_terminator'], self.mock_cmd_term)
269 self.assertTrue(args_dict['return_output'])
270 self.assertEqual(len(args_dict), 3)
271
272
273 @mock.patch.object (os.path, 'isdir')
274 @mock.patch.object (os.path, 'exists')
275 @mock.patch.object (command_executer.CommandExecuter, 'RunCommand')
276 def test_telemetry_run(self, mock_runcmd, mock_exists, mock_isdir):
277
278 def FakeLogMsg (fd, termfd, msg, flush):
279 pass
280
281 save_log_msg = self.real_logger._LogMsg
282 self.real_logger._LogMsg = FakeLogMsg
283 mock_runcmd.return_value = 0
284
285 self.mock_cmd_exec.RunCommand = mock_runcmd
286 self.runner._logger = self.real_logger
287
288 profiler_args = ('--profiler=custom_perf --profiler_args=\'perf_options'
289 '="record -a -e cycles,instructions"\'')
290
291 raises_exception = False
292 mock_isdir.return_value = False
293 try:
294 self.runner.Telemetry_Run('lumpy1.cros', self.mock_label,
295 self.telemetry_bench, '')
296 except:
297 raises_exception = True
298 self.assertTrue(raises_exception)
299
300 raises_exception = False
301 mock_isdir.return_value = True
302 mock_exists.return_value = False
303 try:
304 self.runner.Telemetry_Run('lumpy1.cros', self.mock_label,
305 self.telemetry_bench, '')
306 except:
307 raises_exception = True
308 self.assertTrue(raises_exception)
309
310 raises_exception = False
311 mock_isdir.return_value = True
312 mock_exists.return_value = True
313 try:
314 self.runner.Telemetry_Run('lumpy1.cros', self.mock_label,
315 self.telemetry_bench, profiler_args)
316 except:
317 raises_exception = True
318 self.assertTrue(raises_exception)
319
320 res = self.runner.Telemetry_Run('lumpy1.cros', self.mock_label,
321 self.telemetry_bench, '')
322 self.assertEqual(res, 0)
323 self.assertEqual(mock_runcmd.call_count, 1)
324 self.assertEqual(mock_runcmd.call_args_list[0][0],
325 (('cd src/tools/perf && ./run_measurement '
326 '--browser=cros-chrome --output-format=csv '
327 '--remote=lumpy1.cros --identity /tmp/chromeos/src/scripts'
328 '/mod_for_test_scripts/ssh_keys/testing_rsa octane '),))
329
330 self.real_logger._LogMsg = save_log_msg
331
332if __name__ == "__main__":
333 unittest.main()