#!/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.test_utils.wifi import wifi_test_utils as wutils from acts.test_utils.wifi import wifi_performance_test_utils as wputils 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') 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. """ self.dut = self.android_devices[-1] req_params = ['sap_test_params', 'testbed_params', 'AndroidDevice'] opt_params = ['main_network', 'golden_files_list'] self.unpack_userparams(req_params, opt_params) 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] 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'): 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']) ] if hasattr(self, 'bdf'): self.log.info('Pushing WiFi BDF to DUT.') wputils.push_bdf(self.dut, self.bdf) if hasattr(self, 'firmware'): self.log.info('Pushing WiFi firmware to DUT.') wlanmdsp = [ file for file in self.firmware if 'wlanmdsp.mbn' in file ][0] data_msc = [file for file in self.firmware if 'Data.msc' in file][0] wputils.push_firmware(self.dut, wlanmdsp, data_msc) 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) self.process_testclass_results() def teardown_test(self): 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] info['ap_ip_address'] = self.android_devices[ 0].droid.connectivityGetIPv4Addresses('wlan1')[0] info['frequency'] = self.android_devices[1].adb.shell( 'wpa_cli status | grep freq').split('=')[1] info['channel'] = wutils.WifiEnums.freq_to_channel[int( info['frequency'])] return info def setup_sap_rvr_test(self, testcase_params): """Function that gets devices ready for the test. Args: testcase_params: dict containing test-specific parameters """ 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: wutils.reset_wifi(dev) wutils.set_wifi_country_code(dev, wutils.WifiEnums.CountryCode.US) # 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']) # Set attenuator to 0 dB [self.attenuators[i].set_atten(0) for i in range(self.num_atten)] # Connect DUT to Network network = { 'SSID': sap_config[wutils.WifiEnums.SSID_KEY], 'password': sap_config[wutils.WifiEnums.PWD_KEY] } wutils.wifi_connect(self.android_devices[1], network, num_of_tries=5, check_connectivity=False) # Compile meta data self.access_point = AccessPointTuple(sap_config) testcase_params['connection_info'] = self.get_sap_connection_info() testcase_params['channel'] = testcase_params['connection_info'][ 'channel'] if testcase_params['channel'] < 13: testcase_params['mode'] = 'VHT20' else: testcase_params['mode'] = 'VHT80' testcase_params['iperf_server_address'] = testcase_params[ 'connection_info']['ap_ip_address'] 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 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') 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') 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') 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') self._test_sap_rvr(testcase_params)