Tan Gao | 039dee0 | 2011-09-23 14:25:54 -0700 | [diff] [blame] | 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 |