blob: adfe5c30d96c1f59243f15a8d8e184ae3f0f5475 [file] [log] [blame]
#!/usr/bin/env python3.4
#
# Copyright 2021 - 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 NSA MMWAVE 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_test_utils import break_internet_except_sl4a_port
from acts_contrib.test_utils.tel.tel_test_utils import check_data_stall_detection
from acts_contrib.test_utils.tel.tel_test_utils import check_data_stall_recovery
from acts_contrib.test_utils.tel.tel_test_utils import check_network_validation_fail
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 resume_internet_with_sl4a_port
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_data_utils import browsing_test
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_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_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_5g_test_utils import set_preferred_mode_for_5g
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 Nsa5gMmwDataTest(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 = self.user_params.get("iperf_tcp_port", 0)
self.iperf_udp_port = self.user_params.get("iperf_udp_port", 0)
self.iperf_duration = 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="069d05c0-1fa0-4fd4-a4df-a0eff753b38d")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_data_browsing(self):
""" Verifying connectivity of internet and browsing websites on 5G NSA MMW 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_mode_for_5g(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 MMW attach for 60 secs")
if is_current_network_5g(ad, nr_type = 'mmwave', timeout=60):
ad.log.info("Success! attached on 5G NSA MMW")
else:
ad.log.error("Failure - expected NR_NSA MMW, current %s",
get_current_override_network_type(ad))
# Can't attach 5G NSA MMW, 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 MMW Connectivity and Data Browsing test FAIL for all 3 iterations")
return False
@test_tracker_info(uuid="f1638e11-c686-4431-8b6c-4dc7cbff6406")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_data_stall_recovery(self):
""" Verifies 5G NSA MMW data stall
Set Mode to 5G NSA MMW
Wait for 5G attached on NSA MMW
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='mmwave'):
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 MMW")
else:
ad.log.error("FAIL - data stall over 5G NSA MMW")
return result
@test_tracker_info(uuid="38fd987d-2a9a-44d5-bea4-e524359390c6")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_metered_cellular(self):
""" Verifies 5G NSA MMW Meteredness API
Set Mode to 5G NSA MMW
Wait for 5G attached on NSA NSA MMW
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='mmwave'):
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="8d4ce840-6261-4395-bf7b-e1f6cdf4d9a9")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_metered_wifi(self):
""" Verifies 5G NSA MMW Meteredness API
Set Mode to 5G NSA MMW, 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='mmwave'):
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="1661cd40-0eed-43f0-bd2a-8e02392af3b1")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_wifi_switching(self):
"""Test data connection network switching when phone camped on 5G NSA MMW.
Ensure phone is camped on 5G NSA MMW
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='mmwave')
@test_tracker_info(uuid="8033a359-1b92-45ff-b766-bb0010132eb7")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_data_connectivity(self):
"""Test data connection in 5g NSA MMW.
Turn off airplane mode, disable WiFi, enable Cellular Data.
Ensure phone data generation is 5g NSA MMW.
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='mmwave')
@test_tracker_info(uuid="633526fa-9e58-47a4-8957-bb0a95eef4ab")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_wifi_not_associated(self):
"""Test data connection in 5g NSA MMW.
Turn off airplane mode, enable WiFi (but not connected), enable Cellular Data.
Ensure phone data generation is 5g MMW.
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='mmwave')
@test_tracker_info(uuid="c56324a2-5eda-4027-9068-7e120d2b178e")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_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 5G NSA MMW. 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='mmwave'):
return False
return test_wifi_connect_disconnect(self.log, self.provider, self.wifi_network_ssid, self.wifi_network_pass)
@test_tracker_info(uuid="88cd3f68-08c3-4635-94ce-a1dffc3ffbf2")
@TelephonyBaseTest.tel_test_wrap
def test_5g_nsa_mmw_airplane_mode(self):
"""Test airplane mode basic on Phone and Live SIM on 5G NSA MMW.
Ensure phone is on 5G NSA MMW.
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='mmwave'):
return False
return airplane_mode_test(self.log, self.android_devices[0])
""" Tests End """