blob: afa3d221af2e12d247d0172a8147ac0ead14db88 [file] [log] [blame]
# Copyright (c) 2010 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.
from autotest_lib.client.bin import test, utils
from autotest_lib.client.common_lib import error
import logging, os, re
class network_WiFiTxRx(test.test):
version = 1
def run_once(self, interface=None,
min_tx=-90, min_rx=-90,
min_qual=0.14,
max_tx=20, max_rx=20 ):
'''Check 802.11 WiFi signal strength
@param interface: Network interface to test (None to pick the default)
@param min_tx: Minimum acceptable WiFi Tx value in dBm (integer)
@param min_rx: Minimum acceptable WiFi Rx value in dBm (integer)
@param min_qual: Minimum signal quality (float, range 0 - 1)
@param max_tx: Maximum allowable WiFi Tx value in dBm (integer)
@param max_rx: Maximum allowable WiFi Rx value in dBm (integer)
|min_tx|, |min_rx| and |min_qual| are the only values you are likely to
want to change, and they should be set at sensible defaults anyway.
'''
flipflop = os.path.dirname(__file__)
flipflop = os.path.join(flipflop, 'network-flipflop.sh')
if interface:
flipflop = '%s %s' % (flipflop, interface)
data = utils.system_output(flipflop, retain_output=True)
results = data.splitlines()
pattern = (r'802\.11([a-z]+) '
r'freq [0-9]+(?:\.[0-9]+)? [A-Z]Hz '
r'quality (\d+)/(\d+) '
r'rx (-?\d+) dBm '
r'tx (-?\d+) dBm')
regex = re.compile(pattern)
success = 0
range_fail = '802.11%s %s outside range (%d dBm: %d to %d)'
for association in results:
readings = regex.match(association)
if readings:
modulation = readings.group(1)
quality = int(readings.group(2)) / int(readings.group(3))
rx = int(readings.group(4))
tx = int(readings.group(5))
if min_qual > quality:
raise error.TestFail('802.11%s quality too low (%f < %f)'
% (modulation, quality, min_qual))
if tx < min_tx or tx > max_tx:
raise error.TestFail(range_fail % (modulation, 'Tx',
tx, min_tx, max_tx))
if rx < min_rx or rx > max_rx:
raise error.TestFail(range_fail % (modulation, 'Rx',
rx, min_rx, max_rx))
success += 1
logging.info('SUCCESS: 802.11%s signal is acceptable '
'(Rx:%d dBm, Tx:%d dBm)', modulation, rx, tx)
if not success:
raise error.TestFail('No AP associations established')
return 0