| #!/usr/bin/env python3.4 |
| # |
| # Copyright 2022 - 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. |
| |
| import itertools |
| import time |
| |
| from acts_contrib.test_utils.net import ui_utils as uutils |
| import acts_contrib.test_utils.wifi.wifi_test_utils as wutils |
| from acts_contrib.test_utils.wifi.WifiBaseTest import WifiBaseTest |
| |
| from acts import asserts |
| from acts import signals |
| from acts.test_decorators import test_tracker_info |
| |
| WifiEnums = wutils.WifiEnums |
| |
| DEFAULT_TIMEOUT = 15 |
| OSU_TEST_TIMEOUT = 300 |
| |
| # Constants for providers. |
| OSU_BOINGO = 0 |
| BOINGO = 1 |
| |
| # Constants used for various device operations. |
| |
| UNKNOWN_FQDN = "@#@@!00fffffx" |
| |
| # Constants for Boingo UI automator |
| EDIT_TEXT_CLASS_NAME = "android.widget.EditText" |
| PASSWORD_TEXT = "Password" |
| PASSPOINT_BUTTON = "Get Passpoint" |
| |
| |
| class WifiPasspointLanguageTest(WifiBaseTest): |
| """Tests for APIs in Android's WifiManager class. |
| |
| Test Bed Requirement: |
| * One Android device |
| * Several Wi-Fi networks visible to the device, including an open Wi-Fi |
| network. |
| """ |
| BOINGO_UI_TEXT = { |
| 'CHT': "線上註冊", |
| 'FRA': "Inscription en ligne", |
| 'US': "Online Sign Up", |
| 'SPA': "Registro online", |
| 'ARA': "الاشتراك على الإنترنت" |
| } |
| |
| def setup_class(self): |
| super().setup_class() |
| self.dut = self.android_devices[0] |
| wutils.wifi_test_device_init(self.dut) |
| req_params = [ |
| "passpoint_networks", "boingo_username", "boingo_password", |
| "osu_configs" |
| ] |
| self.unpack_userparams(req_param_names=req_params, ) |
| asserts.assert_true( |
| len(self.passpoint_networks) > 0, |
| "Need at least one Passpoint network.") |
| wutils.wifi_toggle_state(self.dut, True) |
| self.unknown_fqdn = UNKNOWN_FQDN |
| |
| def setup_test(self): |
| super().setup_test() |
| self.dut.droid.wakeLockAcquireBright() |
| self.dut.droid.wakeUpNow() |
| self.dut.unlock_screen() |
| self.dut.adb.shell("input keyevent KEYCODE_HOME") |
| |
| def teardown_test(self): |
| super().teardown_test() |
| self.dut.droid.wakeLockRelease() |
| self.dut.droid.goToSleepNow() |
| passpoint_configs = self.dut.droid.getPasspointConfigs() |
| for config in passpoint_configs: |
| wutils.delete_passpoint(self.dut, config) |
| wutils.reset_wifi(self.dut) |
| self.language_change('US') |
| |
| """Helper Functions""" |
| |
| def install_passpoint_profile(self, passpoint_config): |
| """Install the Passpoint network Profile. |
| |
| Args: |
| passpoint_config: A JSON dict of the Passpoint configuration. |
| |
| """ |
| asserts.assert_true( |
| WifiEnums.SSID_KEY in passpoint_config, |
| "Key '%s' must be present in network definition." % |
| WifiEnums.SSID_KEY) |
| # Install the Passpoint profile. |
| self.dut.droid.addUpdatePasspointConfig(passpoint_config) |
| |
| def check_passpoint_connection(self, passpoint_network): |
| """Verify the device is automatically able to connect to the Passpoint |
| network. |
| |
| Args: |
| passpoint_network: SSID of the Passpoint network. |
| |
| """ |
| ad = self.dut |
| ad.ed.clear_all_events() |
| try: |
| wutils.start_wifi_connection_scan_and_return_status(ad) |
| wutils.wait_for_connect(ad) |
| except: |
| pass |
| # Re-verify we are connected to the correct network. |
| network_info = self.dut.droid.wifiGetConnectionInfo() |
| self.log.info("Network Info: %s" % network_info) |
| if not network_info or not network_info[WifiEnums.SSID_KEY] or \ |
| network_info[WifiEnums.SSID_KEY] not in passpoint_network: |
| raise signals.TestFailure( |
| "Device did not connect to passpoint network.") |
| |
| def get_configured_passpoint_and_delete(self): |
| """Get configured Passpoint network and delete using its FQDN.""" |
| passpoint_config = self.dut.droid.getPasspointConfigs() |
| if not len(passpoint_config): |
| raise signals.TestFailure("Failed to fetch the list of configured" |
| "passpoint networks.") |
| if not wutils.delete_passpoint(self.dut, passpoint_config[0]): |
| raise signals.TestFailure( |
| "Failed to delete Passpoint configuration" |
| " with FQDN = %s" % passpoint_config[0]) |
| |
| def language_change(self, lang): |
| """Run UI automator for boingo passpoint. |
| |
| Args: |
| lang: For testing language. |
| |
| """ |
| langs = { |
| 'CHT': "zh-TW", |
| 'FRA': "fr-FR", |
| 'US': "en-US", |
| 'ARA': "ar-SA", |
| 'SPA': "es-ES" |
| } |
| self.dut.ed.clear_all_events() |
| self.dut.adb.shell('settings put system system_locales %s ' % |
| langs[lang]) |
| self.dut.reboot() |
| time.sleep(DEFAULT_TIMEOUT) |
| |
| def ui_automator_boingo(self, lang): |
| """Changing device language. |
| |
| Args: |
| lang: For testing language. |
| |
| """ |
| # Verify the boingo login page shows |
| langtext = self.BOINGO_UI_TEXT[lang] |
| asserts.assert_true(uutils.has_element(self.dut, text=langtext), |
| "Failed to launch boingohotspot login page") |
| # Go to the bottom of the page |
| for _ in range(3): |
| self.dut.adb.shell("input swipe 300 900 300 300") |
| time.sleep(5) |
| screen_dump = uutils.get_screen_dump_xml(self.dut) |
| nodes = screen_dump.getElementsByTagName("node") |
| index = 0 |
| for node in nodes: |
| if uutils.match_node(node, class_name="android.widget.EditText"): |
| x, y = eval(node.attributes["bounds"].value.split("][")[0][1:]) |
| self.dut.adb.shell("input tap %s %s" % (x, y)) |
| time.sleep(2) |
| if index == 0: |
| #stop the ime launch |
| self.dut.adb.shell( |
| "am force-stop com.google.android.inputmethod.latin") |
| self.dut.adb.shell("input text %s" % self.boingo_username) |
| index += 1 |
| else: |
| self.dut.adb.shell("input text %s" % self.boingo_password) |
| break |
| self.dut.adb.shell("input keyevent 111") |
| self.dut.adb.shell("input keyevent 111") # collapse keyboard |
| self.dut.adb.shell( |
| "input swipe 300 900 300 750") # swipe up to show text |
| |
| # Login |
| uutils.wait_and_click(self.dut, text=PASSPOINT_BUTTON) |
| time.sleep(DEFAULT_TIMEOUT) |
| |
| def start_subscription_provisioning_language(self, lang): |
| """Start subscription provisioning with a default provider. |
| |
| Args: |
| lang: For testing language. |
| |
| """ |
| self.language_change(lang) |
| self.unpack_userparams(('osu_configs', )) |
| asserts.assert_true( |
| len(self.osu_configs) > 0, "Need at least one osu config.") |
| osu_config = self.osu_configs[OSU_BOINGO] |
| # Clear all previous events. |
| self.dut.ed.clear_all_events() |
| self.dut.droid.startSubscriptionProvisioning(osu_config) |
| start_time = time.time() |
| while time.time() < start_time + OSU_TEST_TIMEOUT: |
| dut_event = self.dut.ed.pop_event("onProvisioningCallback", |
| DEFAULT_TIMEOUT * 18) |
| if dut_event['data']['tag'] == 'success': |
| self.log.info("Passpoint Provisioning Success") |
| break |
| if dut_event['data']['tag'] == 'failure': |
| raise signals.TestFailure( |
| "Passpoint Provisioning is failed with %s" % |
| dut_event['data']['reason']) |
| break |
| if dut_event['data']['tag'] == 'status': |
| self.log.info("Passpoint Provisioning status %s" % |
| dut_event['data']['status']) |
| if int(dut_event['data']['status']) == 7: |
| time.sleep(DEFAULT_TIMEOUT) |
| self.ui_automator_boingo(lang) |
| |
| # Clear all previous events. |
| self.dut.ed.clear_all_events() |
| # Verify device connects to the Passpoint network. |
| time.sleep(DEFAULT_TIMEOUT) |
| current_passpoint = self.dut.droid.wifiGetConnectionInfo() |
| if current_passpoint[ |
| WifiEnums.SSID_KEY] not in osu_config["expected_ssids"]: |
| raise signals.TestFailure("Device did not connect to the %s" |
| " passpoint network" % |
| osu_config["expected_ssids"]) |
| self.get_configured_passpoint_and_delete() |
| wutils.wait_for_disconnect(self.dut, timeout=15) |
| |
| """Tests""" |
| |
| @test_tracker_info(uuid="78a939e2-bddc-4bee-8e9d-75f4d953f9eb") |
| def test_passpoint_release_2_connectivity_language_ara(self): |
| """Changing the device's language to ARA(Arabic) |
| to connected passpoint |
| |
| """ |
| |
| self.start_subscription_provisioning_language('ARA') |
| |
| @test_tracker_info(uuid="e04ac983-1fe6-436b-a2e1-339c1d73cb95") |
| def test_passpoint_release_2_connectivity_language_cht(self): |
| """Changing the device's language to CHT(Chinese (Traditional)) |
| to connected passpoint |
| |
| """ |
| |
| self.start_subscription_provisioning_language('CHT') |
| |
| @test_tracker_info(uuid="215452c8-f425-48ac-a057-6f67c2e84d9e") |
| def test_passpoint_release_2_connectivity_language_fra(self): |
| """Changing the device's language to FRA(French) |
| to connected passpoint |
| |
| """ |
| |
| self.start_subscription_provisioning_language('FRA') |
| |
| @test_tracker_info(uuid="b602c998-2d42-44bc-af4a-f4ee42febe65") |
| def test_passpoint_release_2_connectivity_language_spa(self): |
| """Changing the device's language to SPA(Spanish) |
| to connected passpoint |
| |
| """ |
| |
| self.start_subscription_provisioning_language('SPA') |