From 7576e726f9ed8eb8e0229e2b89228c5dacc3f6ea Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Mon, 29 Jan 2018 09:53:26 -0800 Subject: [PATCH] Fix settings ui tests in abvt suite Change-Id: I77a262c473b2dfe09c3dabf8e07525fa17815b35 Fixes: 72608407 Test: atest --- tests/uitests/Android.mk | 16 +- .../settings/ui/AboutPhoneSettingsTests.java | 162 ++-- .../settings/ui/HomepageDisplayTests.java | 10 +- ...irelessNetworkSettingsAdditionalTests.java | 766 ++++++++++++++++++ .../ui/WirelessNetworkSettingsTests.java | 745 ++--------------- 5 files changed, 875 insertions(+), 824 deletions(-) create mode 100644 tests/uitests/src/com/android/settings/ui/WirelessNetworkSettingsAdditionalTests.java diff --git a/tests/uitests/Android.mk b/tests/uitests/Android.mk index 870f59c17bd..d52911deefe 100644 --- a/tests/uitests/Android.mk +++ b/tests/uitests/Android.mk @@ -19,16 +19,22 @@ LOCAL_PACKAGE_NAME := SettingsUITests LOCAL_COMPATIBILITY_SUITE := device-tests LOCAL_SRC_FILES := $(call all-java-files-under, src) LOCAL_MODULE_TAGS := tests -LOCAL_JAVA_LIBRARIES := android.test.runner android.test.base + +LOCAL_JAVA_LIBRARIES := \ + android.test.runner \ + android.test.base + LOCAL_STATIC_JAVA_LIBRARIES := \ + android-support-test \ app-helpers-core \ launcher-helper-lib \ - settings-helper \ - timeresult-helper-lib \ - ub-uiautomator \ - sysui-helper \ metrics-helper-lib \ platform-test-annotations \ + settings-helper \ + sysui-helper \ + timeresult-helper-lib \ + truth-prebuilt \ + ub-uiautomator \ #LOCAL_SDK_VERSION := current diff --git a/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.java b/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.java index 57f9bc2aedd..b92a70773f5 100644 --- a/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.java +++ b/tests/uitests/src/com/android/settings/ui/AboutPhoneSettingsTests.java @@ -16,57 +16,55 @@ package com.android.settings.ui; +import static com.android.settings.ui.testutils.SettingsTestUtils.SETTINGS_PACKAGE; +import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.Truth.assertWithMessage; + +import android.app.Instrumentation; import android.content.Intent; import android.os.RemoteException; import android.provider.Settings; +import android.support.test.InstrumentationRegistry; +import android.support.test.filters.SmallTest; +import android.support.test.runner.AndroidJUnit4; import android.support.test.uiautomator.By; import android.support.test.uiautomator.Direction; import android.support.test.uiautomator.UiDevice; import android.support.test.uiautomator.UiObject2; import android.support.test.uiautomator.Until; -import android.test.InstrumentationTestCase; -import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.text.TextUtils; -import android.util.Log; + +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; /** Verifies basic functionality of the About Phone screen */ -public class AboutPhoneSettingsTests extends InstrumentationTestCase { - private static final boolean LOCAL_LOGV = false; - private static final String TAG = "AboutPhoneSettingsTest"; +@RunWith(AndroidJUnit4.class) +@SmallTest +public class AboutPhoneSettingsTests { private static final int TIMEOUT = 2000; - private static final String SETTINGS_PACKAGE = "com.android.settings"; - - private UiDevice mDevice; // TODO: retrieve using name/ids from com.android.settings package private static final String[] sResourceTexts = { - "Status", - "Legal information", - "Regulatory labels", - "Model", - "Android version", - "Android security patch level", - "Baseband version", - "Kernel version", - "Build number" + "Phone number", + "SIM status", + "Model & hardware", + "MEID", + "Android version" }; - private static final String[] sClickableResourceTexts = { - "Status", "Legal information", "Regulatory labels", - }; + private UiDevice mDevice; + private Instrumentation mInstrumentation; - @Override + @Before public void setUp() throws Exception { - if (LOCAL_LOGV) { - Log.d(TAG, "-------"); - } - super.setUp(); - mDevice = UiDevice.getInstance(getInstrumentation()); + mInstrumentation = InstrumentationRegistry.getInstrumentation(); + mDevice = UiDevice.getInstance(mInstrumentation); try { mDevice.setOrientationNatural(); } catch (RemoteException e) { @@ -82,84 +80,40 @@ public class AboutPhoneSettingsTests extends InstrumentationTestCase { UiObject2 view = mDevice.wait( Until.findObject(By.res(SETTINGS_PACKAGE + ":id/main_content")), TIMEOUT); - assertNotNull("Could not find main About Phone screen", view); + assertThat(view).isNotNull(); view.scroll(Direction.UP, 1.0f); } - @Override - protected void tearDown() throws Exception { + @After + public void tearDown() throws Exception { // Adding an extra pressBack so we exit About Phone Settings // and finish the test cleanly mDevice.pressBack(); mDevice.pressHome(); // finish settings activity mDevice.waitForIdle(TIMEOUT * 2); // give UI time to finish animating - super.tearDown(); + } + + @Test + public void testAllMenuEntriesExist() throws Exception { + searchForItemsAndTakeAction(mDevice, sResourceTexts); } private void launchAboutPhoneSettings(String aboutSetting) throws Exception { Intent aboutIntent = new Intent(aboutSetting); aboutIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - getInstrumentation().getContext().startActivity(aboutIntent); - } - - /** - * Callable actions that can be taken when a UIObject2 is found - * - * @param device The current UiDevice - * @param item The UiObject2 that was found and can be acted on - * - * @return {@code true} if the call was successful, and {@code false} otherwise - */ - public interface UIObject2Callback { - boolean call(UiDevice device, UiObject2 item) throws Exception; - } - - /** - * Clicks the given item and then presses the Back button - * - *

Used to test whether a given UiObject2 can be successfully clicked. - * Presses Back to restore state to the previous screen. - * - * @param device The device that can be used to press Back - * @param item The item to click - * - * @return {@code true} if clicking the item succeeded, and {@code false} otherwise - */ - public class UiObject2Clicker implements UIObject2Callback { - public boolean call(UiDevice device, UiObject2 item) throws Exception { - item.click(); - Thread.sleep(TIMEOUT * 2); // give UI time to finish animating - boolean pressWorked = device.pressBack(); - Thread.sleep(TIMEOUT * 2); - return pressWorked; - } + InstrumentationRegistry.getTargetContext().startActivity(aboutIntent); } /** * Removes items found in the view and optionally takes some action. - * - * @param device The current UiDevice - * @param itemsLeftToFind The items to search for in the current view - * @param action Action to call on each item that is found; pass {@code null} to take no action */ - private void removeItemsAndTakeAction( - UiDevice device, ArrayList itemsLeftToFind, UIObject2Callback action) throws Exception { + private void removeItemsAndTakeAction(UiDevice device, ArrayList itemsLeftToFind) + throws Exception { for (Iterator iterator = itemsLeftToFind.iterator(); iterator.hasNext(); ) { String itemText = iterator.next(); UiObject2 item = device.wait(Until.findObject(By.text(itemText)), TIMEOUT); if (item != null) { - if (LOCAL_LOGV) { - Log.d(TAG, itemText + " is present"); - } iterator.remove(); - if (action != null) { - boolean success = action.call(device, item); - assertTrue("Calling action after " + itemText + " did not work", success); - } - } else { - if (LOCAL_LOGV) { - Log.d(TAG, "Could not find " + itemText); - } } } } @@ -169,25 +123,18 @@ public class AboutPhoneSettingsTests extends InstrumentationTestCase { * *

Will scroll down the screen until it has found all elements or reached the bottom. * This allows elements to be found and acted on even if they change order. - * - * @param device The current UiDevice - * @param itemsToFind The items to search for in the current view - * @param action Action to call on each item that is found; pass {@code null} to take no action */ - public void searchForItemsAndTakeAction(UiDevice device, String[] itemsToFind, UIObject2Callback action) + private void searchForItemsAndTakeAction(UiDevice device, String[] itemsToFind) throws Exception { - ArrayList itemsLeftToFind = new ArrayList(Arrays.asList(itemsToFind)); - assertFalse( - "There must be at least one item to search for on the screen!", - itemsLeftToFind.isEmpty()); + ArrayList itemsLeftToFind = new ArrayList<>(Arrays.asList(itemsToFind)); + assertWithMessage("There must be at least one item to search for on the screen!") + .that(itemsLeftToFind) + .isNotEmpty(); - if (LOCAL_LOGV) { - Log.d(TAG, "items: " + TextUtils.join(", ", itemsLeftToFind)); - } boolean canScrollDown = true; while (canScrollDown && !itemsLeftToFind.isEmpty()) { - removeItemsAndTakeAction(device, itemsLeftToFind, action); + removeItemsAndTakeAction(device, itemsLeftToFind); // when we've finished searching the current view, scroll down UiObject2 view = @@ -201,24 +148,11 @@ public class AboutPhoneSettingsTests extends InstrumentationTestCase { } } // check the last items once we have reached the bottom of the view - removeItemsAndTakeAction(device, itemsLeftToFind, action); + removeItemsAndTakeAction(device, itemsLeftToFind); - assertTrue( - "The following items were not found on the screen: " - + TextUtils.join(", ", itemsLeftToFind), - itemsLeftToFind.isEmpty()); - } - - @MediumTest // UI interaction - public void testAllMenuEntriesExist() throws Exception { - searchForItemsAndTakeAction(mDevice, sResourceTexts, null); - } - - // Suppressing this test as it might be causing other test failures - // Will verify that this test is the cause before proceeding with solution - @Suppress - @MediumTest // UI interaction - public void testClickableEntriesCanBeClicked() throws Exception { - searchForItemsAndTakeAction(mDevice, sClickableResourceTexts, new UiObject2Clicker()); + assertWithMessage("The following items were not found on the screen: " + + TextUtils.join(", ", itemsLeftToFind)) + .that(itemsLeftToFind) + .isEmpty(); } } diff --git a/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.java b/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.java index 7931d30edd2..3b7b006e628 100644 --- a/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.java +++ b/tests/uitests/src/com/android/settings/ui/HomepageDisplayTests.java @@ -16,6 +16,9 @@ package com.android.settings.ui; +import static com.android.settings.ui.testutils.SettingsTestUtils.SETTINGS_PACKAGE; +import static com.android.settings.ui.testutils.SettingsTestUtils.TIMEOUT; + import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.provider.Settings; @@ -36,9 +39,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static com.android.settings.ui.testutils.SettingsTestUtils.SETTINGS_PACKAGE; -import static com.android.settings.ui.testutils.SettingsTestUtils.TIMEOUT; - @MediumTest @RunWith(AndroidJUnit4.class) public class HomepageDisplayTests { @@ -52,19 +52,17 @@ public class HomepageDisplayTests { "Sound", "Storage", "Security & location", - "Users & accounts", + "Accounts", "Accessibility", "System", "Support & tips" }; private UiDevice mDevice; - private SettingsHelper mSettingsHelper; @Before public void setUp() throws Exception { mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); - mSettingsHelper = new SettingsHelper(); try { mDevice.setOrientationNatural(); } catch (RemoteException e) { diff --git a/tests/uitests/src/com/android/settings/ui/WirelessNetworkSettingsAdditionalTests.java b/tests/uitests/src/com/android/settings/ui/WirelessNetworkSettingsAdditionalTests.java new file mode 100644 index 00000000000..4ed2a1dd397 --- /dev/null +++ b/tests/uitests/src/com/android/settings/ui/WirelessNetworkSettingsAdditionalTests.java @@ -0,0 +1,766 @@ +/* + * Copyright (C) 2018 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. + */ + +package com.android.settings.ui; + +import android.content.Context; +import android.net.wifi.WifiManager; +import android.os.RemoteException; +import android.platform.test.annotations.Presubmit; +import android.provider.Settings; +import android.support.test.uiautomator.By; +import android.support.test.uiautomator.BySelector; +import android.support.test.uiautomator.Direction; +import android.support.test.uiautomator.StaleObjectException; +import android.support.test.uiautomator.UiDevice; +import android.support.test.uiautomator.UiObject2; +import android.support.test.uiautomator.Until; +import android.system.helpers.CommandsHelper; +import android.system.helpers.SettingsHelper; +import android.test.InstrumentationTestCase; +import android.test.suitebuilder.annotation.MediumTest; +import android.test.suitebuilder.annotation.Suppress; +import android.util.Log; + +/** + * Additional tests for Wifi Settings. + */ +public class WirelessNetworkSettingsAdditionalTests extends InstrumentationTestCase { + // These back button presses are performed in tearDown() to exit Wifi + // Settings sub-menus that a test might finish in. This number should be + // high enough to account for the deepest sub-menu a test might enter. + private static final int NUM_BACK_BUTTON_PRESSES = 5; + private static final int TIMEOUT = 2000; + private static final int SLEEP_TIME = 500; + private static final String AIRPLANE_MODE_BROADCAST = + "am broadcast -a android.intent.action.AIRPLANE_MODE"; + private static final String TAG="WirelessNetworkSettingsTests"; + + // Note: The values of these variables might affect flakiness in tests that involve + // scrolling. Adjust where necessary. + private static final float SCROLL_UP_PERCENT = 10.0f; + private static final float SCROLL_DOWN_PERCENT = 0.5f; + private static final int MAX_SCROLL_ATTEMPTS = 10; + private static final int MAX_ADD_NETWORK_BUTTON_ATTEMPTS = 3; + private static final int SCROLL_SPEED = 2000; + + private static final String TEST_SSID = "testSsid"; + private static final String TEST_PW_GE_8_CHAR = "testPasswordGreaterThan8Char"; + private static final String TEST_PW_LT_8_CHAR = "lt8Char"; + private static final String TEST_DOMAIN = "testDomain.com"; + + private static final String SETTINGS_PACKAGE = "com.android.settings"; + + private static final String CHECKBOX_CLASS = "android.widget.CheckBox"; + private static final String SPINNER_CLASS = "android.widget.Spinner"; + private static final String EDIT_TEXT_CLASS = "android.widget.EditText"; + private static final String SCROLLVIEW_CLASS = "android.widget.ScrollView"; + private static final String LISTVIEW_CLASS = "android.widget.ListView"; + + private static final String ADD_NETWORK_MENU_CANCEL_BUTTON_TEXT = "CANCEL"; + private static final String ADD_NETWORK_MENU_SAVE_BUTTON_TEXT = "SAVE"; + private static final String ADD_NETWORK_PREFERENCE_TEXT = "Add network"; + private static final String CONFIGURE_WIFI_PREFERENCE_TEXT = "Wi‑Fi preferences"; + private static final String CONFIGURE_WIFI_ADVANCED_PREFERENCE_TEXT = "Advanced"; + private static final String CACERT_MENU_PLEASE_SELECT_TEXT = "Please select"; + private static final String CACERT_MENU_USE_SYSTEM_CERTS_TEXT = "Use system certificates"; + private static final String CACERT_MENU_DO_NOT_VALIDATE_TEXT = "Do not validate"; + private static final String USERCERT_MENU_PLEASE_SELECT_TEXT = "Please select"; + private static final String USERCERT_MENU_DO_NOT_PROVIDE_TEXT = "Do not provide"; + private static final String SECURITY_OPTION_NONE_TEXT = "None"; + private static final String SECURITY_OPTION_WEP_TEXT = "WEP"; + private static final String SECURITY_OPTION_PSK_TEXT = "WPA/WPA2 PSK"; + private static final String SECURITY_OPTION_EAP_TEXT = "802.1x EAP"; + private static final String EAP_METHOD_PEAP_TEXT = "PEAP"; + private static final String EAP_METHOD_TLS_TEXT = "TLS"; + private static final String EAP_METHOD_TTLS_TEXT = "TTLS"; + private static final String EAP_METHOD_PWD_TEXT = "PWD"; + private static final String EAP_METHOD_SIM_TEXT = "SIM"; + private static final String EAP_METHOD_AKA_TEXT = "AKA"; + private static final String EAP_METHOD_AKA_PRIME_TEXT = "AKA'"; + private static final String PHASE2_MENU_NONE_TEXT = "None"; + private static final String PHASE2_MENU_MSCHAPV2_TEXT = "MSCHAPV2"; + private static final String PHASE2_MENU_GTC_TEXT = "GTC"; + + private static final String ADD_NETWORK_MENU_ADV_TOGGLE_RES_ID = "wifi_advanced_togglebox"; + private static final String ADD_NETWORK_MENU_IP_SETTINGS_RES_ID = "ip_settings"; + private static final String ADD_NETWORK_MENU_PROXY_SETTINGS_RES_ID = "proxy_settings"; + private static final String ADD_NETWORK_MENU_SECURITY_OPTION_RES_ID = "security"; + private static final String ADD_NETWORK_MENU_EAP_METHOD_RES_ID = "method"; + private static final String ADD_NETWORK_MENU_SSID_RES_ID = "ssid"; + private static final String ADD_NETWORK_MENU_PHASE2_RES_ID = "phase2"; + private static final String ADD_NETWORK_MENU_CACERT_RES_ID = "ca_cert"; + private static final String ADD_NETWORK_MENU_USERCERT_RES_ID = "user_cert"; + private static final String ADD_NETWORK_MENU_NO_DOMAIN_WARNING_RES_ID = "no_domain_warning"; + private static final String ADD_NETWORK_MENU_NO_CACERT_WARNING_RES_ID = "no_ca_cert_warning"; + private static final String ADD_NETWORK_MENU_DOMAIN_LAYOUT_RES_ID = "l_domain"; + private static final String ADD_NETWORK_MENU_DOMAIN_RES_ID = "domain"; + private static final String ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID = "l_identity"; + private static final String ADD_NETWORK_MENU_ANONYMOUS_LAYOUT_RES_ID = "l_anonymous"; + private static final String ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID = "password_layout"; + private static final String ADD_NETWORK_MENU_SHOW_PASSWORD_LAYOUT_RES_ID = + "show_password_layout"; + private static final String ADD_NETWORK_MENU_PASSWORD_RES_ID = "password"; + + private static final BySelector ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR = + By.scrollable(true).clazz(SCROLLVIEW_CLASS); + private static final BySelector SPINNER_OPTIONS_SCROLLABLE_BY_SELECTOR = + By.scrollable(true).clazz(LISTVIEW_CLASS); + + private UiDevice mDevice; + private CommandsHelper mCommandsHelper; + + @Override + public void setUp() throws Exception { + super.setUp(); + mDevice = UiDevice.getInstance(getInstrumentation()); + try { + mDevice.setOrientationNatural(); + } catch (RemoteException e) { + throw new RuntimeException("failed to freeze device orientation", e); + } + // Ensure airplane mode is OFF so that wifi can be enabled using WiFiManager. + Settings.Global.putString(getInstrumentation().getContext().getContentResolver(), + Settings.Global.AIRPLANE_MODE_ON, "0"); + Log.d(TAG, "sending airplane mode broadcast to device"); + mCommandsHelper = CommandsHelper.getInstance(); + mCommandsHelper.executeShellCommand(AIRPLANE_MODE_BROADCAST); + } + + @Override + protected void tearDown() throws Exception { + // Exit all settings sub-menus. + for (int i = 0; i < NUM_BACK_BUTTON_PRESSES; ++i) { + mDevice.pressBack(); + } + mDevice.pressHome(); + super.tearDown(); + } + + @MediumTest + public void testWifiMenuLoadConfigure() throws Exception { + loadWiFiConfigureMenu(); + Thread.sleep(SLEEP_TIME); + UiObject2 configureWiFiHeading = mDevice.wait(Until.findObject + (By.text(CONFIGURE_WIFI_PREFERENCE_TEXT)), TIMEOUT); + assertNotNull("Configure WiFi menu has not loaded correctly", configureWiFiHeading); + } + + @MediumTest + public void testNetworkNotificationsOn() throws Exception { + verifyNetworkNotificationsOnOrOff(true); + } + + @MediumTest + public void testNetworkNotificationsOff() throws Exception { + verifyNetworkNotificationsOnOrOff(false); + } + + @MediumTest + public void testAddNetworkMenu_Default() throws Exception { + loadAddNetworkMenu(); + + // Submit button should be disabled by default, while cancel button should be enabled. + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + assertTrue(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_CANCEL_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // Check that the SSID field is defaults to the hint. + assertEquals("Enter the SSID", mDevice.wait(Until.findObject(By + .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SSID_RES_ID) + .clazz(EDIT_TEXT_CLASS)), TIMEOUT*2) + .getText()); + + // Check Security defaults to None. + assertEquals("None", mDevice.wait(Until.findObject(By + .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SECURITY_OPTION_RES_ID) + .clazz(SPINNER_CLASS)), TIMEOUT) + .getChildren().get(0).getText()); + + // Check advanced options are collapsed by default. + assertFalse(mDevice.wait(Until.findObject(By + .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ADV_TOGGLE_RES_ID) + .clazz(CHECKBOX_CLASS)), TIMEOUT).isChecked()); + + } + + @Suppress + @MediumTest + public void testAddNetworkMenu_Proxy() throws Exception { + loadAddNetworkMenu(); + + // Toggle advanced options. + mDevice.wait(Until.findObject(By + .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ADV_TOGGLE_RES_ID) + .clazz(CHECKBOX_CLASS)), TIMEOUT).click(); + + // Verify Proxy defaults to None. + BySelector proxySettingsBySelector = + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PROXY_SETTINGS_RES_ID) + .clazz(SPINNER_CLASS); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, proxySettingsBySelector); + assertEquals("None", mDevice.wait(Until.findObject(proxySettingsBySelector), TIMEOUT) + .getChildren().get(0).getText()); + + // Verify that Proxy Manual fields appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, proxySettingsBySelector); + mDevice.wait(Until.findObject(proxySettingsBySelector), TIMEOUT).click(); + mDevice.wait(Until.findObject(By.text("Manual")), TIMEOUT).click(); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "proxy_warning_limited_support")); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "proxy_hostname")); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "proxy_exclusionlist")); + + // Verify that Proxy Auto-Config options appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, proxySettingsBySelector); + mDevice.wait(Until.findObject(proxySettingsBySelector), TIMEOUT).click(); + mDevice.wait(Until.findObject(By.text("Proxy Auto-Config")), TIMEOUT).click(); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "proxy_pac")); + } + + @Suppress + @MediumTest + public void testAddNetworkMenu_IpSettings() throws Exception { + loadAddNetworkMenu(); + + // Toggle advanced options. + mDevice.wait(Until.findObject(By + .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ADV_TOGGLE_RES_ID) + .clazz(CHECKBOX_CLASS)), TIMEOUT).click(); + + // Verify IP settings defaults to DHCP. + BySelector ipSettingsBySelector = + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IP_SETTINGS_RES_ID).clazz(SPINNER_CLASS); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, ipSettingsBySelector); + assertEquals("DHCP", mDevice.wait(Until.findObject(ipSettingsBySelector), TIMEOUT) + .getChildren().get(0).getText()); + + // Verify that Static IP settings options appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, ipSettingsBySelector).click(); + mDevice.wait(Until.findObject(By.text("Static")), TIMEOUT).click(); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "ipaddress")); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "gateway")); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "network_prefix_length")); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "dns1")); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, "dns2")); + } + + @Suppress + @MediumTest + public void testPhase2Settings() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + + BySelector phase2SettingsBySelector = + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PHASE2_RES_ID).clazz(SPINNER_CLASS); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, phase2SettingsBySelector); + assertEquals(PHASE2_MENU_NONE_TEXT, mDevice.wait(Until + .findObject(phase2SettingsBySelector), TIMEOUT).getChildren().get(0).getText()); + mDevice.wait(Until.findObject(phase2SettingsBySelector), TIMEOUT).click(); + Thread.sleep(SLEEP_TIME); + + // Verify Phase 2 authentication spinner options. + assertNotNull(mDevice.wait(Until.findObject(By.text(PHASE2_MENU_NONE_TEXT)), TIMEOUT)); + assertNotNull(mDevice.wait(Until.findObject(By.text(PHASE2_MENU_MSCHAPV2_TEXT)), TIMEOUT)); + assertNotNull(mDevice.wait(Until.findObject(By.text(PHASE2_MENU_GTC_TEXT)), TIMEOUT)); + } + + @Suppress + @MediumTest + public void testCaCertSettings() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + + BySelector caCertSettingsBySelector = + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID).clazz(SPINNER_CLASS); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, caCertSettingsBySelector); + assertEquals(CACERT_MENU_PLEASE_SELECT_TEXT, mDevice.wait(Until + .findObject(caCertSettingsBySelector), TIMEOUT).getChildren().get(0).getText()); + mDevice.wait(Until.findObject(caCertSettingsBySelector), TIMEOUT).click(); + Thread.sleep(SLEEP_TIME); + + // Verify CA certificate spinner options. + assertNotNull(mDevice.wait(Until.findObject( + By.text(CACERT_MENU_PLEASE_SELECT_TEXT)), TIMEOUT)); + assertNotNull(mDevice.wait(Until.findObject( + By.text(CACERT_MENU_USE_SYSTEM_CERTS_TEXT)), TIMEOUT)); + assertNotNull(mDevice.wait(Until.findObject( + By.text(CACERT_MENU_DO_NOT_VALIDATE_TEXT)), TIMEOUT)); + + // Verify that a domain field and warning appear when the user selects the + // "Use system certificates" option. + mDevice.wait(Until.findObject(By.text(CACERT_MENU_USE_SYSTEM_CERTS_TEXT)), TIMEOUT).click(); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_DOMAIN_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_NO_DOMAIN_WARNING_RES_ID)); + + // Verify that a warning appears when the user chooses the "Do Not Validate" option. + mDevice.wait(Until.findObject(caCertSettingsBySelector), TIMEOUT).click(); + mDevice.wait(Until.findObject(By.text(CACERT_MENU_DO_NOT_VALIDATE_TEXT)), TIMEOUT).click(); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_NO_CACERT_WARNING_RES_ID)); + } + + @Suppress + @MediumTest + public void testAddNetwork_NoSecurity() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_NONE_TEXT); + + // Entering an SSID is enough to enable the submit button. // TODO THIS GUY + enterSSID(TEST_SSID); + assertTrue(mDevice.wait(Until + .findObject(By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + } + + @Suppress + @MediumTest + public void testAddNetwork_WEP() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_WEP_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // Verify that WEP fields appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SHOW_PASSWORD_LAYOUT_RES_ID)); + + // Entering an SSID alone does not enable the submit button. + enterSSID(TEST_SSID); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // Submit button is only enabled after a password is entered. + enterPassword(TEST_PW_GE_8_CHAR); + assertTrue(mDevice.wait(Until + .findObject(By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + } + + @Suppress + @MediumTest + public void testAddNetwork_PSK() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_PSK_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // Verify that PSK fields appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SHOW_PASSWORD_LAYOUT_RES_ID)); + + // Entering an SSID alone does not enable the submit button. + enterSSID(TEST_SSID); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // Entering an password that is too short does not enable submit button. + enterPassword(TEST_PW_LT_8_CHAR); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // Submit button is only enabled after a password of valid length is entered. + enterPassword(TEST_PW_GE_8_CHAR); + assertTrue(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + } + + @Suppress + @MediumTest + public void testAddNetwork_EAP_PEAP() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + selectEAPMethod(EAP_METHOD_PEAP_TEXT); + + // Verify that EAP-PEAP fields appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PHASE2_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ANONYMOUS_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SHOW_PASSWORD_LAYOUT_RES_ID)); + + // Entering an SSID alone does not enable the submit button. + enterSSID(TEST_SSID); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + verifyCaCertificateSubmitConditions(); + } + + @Suppress + @MediumTest + public void testAddNetwork_EAP_TLS() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + selectEAPMethod(EAP_METHOD_TLS_TEXT); + + // Verify that EAP-TLS fields appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_USERCERT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID)); + + // Entering an SSID alone does not enable the submit button. + enterSSID(TEST_SSID); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // Selecting the User certificate "Do not provide" option alone does not enable the submit + // button. + selectUserCertificateOption(USERCERT_MENU_DO_NOT_PROVIDE_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + verifyCaCertificateSubmitConditions(); + } + + @Suppress + @MediumTest + public void testAddNetwork_EAP_TTLS() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + selectEAPMethod(EAP_METHOD_TTLS_TEXT); + + // Verify that EAP-TLS fields appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PHASE2_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ANONYMOUS_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); + + // Entering an SSID alone does not enable the submit button. + enterSSID(TEST_SSID); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + verifyCaCertificateSubmitConditions(); + } + + @Suppress + @MediumTest + public void testAddNetwork_EAP_PWD() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + selectEAPMethod(EAP_METHOD_PWD_TEXT); + + // Verify that EAP-TLS fields appear. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID)); + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); + + // Entering an SSID alone enables the submit button. + enterSSID(TEST_SSID); + assertTrue(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + } + + @Suppress + @MediumTest + public void testAddNetwork_EAP_SIM() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + selectEAPMethod(EAP_METHOD_SIM_TEXT); + + // Entering an SSID alone enables the submit button. + enterSSID(TEST_SSID); + assertTrue(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + } + + @Suppress + @MediumTest + public void testAddNetwork_EAP_AKA() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + selectEAPMethod(EAP_METHOD_AKA_TEXT); + + // Entering an SSID alone enables the submit button. + enterSSID(TEST_SSID); + assertTrue(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + } + + @Suppress + @MediumTest + public void testAddNetwork_EAP_AKA_PRIME() throws Exception { + loadAddNetworkMenu(); + selectSecurityOption(SECURITY_OPTION_EAP_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + selectEAPMethod(EAP_METHOD_AKA_PRIME_TEXT); + + // Entering an SSID alone enables the submit button. + enterSSID(TEST_SSID); + assertTrue(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + } + + private void verifyKeepWiFiOnDuringSleep(String settingToBeVerified, int settingValue) + throws Exception { + loadWiFiConfigureMenu(); + mDevice.wait(Until.findObject(By.text("Keep Wi‑Fi on during sleep")), TIMEOUT) + .click(); + mDevice.wait(Until.findObject(By.clazz("android.widget.CheckedTextView") + .text(settingToBeVerified)), TIMEOUT).click(); + Thread.sleep(SLEEP_TIME); + int keepWiFiOnSetting = + Settings.Global.getInt(getInstrumentation().getContext().getContentResolver(), + Settings.Global.WIFI_SLEEP_POLICY); + assertEquals(settingValue, keepWiFiOnSetting); + } + + private void verifyNetworkNotificationsOnOrOff(boolean verifyOn) + throws Exception { + // Enable network recommendations to enable the toggle switch for Network + // notifications + Settings.Global.putString(getInstrumentation().getContext().getContentResolver(), + Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, "1"); + if (verifyOn) { + Settings.Global.putString(getInstrumentation().getContext().getContentResolver(), + Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, "0"); + } + else { + Settings.Global.putString(getInstrumentation().getContext().getContentResolver(), + Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, "1"); + } + loadWiFiConfigureMenu(); + mDevice.wait(Until.findObject(By.text("Open network notification")), TIMEOUT) + .click(); + Thread.sleep(SLEEP_TIME); + String wifiNotificationValue = + Settings.Global.getString(getInstrumentation().getContext().getContentResolver(), + Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON); + if (verifyOn) { + assertEquals("1", wifiNotificationValue); + } + else { + assertEquals("0", wifiNotificationValue); + } + } + + private void verifyWiFiOnOrOff(boolean verifyOn) throws Exception { + String switchText = "On"; + if (verifyOn) { + switchText = "Off"; + } + loadWiFiSettingsPage(!verifyOn); + mDevice.wait(Until + .findObject(By.res(SETTINGS_PACKAGE, "switch_bar").text(switchText)), TIMEOUT) + .click(); + Thread.sleep(SLEEP_TIME); + String wifiValue = + Settings.Global.getString(getInstrumentation().getContext().getContentResolver(), + Settings.Global.WIFI_ON); + if (verifyOn) { + // 1 is Enabled, 2 is Enabled while airplane mode is ON. + assertTrue(wifiValue.equals("1") || wifiValue.equals("2")); + } + else { + assertEquals("0", wifiValue); + } + } + + private void verifyCaCertificateSubmitConditions() throws Exception { + // Selecting the CA certificate "Do not validate" option enables the submit button. + selectCaCertificateOption(CACERT_MENU_DO_NOT_VALIDATE_TEXT); + assertTrue(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // However, selecting the CA certificate "Use system certificates option" is not enough to + // enable the submit button. + selectCaCertificateOption(CACERT_MENU_USE_SYSTEM_CERTS_TEXT); + assertFalse(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + + // Submit button is only enabled after a domain is entered as well. + enterDomain(TEST_DOMAIN); + assertTrue(mDevice.wait(Until.findObject( + By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + } + + private void loadWiFiSettingsPage(boolean wifiEnabled) throws Exception { + WifiManager wifiManager = (WifiManager)getInstrumentation().getContext() + .getSystemService(Context.WIFI_SERVICE); + wifiManager.setWifiEnabled(wifiEnabled); + SettingsHelper.launchSettingsPage(getInstrumentation().getContext(), + Settings.ACTION_WIFI_SETTINGS); + } + + private void loadWiFiConfigureMenu() throws Exception { + loadWiFiSettingsPage(false); + Thread.sleep(TIMEOUT); + mDevice.wait(Until.findObject(By.text(CONFIGURE_WIFI_PREFERENCE_TEXT)), TIMEOUT).click(); + mDevice.wait(Until.findObject( + By.text(CONFIGURE_WIFI_ADVANCED_PREFERENCE_TEXT)), TIMEOUT).click(); + } + + private void loadAddNetworkMenu() throws Exception { + loadWiFiSettingsPage(true); + for (int attempts = 0; attempts < MAX_ADD_NETWORK_BUTTON_ATTEMPTS; ++attempts) { + try { + findOrScrollToObject(By.scrollable(true), By.text(ADD_NETWORK_PREFERENCE_TEXT)) + .click(); + } catch (StaleObjectException e) { + // The network list might have been updated between when the Add network button was + // found, and when it UI automator attempted to click on it. Retry. + continue; + } + // If we get here, we successfully clicked on the Add network button, so we are done. + Thread.sleep(SLEEP_TIME*5); + return; + } + + fail("Failed to load Add Network Menu after " + MAX_ADD_NETWORK_BUTTON_ATTEMPTS + + " retries"); + } + + private void selectSecurityOption(String securityOption) throws Exception { + // We might not need to scroll to the security options if not enough add network menu + // options are visible. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SECURITY_OPTION_RES_ID) + .clazz(SPINNER_CLASS)).click(); + Thread.sleep(SLEEP_TIME); + mDevice.wait(Until.findObject(By.text(securityOption)), TIMEOUT).click(); + } + + private void selectEAPMethod(String eapMethod) throws Exception { + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_EAP_METHOD_RES_ID).clazz(SPINNER_CLASS)) + .click(); + Thread.sleep(SLEEP_TIME); + findOrScrollToObject(SPINNER_OPTIONS_SCROLLABLE_BY_SELECTOR, By.text(eapMethod)).click(); + } + + private void selectUserCertificateOption(String userCertificateOption) throws Exception { + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_USERCERT_RES_ID).clazz(SPINNER_CLASS)) + .click(); + mDevice.wait(Until.findObject(By.text(userCertificateOption)), TIMEOUT).click(); + } + + private void selectCaCertificateOption(String caCertificateOption) throws Exception { + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID).clazz(SPINNER_CLASS)) + .click(); + mDevice.wait(Until.findObject(By.text(caCertificateOption)), TIMEOUT).click(); + } + + private void enterSSID(String ssid) throws Exception { + // We might not need to scroll to the SSID option if not enough add network menu options + // are visible. + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SSID_RES_ID).clazz(EDIT_TEXT_CLASS)) + .setText(ssid); + } + + private void enterPassword(String password) throws Exception { + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_RES_ID).clazz(EDIT_TEXT_CLASS)) + .setText(password); + } + + private void enterDomain(String domain) throws Exception { + findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, + By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_DOMAIN_RES_ID)).setText(domain); + } + + // Use this if the UI object might or might not need to be scrolled to. + private UiObject2 findOrScrollToObject(BySelector scrollableSelector, BySelector objectSelector) + throws Exception { + UiObject2 object = mDevice.wait(Until.findObject(objectSelector), TIMEOUT); + if (object == null) { + object = scrollToObject(scrollableSelector, objectSelector); + } + return object; + } + + private UiObject2 scrollToObject(BySelector scrollableSelector, BySelector objectSelector) + throws Exception { + UiObject2 scrollable = mDevice.wait(Until.findObject(scrollableSelector), TIMEOUT); + if (scrollable == null) { + fail("Could not find scrollable UI object identified by " + scrollableSelector); + } + UiObject2 found = null; + // Scroll all the way up first, then all the way down. + while (true) { + // Optimization: terminate if we find the object while scrolling up to reset, so + // we save the time spent scrolling down again. + boolean canScrollAgain = scrollable.scroll(Direction.UP, SCROLL_UP_PERCENT, + SCROLL_SPEED); + found = mDevice.findObject(objectSelector); + if (found != null) return found; + if (!canScrollAgain) break; + } + for (int attempts = 0; found == null && attempts < MAX_SCROLL_ATTEMPTS; ++attempts) { + // Return value of UiObject2.scroll() is not reliable, so do not use it in loop + // condition, in case it causes this loop to terminate prematurely. + scrollable.scroll(Direction.DOWN, SCROLL_DOWN_PERCENT, SCROLL_SPEED); + found = mDevice.findObject(objectSelector); + } + if (found == null) { + fail("Could not scroll to UI object identified by " + objectSelector); + } + return found; + } +} diff --git a/tests/uitests/src/com/android/settings/ui/WirelessNetworkSettingsTests.java b/tests/uitests/src/com/android/settings/ui/WirelessNetworkSettingsTests.java index 1e3b978c804..64fa5fd734e 100644 --- a/tests/uitests/src/com/android/settings/ui/WirelessNetworkSettingsTests.java +++ b/tests/uitests/src/com/android/settings/ui/WirelessNetworkSettingsTests.java @@ -16,762 +16,109 @@ package com.android.settings.ui; +import static com.android.settings.ui.testutils.SettingsTestUtils.SETTINGS_PACKAGE; +import static com.google.common.truth.Truth.assertThat; + import android.content.Context; -import android.content.Intent; import android.net.wifi.WifiManager; import android.os.RemoteException; import android.platform.test.annotations.Presubmit; import android.provider.Settings; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; +import android.support.test.uiautomator.By; +import android.support.test.uiautomator.UiDevice; +import android.support.test.uiautomator.Until; import android.system.helpers.CommandsHelper; import android.system.helpers.SettingsHelper; -import android.support.test.uiautomator.By; -import android.support.test.uiautomator.BySelector; -import android.support.test.uiautomator.Direction; -import android.support.test.uiautomator.StaleObjectException; -import android.support.test.uiautomator.UiDevice; -import android.support.test.uiautomator.UiObject2; -import android.support.test.uiautomator.Until; -import android.test.InstrumentationTestCase; import android.test.suitebuilder.annotation.MediumTest; -import android.test.suitebuilder.annotation.Suppress; import android.util.Log; -import junit.framework.AssertionFailedError; -public class WirelessNetworkSettingsTests extends InstrumentationTestCase { +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; + +/** + * Core tests for Wifi Settings. + */ +@RunWith(AndroidJUnit4.class) +@MediumTest +public class WirelessNetworkSettingsTests { // These back button presses are performed in tearDown() to exit Wifi // Settings sub-menus that a test might finish in. This number should be // high enough to account for the deepest sub-menu a test might enter. private static final int NUM_BACK_BUTTON_PRESSES = 5; - private static final int TIMEOUT = 2000; + private static final int TIMEOUT = 20000; private static final int SLEEP_TIME = 500; private static final String AIRPLANE_MODE_BROADCAST = "am broadcast -a android.intent.action.AIRPLANE_MODE"; - private static final String TAG="WirelessNetworkSettingsTests"; + private static final String TAG = "WirelessNetworkTests"; - // Note: The values of these variables might affect flakiness in tests that involve - // scrolling. Adjust where necessary. - private static final float SCROLL_UP_PERCENT = 10.0f; - private static final float SCROLL_DOWN_PERCENT = 0.5f; - private static final int MAX_SCROLL_ATTEMPTS = 10; - private static final int MAX_ADD_NETWORK_BUTTON_ATTEMPTS = 3; - private static final int SCROLL_SPEED = 2000; - - private static final String TEST_SSID = "testSsid"; - private static final String TEST_PW_GE_8_CHAR = "testPasswordGreaterThan8Char"; - private static final String TEST_PW_LT_8_CHAR = "lt8Char"; - private static final String TEST_DOMAIN = "testDomain.com"; - - private static final String SETTINGS_PACKAGE = "com.android.settings"; - - private static final String CHECKBOX_CLASS = "android.widget.CheckBox"; - private static final String SPINNER_CLASS = "android.widget.Spinner"; - private static final String EDIT_TEXT_CLASS = "android.widget.EditText"; - private static final String SCROLLVIEW_CLASS = "android.widget.ScrollView"; - private static final String LISTVIEW_CLASS = "android.widget.ListView"; - - private static final String ADD_NETWORK_MENU_CANCEL_BUTTON_TEXT = "CANCEL"; - private static final String ADD_NETWORK_MENU_SAVE_BUTTON_TEXT = "SAVE"; - private static final String ADD_NETWORK_PREFERENCE_TEXT = "Add network"; - private static final String CONFIGURE_WIFI_PREFERENCE_TEXT = "Wi‑Fi preferences"; - private static final String CONFIGURE_WIFI_ADVANCED_PREFERENCE_TEXT = "Advanced"; - private static final String CACERT_MENU_PLEASE_SELECT_TEXT = "Please select"; - private static final String CACERT_MENU_USE_SYSTEM_CERTS_TEXT = "Use system certificates"; - private static final String CACERT_MENU_DO_NOT_VALIDATE_TEXT = "Do not validate"; - private static final String USERCERT_MENU_PLEASE_SELECT_TEXT = "Please select"; - private static final String USERCERT_MENU_DO_NOT_PROVIDE_TEXT = "Do not provide"; - private static final String SECURITY_OPTION_NONE_TEXT = "None"; - private static final String SECURITY_OPTION_WEP_TEXT = "WEP"; - private static final String SECURITY_OPTION_PSK_TEXT = "WPA/WPA2 PSK"; - private static final String SECURITY_OPTION_EAP_TEXT = "802.1x EAP"; - private static final String EAP_METHOD_PEAP_TEXT = "PEAP"; - private static final String EAP_METHOD_TLS_TEXT = "TLS"; - private static final String EAP_METHOD_TTLS_TEXT = "TTLS"; - private static final String EAP_METHOD_PWD_TEXT = "PWD"; - private static final String EAP_METHOD_SIM_TEXT = "SIM"; - private static final String EAP_METHOD_AKA_TEXT = "AKA"; - private static final String EAP_METHOD_AKA_PRIME_TEXT = "AKA'"; - private static final String PHASE2_MENU_NONE_TEXT = "None"; - private static final String PHASE2_MENU_MSCHAPV2_TEXT = "MSCHAPV2"; - private static final String PHASE2_MENU_GTC_TEXT = "GTC"; - - private static final String ADD_NETWORK_MENU_ADV_TOGGLE_RES_ID = "wifi_advanced_togglebox"; - private static final String ADD_NETWORK_MENU_IP_SETTINGS_RES_ID = "ip_settings"; - private static final String ADD_NETWORK_MENU_PROXY_SETTINGS_RES_ID = "proxy_settings"; - private static final String ADD_NETWORK_MENU_SECURITY_OPTION_RES_ID = "security"; - private static final String ADD_NETWORK_MENU_EAP_METHOD_RES_ID = "method"; - private static final String ADD_NETWORK_MENU_SSID_RES_ID = "ssid"; - private static final String ADD_NETWORK_MENU_PHASE2_RES_ID = "phase2"; - private static final String ADD_NETWORK_MENU_CACERT_RES_ID = "ca_cert"; - private static final String ADD_NETWORK_MENU_USERCERT_RES_ID = "user_cert"; - private static final String ADD_NETWORK_MENU_NO_DOMAIN_WARNING_RES_ID = "no_domain_warning"; - private static final String ADD_NETWORK_MENU_NO_CACERT_WARNING_RES_ID = "no_ca_cert_warning"; - private static final String ADD_NETWORK_MENU_DOMAIN_LAYOUT_RES_ID = "l_domain"; - private static final String ADD_NETWORK_MENU_DOMAIN_RES_ID = "domain"; - private static final String ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID = "l_identity"; - private static final String ADD_NETWORK_MENU_ANONYMOUS_LAYOUT_RES_ID = "l_anonymous"; - private static final String ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID = "password_layout"; - private static final String ADD_NETWORK_MENU_SHOW_PASSWORD_LAYOUT_RES_ID = - "show_password_layout"; - private static final String ADD_NETWORK_MENU_PASSWORD_RES_ID = "password"; - - private static final BySelector ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR = - By.scrollable(true).clazz(SCROLLVIEW_CLASS); - private static final BySelector SPINNER_OPTIONS_SCROLLABLE_BY_SELECTOR = - By.scrollable(true).clazz(LISTVIEW_CLASS); private UiDevice mDevice; private CommandsHelper mCommandsHelper; - @Override + @Before public void setUp() throws Exception { - super.setUp(); - mDevice = UiDevice.getInstance(getInstrumentation()); + + mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); try { mDevice.setOrientationNatural(); } catch (RemoteException e) { throw new RuntimeException("failed to freeze device orientation", e); } // Ensure airplane mode is OFF so that wifi can be enabled using WiFiManager. - Settings.Global.putString(getInstrumentation().getContext().getContentResolver(), + Settings.Global.putString(InstrumentationRegistry.getTargetContext().getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, "0"); + Log.d(TAG, "sending airplane mode broadcast to device"); - mCommandsHelper = CommandsHelper.getInstance(); + mCommandsHelper = CommandsHelper.getInstance(InstrumentationRegistry.getInstrumentation()); mCommandsHelper.executeShellCommand(AIRPLANE_MODE_BROADCAST); } - @Override - protected void tearDown() throws Exception { + @After + public void tearDown() { // Exit all settings sub-menus. for (int i = 0; i < NUM_BACK_BUTTON_PRESSES; ++i) { mDevice.pressBack(); } mDevice.pressHome(); - super.tearDown(); } @Presubmit - @MediumTest + @Test public void testWiFiEnabled() throws Exception { verifyWiFiOnOrOff(true); } @Presubmit - @MediumTest + @Test public void testWiFiDisabled() throws Exception { verifyWiFiOnOrOff(false); } - @MediumTest - public void testWifiMenuLoadConfigure() throws Exception { - loadWiFiConfigureMenu(); - Thread.sleep(SLEEP_TIME); - UiObject2 configureWiFiHeading = mDevice.wait(Until.findObject - (By.text(CONFIGURE_WIFI_PREFERENCE_TEXT)), TIMEOUT); - assertNotNull("Configure WiFi menu has not loaded correctly", configureWiFiHeading); - } - - @MediumTest - public void testNetworkNotificationsOn() throws Exception { - verifyNetworkNotificationsOnOrOff(true); - } - - @MediumTest - public void testNetworkNotificationsOff() throws Exception { - verifyNetworkNotificationsOnOrOff(false); - } - - @MediumTest - public void testAddNetworkMenu_Default() throws Exception { - loadAddNetworkMenu(); - - // Submit button should be disabled by default, while cancel button should be enabled. - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - assertTrue(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_CANCEL_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // Check that the SSID field is defaults to the hint. - assertEquals("Enter the SSID", mDevice.wait(Until.findObject(By - .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SSID_RES_ID) - .clazz(EDIT_TEXT_CLASS)), TIMEOUT*2) - .getText()); - - // Check Security defaults to None. - assertEquals("None", mDevice.wait(Until.findObject(By - .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SECURITY_OPTION_RES_ID) - .clazz(SPINNER_CLASS)), TIMEOUT) - .getChildren().get(0).getText()); - - // Check advanced options are collapsed by default. - assertFalse(mDevice.wait(Until.findObject(By - .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ADV_TOGGLE_RES_ID) - .clazz(CHECKBOX_CLASS)), TIMEOUT).isChecked()); - - } - - @Suppress - @MediumTest - public void testAddNetworkMenu_Proxy() throws Exception { - loadAddNetworkMenu(); - - // Toggle advanced options. - mDevice.wait(Until.findObject(By - .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ADV_TOGGLE_RES_ID) - .clazz(CHECKBOX_CLASS)), TIMEOUT).click(); - - // Verify Proxy defaults to None. - BySelector proxySettingsBySelector = - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PROXY_SETTINGS_RES_ID) - .clazz(SPINNER_CLASS); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, proxySettingsBySelector); - assertEquals("None", mDevice.wait(Until.findObject(proxySettingsBySelector), TIMEOUT) - .getChildren().get(0).getText()); - - // Verify that Proxy Manual fields appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, proxySettingsBySelector); - mDevice.wait(Until.findObject(proxySettingsBySelector), TIMEOUT).click(); - mDevice.wait(Until.findObject(By.text("Manual")), TIMEOUT).click(); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "proxy_warning_limited_support")); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "proxy_hostname")); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "proxy_exclusionlist")); - - // Verify that Proxy Auto-Config options appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, proxySettingsBySelector); - mDevice.wait(Until.findObject(proxySettingsBySelector), TIMEOUT).click(); - mDevice.wait(Until.findObject(By.text("Proxy Auto-Config")), TIMEOUT).click(); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "proxy_pac")); - } - - @Suppress - @MediumTest - public void testAddNetworkMenu_IpSettings() throws Exception { - loadAddNetworkMenu(); - - // Toggle advanced options. - mDevice.wait(Until.findObject(By - .res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ADV_TOGGLE_RES_ID) - .clazz(CHECKBOX_CLASS)), TIMEOUT).click(); - - // Verify IP settings defaults to DHCP. - BySelector ipSettingsBySelector = - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IP_SETTINGS_RES_ID).clazz(SPINNER_CLASS); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, ipSettingsBySelector); - assertEquals("DHCP", mDevice.wait(Until.findObject(ipSettingsBySelector), TIMEOUT) - .getChildren().get(0).getText()); - - // Verify that Static IP settings options appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, ipSettingsBySelector).click(); - mDevice.wait(Until.findObject(By.text("Static")), TIMEOUT).click(); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "ipaddress")); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "gateway")); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "network_prefix_length")); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "dns1")); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, "dns2")); - } - - @Suppress - @MediumTest - public void testPhase2Settings() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - - BySelector phase2SettingsBySelector = - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PHASE2_RES_ID).clazz(SPINNER_CLASS); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, phase2SettingsBySelector); - assertEquals(PHASE2_MENU_NONE_TEXT, mDevice.wait(Until - .findObject(phase2SettingsBySelector), TIMEOUT).getChildren().get(0).getText()); - mDevice.wait(Until.findObject(phase2SettingsBySelector), TIMEOUT).click(); - Thread.sleep(SLEEP_TIME); - - // Verify Phase 2 authentication spinner options. - assertNotNull(mDevice.wait(Until.findObject(By.text(PHASE2_MENU_NONE_TEXT)), TIMEOUT)); - assertNotNull(mDevice.wait(Until.findObject(By.text(PHASE2_MENU_MSCHAPV2_TEXT)), TIMEOUT)); - assertNotNull(mDevice.wait(Until.findObject(By.text(PHASE2_MENU_GTC_TEXT)), TIMEOUT)); - } - - @Suppress - @MediumTest - public void testCaCertSettings() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - - BySelector caCertSettingsBySelector = - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID).clazz(SPINNER_CLASS); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, caCertSettingsBySelector); - assertEquals(CACERT_MENU_PLEASE_SELECT_TEXT, mDevice.wait(Until - .findObject(caCertSettingsBySelector), TIMEOUT).getChildren().get(0).getText()); - mDevice.wait(Until.findObject(caCertSettingsBySelector), TIMEOUT).click(); - Thread.sleep(SLEEP_TIME); - - // Verify CA certificate spinner options. - assertNotNull(mDevice.wait(Until.findObject( - By.text(CACERT_MENU_PLEASE_SELECT_TEXT)), TIMEOUT)); - assertNotNull(mDevice.wait(Until.findObject( - By.text(CACERT_MENU_USE_SYSTEM_CERTS_TEXT)), TIMEOUT)); - assertNotNull(mDevice.wait(Until.findObject( - By.text(CACERT_MENU_DO_NOT_VALIDATE_TEXT)), TIMEOUT)); - - // Verify that a domain field and warning appear when the user selects the - // "Use system certificates" option. - mDevice.wait(Until.findObject(By.text(CACERT_MENU_USE_SYSTEM_CERTS_TEXT)), TIMEOUT).click(); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_DOMAIN_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_NO_DOMAIN_WARNING_RES_ID)); - - // Verify that a warning appears when the user chooses the "Do Not Validate" option. - mDevice.wait(Until.findObject(caCertSettingsBySelector), TIMEOUT).click(); - mDevice.wait(Until.findObject(By.text(CACERT_MENU_DO_NOT_VALIDATE_TEXT)), TIMEOUT).click(); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_NO_CACERT_WARNING_RES_ID)); - } - - @Suppress - @MediumTest - public void testAddNetwork_NoSecurity() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_NONE_TEXT); - - // Entering an SSID is enough to enable the submit button. // TODO THIS GUY - enterSSID(TEST_SSID); - assertTrue(mDevice.wait(Until - .findObject(By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - } - - @Suppress - @MediumTest - public void testAddNetwork_WEP() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_WEP_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // Verify that WEP fields appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SHOW_PASSWORD_LAYOUT_RES_ID)); - - // Entering an SSID alone does not enable the submit button. - enterSSID(TEST_SSID); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // Submit button is only enabled after a password is entered. - enterPassword(TEST_PW_GE_8_CHAR); - assertTrue(mDevice.wait(Until - .findObject(By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - } - - @Suppress - @MediumTest - public void testAddNetwork_PSK() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_PSK_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // Verify that PSK fields appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SHOW_PASSWORD_LAYOUT_RES_ID)); - - // Entering an SSID alone does not enable the submit button. - enterSSID(TEST_SSID); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // Entering an password that is too short does not enable submit button. - enterPassword(TEST_PW_LT_8_CHAR); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // Submit button is only enabled after a password of valid length is entered. - enterPassword(TEST_PW_GE_8_CHAR); - assertTrue(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - } - - @Suppress - @MediumTest - public void testAddNetwork_EAP_PEAP() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - selectEAPMethod(EAP_METHOD_PEAP_TEXT); - - // Verify that EAP-PEAP fields appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PHASE2_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ANONYMOUS_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SHOW_PASSWORD_LAYOUT_RES_ID)); - - // Entering an SSID alone does not enable the submit button. - enterSSID(TEST_SSID); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - verifyCaCertificateSubmitConditions(); - } - - @Suppress - @MediumTest - public void testAddNetwork_EAP_TLS() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - selectEAPMethod(EAP_METHOD_TLS_TEXT); - - // Verify that EAP-TLS fields appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_USERCERT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID)); - - // Entering an SSID alone does not enable the submit button. - enterSSID(TEST_SSID); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // Selecting the User certificate "Do not provide" option alone does not enable the submit - // button. - selectUserCertificateOption(USERCERT_MENU_DO_NOT_PROVIDE_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - verifyCaCertificateSubmitConditions(); - } - - @Suppress - @MediumTest - public void testAddNetwork_EAP_TTLS() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - selectEAPMethod(EAP_METHOD_TTLS_TEXT); - - // Verify that EAP-TLS fields appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PHASE2_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_ANONYMOUS_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); - - // Entering an SSID alone does not enable the submit button. - enterSSID(TEST_SSID); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - verifyCaCertificateSubmitConditions(); - } - - @Suppress - @MediumTest - public void testAddNetwork_EAP_PWD() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - selectEAPMethod(EAP_METHOD_PWD_TEXT); - - // Verify that EAP-TLS fields appear. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_IDENTITY_LAYOUT_RES_ID)); - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_LAYOUT_RES_ID)); - - // Entering an SSID alone enables the submit button. - enterSSID(TEST_SSID); - assertTrue(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - } - - @Suppress - @MediumTest - public void testAddNetwork_EAP_SIM() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - selectEAPMethod(EAP_METHOD_SIM_TEXT); - - // Entering an SSID alone enables the submit button. - enterSSID(TEST_SSID); - assertTrue(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - } - - @Suppress - @MediumTest - public void testAddNetwork_EAP_AKA() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - selectEAPMethod(EAP_METHOD_AKA_TEXT); - - // Entering an SSID alone enables the submit button. - enterSSID(TEST_SSID); - assertTrue(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - } - - @Suppress - @MediumTest - public void testAddNetwork_EAP_AKA_PRIME() throws Exception { - loadAddNetworkMenu(); - selectSecurityOption(SECURITY_OPTION_EAP_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - selectEAPMethod(EAP_METHOD_AKA_PRIME_TEXT); - - // Entering an SSID alone enables the submit button. - enterSSID(TEST_SSID); - assertTrue(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - } - - private void verifyKeepWiFiOnDuringSleep(String settingToBeVerified, int settingValue) - throws Exception { - loadWiFiConfigureMenu(); - mDevice.wait(Until.findObject(By.text("Keep Wi‑Fi on during sleep")), TIMEOUT) - .click(); - mDevice.wait(Until.findObject(By.clazz("android.widget.CheckedTextView") - .text(settingToBeVerified)), TIMEOUT).click(); - Thread.sleep(SLEEP_TIME); - int keepWiFiOnSetting = - Settings.Global.getInt(getInstrumentation().getContext().getContentResolver(), - Settings.Global.WIFI_SLEEP_POLICY); - assertEquals(settingValue, keepWiFiOnSetting); - } - - private void verifyNetworkNotificationsOnOrOff(boolean verifyOn) - throws Exception { - // Enable network recommendations to enable the toggle switch for Network - // notifications - Settings.Global.putString(getInstrumentation().getContext().getContentResolver(), - Settings.Global.NETWORK_RECOMMENDATIONS_ENABLED, "1"); - if (verifyOn) { - Settings.Global.putString(getInstrumentation().getContext().getContentResolver(), - Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, "0"); - } - else { - Settings.Global.putString(getInstrumentation().getContext().getContentResolver(), - Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON, "1"); - } - loadWiFiConfigureMenu(); - mDevice.wait(Until.findObject(By.text("Open network notification")), TIMEOUT) - .click(); - Thread.sleep(SLEEP_TIME); - String wifiNotificationValue = - Settings.Global.getString(getInstrumentation().getContext().getContentResolver(), - Settings.Global.WIFI_NETWORKS_AVAILABLE_NOTIFICATION_ON); - if (verifyOn) { - assertEquals("1", wifiNotificationValue); - } - else { - assertEquals("0", wifiNotificationValue); - } - } - private void verifyWiFiOnOrOff(boolean verifyOn) throws Exception { - String switchText = "On"; - if (verifyOn) { - switchText = "Off"; - } - loadWiFiSettingsPage(!verifyOn); - mDevice.wait(Until - .findObject(By.res(SETTINGS_PACKAGE, "switch_bar").text(switchText)), TIMEOUT) - .click(); - Thread.sleep(SLEEP_TIME); - String wifiValue = - Settings.Global.getString(getInstrumentation().getContext().getContentResolver(), - Settings.Global.WIFI_ON); - if (verifyOn) { - // 1 is Enabled, 2 is Enabled while airplane mode is ON. - assertTrue(wifiValue.equals("1") || wifiValue.equals("2")); - } - else { - assertEquals("0", wifiValue); - } - } - - private void verifyCaCertificateSubmitConditions() throws Exception { - // Selecting the CA certificate "Do not validate" option enables the submit button. - selectCaCertificateOption(CACERT_MENU_DO_NOT_VALIDATE_TEXT); - assertTrue(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // However, selecting the CA certificate "Use system certificates option" is not enough to - // enable the submit button. - selectCaCertificateOption(CACERT_MENU_USE_SYSTEM_CERTS_TEXT); - assertFalse(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); - - // Submit button is only enabled after a domain is entered as well. - enterDomain(TEST_DOMAIN); - assertTrue(mDevice.wait(Until.findObject( - By.text(ADD_NETWORK_MENU_SAVE_BUTTON_TEXT)), TIMEOUT).isEnabled()); + loadWiFiSettingsPage(!verifyOn); + mDevice.wait(Until.findObject(By.res(SETTINGS_PACKAGE, "switch_widget")), TIMEOUT) + .click(); + Thread.sleep(SLEEP_TIME); + final String wifiValue = Settings.Global.getString( + InstrumentationRegistry.getTargetContext().getContentResolver(), + Settings.Global.WIFI_ON); + if (verifyOn) { + // 1 is Enabled, 2 is Enabled while airplane mode is ON. + assertThat(wifiValue).isAnyOf("1", "2"); + } else { + assertThat(wifiValue).isEqualTo("0"); + } } private void loadWiFiSettingsPage(boolean wifiEnabled) throws Exception { - WifiManager wifiManager = (WifiManager)getInstrumentation().getContext() + WifiManager wifiManager = (WifiManager) InstrumentationRegistry.getTargetContext() .getSystemService(Context.WIFI_SERVICE); wifiManager.setWifiEnabled(wifiEnabled); - SettingsHelper.launchSettingsPage(getInstrumentation().getContext(), + SettingsHelper.launchSettingsPage(InstrumentationRegistry.getTargetContext(), Settings.ACTION_WIFI_SETTINGS); } - - private void loadWiFiConfigureMenu() throws Exception { - loadWiFiSettingsPage(false); - Thread.sleep(TIMEOUT); - mDevice.wait(Until.findObject(By.text(CONFIGURE_WIFI_PREFERENCE_TEXT)), TIMEOUT).click(); - mDevice.wait(Until.findObject( - By.text(CONFIGURE_WIFI_ADVANCED_PREFERENCE_TEXT)), TIMEOUT).click(); - } - - private void loadAddNetworkMenu() throws Exception { - loadWiFiSettingsPage(true); - for (int attempts = 0; attempts < MAX_ADD_NETWORK_BUTTON_ATTEMPTS; ++attempts) { - try { - findOrScrollToObject(By.scrollable(true), By.text(ADD_NETWORK_PREFERENCE_TEXT)) - .click(); - } catch (StaleObjectException e) { - // The network list might have been updated between when the Add network button was - // found, and when it UI automator attempted to click on it. Retry. - continue; - } - // If we get here, we successfully clicked on the Add network button, so we are done. - Thread.sleep(SLEEP_TIME*5); - return; - } - - fail("Failed to load Add Network Menu after " + MAX_ADD_NETWORK_BUTTON_ATTEMPTS - + " retries"); - } - - private void selectSecurityOption(String securityOption) throws Exception { - // We might not need to scroll to the security options if not enough add network menu - // options are visible. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SECURITY_OPTION_RES_ID) - .clazz(SPINNER_CLASS)).click(); - Thread.sleep(SLEEP_TIME); - mDevice.wait(Until.findObject(By.text(securityOption)), TIMEOUT).click(); - } - - private void selectEAPMethod(String eapMethod) throws Exception { - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_EAP_METHOD_RES_ID).clazz(SPINNER_CLASS)) - .click(); - Thread.sleep(SLEEP_TIME); - findOrScrollToObject(SPINNER_OPTIONS_SCROLLABLE_BY_SELECTOR, By.text(eapMethod)).click(); - } - - private void selectUserCertificateOption(String userCertificateOption) throws Exception { - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_USERCERT_RES_ID).clazz(SPINNER_CLASS)) - .click(); - mDevice.wait(Until.findObject(By.text(userCertificateOption)), TIMEOUT).click(); - } - - private void selectCaCertificateOption(String caCertificateOption) throws Exception { - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_CACERT_RES_ID).clazz(SPINNER_CLASS)) - .click(); - mDevice.wait(Until.findObject(By.text(caCertificateOption)), TIMEOUT).click(); - } - - private void enterSSID(String ssid) throws Exception { - // We might not need to scroll to the SSID option if not enough add network menu options - // are visible. - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_SSID_RES_ID).clazz(EDIT_TEXT_CLASS)) - .setText(ssid); - } - - private void enterPassword(String password) throws Exception { - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_PASSWORD_RES_ID).clazz(EDIT_TEXT_CLASS)) - .setText(password); - } - - private void enterDomain(String domain) throws Exception { - findOrScrollToObject(ADD_NETWORK_MENU_SCROLLABLE_BY_SELECTOR, - By.res(SETTINGS_PACKAGE, ADD_NETWORK_MENU_DOMAIN_RES_ID)).setText(domain); - } - - // Use this if the UI object might or might not need to be scrolled to. - private UiObject2 findOrScrollToObject(BySelector scrollableSelector, BySelector objectSelector) - throws Exception { - UiObject2 object = mDevice.wait(Until.findObject(objectSelector), TIMEOUT); - if (object == null) { - object = scrollToObject(scrollableSelector, objectSelector); - } - return object; - } - - private UiObject2 scrollToObject(BySelector scrollableSelector, BySelector objectSelector) - throws Exception { - UiObject2 scrollable = mDevice.wait(Until.findObject(scrollableSelector), TIMEOUT); - if (scrollable == null) { - fail("Could not find scrollable UI object identified by " + scrollableSelector); - } - UiObject2 found = null; - // Scroll all the way up first, then all the way down. - while (true) { - // Optimization: terminate if we find the object while scrolling up to reset, so - // we save the time spent scrolling down again. - boolean canScrollAgain = scrollable.scroll(Direction.UP, SCROLL_UP_PERCENT, - SCROLL_SPEED); - found = mDevice.findObject(objectSelector); - if (found != null) return found; - if (!canScrollAgain) break; - } - for (int attempts = 0; found == null && attempts < MAX_SCROLL_ATTEMPTS; ++attempts) { - // Return value of UiObject2.scroll() is not reliable, so do not use it in loop - // condition, in case it causes this loop to terminate prematurely. - scrollable.scroll(Direction.DOWN, SCROLL_DOWN_PERCENT, SCROLL_SPEED); - found = mDevice.findObject(objectSelector); - } - if (found == null) { - fail("Could not scroll to UI object identified by " + objectSelector); - } - return found; - } }