Home | History | Annotate | Download | only in lab
      1 #/usr/bin/env python3.4
      2 #
      3 #   Copyright 2016 - The Android Open Source Project
      4 #
      5 #   Licensed under the Apache License, Version 2.0 (the "License");
      6 #   you may not use this file except in compliance with the License.
      7 #   You may obtain a copy of the License at
      8 #
      9 #       http://www.apache.org/licenses/LICENSE-2.0
     10 #
     11 #   Unless required by applicable law or agreed to in writing, software
     12 #   distributed under the License is distributed on an "AS IS" BASIS,
     13 #   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 #   See the License for the specific language governing permissions and
     15 #   limitations under the License.
     16 """
     17 Sanity tests for voice tests in telephony
     18 """
     19 import time, os
     20 
     21 from acts.test_utils.tel.anritsu_utils import make_ims_call
     22 from acts.test_utils.tel.anritsu_utils import tear_down_call
     23 from acts.test_utils.tel.tel_test_utils import iperf_test_by_adb
     24 from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
     25 from acts.test_utils.tel.TelephonyLabPowerTest import TelephonyLabPowerTest
     26 from acts.utils import adb_shell_ping
     27 from acts.controllers import iperf_server
     28 from acts.utils import exe_cmd
     29 import json
     30 
     31 DEFAULT_PING_DURATION = 10
     32 IPERF_DURATION = 30
     33 IPERF_LOG_FILE_PATH = "/sdcard/iperf.txt"
     34 
     35 DEFAULT_CALL_NUMBER = "+11234567891"
     36 WAIT_TIME_VOLTE = 5
     37 
     38 
     39 class TelLabPowerDataTest(TelephonyLabPowerTest):
     40     # TODO Keep if we want to add more in here for this class.
     41     def __init__(self, controllers):
     42         TelephonyLabPowerTest.__init__(self, controllers)
     43         self.ip_server = self.iperf_servers[0]
     44         self.port_num = self.ip_server.port
     45         self.log.info("Iperf Port is %s", self.port_num)
     46         self.log.info("End of __init__ class of TelLabPowerDataTest")
     47 
     48     # May not need
     49     def teardown_class(self):
     50         # Always take down the simulation
     51         TelephonyLabPowerTest.teardown_class(self)
     52 
     53     def iperf_setup(self):
     54         # Fetch IP address of the host machine
     55         cmd = "|".join(("ifconfig", "grep eth0 -A1", "grep inet",
     56                         "cut -d ':' -f2", "cut -d ' ' -f 1"))
     57         destination_ip = exe_cmd(cmd)
     58         destination_ip = (destination_ip.decode("utf-8")).split("\n")[0]
     59         self.log.info("Dest IP is %s", destination_ip)
     60         time.sleep(1)
     61         if not adb_shell_ping(
     62                 self.ad, DEFAULT_PING_DURATION, destination_ip,
     63                 loss_tolerance=95):
     64             self.log.error("Pings failed to Destination.")
     65             return False
     66 
     67         return destination_ip
     68 
     69     def _iperf_task(self, destination_ip, duration):
     70         self.log.info("Starting iPerf task")
     71         self.ip_server.start()
     72         tput_dict = {"Uplink": 0, "Downlink": 0}
     73         if iperf_test_by_adb(
     74                 self.log,
     75                 self.ad,
     76                 destination_ip,
     77                 self.port_num,
     78                 True,  # reverse
     79                 duration,
     80                 rate_dict=tput_dict,
     81                 blocking=False,
     82                 log_file_path=IPERF_LOG_FILE_PATH):
     83             return True
     84         else:
     85             self.log.error("iperf failed to Destination.")
     86             self.ip_server.stop()
     87             return False
     88 
     89     def power_iperf_test(self, olvl, rflvl, sch_mode="DYNAMIC", volte=False):
     90         if volte:
     91             # make a VoLTE MO call
     92             self.log.info("DEFAULT_CALL_NUMBER = " + DEFAULT_CALL_NUMBER)
     93             if not make_ims_call(self.log, self.ad, self.anritsu,
     94                                  DEFAULT_CALL_NUMBER):
     95                 self.log.error("Phone {} Failed to make volte call to {}"
     96                                .format(self.ad.serial, DEFAULT_CALL_NUMBER))
     97                 return False
     98             self.log.info("wait for %d seconds" % WAIT_TIME_VOLTE)
     99             time.sleep(WAIT_TIME_VOLTE)
    100 
    101         server_ip = self.iperf_setup()
    102         if not server_ip:
    103             self.log.error("iperf server can not be reached by ping")
    104             return False
    105 
    106         self._iperf_task(server_ip, IPERF_DURATION)
    107         self.log.info("Wait for 10 secconds before power measurement")
    108         time.sleep(10)
    109         self.power_test(olvl, rflvl, sch_mode)
    110 
    111         result = self.ad.adb.shell("cat {}".format(IPERF_LOG_FILE_PATH))
    112         if result is not None:
    113             data_json = json.loads(''.join(result))
    114             rx_rate = data_json['end']['sum_received']['bits_per_second']
    115             xfer_time = data_json['end']['sum_received']['seconds']
    116             self.ad.log.info('iPerf3 transfer time was %ssecs', xfer_time)
    117             self.ad.log.info('iPerf3 download speed is %sbps', rx_rate)
    118 
    119         if volte:
    120             # check if the phone is still in call, then tear it down
    121             if not self.ad.droid.telecomIsInCall():
    122                 self.log.error("Call is already ended in the phone.")
    123                 return False
    124             if not tear_down_call(self.log, self.ad, self.anritsu):
    125                 self.log.error("Phone {} Failed to tear down VoLTE call"
    126                                .format(self.ad.serial))
    127                 return False
    128 
    129         return True
    130 
    131     """ Tests Begin """
    132 
    133     @TelephonyBaseTest.tel_test_wrap
    134     def test_data_power_n30_n30(self):
    135         """ Test power consumption for iPerf data @ DL/UL -30/-30dBm
    136         Steps:
    137         1. Assume UE already in Communication mode.
    138         2. Initiate iPerf data transfer.
    139         3. Set DL/UL power and Dynamic scheduling.
    140         4. Measure power consumption.
    141 
    142         Expected Results:
    143         1. power consumption measurement is successful
    144         2. measurement results is saved accordingly
    145 
    146         Returns:
    147             True if pass; False if fail
    148         """
    149         return self.power_iperf_test(-30, -30)
    150 
    151     @TelephonyBaseTest.tel_test_wrap
    152     def test_data_power_n50_n10(self):
    153         """ Test power consumption for iPerf data @ DL/UL -50/-10dBm
    154         Steps:
    155         1. Assume UE already in Communication mode.
    156         2. Initiate iPerf data transfer.
    157         3. Set DL/UL power and Dynamic scheduling.
    158         4. Measure power consumption.
    159 
    160         Expected Results:
    161         1. power consumption measurement is successful
    162         2. measurement results is saved accordingly
    163 
    164         Returns:
    165             True if pass; False if fail
    166         """
    167         return self.power_iperf_test(-50, -10)
    168 
    169     @TelephonyBaseTest.tel_test_wrap
    170     def test_data_power_n70_10(self):
    171         """ Test power consumption for iPerf data @ DL/UL -70/+10dBm
    172         Steps:
    173         1. Assume UE already in Communication mode.
    174         2. Initiate iPerf data transfer.
    175         3. Set DL/UL power and Dynamic scheduling.
    176         4. Measure power consumption.
    177 
    178         Expected Results:
    179         1. power consumption measurement is successful
    180         2. measurement results is saved accordingly
    181 
    182         Returns:
    183             True if pass; False if fail
    184         """
    185         return self.power_iperf_test(-70, 10)
    186 
    187     @TelephonyBaseTest.tel_test_wrap
    188     def test_data_volte_power_n30_n30(self):
    189         """ Test power consumption for iPerf data and volte @ DL/UL -30/-30dBm
    190         Steps:
    191         1. Assume UE already in Communication mode.
    192         2. Make MO VoLTE call.
    193         3. Initiate iPerf data transfer.
    194         4. Set DL/UL power and Dynamic scheduling.
    195         5. Measure power consumption.
    196 
    197         Expected Results:
    198         1. power consumption measurement is successful
    199         2. measurement results is saved accordingly
    200 
    201         Returns:
    202             True if pass; False if fail
    203         """
    204         return self.power_iperf_test(-30, -30, volte=True)
    205 
    206     @TelephonyBaseTest.tel_test_wrap
    207     def test_data_volte_power_n50_n10(self):
    208         """ Test power consumption for iPerf data and volte @ DL/UL -50/-10dBm
    209         Steps:
    210         1. Assume UE already in Communication mode.
    211         2. Make MO VoLTE call.
    212         3. Initiate iPerf data transfer.
    213         4. Set DL/UL power and Dynamic scheduling.
    214         5. Measure power consumption.
    215 
    216         Expected Results:
    217         1. power consumption measurement is successful
    218         2. measurement results is saved accordingly
    219 
    220         Returns:
    221             True if pass; False if fail
    222         """
    223         return self.power_iperf_test(-50, -10, volte=True)
    224 
    225     @TelephonyBaseTest.tel_test_wrap
    226     def test_data_volte_power_n70_10(self):
    227         """ Test power consumption for iPerf data and volte @ DL/UL -70/+10dBm
    228         Steps:
    229         1. Assume UE already in Communication mode.
    230         2. Make MO VoLTE call.
    231         3. Initiate iPerf data transfer.
    232         4. Set DL/UL power and Dynamic scheduling.
    233         5. Measure power consumption.
    234 
    235         Expected Results:
    236         1. power consumption measurement is successful
    237         2. measurement results is saved accordingly
    238 
    239         Returns:
    240             True if pass; False if fail
    241         """
    242         return self.power_iperf_test(-70, 10, volte=True)
    243 
    244     """ Tests End """
    245