#!/usr/bin/env python3.4
#
#   Copyright 2017 - 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 logging
import math
import os
import time
from acts import base_test
from acts import utils
from acts.test_decorators import test_tracker_info
from acts.test_utils.wifi import wifi_test_utils as wutils
from acts.test_utils.wifi import wifi_power_test_utils as wputils
from acts.test_utils.wifi.WifiBaseTest import WifiBaseTest
import acts.controllers.iperf_server as ipf

TEMP_FILE = '/sdcard/Download/tmp.log'


class PowertrafficTest(base_test.BaseTestClass):
    def __init__(self, controllers):

        WifiBaseTest.__init__(self, controllers)

    def setup_class(self):

        self.log = logging.getLogger()
        self.dut = self.android_devices[0]
        req_params = ['traffictest_params', 'custom_files']
        self.unpack_userparams(req_params)
        self.unpack_testparams(self.traffictest_params)
        self.num_atten = self.attenuators[0].instrument.num_atten
        self.mon_data_path = os.path.join(self.log_path, 'Monsoon')
        self.mon_duration = self.iperf_duration - 10
        self.mon = self.monsoons[0]
        self.mon.set_max_current(8.0)
        self.mon.set_voltage(4.2)
        self.mon.attach_device(self.dut)
        self.mon_info = wputils.create_monsoon_info(self)
        self.iperf_server = self.iperf_servers[0]
        self.access_point = self.access_points[0]
        self.pkt_sender = self.packet_senders[0]
        for file in self.custom_files:
            if 'pass_fail_threshold' in file:
                self.threshold_file = file
            elif 'attenuator_setting' in file:
                self.attenuation_file = file
            elif 'network_config' in file:
                self.network_file = file
        self.threshold = wputils.unpack_custom_file(self.threshold_file,
                                                    self.TAG)
        self.atten_level = wputils.unpack_custom_file(self.attenuation_file,
                                                      self.TAG)
        self.networks = wputils.unpack_custom_file(self.network_file)
        self.main_network = self.networks['main_network']

    def teardown_test(self):
        """Tear down necessary objects after test case is finished.

        Bring down the AP interface, delete the bridge interface, stop IPERF
        server and reset the ethernet interface for iperf traffic
        """
        self.log.info('Tearing down the test case')
        self.iperf_server.stop()
        self.access_point.bridge.teardown(self.brconfigs)
        self.access_point.close()
        wputils.reset_host_interface(self.pkt_sender.interface)
        self.mon.usb('on')

    def teardown_class(self):
        """Clean up the test class after tests finish running

        """
        self.log.info('Tearing down the test class')
        self.mon.usb('on')
        self.access_point.close()

    def unpack_testparams(self, bulk_params):
        """Unpack all the test specific parameters.

        Args:
            bulk_params: dict with all test specific params in the config file
        """
        for key in bulk_params.keys():
            setattr(self, key, bulk_params[key])

    def iperf_power_test_func(self):
        """Test function for iperf power measurement at different RSSI level.

        Args:
            screen_status: screen ON or OFF
            band: desired band for AP to operate on
        """
        # Decode test parameters for the current test
        test_params = self.current_test_name.split('_')
        screen_status = test_params[2][6:]
        band = test_params[3]
        traffic_direction = test_params[4]
        traffic_type = test_params[5]
        signal_level = test_params[6][:-4]
        oper_mode = test_params[7]
        bandwidth = int(test_params[8])

        # Set device to rockbottom first
        wputils.dut_rockbottom(self.dut)
        wutils.wifi_toggle_state(self.dut, True)

        # Set up the AP
        network = self.main_network[band]
        self.brconfigs = wputils.ap_setup(self.access_point, network,
                                          bandwidth)

        # Wait for DHCP on the ethernet port and get IP as Iperf server address
        # Time out in 60 seconds if not getting DHCP address
        iface_eth = self.pkt_sender.interface
        self.iperf_server_address = wputils.wait_for_dhcp(iface_eth)

        # Set attenuator to desired level
        self.log.info('Set attenuation to desired RSSI level')
        atten_setting = band + '_' + signal_level
        for i in range(self.num_atten):
            attenuation = self.atten_level[atten_setting][i]
            self.attenuators[i].set_atten(attenuation)

        # Connect the phone to the AP
        wutils.wifi_connect(self.dut, network)
        time.sleep(5)
        if screen_status == 'off':
            self.dut.droid.goToSleepNow()
        RSSI = wputils.get_wifi_rssi(self.dut)

        # Construct the iperf command based on the test params
        iperf_args = '-i 1 -t {} -p {} -J'.format(self.iperf_duration,
                                                  self.iperf_server.port)
        if traffic_type == "UDP":
            iperf_args = iperf_args + "-u -b 2g"
        if traffic_direction == "DL":
            iperf_args = iperf_args + ' -R'
            use_client_output = True
        else:
            use_client_output = False
        # Parse the client side data to a file saved on the phone
        iperf_args = iperf_args + ' > %s' % TEMP_FILE

        # Run IPERF
        self.iperf_server.start()
        wputils.run_iperf_client_nonblocking(
            self.dut, self.iperf_server_address, iperf_args)

        # Collect power data and plot
        begin_time = utils.get_current_epoch_time()
        file_path, avg_current = wputils.monsoon_data_collect_save(
            self.dut, self.mon_info, self.current_test_name)

        # Get IPERF results
        RESULTS_DESTINATION = os.path.join(self.iperf_server.log_path,
                                           "iperf_client_output_{}.log".format(
                                               self.current_test_name))
        PULL_FILE = '{} {}'.format(TEMP_FILE, RESULTS_DESTINATION)
        self.dut.adb.pull(PULL_FILE)
        # Calculate the average throughput
        if use_client_output:
            iperf_file = RESULTS_DESTINATION
        else:
            iperf_file = self.iperf_server.log_files[-1]
        try:
            iperf_result = ipf.IPerfResult(iperf_file)
            throughput = (math.fsum(iperf_result.instantaneous_rates[:-1]) /
                          len(iperf_result.instantaneous_rates[:-1])) * 8
            self.log.info("The average throughput is {}".format(throughput))
        except:
            self.log.warning(
                "ValueError: Cannot get iperf result. Setting to 0")
            throughput = 0

        # Monsoon Power data plot with IPerf throughput information
        tag = '_RSSI_{0:d}dBm_Throughput_{1:.2f}Mbps'.format(RSSI, throughput)
        wputils.monsoon_data_plot(self.mon_info, file_path, tag)

        # Take Bugreport
        if bool(self.bug_report) == True:
            self.dut.take_bug_report(self.test_name, begin_time)
        # Pass and fail check
        wputils.pass_fail_check(self, avg_current)

    # Screen off TCP test cases
    @test_tracker_info(uuid='93f79f74-88d9-4781-bff0-8899bed1c336')
    def test_traffic_screenoff_2g_DL_TCP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='147eff45-97d7-47c0-b306-f84d9adecd9b')
    def test_traffic_screenoff_2g_DL_TCP_mediumRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='5982268b-57e4-40bf-848e-fee80fabf9d7')
    def test_traffic_screenoff_2g_DL_TCP_lowRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='c71a8c77-d355-4a82-b9f1-7cc8b888abd8')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='307945a6-32b7-42d0-a26c-d439f1599963')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='e9a900a1-e263-45ad-bdf3-9c463f761d3c')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='1d1d9a06-98e1-486e-a1db-2102708161ec')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='feeaad15-6893-4d49-aaf6-bf9802780f5d')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='f378679a-1c20-43a1-bff6-a6a5482a8e3d')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='6a05f133-49e5-4436-ba84-0746f04021ef')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='750bf1c3-2099-4b89-97dd-18f8e72df462')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ea458af-1ae0-40ee-853d-ac57b51d3eda')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='43d9b146-3547-4a27-9d79-c9341c32ccda')
    def test_traffic_screenoff_2g_UL_TCP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='f00a868b-c8b1-4b36-8136-b39b5c2396a7')
    def test_traffic_screenoff_2g_UL_TCP_mediumRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='cd0c37ac-23fe-4dd1-9130-ccb2dfa71020')
    def test_traffic_screenoff_2g_UL_TCP_lowRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='f9173d39-b46d-4d80-a5a5-7966f5eed9de')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='cf77e1dc-30bc-4df9-88be-408f1fddc24f')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='48f91745-22dc-47c9-ace6-c2719df651d6')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='18456aa7-62f0-4560-a7dc-4d7e01f6aca5')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='8ad237d7-f5e1-45e1-a4a2-a010628a4db9')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='3e29173f-b950-4a41-a7f6-6cc0731bf477')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d4cdb21-a1b0-4011-9956-ca0b7a9f3bec')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='8427d3f0-9418-4b5c-aea9-7509e5959ce6')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='5ac91734-0323-464b-b04a-c7d3d7ff8cdf')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

    # Screen off UDP tests - only check 5g VHT 80
    @test_tracker_info(uuid='1ab4a4e2-bce2-4ff8-be9d-f8ed2bb617cd')
    def test_traffic_screenoff_5g_DL_UDP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='a2c66d63-e93f-42aa-a021-0c6cdfdc87b8')
    def test_traffic_screenoff_5g_DL_UDP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='68e6f92a-ae15-4e76-81e7-a7b491e181fe')
    def test_traffic_screenoff_5g_DL_UDP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='258500f4-f177-43df-82a7-a64d66e90720')
    def test_traffic_screenoff_5g_UL_UDP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d2d3d45-575d-4080-86f9-b32a96963032')
    def test_traffic_screenoff_5g_UL_UDP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='a17c7d0b-58ca-47b5-9f32-0b7a3d7d3d9d')
    def test_traffic_screenoff_5g_UL_UDP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

    # Screen on point check
    @test_tracker_info(uuid='c1c71639-4463-4999-8f5d-7d9153402c79')
    def test_traffic_screenon_2g_DL_TCP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='40daebc4-45a2-4299-b724-e8cb917b86e8')
    def test_traffic_screenon_5g_DL_TCP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='2e286f36-1a47-4895-a0e8-a161d6a9fd9f')
    def test_traffic_screenon_2g_UL_TCP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='9f6b52cb-b48a-4382-8061-3d3a511a261a')
    def test_traffic_screenon_5g_UL_TCP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='59d79274-15cf-446b-a567-655c07f8a778')
    def test_traffic_screenon_2g_DL_UDP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='02891671-48cc-4186-9a95-3e02671477d0')
    def test_traffic_screenon_5g_DL_UDP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='02821540-7b08-4e4f-a1f1-b455fd4cec6e')
    def test_traffic_screenon_2g_UL_UDP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='59ea06ac-3ac8-4ecc-abb1-bcde34f47358')
    def test_traffic_screenon_2g_UL_UDP_mediumRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='0cbbd849-7b59-4143-95e7-92cf1fd955dc')
    def test_traffic_screenon_2g_UL_UDP_lowRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='d84f11d8-41a9-4ce8-a351-ebb0379d56c1')
    def test_traffic_screenon_5g_UL_UDP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='01b6087c-b39a-441d-90e9-da659aa0db7f')
    def test_traffic_screenon_5g_UL_UDP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='7e16dcaa-128f-4874-ab52-2f43e25e6da8')
    def test_traffic_screenon_5g_UL_UDP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

2d38f07ccd72412f9efaa98f716c17470397cddf
<mask token>


class PowertrafficTest(base_test.BaseTestClass):
    <mask token>

    def setup_class(self):
        self.log = logging.getLogger()
        self.dut = self.android_devices[0]
        req_params = ['traffictest_params', 'custom_files']
        self.unpack_userparams(req_params)
        self.unpack_testparams(self.traffictest_params)
        self.num_atten = self.attenuators[0].instrument.num_atten
        self.mon_data_path = os.path.join(self.log_path, 'Monsoon')
        self.mon_duration = self.iperf_duration - 10
        self.mon = self.monsoons[0]
        self.mon.set_max_current(8.0)
        self.mon.set_voltage(4.2)
        self.mon.attach_device(self.dut)
        self.mon_info = wputils.create_monsoon_info(self)
        self.iperf_server = self.iperf_servers[0]
        self.access_point = self.access_points[0]
        self.pkt_sender = self.packet_senders[0]
        for file in self.custom_files:
            if 'pass_fail_threshold' in file:
                self.threshold_file = file
            elif 'attenuator_setting' in file:
                self.attenuation_file = file
            elif 'network_config' in file:
                self.network_file = file
        self.threshold = wputils.unpack_custom_file(self.threshold_file,
            self.TAG)
        self.atten_level = wputils.unpack_custom_file(self.attenuation_file,
            self.TAG)
        self.networks = wputils.unpack_custom_file(self.network_file)
        self.main_network = self.networks['main_network']

    def teardown_test(self):
        """Tear down necessary objects after test case is finished.

        Bring down the AP interface, delete the bridge interface, stop IPERF
        server and reset the ethernet interface for iperf traffic
        """
        self.log.info('Tearing down the test case')
        self.iperf_server.stop()
        self.access_point.bridge.teardown(self.brconfigs)
        self.access_point.close()
        wputils.reset_host_interface(self.pkt_sender.interface)
        self.mon.usb('on')

    def teardown_class(self):
        """Clean up the test class after tests finish running

        """
        self.log.info('Tearing down the test class')
        self.mon.usb('on')
        self.access_point.close()

    def unpack_testparams(self, bulk_params):
        """Unpack all the test specific parameters.

        Args:
            bulk_params: dict with all test specific params in the config file
        """
        for key in bulk_params.keys():
            setattr(self, key, bulk_params[key])

    def iperf_power_test_func(self):
        """Test function for iperf power measurement at different RSSI level.

        Args:
            screen_status: screen ON or OFF
            band: desired band for AP to operate on
        """
        test_params = self.current_test_name.split('_')
        screen_status = test_params[2][6:]
        band = test_params[3]
        traffic_direction = test_params[4]
        traffic_type = test_params[5]
        signal_level = test_params[6][:-4]
        oper_mode = test_params[7]
        bandwidth = int(test_params[8])
        wputils.dut_rockbottom(self.dut)
        wutils.wifi_toggle_state(self.dut, True)
        network = self.main_network[band]
        self.brconfigs = wputils.ap_setup(self.access_point, network, bandwidth
            )
        iface_eth = self.pkt_sender.interface
        self.iperf_server_address = wputils.wait_for_dhcp(iface_eth)
        self.log.info('Set attenuation to desired RSSI level')
        atten_setting = band + '_' + signal_level
        for i in range(self.num_atten):
            attenuation = self.atten_level[atten_setting][i]
            self.attenuators[i].set_atten(attenuation)
        wutils.wifi_connect(self.dut, network)
        time.sleep(5)
        if screen_status == 'off':
            self.dut.droid.goToSleepNow()
        RSSI = wputils.get_wifi_rssi(self.dut)
        iperf_args = '-i 1 -t {} -p {} -J'.format(self.iperf_duration, self
            .iperf_server.port)
        if traffic_type == 'UDP':
            iperf_args = iperf_args + '-u -b 2g'
        if traffic_direction == 'DL':
            iperf_args = iperf_args + ' -R'
            use_client_output = True
        else:
            use_client_output = False
        iperf_args = iperf_args + ' > %s' % TEMP_FILE
        self.iperf_server.start()
        wputils.run_iperf_client_nonblocking(self.dut, self.
            iperf_server_address, iperf_args)
        begin_time = utils.get_current_epoch_time()
        file_path, avg_current = wputils.monsoon_data_collect_save(self.dut,
            self.mon_info, self.current_test_name)
        RESULTS_DESTINATION = os.path.join(self.iperf_server.log_path,
            'iperf_client_output_{}.log'.format(self.current_test_name))
        PULL_FILE = '{} {}'.format(TEMP_FILE, RESULTS_DESTINATION)
        self.dut.adb.pull(PULL_FILE)
        if use_client_output:
            iperf_file = RESULTS_DESTINATION
        else:
            iperf_file = self.iperf_server.log_files[-1]
        try:
            iperf_result = ipf.IPerfResult(iperf_file)
            throughput = math.fsum(iperf_result.instantaneous_rates[:-1]
                ) / len(iperf_result.instantaneous_rates[:-1]) * 8
            self.log.info('The average throughput is {}'.format(throughput))
        except:
            self.log.warning(
                'ValueError: Cannot get iperf result. Setting to 0')
            throughput = 0
        tag = '_RSSI_{0:d}dBm_Throughput_{1:.2f}Mbps'.format(RSSI, throughput)
        wputils.monsoon_data_plot(self.mon_info, file_path, tag)
        if bool(self.bug_report) == True:
            self.dut.take_bug_report(self.test_name, begin_time)
        wputils.pass_fail_check(self, avg_current)

    @test_tracker_info(uuid='93f79f74-88d9-4781-bff0-8899bed1c336')
    def test_traffic_screenoff_2g_DL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='147eff45-97d7-47c0-b306-f84d9adecd9b')
    def test_traffic_screenoff_2g_DL_TCP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='5982268b-57e4-40bf-848e-fee80fabf9d7')
    def test_traffic_screenoff_2g_DL_TCP_lowRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='c71a8c77-d355-4a82-b9f1-7cc8b888abd8')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='307945a6-32b7-42d0-a26c-d439f1599963')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='e9a900a1-e263-45ad-bdf3-9c463f761d3c')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1d1d9a06-98e1-486e-a1db-2102708161ec')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='feeaad15-6893-4d49-aaf6-bf9802780f5d')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_40(self):
        self.iperf_power_test_func()
    <mask token>
    <mask token>

    @test_tracker_info(uuid='750bf1c3-2099-4b89-97dd-18f8e72df462')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ea458af-1ae0-40ee-853d-ac57b51d3eda')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>
    <mask token>
    <mask token>

    @test_tracker_info(uuid='f9173d39-b46d-4d80-a5a5-7966f5eed9de')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='cf77e1dc-30bc-4df9-88be-408f1fddc24f')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='48f91745-22dc-47c9-ace6-c2719df651d6')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_20(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='8ad237d7-f5e1-45e1-a4a2-a010628a4db9')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3e29173f-b950-4a41-a7f6-6cc0731bf477')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d4cdb21-a1b0-4011-9956-ca0b7a9f3bec')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='8427d3f0-9418-4b5c-aea9-7509e5959ce6')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='5ac91734-0323-464b-b04a-c7d3d7ff8cdf')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ab4a4e2-bce2-4ff8-be9d-f8ed2bb617cd')
    def test_traffic_screenoff_5g_DL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='a2c66d63-e93f-42aa-a021-0c6cdfdc87b8')
    def test_traffic_screenoff_5g_DL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='258500f4-f177-43df-82a7-a64d66e90720')
    def test_traffic_screenoff_5g_UL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='a17c7d0b-58ca-47b5-9f32-0b7a3d7d3d9d')
    def test_traffic_screenoff_5g_UL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='c1c71639-4463-4999-8f5d-7d9153402c79')
    def test_traffic_screenon_2g_DL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='40daebc4-45a2-4299-b724-e8cb917b86e8')
    def test_traffic_screenon_5g_DL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='2e286f36-1a47-4895-a0e8-a161d6a9fd9f')
    def test_traffic_screenon_2g_UL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='9f6b52cb-b48a-4382-8061-3d3a511a261a')
    def test_traffic_screenon_5g_UL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='02891671-48cc-4186-9a95-3e02671477d0')
    def test_traffic_screenon_5g_DL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='02821540-7b08-4e4f-a1f1-b455fd4cec6e')
    def test_traffic_screenon_2g_UL_UDP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='59ea06ac-3ac8-4ecc-abb1-bcde34f47358')
    def test_traffic_screenon_2g_UL_UDP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()
    <mask token>
    <mask token>

    @test_tracker_info(uuid='01b6087c-b39a-441d-90e9-da659aa0db7f')
    def test_traffic_screenon_5g_UL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='7e16dcaa-128f-4874-ab52-2f43e25e6da8')
    def test_traffic_screenon_5g_UL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

<mask token>


class PowertrafficTest(base_test.BaseTestClass):
    <mask token>

    def setup_class(self):
        self.log = logging.getLogger()
        self.dut = self.android_devices[0]
        req_params = ['traffictest_params', 'custom_files']
        self.unpack_userparams(req_params)
        self.unpack_testparams(self.traffictest_params)
        self.num_atten = self.attenuators[0].instrument.num_atten
        self.mon_data_path = os.path.join(self.log_path, 'Monsoon')
        self.mon_duration = self.iperf_duration - 10
        self.mon = self.monsoons[0]
        self.mon.set_max_current(8.0)
        self.mon.set_voltage(4.2)
        self.mon.attach_device(self.dut)
        self.mon_info = wputils.create_monsoon_info(self)
        self.iperf_server = self.iperf_servers[0]
        self.access_point = self.access_points[0]
        self.pkt_sender = self.packet_senders[0]
        for file in self.custom_files:
            if 'pass_fail_threshold' in file:
                self.threshold_file = file
            elif 'attenuator_setting' in file:
                self.attenuation_file = file
            elif 'network_config' in file:
                self.network_file = file
        self.threshold = wputils.unpack_custom_file(self.threshold_file,
            self.TAG)
        self.atten_level = wputils.unpack_custom_file(self.attenuation_file,
            self.TAG)
        self.networks = wputils.unpack_custom_file(self.network_file)
        self.main_network = self.networks['main_network']

    def teardown_test(self):
        """Tear down necessary objects after test case is finished.

        Bring down the AP interface, delete the bridge interface, stop IPERF
        server and reset the ethernet interface for iperf traffic
        """
        self.log.info('Tearing down the test case')
        self.iperf_server.stop()
        self.access_point.bridge.teardown(self.brconfigs)
        self.access_point.close()
        wputils.reset_host_interface(self.pkt_sender.interface)
        self.mon.usb('on')

    def teardown_class(self):
        """Clean up the test class after tests finish running

        """
        self.log.info('Tearing down the test class')
        self.mon.usb('on')
        self.access_point.close()

    def unpack_testparams(self, bulk_params):
        """Unpack all the test specific parameters.

        Args:
            bulk_params: dict with all test specific params in the config file
        """
        for key in bulk_params.keys():
            setattr(self, key, bulk_params[key])

    def iperf_power_test_func(self):
        """Test function for iperf power measurement at different RSSI level.

        Args:
            screen_status: screen ON or OFF
            band: desired band for AP to operate on
        """
        test_params = self.current_test_name.split('_')
        screen_status = test_params[2][6:]
        band = test_params[3]
        traffic_direction = test_params[4]
        traffic_type = test_params[5]
        signal_level = test_params[6][:-4]
        oper_mode = test_params[7]
        bandwidth = int(test_params[8])
        wputils.dut_rockbottom(self.dut)
        wutils.wifi_toggle_state(self.dut, True)
        network = self.main_network[band]
        self.brconfigs = wputils.ap_setup(self.access_point, network, bandwidth
            )
        iface_eth = self.pkt_sender.interface
        self.iperf_server_address = wputils.wait_for_dhcp(iface_eth)
        self.log.info('Set attenuation to desired RSSI level')
        atten_setting = band + '_' + signal_level
        for i in range(self.num_atten):
            attenuation = self.atten_level[atten_setting][i]
            self.attenuators[i].set_atten(attenuation)
        wutils.wifi_connect(self.dut, network)
        time.sleep(5)
        if screen_status == 'off':
            self.dut.droid.goToSleepNow()
        RSSI = wputils.get_wifi_rssi(self.dut)
        iperf_args = '-i 1 -t {} -p {} -J'.format(self.iperf_duration, self
            .iperf_server.port)
        if traffic_type == 'UDP':
            iperf_args = iperf_args + '-u -b 2g'
        if traffic_direction == 'DL':
            iperf_args = iperf_args + ' -R'
            use_client_output = True
        else:
            use_client_output = False
        iperf_args = iperf_args + ' > %s' % TEMP_FILE
        self.iperf_server.start()
        wputils.run_iperf_client_nonblocking(self.dut, self.
            iperf_server_address, iperf_args)
        begin_time = utils.get_current_epoch_time()
        file_path, avg_current = wputils.monsoon_data_collect_save(self.dut,
            self.mon_info, self.current_test_name)
        RESULTS_DESTINATION = os.path.join(self.iperf_server.log_path,
            'iperf_client_output_{}.log'.format(self.current_test_name))
        PULL_FILE = '{} {}'.format(TEMP_FILE, RESULTS_DESTINATION)
        self.dut.adb.pull(PULL_FILE)
        if use_client_output:
            iperf_file = RESULTS_DESTINATION
        else:
            iperf_file = self.iperf_server.log_files[-1]
        try:
            iperf_result = ipf.IPerfResult(iperf_file)
            throughput = math.fsum(iperf_result.instantaneous_rates[:-1]
                ) / len(iperf_result.instantaneous_rates[:-1]) * 8
            self.log.info('The average throughput is {}'.format(throughput))
        except:
            self.log.warning(
                'ValueError: Cannot get iperf result. Setting to 0')
            throughput = 0
        tag = '_RSSI_{0:d}dBm_Throughput_{1:.2f}Mbps'.format(RSSI, throughput)
        wputils.monsoon_data_plot(self.mon_info, file_path, tag)
        if bool(self.bug_report) == True:
            self.dut.take_bug_report(self.test_name, begin_time)
        wputils.pass_fail_check(self, avg_current)

    @test_tracker_info(uuid='93f79f74-88d9-4781-bff0-8899bed1c336')
    def test_traffic_screenoff_2g_DL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='147eff45-97d7-47c0-b306-f84d9adecd9b')
    def test_traffic_screenoff_2g_DL_TCP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='5982268b-57e4-40bf-848e-fee80fabf9d7')
    def test_traffic_screenoff_2g_DL_TCP_lowRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='c71a8c77-d355-4a82-b9f1-7cc8b888abd8')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='307945a6-32b7-42d0-a26c-d439f1599963')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='e9a900a1-e263-45ad-bdf3-9c463f761d3c')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1d1d9a06-98e1-486e-a1db-2102708161ec')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='feeaad15-6893-4d49-aaf6-bf9802780f5d')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_40(self):
        self.iperf_power_test_func()
    <mask token>
    <mask token>

    @test_tracker_info(uuid='750bf1c3-2099-4b89-97dd-18f8e72df462')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ea458af-1ae0-40ee-853d-ac57b51d3eda')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>
    <mask token>
    <mask token>

    @test_tracker_info(uuid='f9173d39-b46d-4d80-a5a5-7966f5eed9de')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='cf77e1dc-30bc-4df9-88be-408f1fddc24f')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='48f91745-22dc-47c9-ace6-c2719df651d6')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_20(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='8ad237d7-f5e1-45e1-a4a2-a010628a4db9')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3e29173f-b950-4a41-a7f6-6cc0731bf477')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d4cdb21-a1b0-4011-9956-ca0b7a9f3bec')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='8427d3f0-9418-4b5c-aea9-7509e5959ce6')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='5ac91734-0323-464b-b04a-c7d3d7ff8cdf')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ab4a4e2-bce2-4ff8-be9d-f8ed2bb617cd')
    def test_traffic_screenoff_5g_DL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='a2c66d63-e93f-42aa-a021-0c6cdfdc87b8')
    def test_traffic_screenoff_5g_DL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='258500f4-f177-43df-82a7-a64d66e90720')
    def test_traffic_screenoff_5g_UL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='a17c7d0b-58ca-47b5-9f32-0b7a3d7d3d9d')
    def test_traffic_screenoff_5g_UL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='c1c71639-4463-4999-8f5d-7d9153402c79')
    def test_traffic_screenon_2g_DL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='40daebc4-45a2-4299-b724-e8cb917b86e8')
    def test_traffic_screenon_5g_DL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='2e286f36-1a47-4895-a0e8-a161d6a9fd9f')
    def test_traffic_screenon_2g_UL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='9f6b52cb-b48a-4382-8061-3d3a511a261a')
    def test_traffic_screenon_5g_UL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='02891671-48cc-4186-9a95-3e02671477d0')
    def test_traffic_screenon_5g_DL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='02821540-7b08-4e4f-a1f1-b455fd4cec6e')
    def test_traffic_screenon_2g_UL_UDP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='59ea06ac-3ac8-4ecc-abb1-bcde34f47358')
    def test_traffic_screenon_2g_UL_UDP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='d84f11d8-41a9-4ce8-a351-ebb0379d56c1')
    def test_traffic_screenon_5g_UL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='01b6087c-b39a-441d-90e9-da659aa0db7f')
    def test_traffic_screenon_5g_UL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='7e16dcaa-128f-4874-ab52-2f43e25e6da8')
    def test_traffic_screenon_5g_UL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

<mask token>


class PowertrafficTest(base_test.BaseTestClass):
    <mask token>

    def setup_class(self):
        self.log = logging.getLogger()
        self.dut = self.android_devices[0]
        req_params = ['traffictest_params', 'custom_files']
        self.unpack_userparams(req_params)
        self.unpack_testparams(self.traffictest_params)
        self.num_atten = self.attenuators[0].instrument.num_atten
        self.mon_data_path = os.path.join(self.log_path, 'Monsoon')
        self.mon_duration = self.iperf_duration - 10
        self.mon = self.monsoons[0]
        self.mon.set_max_current(8.0)
        self.mon.set_voltage(4.2)
        self.mon.attach_device(self.dut)
        self.mon_info = wputils.create_monsoon_info(self)
        self.iperf_server = self.iperf_servers[0]
        self.access_point = self.access_points[0]
        self.pkt_sender = self.packet_senders[0]
        for file in self.custom_files:
            if 'pass_fail_threshold' in file:
                self.threshold_file = file
            elif 'attenuator_setting' in file:
                self.attenuation_file = file
            elif 'network_config' in file:
                self.network_file = file
        self.threshold = wputils.unpack_custom_file(self.threshold_file,
            self.TAG)
        self.atten_level = wputils.unpack_custom_file(self.attenuation_file,
            self.TAG)
        self.networks = wputils.unpack_custom_file(self.network_file)
        self.main_network = self.networks['main_network']

    def teardown_test(self):
        """Tear down necessary objects after test case is finished.

        Bring down the AP interface, delete the bridge interface, stop IPERF
        server and reset the ethernet interface for iperf traffic
        """
        self.log.info('Tearing down the test case')
        self.iperf_server.stop()
        self.access_point.bridge.teardown(self.brconfigs)
        self.access_point.close()
        wputils.reset_host_interface(self.pkt_sender.interface)
        self.mon.usb('on')

    def teardown_class(self):
        """Clean up the test class after tests finish running

        """
        self.log.info('Tearing down the test class')
        self.mon.usb('on')
        self.access_point.close()

    def unpack_testparams(self, bulk_params):
        """Unpack all the test specific parameters.

        Args:
            bulk_params: dict with all test specific params in the config file
        """
        for key in bulk_params.keys():
            setattr(self, key, bulk_params[key])

    def iperf_power_test_func(self):
        """Test function for iperf power measurement at different RSSI level.

        Args:
            screen_status: screen ON or OFF
            band: desired band for AP to operate on
        """
        test_params = self.current_test_name.split('_')
        screen_status = test_params[2][6:]
        band = test_params[3]
        traffic_direction = test_params[4]
        traffic_type = test_params[5]
        signal_level = test_params[6][:-4]
        oper_mode = test_params[7]
        bandwidth = int(test_params[8])
        wputils.dut_rockbottom(self.dut)
        wutils.wifi_toggle_state(self.dut, True)
        network = self.main_network[band]
        self.brconfigs = wputils.ap_setup(self.access_point, network, bandwidth
            )
        iface_eth = self.pkt_sender.interface
        self.iperf_server_address = wputils.wait_for_dhcp(iface_eth)
        self.log.info('Set attenuation to desired RSSI level')
        atten_setting = band + '_' + signal_level
        for i in range(self.num_atten):
            attenuation = self.atten_level[atten_setting][i]
            self.attenuators[i].set_atten(attenuation)
        wutils.wifi_connect(self.dut, network)
        time.sleep(5)
        if screen_status == 'off':
            self.dut.droid.goToSleepNow()
        RSSI = wputils.get_wifi_rssi(self.dut)
        iperf_args = '-i 1 -t {} -p {} -J'.format(self.iperf_duration, self
            .iperf_server.port)
        if traffic_type == 'UDP':
            iperf_args = iperf_args + '-u -b 2g'
        if traffic_direction == 'DL':
            iperf_args = iperf_args + ' -R'
            use_client_output = True
        else:
            use_client_output = False
        iperf_args = iperf_args + ' > %s' % TEMP_FILE
        self.iperf_server.start()
        wputils.run_iperf_client_nonblocking(self.dut, self.
            iperf_server_address, iperf_args)
        begin_time = utils.get_current_epoch_time()
        file_path, avg_current = wputils.monsoon_data_collect_save(self.dut,
            self.mon_info, self.current_test_name)
        RESULTS_DESTINATION = os.path.join(self.iperf_server.log_path,
            'iperf_client_output_{}.log'.format(self.current_test_name))
        PULL_FILE = '{} {}'.format(TEMP_FILE, RESULTS_DESTINATION)
        self.dut.adb.pull(PULL_FILE)
        if use_client_output:
            iperf_file = RESULTS_DESTINATION
        else:
            iperf_file = self.iperf_server.log_files[-1]
        try:
            iperf_result = ipf.IPerfResult(iperf_file)
            throughput = math.fsum(iperf_result.instantaneous_rates[:-1]
                ) / len(iperf_result.instantaneous_rates[:-1]) * 8
            self.log.info('The average throughput is {}'.format(throughput))
        except:
            self.log.warning(
                'ValueError: Cannot get iperf result. Setting to 0')
            throughput = 0
        tag = '_RSSI_{0:d}dBm_Throughput_{1:.2f}Mbps'.format(RSSI, throughput)
        wputils.monsoon_data_plot(self.mon_info, file_path, tag)
        if bool(self.bug_report) == True:
            self.dut.take_bug_report(self.test_name, begin_time)
        wputils.pass_fail_check(self, avg_current)

    @test_tracker_info(uuid='93f79f74-88d9-4781-bff0-8899bed1c336')
    def test_traffic_screenoff_2g_DL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='147eff45-97d7-47c0-b306-f84d9adecd9b')
    def test_traffic_screenoff_2g_DL_TCP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='5982268b-57e4-40bf-848e-fee80fabf9d7')
    def test_traffic_screenoff_2g_DL_TCP_lowRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='c71a8c77-d355-4a82-b9f1-7cc8b888abd8')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='307945a6-32b7-42d0-a26c-d439f1599963')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='e9a900a1-e263-45ad-bdf3-9c463f761d3c')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1d1d9a06-98e1-486e-a1db-2102708161ec')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='feeaad15-6893-4d49-aaf6-bf9802780f5d')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_40(self):
        self.iperf_power_test_func()
    <mask token>
    <mask token>

    @test_tracker_info(uuid='750bf1c3-2099-4b89-97dd-18f8e72df462')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ea458af-1ae0-40ee-853d-ac57b51d3eda')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='f00a868b-c8b1-4b36-8136-b39b5c2396a7')
    def test_traffic_screenoff_2g_UL_TCP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='f9173d39-b46d-4d80-a5a5-7966f5eed9de')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='cf77e1dc-30bc-4df9-88be-408f1fddc24f')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='48f91745-22dc-47c9-ace6-c2719df651d6')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='18456aa7-62f0-4560-a7dc-4d7e01f6aca5')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='8ad237d7-f5e1-45e1-a4a2-a010628a4db9')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3e29173f-b950-4a41-a7f6-6cc0731bf477')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d4cdb21-a1b0-4011-9956-ca0b7a9f3bec')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='8427d3f0-9418-4b5c-aea9-7509e5959ce6')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='5ac91734-0323-464b-b04a-c7d3d7ff8cdf')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ab4a4e2-bce2-4ff8-be9d-f8ed2bb617cd')
    def test_traffic_screenoff_5g_DL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='a2c66d63-e93f-42aa-a021-0c6cdfdc87b8')
    def test_traffic_screenoff_5g_DL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='68e6f92a-ae15-4e76-81e7-a7b491e181fe')
    def test_traffic_screenoff_5g_DL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='258500f4-f177-43df-82a7-a64d66e90720')
    def test_traffic_screenoff_5g_UL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='a17c7d0b-58ca-47b5-9f32-0b7a3d7d3d9d')
    def test_traffic_screenoff_5g_UL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='c1c71639-4463-4999-8f5d-7d9153402c79')
    def test_traffic_screenon_2g_DL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='40daebc4-45a2-4299-b724-e8cb917b86e8')
    def test_traffic_screenon_5g_DL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='2e286f36-1a47-4895-a0e8-a161d6a9fd9f')
    def test_traffic_screenon_2g_UL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='9f6b52cb-b48a-4382-8061-3d3a511a261a')
    def test_traffic_screenon_5g_UL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='02891671-48cc-4186-9a95-3e02671477d0')
    def test_traffic_screenon_5g_DL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='02821540-7b08-4e4f-a1f1-b455fd4cec6e')
    def test_traffic_screenon_2g_UL_UDP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='59ea06ac-3ac8-4ecc-abb1-bcde34f47358')
    def test_traffic_screenon_2g_UL_UDP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='d84f11d8-41a9-4ce8-a351-ebb0379d56c1')
    def test_traffic_screenon_5g_UL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='01b6087c-b39a-441d-90e9-da659aa0db7f')
    def test_traffic_screenon_5g_UL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='7e16dcaa-128f-4874-ab52-2f43e25e6da8')
    def test_traffic_screenon_5g_UL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

<mask token>


class PowertrafficTest(base_test.BaseTestClass):

    def __init__(self, controllers):
        WifiBaseTest.__init__(self, controllers)

    def setup_class(self):
        self.log = logging.getLogger()
        self.dut = self.android_devices[0]
        req_params = ['traffictest_params', 'custom_files']
        self.unpack_userparams(req_params)
        self.unpack_testparams(self.traffictest_params)
        self.num_atten = self.attenuators[0].instrument.num_atten
        self.mon_data_path = os.path.join(self.log_path, 'Monsoon')
        self.mon_duration = self.iperf_duration - 10
        self.mon = self.monsoons[0]
        self.mon.set_max_current(8.0)
        self.mon.set_voltage(4.2)
        self.mon.attach_device(self.dut)
        self.mon_info = wputils.create_monsoon_info(self)
        self.iperf_server = self.iperf_servers[0]
        self.access_point = self.access_points[0]
        self.pkt_sender = self.packet_senders[0]
        for file in self.custom_files:
            if 'pass_fail_threshold' in file:
                self.threshold_file = file
            elif 'attenuator_setting' in file:
                self.attenuation_file = file
            elif 'network_config' in file:
                self.network_file = file
        self.threshold = wputils.unpack_custom_file(self.threshold_file,
            self.TAG)
        self.atten_level = wputils.unpack_custom_file(self.attenuation_file,
            self.TAG)
        self.networks = wputils.unpack_custom_file(self.network_file)
        self.main_network = self.networks['main_network']

    def teardown_test(self):
        """Tear down necessary objects after test case is finished.

        Bring down the AP interface, delete the bridge interface, stop IPERF
        server and reset the ethernet interface for iperf traffic
        """
        self.log.info('Tearing down the test case')
        self.iperf_server.stop()
        self.access_point.bridge.teardown(self.brconfigs)
        self.access_point.close()
        wputils.reset_host_interface(self.pkt_sender.interface)
        self.mon.usb('on')

    def teardown_class(self):
        """Clean up the test class after tests finish running

        """
        self.log.info('Tearing down the test class')
        self.mon.usb('on')
        self.access_point.close()

    def unpack_testparams(self, bulk_params):
        """Unpack all the test specific parameters.

        Args:
            bulk_params: dict with all test specific params in the config file
        """
        for key in bulk_params.keys():
            setattr(self, key, bulk_params[key])

    def iperf_power_test_func(self):
        """Test function for iperf power measurement at different RSSI level.

        Args:
            screen_status: screen ON or OFF
            band: desired band for AP to operate on
        """
        test_params = self.current_test_name.split('_')
        screen_status = test_params[2][6:]
        band = test_params[3]
        traffic_direction = test_params[4]
        traffic_type = test_params[5]
        signal_level = test_params[6][:-4]
        oper_mode = test_params[7]
        bandwidth = int(test_params[8])
        wputils.dut_rockbottom(self.dut)
        wutils.wifi_toggle_state(self.dut, True)
        network = self.main_network[band]
        self.brconfigs = wputils.ap_setup(self.access_point, network, bandwidth
            )
        iface_eth = self.pkt_sender.interface
        self.iperf_server_address = wputils.wait_for_dhcp(iface_eth)
        self.log.info('Set attenuation to desired RSSI level')
        atten_setting = band + '_' + signal_level
        for i in range(self.num_atten):
            attenuation = self.atten_level[atten_setting][i]
            self.attenuators[i].set_atten(attenuation)
        wutils.wifi_connect(self.dut, network)
        time.sleep(5)
        if screen_status == 'off':
            self.dut.droid.goToSleepNow()
        RSSI = wputils.get_wifi_rssi(self.dut)
        iperf_args = '-i 1 -t {} -p {} -J'.format(self.iperf_duration, self
            .iperf_server.port)
        if traffic_type == 'UDP':
            iperf_args = iperf_args + '-u -b 2g'
        if traffic_direction == 'DL':
            iperf_args = iperf_args + ' -R'
            use_client_output = True
        else:
            use_client_output = False
        iperf_args = iperf_args + ' > %s' % TEMP_FILE
        self.iperf_server.start()
        wputils.run_iperf_client_nonblocking(self.dut, self.
            iperf_server_address, iperf_args)
        begin_time = utils.get_current_epoch_time()
        file_path, avg_current = wputils.monsoon_data_collect_save(self.dut,
            self.mon_info, self.current_test_name)
        RESULTS_DESTINATION = os.path.join(self.iperf_server.log_path,
            'iperf_client_output_{}.log'.format(self.current_test_name))
        PULL_FILE = '{} {}'.format(TEMP_FILE, RESULTS_DESTINATION)
        self.dut.adb.pull(PULL_FILE)
        if use_client_output:
            iperf_file = RESULTS_DESTINATION
        else:
            iperf_file = self.iperf_server.log_files[-1]
        try:
            iperf_result = ipf.IPerfResult(iperf_file)
            throughput = math.fsum(iperf_result.instantaneous_rates[:-1]
                ) / len(iperf_result.instantaneous_rates[:-1]) * 8
            self.log.info('The average throughput is {}'.format(throughput))
        except:
            self.log.warning(
                'ValueError: Cannot get iperf result. Setting to 0')
            throughput = 0
        tag = '_RSSI_{0:d}dBm_Throughput_{1:.2f}Mbps'.format(RSSI, throughput)
        wputils.monsoon_data_plot(self.mon_info, file_path, tag)
        if bool(self.bug_report) == True:
            self.dut.take_bug_report(self.test_name, begin_time)
        wputils.pass_fail_check(self, avg_current)

    @test_tracker_info(uuid='93f79f74-88d9-4781-bff0-8899bed1c336')
    def test_traffic_screenoff_2g_DL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='147eff45-97d7-47c0-b306-f84d9adecd9b')
    def test_traffic_screenoff_2g_DL_TCP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='5982268b-57e4-40bf-848e-fee80fabf9d7')
    def test_traffic_screenoff_2g_DL_TCP_lowRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='c71a8c77-d355-4a82-b9f1-7cc8b888abd8')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='307945a6-32b7-42d0-a26c-d439f1599963')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='e9a900a1-e263-45ad-bdf3-9c463f761d3c')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1d1d9a06-98e1-486e-a1db-2102708161ec')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='feeaad15-6893-4d49-aaf6-bf9802780f5d')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='f378679a-1c20-43a1-bff6-a6a5482a8e3d')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='6a05f133-49e5-4436-ba84-0746f04021ef')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='750bf1c3-2099-4b89-97dd-18f8e72df462')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ea458af-1ae0-40ee-853d-ac57b51d3eda')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='43d9b146-3547-4a27-9d79-c9341c32ccda')
    def test_traffic_screenoff_2g_UL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='f00a868b-c8b1-4b36-8136-b39b5c2396a7')
    def test_traffic_screenoff_2g_UL_TCP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='cd0c37ac-23fe-4dd1-9130-ccb2dfa71020')
    def test_traffic_screenoff_2g_UL_TCP_lowRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='f9173d39-b46d-4d80-a5a5-7966f5eed9de')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='cf77e1dc-30bc-4df9-88be-408f1fddc24f')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='48f91745-22dc-47c9-ace6-c2719df651d6')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='18456aa7-62f0-4560-a7dc-4d7e01f6aca5')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='8ad237d7-f5e1-45e1-a4a2-a010628a4db9')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3e29173f-b950-4a41-a7f6-6cc0731bf477')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_40(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d4cdb21-a1b0-4011-9956-ca0b7a9f3bec')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='8427d3f0-9418-4b5c-aea9-7509e5959ce6')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='5ac91734-0323-464b-b04a-c7d3d7ff8cdf')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ab4a4e2-bce2-4ff8-be9d-f8ed2bb617cd')
    def test_traffic_screenoff_5g_DL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='a2c66d63-e93f-42aa-a021-0c6cdfdc87b8')
    def test_traffic_screenoff_5g_DL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='68e6f92a-ae15-4e76-81e7-a7b491e181fe')
    def test_traffic_screenoff_5g_DL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='258500f4-f177-43df-82a7-a64d66e90720')
    def test_traffic_screenoff_5g_UL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d2d3d45-575d-4080-86f9-b32a96963032')
    def test_traffic_screenoff_5g_UL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='a17c7d0b-58ca-47b5-9f32-0b7a3d7d3d9d')
    def test_traffic_screenoff_5g_UL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='c1c71639-4463-4999-8f5d-7d9153402c79')
    def test_traffic_screenon_2g_DL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='40daebc4-45a2-4299-b724-e8cb917b86e8')
    def test_traffic_screenon_5g_DL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='2e286f36-1a47-4895-a0e8-a161d6a9fd9f')
    def test_traffic_screenon_2g_UL_TCP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='9f6b52cb-b48a-4382-8061-3d3a511a261a')
    def test_traffic_screenon_5g_UL_TCP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()
    <mask token>

    @test_tracker_info(uuid='02891671-48cc-4186-9a95-3e02671477d0')
    def test_traffic_screenon_5g_DL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='02821540-7b08-4e4f-a1f1-b455fd4cec6e')
    def test_traffic_screenon_2g_UL_UDP_highRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='59ea06ac-3ac8-4ecc-abb1-bcde34f47358')
    def test_traffic_screenon_2g_UL_UDP_mediumRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='0cbbd849-7b59-4143-95e7-92cf1fd955dc')
    def test_traffic_screenon_2g_UL_UDP_lowRSSI_HT_20(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='d84f11d8-41a9-4ce8-a351-ebb0379d56c1')
    def test_traffic_screenon_5g_UL_UDP_highRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='01b6087c-b39a-441d-90e9-da659aa0db7f')
    def test_traffic_screenon_5g_UL_UDP_mediumRSSI_VHT_80(self):
        self.iperf_power_test_func()

    @test_tracker_info(uuid='7e16dcaa-128f-4874-ab52-2f43e25e6da8')
    def test_traffic_screenon_5g_UL_UDP_lowRSSI_VHT_80(self):
        self.iperf_power_test_func()

#!/usr/bin/env python3.4
#
#   Copyright 2017 - 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 logging
import math
import os
import time
from acts import base_test
from acts import utils
from acts.test_decorators import test_tracker_info
from acts.test_utils.wifi import wifi_test_utils as wutils
from acts.test_utils.wifi import wifi_power_test_utils as wputils
from acts.test_utils.wifi.WifiBaseTest import WifiBaseTest
import acts.controllers.iperf_server as ipf

TEMP_FILE = '/sdcard/Download/tmp.log'


class PowertrafficTest(base_test.BaseTestClass):
    def __init__(self, controllers):

        WifiBaseTest.__init__(self, controllers)

    def setup_class(self):

        self.log = logging.getLogger()
        self.dut = self.android_devices[0]
        req_params = ['traffictest_params', 'custom_files']
        self.unpack_userparams(req_params)
        self.unpack_testparams(self.traffictest_params)
        self.num_atten = self.attenuators[0].instrument.num_atten
        self.mon_data_path = os.path.join(self.log_path, 'Monsoon')
        self.mon_duration = self.iperf_duration - 10
        self.mon = self.monsoons[0]
        self.mon.set_max_current(8.0)
        self.mon.set_voltage(4.2)
        self.mon.attach_device(self.dut)
        self.mon_info = wputils.create_monsoon_info(self)
        self.iperf_server = self.iperf_servers[0]
        self.access_point = self.access_points[0]
        self.pkt_sender = self.packet_senders[0]
        for file in self.custom_files:
            if 'pass_fail_threshold' in file:
                self.threshold_file = file
            elif 'attenuator_setting' in file:
                self.attenuation_file = file
            elif 'network_config' in file:
                self.network_file = file
        self.threshold = wputils.unpack_custom_file(self.threshold_file,
                                                    self.TAG)
        self.atten_level = wputils.unpack_custom_file(self.attenuation_file,
                                                      self.TAG)
        self.networks = wputils.unpack_custom_file(self.network_file)
        self.main_network = self.networks['main_network']

    def teardown_test(self):
        """Tear down necessary objects after test case is finished.

        Bring down the AP interface, delete the bridge interface, stop IPERF
        server and reset the ethernet interface for iperf traffic
        """
        self.log.info('Tearing down the test case')
        self.iperf_server.stop()
        self.access_point.bridge.teardown(self.brconfigs)
        self.access_point.close()
        wputils.reset_host_interface(self.pkt_sender.interface)
        self.mon.usb('on')

    def teardown_class(self):
        """Clean up the test class after tests finish running

        """
        self.log.info('Tearing down the test class')
        self.mon.usb('on')
        self.access_point.close()

    def unpack_testparams(self, bulk_params):
        """Unpack all the test specific parameters.

        Args:
            bulk_params: dict with all test specific params in the config file
        """
        for key in bulk_params.keys():
            setattr(self, key, bulk_params[key])

    def iperf_power_test_func(self):
        """Test function for iperf power measurement at different RSSI level.

        Args:
            screen_status: screen ON or OFF
            band: desired band for AP to operate on
        """
        # Decode test parameters for the current test
        test_params = self.current_test_name.split('_')
        screen_status = test_params[2][6:]
        band = test_params[3]
        traffic_direction = test_params[4]
        traffic_type = test_params[5]
        signal_level = test_params[6][:-4]
        oper_mode = test_params[7]
        bandwidth = int(test_params[8])

        # Set device to rockbottom first
        wputils.dut_rockbottom(self.dut)
        wutils.wifi_toggle_state(self.dut, True)

        # Set up the AP
        network = self.main_network[band]
        self.brconfigs = wputils.ap_setup(self.access_point, network,
                                          bandwidth)

        # Wait for DHCP on the ethernet port and get IP as Iperf server address
        # Time out in 60 seconds if not getting DHCP address
        iface_eth = self.pkt_sender.interface
        self.iperf_server_address = wputils.wait_for_dhcp(iface_eth)

        # Set attenuator to desired level
        self.log.info('Set attenuation to desired RSSI level')
        atten_setting = band + '_' + signal_level
        for i in range(self.num_atten):
            attenuation = self.atten_level[atten_setting][i]
            self.attenuators[i].set_atten(attenuation)

        # Connect the phone to the AP
        wutils.wifi_connect(self.dut, network)
        time.sleep(5)
        if screen_status == 'off':
            self.dut.droid.goToSleepNow()
        RSSI = wputils.get_wifi_rssi(self.dut)

        # Construct the iperf command based on the test params
        iperf_args = '-i 1 -t {} -p {} -J'.format(self.iperf_duration,
                                                  self.iperf_server.port)
        if traffic_type == "UDP":
            iperf_args = iperf_args + "-u -b 2g"
        if traffic_direction == "DL":
            iperf_args = iperf_args + ' -R'
            use_client_output = True
        else:
            use_client_output = False
        # Parse the client side data to a file saved on the phone
        iperf_args = iperf_args + ' > %s' % TEMP_FILE

        # Run IPERF
        self.iperf_server.start()
        wputils.run_iperf_client_nonblocking(
            self.dut, self.iperf_server_address, iperf_args)

        # Collect power data and plot
        begin_time = utils.get_current_epoch_time()
        file_path, avg_current = wputils.monsoon_data_collect_save(
            self.dut, self.mon_info, self.current_test_name)

        # Get IPERF results
        RESULTS_DESTINATION = os.path.join(self.iperf_server.log_path,
                                           "iperf_client_output_{}.log".format(
                                               self.current_test_name))
        PULL_FILE = '{} {}'.format(TEMP_FILE, RESULTS_DESTINATION)
        self.dut.adb.pull(PULL_FILE)
        # Calculate the average throughput
        if use_client_output:
            iperf_file = RESULTS_DESTINATION
        else:
            iperf_file = self.iperf_server.log_files[-1]
        try:
            iperf_result = ipf.IPerfResult(iperf_file)
            throughput = (math.fsum(iperf_result.instantaneous_rates[:-1]) /
                          len(iperf_result.instantaneous_rates[:-1])) * 8
            self.log.info("The average throughput is {}".format(throughput))
        except:
            self.log.warning(
                "ValueError: Cannot get iperf result. Setting to 0")
            throughput = 0

        # Monsoon Power data plot with IPerf throughput information
        tag = '_RSSI_{0:d}dBm_Throughput_{1:.2f}Mbps'.format(RSSI, throughput)
        wputils.monsoon_data_plot(self.mon_info, file_path, tag)

        # Take Bugreport
        if bool(self.bug_report) == True:
            self.dut.take_bug_report(self.test_name, begin_time)
        # Pass and fail check
        wputils.pass_fail_check(self, avg_current)

    # Screen off TCP test cases
    @test_tracker_info(uuid='93f79f74-88d9-4781-bff0-8899bed1c336')
    def test_traffic_screenoff_2g_DL_TCP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='147eff45-97d7-47c0-b306-f84d9adecd9b')
    def test_traffic_screenoff_2g_DL_TCP_mediumRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='5982268b-57e4-40bf-848e-fee80fabf9d7')
    def test_traffic_screenoff_2g_DL_TCP_lowRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='c71a8c77-d355-4a82-b9f1-7cc8b888abd8')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='307945a6-32b7-42d0-a26c-d439f1599963')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='e9a900a1-e263-45ad-bdf3-9c463f761d3c')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='1d1d9a06-98e1-486e-a1db-2102708161ec')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='feeaad15-6893-4d49-aaf6-bf9802780f5d')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='f378679a-1c20-43a1-bff6-a6a5482a8e3d')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='6a05f133-49e5-4436-ba84-0746f04021ef')
    def test_traffic_screenoff_5g_DL_TCP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='750bf1c3-2099-4b89-97dd-18f8e72df462')
    def test_traffic_screenoff_5g_DL_TCP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='1ea458af-1ae0-40ee-853d-ac57b51d3eda')
    def test_traffic_screenoff_5g_DL_TCP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='43d9b146-3547-4a27-9d79-c9341c32ccda')
    def test_traffic_screenoff_2g_UL_TCP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='f00a868b-c8b1-4b36-8136-b39b5c2396a7')
    def test_traffic_screenoff_2g_UL_TCP_mediumRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='cd0c37ac-23fe-4dd1-9130-ccb2dfa71020')
    def test_traffic_screenoff_2g_UL_TCP_lowRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='f9173d39-b46d-4d80-a5a5-7966f5eed9de')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='cf77e1dc-30bc-4df9-88be-408f1fddc24f')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='48f91745-22dc-47c9-ace6-c2719df651d6')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='18456aa7-62f0-4560-a7dc-4d7e01f6aca5')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='8ad237d7-f5e1-45e1-a4a2-a010628a4db9')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='3e29173f-b950-4a41-a7f6-6cc0731bf477')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_40(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d4cdb21-a1b0-4011-9956-ca0b7a9f3bec')
    def test_traffic_screenoff_5g_UL_TCP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='8427d3f0-9418-4b5c-aea9-7509e5959ce6')
    def test_traffic_screenoff_5g_UL_TCP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='5ac91734-0323-464b-b04a-c7d3d7ff8cdf')
    def test_traffic_screenoff_5g_UL_TCP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

    # Screen off UDP tests - only check 5g VHT 80
    @test_tracker_info(uuid='1ab4a4e2-bce2-4ff8-be9d-f8ed2bb617cd')
    def test_traffic_screenoff_5g_DL_UDP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='a2c66d63-e93f-42aa-a021-0c6cdfdc87b8')
    def test_traffic_screenoff_5g_DL_UDP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='68e6f92a-ae15-4e76-81e7-a7b491e181fe')
    def test_traffic_screenoff_5g_DL_UDP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='258500f4-f177-43df-82a7-a64d66e90720')
    def test_traffic_screenoff_5g_UL_UDP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='3d2d3d45-575d-4080-86f9-b32a96963032')
    def test_traffic_screenoff_5g_UL_UDP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='a17c7d0b-58ca-47b5-9f32-0b7a3d7d3d9d')
    def test_traffic_screenoff_5g_UL_UDP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()

    # Screen on point check
    @test_tracker_info(uuid='c1c71639-4463-4999-8f5d-7d9153402c79')
    def test_traffic_screenon_2g_DL_TCP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='40daebc4-45a2-4299-b724-e8cb917b86e8')
    def test_traffic_screenon_5g_DL_TCP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='2e286f36-1a47-4895-a0e8-a161d6a9fd9f')
    def test_traffic_screenon_2g_UL_TCP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='9f6b52cb-b48a-4382-8061-3d3a511a261a')
    def test_traffic_screenon_5g_UL_TCP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='59d79274-15cf-446b-a567-655c07f8a778')
    def test_traffic_screenon_2g_DL_UDP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='02891671-48cc-4186-9a95-3e02671477d0')
    def test_traffic_screenon_5g_DL_UDP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='02821540-7b08-4e4f-a1f1-b455fd4cec6e')
    def test_traffic_screenon_2g_UL_UDP_highRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='59ea06ac-3ac8-4ecc-abb1-bcde34f47358')
    def test_traffic_screenon_2g_UL_UDP_mediumRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='0cbbd849-7b59-4143-95e7-92cf1fd955dc')
    def test_traffic_screenon_2g_UL_UDP_lowRSSI_HT_20(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='d84f11d8-41a9-4ce8-a351-ebb0379d56c1')
    def test_traffic_screenon_5g_UL_UDP_highRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='01b6087c-b39a-441d-90e9-da659aa0db7f')
    def test_traffic_screenon_5g_UL_UDP_mediumRSSI_VHT_80(self):

        self.iperf_power_test_func()

    @test_tracker_info(uuid='7e16dcaa-128f-4874-ab52-2f43e25e6da8')
    def test_traffic_screenon_5g_UL_UDP_lowRSSI_VHT_80(self):

        self.iperf_power_test_func()
