| #!/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 """ |