# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import logging, os, re, string

from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error

class network_WiFiCaps(test.test):
    version = 1

    def setup(self):
        self.job.setup_dep(['iwcap'])
        # create a empty srcdir to prevent the error that checks .version
        if not os.path.exists(self.srcdir):
            os.mkdir(self.srcdir)


    def __parse_iwcap(self, lines):
        """Parse the iwcap output"""

        results = {}
        parse_re = re.compile(r'([a-z0-9]*):[ ]*(.*)')
        for line in lines.split('\n'):
            line = line.rstrip()
            logging.info('==> %s' %line)
            match = parse_re.search(line)
            if match:
                results[match.group(1)] = match.group(2)
                continue
        return results


    def __run_iwcap(self, phy, caps):
        iwcapdir = os.path.join(self.autodir, 'deps', 'iwcap', 'iwcap')
        iwcap = utils.run(iwcapdir + ' ' + phy + ' ' + string.join(caps))
        return self.__parse_iwcap(iwcap.stdout)

    def run_once(self):
        phy = utils.system_output("iw list | awk '/^Wiphy/ {print $2}'")
        if not phy or 'phy' not in phy:
            raise error.TestFail('WiFi Physical interface not found')

        requiredCaps = {
            'sta'    : 'true',        # station mode

            '24ghz'  : 'true',        # 2.4GHz band
            '11b'    : 'true',
            '11g'    : 'true',

            '5ghz'   : 'true',        # 5GHz band
            '11a'    : 'true',

            '11n'    : 'true',        # 802.11n (both bands)
            'ht40'   : 'true',        # HT40
            'sgi40'  : 'true',        # Short GI in HT40
        }

        dep = 'iwcap'
        dep_dir = os.path.join(self.autodir, 'deps', dep)
        self.job.install_pkg(dep, 'dep', dep_dir)

        results = self.__run_iwcap(phy, requiredCaps.keys())
        for cap in requiredCaps:
            if not cap in results:
                raise error.TestFail('Internal error, ' +
                    'capability "%s" not handled' % cap)
            if results[cap] != requiredCaps[cap]:
                raise error.TestFail('Requirement not met: ' +
                    'cap "%s" is "%s" but expected "%s"'
                    % (cap, results[cap], requiredCaps[cap]))
