# 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