• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright 2015 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
5import re
6
7from autotest_lib.client.bin import test, utils
8from autotest_lib.client.common_lib import error
9
10
11class _Matcher(object):
12    """Extends regular expression with a match/do not match bit and
13    a saner definition of "match".
14    """
15
16
17    def __init__(self, pattern):
18
19        self._pattern = pattern
20        # If the pattern starts with !, it means "do not match".
21        if pattern[0] == '!':
22            self._positive_match = False
23            pattern = pattern[1:]
24        else:
25            self._positive_match = True
26
27        # re.match() forces the RE to match from the beginning, but doesn't
28        # require that the RE matches the entire string, so wrap with ^$ even
29        # though the ^ is not strictly needed.
30        self._regexp = re.compile("^" + pattern + "$")
31
32
33    def match(self, string):
34        return bool(self._regexp.match(string)) == self._positive_match
35
36
37_ALPHANUM = _Matcher("[\d\w]+")
38_NUM = _Matcher("[\d]+")
39_HEXNUM = _Matcher("0x[\da-fA-F]+")
40_BIT = _Matcher("[01]")
41_ANYTHING = _Matcher("!(\(error\))|")  # anything but "(error)" or ""
42
43def check(var, matcher):
44    """
45    Runs "crossystem @var" and raises an error
46    if the output does not match @matcher
47
48    @param var: the name of a crossystem variable
49    @param matcher: a matcher that must match the output of crossystem @var
50
51    """
52    output = utils.system_output("crossystem %s" % var).strip()
53    if not matcher.match(output):
54        raise error.TestFail("crossystem %s = \"%s\", does not match \"%s\"" %
55                (var, output, matcher._pattern))
56
57
58class platform_Crossystem(test.test):
59    """See control file for doc"""
60    version = 2
61
62    def run_once(self):
63        """Checks that crossystem works and returns plausible values for
64        a set of variables that are implemented on all platforms.
65        """
66
67        for var, matcher in (
68                ("arch", _ALPHANUM),
69                ("cros_debug", _BIT),
70                ("debug_build", _BIT),
71                ("devsw_boot", _BIT),
72                ("devsw_cur", _BIT),
73                ("fwid", _ANYTHING),
74                ("hwid", _ANYTHING),
75                ("loc_idx", _NUM),
76                ("mainfw_act", _ALPHANUM),
77                ("mainfw_type", _ALPHANUM),
78                ("ro_fwid", _ANYTHING),
79                ("tpm_fwver", _HEXNUM),
80                ("tpm_kernver", _HEXNUM),
81                ("wpsw_cur", _BIT),
82        ):
83            check(var, matcher)
84