blob: 61da9516223b505913ec6585b0af4a347e7f0cea [file] [log] [blame]
Tan Gao039dee02011-09-23 14:25:54 -07001# 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
7import logging, subprocess, time
8from autotest_lib.client.common_lib import error
9
10
11def 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
42def 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
62def 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