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