# Copyright (c) 2011 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """A Python utility library for TPM module testing.""" import logging, subprocess, time from autotest_lib.client.common_lib import error def runInSubprocess(args, rc_list=None): """Run a command in subprocess and return stdout. Args: args: a list of string, command to run. rc_list: a list of int, acceptable return code values. Returns: out: a string, stdout of the command executed. err: a string, stderr of the command executed, or None. Raises: RuntimeError: if subprocess return code is non-zero and not in rc_list. """ if rc_list is None: rc_list = [] # Sleep for 1 second so we don't overwhelm I2C bus with too many commands time.sleep(1) logging.debug('runInSubprocess args = %r; rc_list = %r', args, rc_list) proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE) out, err = proc.communicate() logging.error('runInSubprocess %s: out=%r, err=%r', args[0], out, err) if proc.returncode and proc.returncode not in rc_list: raise RuntimeError('runInSubprocess %s failed with returncode %d: %s' % (args[0], proc.returncode, out)) return str(out), str(err) def enableI2C(): """Enable i2c-dev so i2c-tools can be used. Dependency: 'i2cdetect' is a command from 'i2c-tools' package, which comes with Chrom* OS image and is available from inside chroot. Raises: TestFail: if i2c-dev can't be enabled. """ args = ['i2cdetect', '-l'] out, _ = runInSubprocess(args) if not out: logging.info('i2c-dev disabled. Enabling it with modprobe') out, _ = runInSubprocess(['modprobe', 'i2c-dev']) if out: raise error.TestFail('Error enable i2c-dev: %s' % out) out, _ = runInSubprocess(args) logging.info('i2c-dev ready to go:\n%s', out) def computeTimeElapsed(end, start): """Computes time difference in microseconds. Args: end: a datetime.datetime() object, end timestamp. start: a datetime.datetime() object, start timestamp. Returns: usec: an int, difference between end and start in microseconds. """ t = end - start usec = 1000000 * t.seconds + t.microseconds logging.info('Elapsed time = %d usec', usec) return usec