xref: /aosp_15_r20/external/autotest/client/common_lib/smogcheck_util.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
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