Home | History | Annotate | Download | only in common_lib
      1 # Copyright (c) 2011 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 
      5 """A Python utility library for TPM module testing."""
      6 
      7 import logging, subprocess, time
      8 from autotest_lib.client.common_lib import error
      9 
     10 
     11 def runInSubprocess(args, rc_list=None):
     12     """Run a command in subprocess and return stdout.
     13 
     14     Args:
     15       args: a list of string, command to run.
     16       rc_list: a list of int, acceptable return code values.
     17 
     18     Returns:
     19       out: a string, stdout of the command executed.
     20       err: a string, stderr of the command executed, or None.
     21 
     22     Raises:
     23       RuntimeError: if subprocess return code is non-zero and not in rc_list.
     24     """
     25     if rc_list is None:
     26         rc_list = []
     27 
     28     # Sleep for 1 second so we don't overwhelm I2C bus with too many commands
     29     time.sleep(1)
     30     logging.debug('runInSubprocess args = %r; rc_list = %r', args, rc_list)
     31     proc = subprocess.Popen(args,
     32                             stdout=subprocess.PIPE,
     33                             stderr=subprocess.PIPE)
     34     out, err = proc.communicate()
     35     logging.error('runInSubprocess %s: out=%r, err=%r', args[0], out, err)
     36     if proc.returncode and proc.returncode not in rc_list:
     37         raise RuntimeError('runInSubprocess %s failed with returncode %d: %s' %
     38                            (args[0], proc.returncode, out))
     39     return str(out), str(err)
     40 
     41 
     42 def enableI2C():
     43     """Enable i2c-dev so i2c-tools can be used.
     44 
     45     Dependency: 'i2cdetect' is a command from 'i2c-tools' package, which comes
     46                 with Chrom* OS image and is available from inside chroot.
     47 
     48     Raises:
     49       TestFail: if i2c-dev can't be enabled.
     50     """
     51     args = ['i2cdetect', '-l']
     52     out, _ = runInSubprocess(args)
     53     if not out:
     54         logging.info('i2c-dev disabled. Enabling it with modprobe')
     55         out, _ = runInSubprocess(['modprobe', 'i2c-dev'])
     56         if out:
     57             raise error.TestFail('Error enable i2c-dev: %s' % out)
     58         out, _ = runInSubprocess(args)
     59     logging.info('i2c-dev ready to go:\n%s', out)
     60 
     61 
     62 def computeTimeElapsed(end, start):
     63     """Computes time difference in microseconds.
     64 
     65     Args:
     66       end: a datetime.datetime() object, end timestamp.
     67       start: a datetime.datetime() object, start timestamp.
     68 
     69     Returns:
     70       usec: an int, difference between end and start in microseconds.
     71     """
     72     t = end - start
     73     usec = 1000000 * t.seconds + t.microseconds
     74     logging.info('Elapsed time = %d usec', usec)
     75     return usec
     76