Home | History | Annotate | Download | only in platform_Quipper
      1 # Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 import subprocess
      5 from autotest_lib.client.bin import test
      6 from autotest_lib.client.common_lib import error
      7 
      8 
      9 class platform_Quipper(test.test):
     10     """
     11     Collects perf data and convert it to a protobuf. Verifies that quipper
     12     completes successfully and that the output is nonzero.
     13     """
     14     version = 1
     15 
     16     def _get_quipper_command(self, duration, perf_options):
     17         return ('quipper', str(duration), 'perf', 'record', '-a') + \
     18                perf_options
     19 
     20 
     21     def _get_perf_command(self, duration, perf_options):
     22         return ('perf', 'record', '-a') + perf_options + \
     23                ('--', 'sleep', str(duration))
     24 
     25 
     26     def run_once(self):
     27         """
     28         See test description.
     29         """
     30 
     31         duration = 2
     32 
     33         # These are the various perf command options to add to
     34         # |quipper_command_base|, for a wide range of commands to test.
     35         quipper_command_options = (
     36             # Basic cycle-based profile.
     37             ('-e', 'cycles'),
     38             # Set a custom sampling frequency.
     39             ('-e', 'cycles', '-F', '3011'),
     40             # Set a custom sampling period.
     41             ('-e', 'cycles', '-c', '2000003'),
     42             # Test various events.
     43             ('-e', 'cycles,instructions,branch-misses,cache-misses'),
     44             # Test callgraph.
     45             ('-e', 'cycles', '-g'),
     46             # Test callgraph and raw data.
     47             ('-e', 'cycles', '-g', '-R'),
     48             # Test LBR.
     49             ('-e', 'cycles', '-b'),
     50             # Test LBR, callgraph, and raw data.
     51             ('-e', 'cycles', '-b', '-g', '-R'),
     52         )
     53 
     54         keyvals = {}
     55         # Run quipper with each of the options.
     56         for options in quipper_command_options:
     57             result = ""
     58 
     59             # Try running the associated perf command first.
     60             perf_command = self._get_perf_command(duration, options)
     61 
     62             # Generate a full quipper command by joining the base command
     63             # and various perf options.
     64             quipper_command = self._get_quipper_command(duration, options)
     65             quipper_command_string = ' '.join(quipper_command)
     66 
     67             try:
     68                 result = subprocess.check_output(perf_command)
     69             except subprocess.CalledProcessError:
     70                 # If the perf command fails, don't test quipper. But record that
     71                 # it was skipped.
     72                 keyvals['command'] = '(' + quipper_command_string + ')'
     73                 keyvals['result_length'] = '(skipped)'
     74                 self.write_perf_keyval(keyvals)
     75                 continue
     76 
     77             try:
     78                 result = subprocess.check_output(quipper_command,
     79                                                  stderr=subprocess.STDOUT)
     80             except subprocess.CalledProcessError:
     81                 raise error.TestFail('Error running command: ' +
     82                                      quipper_command_string)
     83 
     84             # Write keyvals.
     85             keyvals['command'] = quipper_command_string;
     86             keyvals['result_length'] = len(result)
     87             self.write_perf_keyval(keyvals)
     88 
     89             # Verify the output size.
     90             if len(result) == 0:
     91                 raise error.TestFail('Got no result data from quipper.')
     92 
     93