• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (c) 2009 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 logging, os, re, string
6
7from autotest_lib.client.bin import test, utils
8from autotest_lib.client.common_lib import error
9
10class network_WiFiCaps(test.test):
11    version = 1
12
13    def setup(self):
14        self.job.setup_dep(['iwcap'])
15        # create a empty srcdir to prevent the error that checks .version
16        if not os.path.exists(self.srcdir):
17            os.mkdir(self.srcdir)
18
19
20    def __parse_iwcap(self, lines):
21        """Parse the iwcap output"""
22
23        results = {}
24        parse_re = re.compile(r'([a-z0-9]*):[ ]*(.*)')
25        for line in lines.split('\n'):
26            line = line.rstrip()
27            logging.info('==> %s' %line)
28            match = parse_re.search(line)
29            if match:
30                results[match.group(1)] = match.group(2)
31                continue
32        return results
33
34
35    def __run_iwcap(self, phy, caps):
36        dir = os.path.join(self.autodir, 'deps', 'iwcap', 'iwcap')
37        iwcap = utils.run(dir + ' ' + phy + ' ' + string.join(caps))
38        return self.__parse_iwcap(iwcap.stdout)
39
40    def run_once(self):
41        phy = utils.system_output("iw list | awk '/^Wiphy/ {print $2}'")
42        if not phy or 'phy' not in phy:
43            raise error.TestFail('WiFi Physical interface not found')
44
45        requiredCaps = {
46            'sta'    : 'true',        # station mode
47
48            '24ghz'  : 'true',        # 2.4GHz band
49            '11b'    : 'true',
50            '11g'    : 'true',
51
52            '5ghz'   : 'true',        # 5GHz band
53            '11a'    : 'true',
54
55            '11n'    : 'true',        # 802.11n (both bands)
56            'ht40'   : 'true',        # HT40
57            'sgi40'  : 'true',        # Short GI in HT40
58        }
59
60        dep = 'iwcap'
61        dep_dir = os.path.join(self.autodir, 'deps', dep)
62        self.job.install_pkg(dep, 'dep', dep_dir)
63
64        results = self.__run_iwcap(phy, requiredCaps.keys())
65        for cap in requiredCaps:
66            if not cap in results:
67                raise error.TestFail('Internal error, ' +
68                    'capability "%s" not handled' % cap)
69            if results[cap] != requiredCaps[cap]:
70                raise error.TestFail('Requirement not met: ' +
71                    'cap "%s" is "%s" but expected "%s"'
72                    % (cap, results[cap], requiredCaps[cap]))
73