#/usr/bin/env python3.4
#
# Copyright 2016 - 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.
"""
Sanity tests for voice tests in telephony
"""
import time, os
from acts.test_utils.tel.anritsu_utils import make_ims_call
from acts.test_utils.tel.anritsu_utils import tear_down_call
from acts.test_utils.tel.tel_test_utils import iperf_test_by_adb
from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts.test_utils.tel.TelephonyLabPowerTest import TelephonyLabPowerTest
from acts.utils import adb_shell_ping
from acts.controllers import iperf_server
from acts.utils import exe_cmd
import json
DEFAULT_PING_DURATION = 10
IPERF_DURATION = 30
IPERF_LOG_FILE_PATH = "/sdcard/iperf.txt"
DEFAULT_CALL_NUMBER = "+11234567891"
WAIT_TIME_VOLTE = 5
class TelLabPowerDataTest(TelephonyLabPowerTest):
# TODO Keep if we want to add more in here for this class.
def __init__(self, controllers):
TelephonyLabPowerTest.__init__(self, controllers)
self.ip_server = self.iperf_servers[0]
self.port_num = self.ip_server.port
self.log.info("Iperf Port is %s", self.port_num)
self.log.info("End of __init__ class of TelLabPowerDataTest")
# May not need
def teardown_class(self):
# Always take down the simulation
TelephonyLabPowerTest.teardown_class(self)
def iperf_setup(self):
# Fetch IP address of the host machine
cmd = "|".join(("ifconfig", "grep eth0 -A1", "grep inet",
"cut -d ':' -f2", "cut -d ' ' -f 1"))
destination_ip = exe_cmd(cmd)
destination_ip = (destination_ip.decode("utf-8")).split("\n")[0]
self.log.info("Dest IP is %s", destination_ip)
time.sleep(1)
if not adb_shell_ping(
self.ad, DEFAULT_PING_DURATION, destination_ip,
loss_tolerance=95):
self.log.error("Pings failed to Destination.")
return False
return destination_ip
def _iperf_task(self, destination_ip, duration):
self.log.info("Starting iPerf task")
self.ip_server.start()
tput_dict = {"Uplink": 0, "Downlink": 0}
if iperf_test_by_adb(
self.log,
self.ad,
destination_ip,
self.port_num,
True, # reverse
duration,
rate_dict=tput_dict,
blocking=False,
log_file_path=IPERF_LOG_FILE_PATH):
return True
else:
self.log.error("iperf failed to Destination.")
self.ip_server.stop()
return False
def power_iperf_test(self, olvl, rflvl, sch_mode="DYNAMIC", volte=False):
if volte:
# make a VoLTE MO call
self.log.info("DEFAULT_CALL_NUMBER = " + DEFAULT_CALL_NUMBER)
if not make_ims_call(self.log, self.ad, self.anritsu,
DEFAULT_CALL_NUMBER):
self.log.error("Phone {} Failed to make volte call to {}"
.format(self.ad.serial, DEFAULT_CALL_NUMBER))
return False
self.log.info("wait for %d seconds" % WAIT_TIME_VOLTE)
time.sleep(WAIT_TIME_VOLTE)
server_ip = self.iperf_setup()
if not server_ip:
self.log.error("iperf server can not be reached by ping")
return False
self._iperf_task(server_ip, IPERF_DURATION)
self.log.info("Wait for 10 secconds before power measurement")
time.sleep(10)
self.power_test(olvl, rflvl, sch_mode)
result = self.ad.adb.shell("cat {}".format(IPERF_LOG_FILE_PATH))
if result is not None:
data_json = json.loads(''.join(result))
rx_rate = data_json['end']['sum_received']['bits_per_second']
xfer_time = data_json['end']['sum_received']['seconds']
self.ad.log.info('iPerf3 transfer time was %ssecs', xfer_time)
self.ad.log.info('iPerf3 download speed is %sbps', rx_rate)
if volte:
# check if the phone is still in call, then tear it down
if not self.ad.droid.telecomIsInCall():
self.log.error("Call is already ended in the phone.")
return False
if not tear_down_call(self.log, self.ad, self.anritsu):
self.log.error("Phone {} Failed to tear down VoLTE call"
.format(self.ad.serial))
return False
return True
""" Tests Begin """
@TelephonyBaseTest.tel_test_wrap
def test_data_power_n30_n30(self):
""" Test power consumption for iPerf data @ DL/UL -30/-30dBm
Steps:
1. Assume UE already in Communication mode.
2. Initiate iPerf data transfer.
3. Set DL/UL power and Dynamic scheduling.
4. Measure power consumption.
Expected Results:
1. power consumption measurement is successful
2. measurement results is saved accordingly
Returns:
True if pass; False if fail
"""
return self.power_iperf_test(-30, -30)
@TelephonyBaseTest.tel_test_wrap
def test_data_power_n50_n10(self):
""" Test power consumption for iPerf data @ DL/UL -50/-10dBm
Steps:
1. Assume UE already in Communication mode.
2. Initiate iPerf data transfer.
3. Set DL/UL power and Dynamic scheduling.
4. Measure power consumption.
Expected Results:
1. power consumption measurement is successful
2. measurement results is saved accordingly
Returns:
True if pass; False if fail
"""
return self.power_iperf_test(-50, -10)
@TelephonyBaseTest.tel_test_wrap
def test_data_power_n70_10(self):
""" Test power consumption for iPerf data @ DL/UL -70/+10dBm
Steps:
1. Assume UE already in Communication mode.
2. Initiate iPerf data transfer.
3. Set DL/UL power and Dynamic scheduling.
4. Measure power consumption.
Expected Results:
1. power consumption measurement is successful
2. measurement results is saved accordingly
Returns:
True if pass; False if fail
"""
return self.power_iperf_test(-70, 10)
@TelephonyBaseTest.tel_test_wrap
def test_data_volte_power_n30_n30(self):
""" Test power consumption for iPerf data and volte @ DL/UL -30/-30dBm
Steps:
1. Assume UE already in Communication mode.
2. Make MO VoLTE call.
3. Initiate iPerf data transfer.
4. Set DL/UL power and Dynamic scheduling.
5. Measure power consumption.
Expected Results:
1. power consumption measurement is successful
2. measurement results is saved accordingly
Returns:
True if pass; False if fail
"""
return self.power_iperf_test(-30, -30, volte=True)
@TelephonyBaseTest.tel_test_wrap
def test_data_volte_power_n50_n10(self):
""" Test power consumption for iPerf data and volte @ DL/UL -50/-10dBm
Steps:
1. Assume UE already in Communication mode.
2. Make MO VoLTE call.
3. Initiate iPerf data transfer.
4. Set DL/UL power and Dynamic scheduling.
5. Measure power consumption.
Expected Results:
1. power consumption measurement is successful
2. measurement results is saved accordingly
Returns:
True if pass; False if fail
"""
return self.power_iperf_test(-50, -10, volte=True)
@TelephonyBaseTest.tel_test_wrap
def test_data_volte_power_n70_10(self):
""" Test power consumption for iPerf data and volte @ DL/UL -70/+10dBm
Steps:
1. Assume UE already in Communication mode.
2. Make MO VoLTE call.
3. Initiate iPerf data transfer.
4. Set DL/UL power and Dynamic scheduling.
5. Measure power consumption.
Expected Results:
1. power consumption measurement is successful
2. measurement results is saved accordingly
Returns:
True if pass; False if fail
"""
return self.power_iperf_test(-70, 10, volte=True)
""" Tests End """