blob: 1a6be2ad9dcee0f1844ed58a86126c508f3f7f3d [file] [log] [blame]
#!/usr/bin/env python3.4
#
# Copyright 2022 - Google
#
# 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.
"""
Test Script for 5G Data scenarios
"""
import time
from acts.test_decorators import test_tracker_info
from acts_contrib.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
from acts_contrib.test_utils.tel.tel_defines import GEN_5G
from acts_contrib.test_utils.tel.tel_defines import MAX_WAIT_TIME_USER_PLANE_DATA
from acts_contrib.test_utils.tel.tel_defines import NETWORK_MODE_NR_LTE_GSM_WCDMA
from acts_contrib.test_utils.tel.tel_defines import NetworkCallbackCapabilitiesChanged
from acts_contrib.test_utils.tel.tel_defines import WAIT_TIME_ANDROID_STATE_SETTLING
from acts_contrib.test_utils.tel.tel_data_utils import browsing_test
from acts_contrib.test_utils.tel.tel_data_utils import check_data_stall_detection
from acts_contrib.test_utils.tel.tel_data_utils import check_data_stall_recovery
from acts_contrib.test_utils.tel.tel_data_utils import check_network_validation_fail
from acts_contrib.test_utils.tel.tel_data_utils import data_connectivity_single_bearer
from acts_contrib.test_utils.tel.tel_data_utils import test_data_connectivity_multi_bearer
from acts_contrib.test_utils.tel.tel_data_utils import test_wifi_connect_disconnect
from acts_contrib.test_utils.tel.tel_data_utils import verify_for_network_callback
from acts_contrib.test_utils.tel.tel_data_utils import wifi_cell_switching
from acts_contrib.test_utils.tel.tel_data_utils import airplane_mode_test
from acts_contrib.test_utils.tel.tel_data_utils import reboot_test
from acts_contrib.test_utils.tel.tel_5g_utils import is_current_network_5g
from acts_contrib.test_utils.tel.tel_5g_test_utils import provision_device_for_5g
from acts_contrib.test_utils.tel.tel_phone_setup_utils import phone_setup_volte
from acts_contrib.test_utils.tel.tel_test_utils import break_internet_except_sl4a_port
from acts_contrib.test_utils.tel.tel_test_utils import get_current_override_network_type
from acts_contrib.test_utils.tel.tel_test_utils import get_device_epoch_time
from acts_contrib.test_utils.tel.tel_test_utils import iperf_test_by_adb
from acts_contrib.test_utils.tel.tel_test_utils import iperf_udp_test_by_adb
from acts_contrib.test_utils.tel.tel_test_utils import resume_internet_with_sl4a_port
from acts_contrib.test_utils.tel.tel_test_utils import set_preferred_network_mode_pref
from acts_contrib.test_utils.tel.tel_test_utils import test_data_browsing_failure_using_sl4a
from acts_contrib.test_utils.tel.tel_test_utils import test_data_browsing_success_using_sl4a
from acts_contrib.test_utils.tel.tel_test_utils import toggle_airplane_mode
from acts_contrib.test_utils.tel.tel_test_utils import verify_internet_connection
from acts_contrib.test_utils.tel.tel_wifi_utils import ensure_wifi_connected
from acts_contrib.test_utils.tel.tel_wifi_utils import wifi_reset
from acts_contrib.test_utils.tel.tel_wifi_utils import wifi_toggle_state
class Nsa5gDataTest(TelephonyBaseTest):
def setup_class(self):
super().setup_class()
self.iperf_server_ip = self.user_params.get("iperf_server", '0.0.0.0')
self.iperf_tcp_port = int(
self.user_params.get("iperf_tcp_port", 0))
self.iperf_udp_port = int(
self.user_params.get("iperf_udp_port", 0))
self.iperf_duration = int(
self.user_params.get("iperf_duration", 60))
def setup_test(self):
TelephonyBaseTest.setup_test(self)
self.provider = self.android_devices[0]
self.clients = self.android_devices[1:]
def teardown_class(self):
TelephonyBaseTest.teardown_class(self)
""" Tests Begin """
@test_tracker_info(uuid="a73b749f-746c-4089-a8ad-4e47aed180f6")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_data_browsing(self):
""" Verifying connectivity of internet and browsing websites on 5G NSA network.
Ensure
1. ping to IP of websites is successful.
2. http ping to IP of websites is successful.
3. browsing websites is successful.
Returns:
True if pass; False if fail.
"""
ad = self.android_devices[0]
wifi_toggle_state(ad.log, ad, False)
sub_id = ad.droid.subscriptionGetDefaultSubId()
if not set_preferred_network_mode_pref(ad.log, ad, sub_id,
NETWORK_MODE_NR_LTE_GSM_WCDMA):
ad.log.error("Failed to set network mode to NSA")
return False
ad.log.info("Set network mode to NSA successfully")
ad.log.info("Waiting for 5g NSA attach for 60 secs")
if is_current_network_5g(ad, nr_type = 'nsa', timeout=60):
ad.log.info("Success! attached on 5g NSA")
else:
ad.log.error("Failure - expected NR_NSA, current %s",
get_current_override_network_type(ad))
# Can't attach 5g NSA, exit test!
return False
for iteration in range(3):
connectivity = False
browsing = False
ad.log.info("Attempt %d", iteration + 1)
if not verify_internet_connection(self.log, ad):
ad.log.error("Failed to connect to internet!")
else:
ad.log.info("Connect to internet successfully!")
connectivity = True
if not browsing_test(ad.log, ad):
ad.log.error("Failed to browse websites!")
else:
ad.log.info("Successful to browse websites!")
browsing = True
if connectivity and browsing:
return True
time.sleep(WAIT_TIME_ANDROID_STATE_SETTLING)
ad.log.error("5G NSA Connectivity and Data Browsing test FAIL for all 3 iterations")
return False
@test_tracker_info(uuid="c7727c26-b588-461f-851b-802bfa3a86af")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_data_stall_recovery(self):
""" Verifies 5G NSA data stall
Set Mode to 5G
Wait for 5G attached on NSA
Browse websites for success
Trigger data stall and verify browsing fails
Resume data and verify browsing success
Returns:
True if pass; False if fail.
"""
ad = self.android_devices[0]
result = True
wifi_toggle_state(ad.log, ad, False)
toggle_airplane_mode(ad.log, ad, False)
if not provision_device_for_5g(ad.log, ad, nr_type='nsa'):
return False
cmd = ('ss -l -p -n | grep "tcp.*droid_script" | tr -s " " '
'| cut -d " " -f 5 | sed s/.*://g')
sl4a_port = ad.adb.shell(cmd)
if not test_data_browsing_success_using_sl4a(ad.log, ad):
ad.log.error("Browsing failed before the test, aborting!")
return False
begin_time = get_device_epoch_time(ad)
break_internet_except_sl4a_port(ad, sl4a_port)
if not test_data_browsing_failure_using_sl4a(ad.log, ad):
ad.log.error("Browsing after breaking the internet, aborting!")
result = False
if not check_data_stall_detection(ad):
ad.log.warning("NetworkMonitor unable to detect Data Stall")
if not check_network_validation_fail(ad, begin_time):
ad.log.warning("Unable to detect NW validation fail")
if not check_data_stall_recovery(ad, begin_time):
ad.log.error("Recovery was not triggered")
result = False
resume_internet_with_sl4a_port(ad, sl4a_port)
time.sleep(MAX_WAIT_TIME_USER_PLANE_DATA)
if not test_data_browsing_success_using_sl4a(ad.log, ad):
ad.log.error("Browsing failed after resuming internet")
result = False
if result:
ad.log.info("PASS - data stall over 5G NSA")
else:
ad.log.error("FAIL - data stall over 5G NSA")
return result
@test_tracker_info(uuid="bb823c3e-d84e-44b5-a9b4-89f65ab2d02c")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_metered_cellular(self):
""" Verifies 5G Meteredness API
Set Mode to 5G
Wait for 5G attached on NSA
Register for Connectivity callback
Verify value of metered flag
Returns:
True if pass; False if fail.
"""
ad = self.android_devices[0]
try:
wifi_toggle_state(ad.log, ad, False)
toggle_airplane_mode(ad.log, ad, False)
if not provision_device_for_5g(ad.log, ad, nr_type='nsa'):
return False
return verify_for_network_callback(ad.log, ad,
NetworkCallbackCapabilitiesChanged, apm_mode=False)
except Exception as e:
ad.log.error(e)
return False
@test_tracker_info(uuid="192a605c-d7a9-4c34-800a-96a7d3177d7b")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_metered_wifi(self):
""" Verifies 5G Meteredness API
Set Mode to 5G, Wifi Connected
Register for Connectivity callback
Verify value of metered flag
Returns:
True if pass; False if fail.
"""
ad = self.android_devices[0]
try:
toggle_airplane_mode(ad.log, ad, False)
if not provision_device_for_5g(ad.log, ad, nr_type='nsa'):
return False
wifi_toggle_state(ad.log, ad, True)
if not ensure_wifi_connected(ad.log, ad,
self.wifi_network_ssid,
self.wifi_network_pass):
ad.log.error("WiFi connect fail.")
return False
return verify_for_network_callback(ad.log, ad,
NetworkCallbackCapabilitiesChanged)
except Exception as e:
ad.log.error(e)
return False
finally:
wifi_toggle_state(ad.log, ad, False)
@test_tracker_info(uuid="be0c110d-52d4-4af8-bf1c-96c4807d1f07")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_udp_throughput(self):
""" Verifies UDP DL throughput over 5G
Set Mode to 5G, Wifi Disconnected
Verify device attached to 5G NSA
Perform iperf test using UDP and measure throughput
Returns:
True if pass; False if fail.
"""
ad = self.android_devices[0]
try:
toggle_airplane_mode(ad.log, ad, False)
if not provision_device_for_5g(ad.log, ad, nr_type='nsa'):
return False
wifi_toggle_state(ad.log, ad, False)
return iperf_udp_test_by_adb(ad.log,
ad,
self.iperf_server_ip,
self.iperf_udp_port,
True,
self.iperf_duration)
except Exception as e:
ad.log.error(e)
return False
@test_tracker_info(uuid="47b87533-dc33-4c27-95ff-0b5316e6a193")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_tcp_throughput(self):
""" Verifies TCP DL throughput over 5G
Set Mode to 5G, Wifi Disconnected
Verify device attached to 5G NSA
Perform iperf test using TCP and measure throughput
Returns:
True if pass; False if fail.
"""
ad = self.android_devices[0]
try:
toggle_airplane_mode(ad.log, ad, False)
if not provision_device_for_5g(ad.log, ad, nr_type='nsa'):
return False
wifi_toggle_state(ad.log, ad, False)
return iperf_test_by_adb(ad.log,
ad,
self.iperf_server_ip,
self.iperf_tcp_port,
True,
self.iperf_duration)
except Exception as e:
ad.log.error(e)
return False
@test_tracker_info(uuid="79393af4-cbc1-4d00-8e02-fe76e8b28367")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_bursty_data(self):
""" Verifies Bursty data transfer over 5G
Set Mode to 5G, Wifi Disconnected
Verify device attached to 5G NSA
Perform iperf test using burst of data
Returns:
True if pass; False if fail.
"""
ad = self.android_devices[0]
try:
toggle_airplane_mode(ad.log, ad, False)
if not provision_device_for_5g(ad.log, ad, nr_type='nsa'):
return False
wifi_toggle_state(ad.log, ad, False)
return iperf_udp_test_by_adb(ad.log,
ad,
self.iperf_server_ip,
self.iperf_udp_port,
True,
self.iperf_duration,
limit_rate="10M",
pacing_timer="1000000")
except Exception as e:
ad.log.error(e)
return False
@test_tracker_info(uuid="7179f0f1-f0ca-4496-8f4a-7eebc616a41a")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_wifi_switching(self):
"""Test data connection network switching when phone camped on nsa 5G.
Ensure phone is camped on nsa 5G
Ensure WiFi can connect to live network,
Airplane mode is off, data connection is on, WiFi is on.
Turn off WiFi, verify data is on cell and browse to google.com is OK.
Turn on WiFi, verify data is on WiFi and browse to google.com is OK.
Turn off WiFi, verify data is on cell and browse to google.com is OK.
Returns:
True if pass.
"""
ad = self.android_devices[0]
return wifi_cell_switching(ad.log, ad, GEN_5G, self.wifi_network_ssid,
self.wifi_network_pass, nr_type='nsa')
@test_tracker_info(uuid="75066e0a-0e2e-4346-a253-6ed11d1c4d23")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_multi_bearer(self):
"""Test nsa5G data connection before call and in call. (VoLTE call)
Turn off airplane mode, disable WiFi, enable Cellular Data.
Make sure phone in nsa5G, verify Internet.
Initiate a voice call. verify Internet.
Disable Cellular Data, verify Internet is inaccessible.
Enable Cellular Data, verify Internet.
Hangup Voice Call, verify Internet.
Returns:
True if success.
False if failed.
"""
ads = self.android_devices
if not phone_setup_volte(ads[0].log, ads[0]):
ads[0].log.error("Failed to setup VoLTE")
return False
return test_data_connectivity_multi_bearer(self.log, ads, GEN_5G, nr_type='nsa')
@test_tracker_info(uuid="e88b226e-3842-4c45-a33e-d4fee7d8f6f0")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_data_connectivity(self):
"""Test data connection in nsa5g.
Turn off airplane mode, disable WiFi, enable Cellular Data.
Ensure phone data generation is nsa 5g.
Verify Internet.
Disable Cellular Data, verify Internet is inaccessible.
Enable Cellular Data, verify Internet.
Returns:
True if success.
False if failed.
"""
ad = self.android_devices[0]
wifi_reset(ad.log, ad)
wifi_toggle_state(ad.log, ad, False)
return data_connectivity_single_bearer(ad.log, ad, GEN_5G, nr_type='nsa')
@test_tracker_info(uuid="4c70e09d-f215-4c5b-8c61-f9e9def43d30")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_wifi_not_associated(self):
"""Test data connection in nsa 5g.
Turn off airplane mode, enable WiFi (but not connected), enable Cellular Data.
Ensure phone data generation is nsa 5g.
Verify Internet.
Disable Cellular Data, verify Internet is inaccessible.
Enable Cellular Data, verify Internet.
Returns:
True if success.
False if failed.
"""
ad = self.android_devices[0]
wifi_reset(ad.log, ad)
wifi_toggle_state(ad.log, ad, False)
wifi_toggle_state(ad.log, ad, True)
return data_connectivity_single_bearer(ad.log, ad, GEN_5G, nr_type='nsa')
@test_tracker_info(uuid="8308bf40-7f1b-443f-bde6-19d9ff97e471")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_wifi_connect_disconnect(self):
"""Perform multiple connects and disconnects from WiFi and verify that
data switches between WiFi and Cell.
Steps:
1. DUT Cellular Data is on nsa 5G. Reset Wifi on DUT
2. Connect DUT to a WiFi AP
3. Repeat steps 1-2, alternately disconnecting and disabling wifi
Expected Results:
1. Verify Data on Cell
2. Verify Data on Wifi
Returns:
True if success.
False if failed.
"""
if not provision_device_for_5g(self.log, self.provider, nr_type='nsa'):
return False
return test_wifi_connect_disconnect(self.log, self.provider, self.wifi_network_ssid, self.wifi_network_pass)
@test_tracker_info(uuid="4a61c7c9-f4ed-4e21-b04b-d7a81347b8aa")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_airplane_mode(self):
"""Test airplane mode basic on Phone and Live SIM on 5G NSA.
Ensure phone is on 5G NSA.
Ensure phone attach, data on, WiFi off and verify Internet.
Turn on airplane mode to make sure detach.
Turn off airplane mode to make sure attach.
Verify Internet connection.
Returns:
True if pass; False if fail.
"""
if not provision_device_for_5g(self.log, self.android_devices[0], nr_type='nsa'):
return False
return airplane_mode_test(self.log, self.android_devices[0])
@test_tracker_info(uuid="091cde37-0bac-4399-83aa-cbd5a83b07a1")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_reboot(self):
"""Test 5G NSA service availability after reboot."""
if not provision_device_for_5g(self.log, self.android_devices[0], nr_type='nsa'):
return False
if not verify_internet_connection(self.log, self.android_devices[0]):
return False
return reboot_test(self.log, self.android_devices[0])
""" Tests End """