blob: 47719c5c0976b718469f0fb5eb8bb1112e0edfb1 [file] [log] [blame]
#!/usr/bin/env python3.4
#
# Copyright 2018 - The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the 'License');
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an 'AS IS' BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import collections
import logging
import os
from acts import asserts
from acts import base_test
from acts.controllers import iperf_server as ipf
from acts.controllers import iperf_client as ipc
from acts.metrics.loggers.blackbox import BlackboxMappedMetricLogger
from acts_contrib.test_utils.wifi import ota_sniffer
from acts_contrib.test_utils.wifi import wifi_test_utils as wutils
from acts_contrib.test_utils.wifi import wifi_performance_test_utils as wputils
from acts_contrib.test_utils.wifi import wifi_retail_ap as retail_ap
from WifiRvrTest import WifiRvrTest
AccessPointTuple = collections.namedtuple(('AccessPointTuple'),
['ap_settings'])
class WifiSoftApRvrTest(WifiRvrTest):
def __init__(self, controllers):
base_test.BaseTestClass.__init__(self, controllers)
self.tests = ('test_rvr_TCP_DL_2GHz', 'test_rvr_TCP_UL_2GHz',
'test_rvr_TCP_DL_5GHz', 'test_rvr_TCP_UL_5GHz',
'test_rvr_TCP_DL_2GHz_backhaul_2GHz',
'test_rvr_TCP_UL_2GHz_backhaul_2GHz',
'test_rvr_TCP_DL_5GHz_backhaul_2GHz',
'test_rvr_TCP_UL_5GHz_backhaul_2GHz',
'test_rvr_TCP_DL_2GHz_backhaul_5GHz',
'test_rvr_TCP_UL_2GHz_backhaul_5GHz',
'test_rvr_TCP_DL_5GHz_backhaul_5GHz',
'test_rvr_TCP_UL_5GHz_backhaul_5GHz')
self.testcase_metric_logger = (
BlackboxMappedMetricLogger.for_test_case())
self.testclass_metric_logger = (
BlackboxMappedMetricLogger.for_test_class())
self.publish_testcase_metrics = True
def setup_class(self):
"""Initializes common test hardware and parameters.
This function initializes hardwares and compiles parameters that are
common to all tests in this class.
"""
req_params = [
'sap_test_params', 'testbed_params', 'RetailAccessPoints',
'ap_networks'
]
opt_params = ['golden_files_list', 'OTASniffer']
self.unpack_userparams(req_params, opt_params)
self.access_points = retail_ap.create(self.RetailAccessPoints)
self.testclass_params = self.sap_test_params
self.num_atten = self.attenuators[0].instrument.num_atten
self.iperf_server = ipf.create([{
'AndroidDevice':
self.android_devices[0].serial,
'port':
'5201'
}])[0]
self.iperf_client = ipc.create([{
'AndroidDevice':
self.android_devices[1].serial,
'port':
'5201'
}])[0]
if hasattr(self,
'OTASniffer') and self.testbed_params['sniffer_enable']:
try:
self.sniffer = ota_sniffer.create(self.OTASniffer)[0]
except:
self.log.warning('Could not start sniffer. Disabling sniffs.')
self.testbed_params['sniffer_enable'] = 0
self.log_path = os.path.join(logging.log_path, 'results')
os.makedirs(self.log_path, exist_ok=True)
if not hasattr(self, 'golden_files_list'):
if 'golden_results_path' in self.testbed_params:
self.golden_files_list = [
os.path.join(self.testbed_params['golden_results_path'],
file) for file in
os.listdir(self.testbed_params['golden_results_path'])
]
else:
self.log.warning('No golden files found.')
self.golden_files_list = []
self.testclass_results = []
# Turn WiFi ON
for dev in self.android_devices:
wutils.wifi_toggle_state(dev, True)
def teardown_class(self):
# Turn WiFi OFF
wutils.stop_wifi_tethering(self.android_devices[0])
for dev in self.android_devices:
wutils.wifi_toggle_state(dev, False)
dev.go_to_sleep()
self.process_testclass_results()
# Teardown AP and release it's lockfile
for ap in self.access_points:
ap.teardown()
def teardown_test(self):
self.iperf_server.stop()
wutils.stop_wifi_tethering(self.android_devices[0])
def get_sap_connection_info(self):
info = {}
info['client_ip_address'] = self.android_devices[
1].droid.connectivityGetIPv4Addresses('wlan0')[0]
ifconfig_out = self.android_devices[0].adb.shell('ifconfig')
soft_ap_interface = 'wlan1' if 'wlan1' in ifconfig_out else 'wlan2'
info['ap_ip_address'] = self.android_devices[
0].droid.connectivityGetIPv4Addresses(soft_ap_interface)[0]
connection_rssi = wputils.get_connected_rssi(self.android_devices[1],
interface='wlan0')
info['frequency'] = connection_rssi['frequency'][0]
info['channel'] = wutils.WifiEnums.freq_to_channel[int(
info['frequency'])]
info['mode'] = 'bw20' if info['channel'] < 13 else 'bw80'
return info
def setup_aps(self, testcase_params):
for network in testcase_params['ap_networks']:
self.log.info('Setting AP {} {} interface on channel {}'.format(
network['ap_id'], network['interface_id'], network['channel']))
self.access_points[network['ap_id']].set_channel(
network['interface_id'], network['channel'])
def setup_duts(self, testcase_params):
"""Function that gets devices ready for the test.
Args:
testcase_params: dict containing test-specific parameters
"""
self.ap_dut = self.android_devices[0]
self.sta_dut = self.android_devices[1]
for dev in self.android_devices:
if not wputils.health_check(dev, 20):
asserts.skip('DUT health check failed. Skipping test.')
# Reset WiFi on all devices
for dev in self.android_devices:
dev.go_to_sleep()
wutils.reset_wifi(dev)
wutils.set_wifi_country_code(dev, wutils.WifiEnums.CountryCode.US)
for network in testcase_params['ap_networks']:
for connected_dut in network['connected_dut']:
self.log.info("Connecting DUT {} to {}".format(
connected_dut, self.ap_networks[network['ap_id']][
network['interface_id']]))
wutils.wifi_connect(self.android_devices[connected_dut],
self.ap_networks[network['ap_id']][
network['interface_id']],
num_of_tries=5,
check_connectivity=True)
def setup_sap_connection(self, testcase_params):
# Setup Soft AP
sap_config = wutils.create_softap_config()
self.log.info('SoftAP Config: {}'.format(sap_config))
wutils.start_wifi_tethering(self.android_devices[0],
sap_config[wutils.WifiEnums.SSID_KEY],
sap_config[wutils.WifiEnums.PWD_KEY],
testcase_params['sap_band_enum'])
# Connect DUT to Network
testcase_params['test_network'] = {
'SSID': sap_config[wutils.WifiEnums.SSID_KEY],
'password': sap_config[wutils.WifiEnums.PWD_KEY]
}
wutils.wifi_connect(self.sta_dut,
testcase_params['test_network'],
num_of_tries=5,
check_connectivity=False)
# Compile meta data
sap_info = self.get_sap_connection_info()
print("SAP Info: {}".format(sap_info))
testcase_params['channel'] = sap_info['channel']
if testcase_params['channel'] < 13:
testcase_params['band'] = '2GHz'
else:
testcase_params['band'] = '5GHz'
testcase_params['mode'] = sap_info['mode']
self.access_point = AccessPointTuple({
testcase_params['band']: {
'SSID': sap_config[wutils.WifiEnums.SSID_KEY],
'password': sap_config[wutils.WifiEnums.PWD_KEY],
'channel': sap_info['channel'],
'mode': sap_info['mode'],
'bandwidth': sap_info['mode'],
}
})
testcase_params['iperf_server_address'] = sap_info['ap_ip_address']
def setup_sap_rvr_test(self, testcase_params):
"""Function that gets devices ready for the test.
Args:
testcase_params: dict containing test-specific parameters
"""
# Configure DUTs
self.setup_aps(testcase_params)
# Set attenuator to 0 dB
for attenuator in self.attenuators:
attenuator.set_atten(0, strict=False)
# Configure DUTs
self.setup_duts(testcase_params)
# Setup sap connection
self.setup_sap_connection(testcase_params)
# Set DUT to monitor RSSI and LLStats on
self.monitored_dut = self.sta_dut
self.monitored_interface = 'wlan0'
def compile_test_params(self, testcase_params):
"""Function that completes all test params based on the test name.
Args:
testcase_params: dict containing test-specific parameters
"""
num_atten_steps = int((self.testclass_params['atten_stop'] -
self.testclass_params['atten_start']) /
self.testclass_params['atten_step'])
testcase_params['atten_range'] = [
self.testclass_params['atten_start'] +
x * self.testclass_params['atten_step']
for x in range(0, num_atten_steps)
]
if testcase_params['traffic_direction'] == 'DL':
testcase_params['iperf_args'] = wputils.get_iperf_arg_string(
duration=self.testclass_params['iperf_duration'],
reverse_direction=1,
traffic_type=testcase_params['traffic_type'])
testcase_params['use_client_output'] = True
else:
testcase_params['iperf_args'] = wputils.get_iperf_arg_string(
duration=self.testclass_params['iperf_duration'],
reverse_direction=0,
traffic_type=testcase_params['traffic_type'])
testcase_params['use_client_output'] = False
# Compile AP and infrastructure connection parameters
ap_networks = []
if testcase_params['dut_connected'][0]:
band = testcase_params['dut_connected'][0].split('_')[0]
ap_networks.append({
'ap_id':
0,
'interface_id':
band if band == '2G' else band + '_1',
'band':
band,
'channel':
1 if band == '2G' else 36,
'connected_dut': [0]
})
if testcase_params['dut_connected'][1]:
if testcase_params['dut_connected'][0] == testcase_params[
'dut_connected'][1]:
# if connected to same network, add it to the above
ap_networks[0]['connected_dut'].append(1)
else:
band = testcase_params['dut_connected'][1].split('_')[0]
if not testcase_params['dut_connected'][0]:
# if it's the only dut connected, assign it to ap 0
ap_id = 0
else:
ap_id = 1
ap_networks.append({
'ap_id':
ap_id,
'interface_id':
band if band == '2G' else band + '_1',
'band':
band,
'channel':
11 if band == '2G' else 149,
'connected_dut': [1]
})
testcase_params['ap_networks'] = ap_networks
return testcase_params
def _test_sap_rvr(self, testcase_params):
""" Function that gets called for each test case
Args:
testcase_params: dict containing test-specific parameters
"""
# Compile test parameters from config and test name
testcase_params = self.compile_test_params(testcase_params)
self.setup_sap_rvr_test(testcase_params)
result = self.run_rvr_test(testcase_params)
self.testclass_results.append(result)
self.process_test_results(result)
self.pass_fail_check(result)
#Test cases
def test_rvr_TCP_DL_2GHz(self):
testcase_params = collections.OrderedDict(
sap_band='2GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_2G,
traffic_type='TCP',
traffic_direction='DL',
dut_connected=[False, False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_UL_2GHz(self):
testcase_params = collections.OrderedDict(
sap_band='2GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_2G,
traffic_type='TCP',
traffic_direction='UL',
dut_connected=[False, False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_DL_5GHz(self):
testcase_params = collections.OrderedDict(
sap_band='5GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_5G,
traffic_type='TCP',
traffic_direction='DL',
dut_connected=[False, False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_UL_5GHz(self):
testcase_params = collections.OrderedDict(
sap_band='5GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_5G,
traffic_type='TCP',
traffic_direction='UL',
dut_connected=[False, False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_DL_2GHz_backhaul_2GHz(self):
testcase_params = collections.OrderedDict(
sap_band='2GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_2G,
traffic_type='TCP',
traffic_direction='DL',
dut_connected=['2G_1', False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_UL_2GHz_backhaul_2GHz(self):
testcase_params = collections.OrderedDict(
sap_band='2GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_2G,
traffic_type='TCP',
traffic_direction='UL',
dut_connected=['2G_1', False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_DL_5GHz_backhaul_2GHz(self):
testcase_params = collections.OrderedDict(
sap_band='5GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_5G,
traffic_type='TCP',
traffic_direction='DL',
dut_connected=['2G_1', False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_UL_5GHz_backhaul_2GHz(self):
testcase_params = collections.OrderedDict(
sap_band='5GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_5G,
traffic_type='TCP',
traffic_direction='UL',
dut_connected=['2G_1', False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_DL_2GHz_backhaul_5GHz(self):
testcase_params = collections.OrderedDict(
sap_band='2GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_2G,
traffic_type='TCP',
traffic_direction='DL',
dut_connected=['5G_1', False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_UL_2GHz_backhaul_5GHz(self):
testcase_params = collections.OrderedDict(
sap_band='2GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_2G,
traffic_type='TCP',
traffic_direction='UL',
dut_connected=['5G_1', False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_DL_5GHz_backhaul_5GHz(self):
testcase_params = collections.OrderedDict(
sap_band='5GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_5G,
traffic_type='TCP',
traffic_direction='DL',
dut_connected=['5G_1', False])
self._test_sap_rvr(testcase_params)
def test_rvr_TCP_UL_5GHz_backhaul_5GHz(self):
testcase_params = collections.OrderedDict(
sap_band='5GHz',
sap_band_enum=wutils.WifiEnums.WIFI_CONFIG_APBAND_5G,
traffic_type='TCP',
traffic_direction='UL',
dut_connected=['5G_1', False])
self._test_sap_rvr(testcase_params)