diff -r 000000000000 -r 6474c204b198 mobile/android/base/tests/testSettingsMenuItems.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mobile/android/base/tests/testSettingsMenuItems.java Wed Dec 31 06:09:35 2014 +0100 @@ -0,0 +1,250 @@ +package org.mozilla.gecko.tests; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; + +import org.mozilla.gecko.Actions; +import org.mozilla.gecko.AppConstants; + +/** This patch tests the Sections present in the Settings Menu and the + * default values for them + */ +public class testSettingsMenuItems extends PixelTest { + String BRAND_NAME = "(Fennec|Nightly|Aurora|Firefox|Firefox Beta)"; + + /** + * The following String[][] (arrays) match the menu hierarchy for each section. + * Each String[] (array) represents the menu items/choices in the following order: + * + * itemTitle { defaultValue [options] } + * + * where defaultValue is optional, and there can be multiple options. + * + * These menu items are the ones that are always present - to test menu items that differ + * based on build (e.g., release vs. nightly), add the items in addConditionalSettings. + */ + + // Customize menu items. + String[] PATH_CUSTOMIZE = { "Customize" }; + String[][] OPTIONS_CUSTOMIZE = { + { "Home" }, + { "Search", "", "Show search suggestions", "Installed search engines"}, + { "Tabs", "Don't restore after quitting " + BRAND_NAME, "Always restore", "Don't restore after quitting " + BRAND_NAME }, + { "Import from Android", "", "Bookmarks", "History", "Import" }, + }; + + // Home panel menu items. + String[] PATH_HOME = { "Customize", "Home" }; + String[][] OPTIONS_HOME = { + { "Panels" }, + { "Automatic updates", "Enabled", "Enabled", "Only over Wi-Fi" }, + }; + + // Display menu items. + String[] PATH_DISPLAY = { "Display" }; + String[][] OPTIONS_DISPLAY = { + { "Text size" }, + { "Title bar", "Show page title", "Show page title", "Show page address" }, + { "Advanced" }, + { "Character encoding", "Don't show menu", "Show menu", "Don't show menu" }, + { "Plugins", "Tap to play", "Enabled", "Tap to play", "Disabled" }, + }; + + // Privacy menu items. + String[] PATH_PRIVACY = { "Privacy" }; + String[][] OPTIONS_PRIVACY = { + { "Tracking", "Do not tell sites anything about my tracking preferences", "Tell sites that I do not want to be tracked", "Tell sites that I want to be tracked", "Do not tell sites anything about my tracking preferences" }, + { "Cookies", "Enabled", "Enabled, excluding 3rd party", "Disabled" }, + { "Remember passwords" }, + { "Use master password" }, + { "Clear private data", "", "Browsing history", "Downloads", "Form & search history", "Cookies & active logins", "Saved passwords", "Cache", "Offline website data", "Site settings", "Clear data" }, + }; + + // Mozilla/vendor menu items. + String[] PATH_MOZILLA = { "Mozilla" }; + String[][] OPTIONS_MOZILLA = { + { "About " + BRAND_NAME }, + { "FAQs" }, + { "Give feedback" }, + { "Show product announcements" }, + { "Data choices" }, + { BRAND_NAME + " Health Report", "Shares data with Mozilla about your browser health and helps you understand your browser performance" }, + { "View my Health Report" }, + }; + + /* + * This sets up a hierarchy of settings to test. + * + * The keys are String arrays representing the path through menu items + * (the single-item arrays being top-level categories), and each value + * is a List of menu items contained within each category. + * + * Each menu item is itself an array as follows: + * - item title + * - default string value of item (optional) + * - string values of options that are displayed once clicked (optional). + */ + public void setupSettingsMap(Map> settingsMap) { + settingsMap.put(PATH_CUSTOMIZE, new ArrayList(Arrays.asList(OPTIONS_CUSTOMIZE))); + settingsMap.put(PATH_HOME, new ArrayList(Arrays.asList(OPTIONS_HOME))); + settingsMap.put(PATH_DISPLAY, new ArrayList(Arrays.asList(OPTIONS_DISPLAY))); + settingsMap.put(PATH_PRIVACY, new ArrayList(Arrays.asList(OPTIONS_PRIVACY))); + settingsMap.put(PATH_MOZILLA, new ArrayList(Arrays.asList(OPTIONS_MOZILLA))); + } + + public void testSettingsMenuItems() { + blockForGeckoReady(); + + Map> settingsMenuItems = new HashMap>(); + setupSettingsMap(settingsMenuItems); + + // Set special handling for Settings items that are conditionally built. + addConditionalSettings(settingsMenuItems); + + selectMenuItem("Settings"); + waitForText("Settings"); + + // Dismiss the Settings screen and verify that the view is returned to about:home page + mActions.sendSpecialKey(Actions.SpecialKey.BACK); + + // Waiting for page title to appear to be sure that is fully loaded before opening the menu + waitForText("Enter Search"); + verifyUrl("about:home"); + + selectMenuItem("Settings"); + waitForText("Settings"); + + checkForSync(mDevice); + + checkMenuHierarchy(settingsMenuItems); + } + + /** + * Check for Sync in settings. + * + * Sync location is a top level menu item on phones, but is under "Customize" on tablets. + * + */ + public void checkForSync(Device device) { + if (device.type.equals("tablet")) { + // Select "Customize" from settings. + String customizeString = "^Customize$"; + waitForEnabledText(customizeString); + mSolo.clickOnText(customizeString); + } + mAsserter.ok(mSolo.waitForText("Sync"), "Waiting for Sync option", "The Sync option is present"); + } + + /** + * Check for conditions for building certain settings, and add them to be tested + * if they are present. + */ + public void addConditionalSettings(Map> settingsMap) { + // Preferences dependent on RELEASE_BUILD + if (!AppConstants.RELEASE_BUILD) { + // Text reflow - only built if *not* release build + String[] textReflowUi = { "Text reflow" }; + settingsMap.get(PATH_DISPLAY).add(textReflowUi); + + // Anonymous cell tower/wifi collection - only built if *not* release build + String[] networkReportingUi = { "Mozilla Location Service", "Receives Wi-Fi and cellular location data when running in the background and shares it with Mozilla to improve our geolocation service" }; + settingsMap.get(PATH_MOZILLA).add(networkReportingUi); + + String[] learnMoreUi = { "Learn more" }; + settingsMap.get(PATH_MOZILLA).add(learnMoreUi); + } + + // Automatic updates + if (AppConstants.MOZ_UPDATER) { + String[] autoUpdateUi = { "Download updates automatically", "Only over Wi-Fi", "Always", "Only over Wi-Fi", "Never" }; + settingsMap.get(PATH_CUSTOMIZE).add(autoUpdateUi); + } + + // Crash reporter + if (AppConstants.MOZ_CRASHREPORTER) { + String[] crashReporterUi = { "Crash Reporter", BRAND_NAME + " submits crash reports to help Mozilla make your browser more stable and secure" }; + settingsMap.get(PATH_MOZILLA).add(crashReporterUi); + } + + // Telemetry + if (AppConstants.MOZ_TELEMETRY_REPORTING) { + String[] telemetryUi = { "Telemetry", "Shares performance, usage, hardware and customization data about your browser with Mozilla to help us make " + BRAND_NAME + " better" }; + settingsMap.get(PATH_MOZILLA).add(telemetryUi); + } + } + + public void checkMenuHierarchy(Map> settingsMap) { + // Check the items within each category. + String section = null; + for (Entry> e : settingsMap.entrySet()) { + final String[] menuPath = e.getKey(); + + for (String menuItem : menuPath) { + section = "^" + menuItem + "$"; + + waitForEnabledText(section); + mSolo.clickOnText(section); + } + + List sectionItems = e.getValue(); + + // Check each item of the section. + for (String[] item : sectionItems) { + int itemLen = item.length; + + // Each item must at least have a title. + mAsserter.ok(item.length > 0, "Section-item", "Each item must at least have a title"); + + // Check item title. + String itemTitle = "^" + item[0] + "$"; + boolean foundText = waitForPreferencesText(itemTitle); + + mAsserter.ok(foundText, "Waiting for settings item " + itemTitle + " in section " + section, + "The " + itemTitle + " option is present in section " + section); + // Check item default, if it exists. + if (itemLen > 1) { + String itemDefault = "^" + item[1] + "$"; + foundText = waitForPreferencesText(itemDefault); + mAsserter.ok(foundText, "Waiting for settings item default " + itemDefault + + " in section " + section, + "The " + itemDefault + " default is present in section " + section); + } + // Check item choices, if they exist. + if (itemLen > 2) { + waitForEnabledText(itemTitle); + mSolo.clickOnText(itemTitle); + for (int i = 2; i < itemLen; i++) { + String itemChoice = "^" + item[i] + "$"; + foundText = waitForPreferencesText(itemChoice); + mAsserter.ok(foundText, "Waiting for settings item choice " + itemChoice + + " in section " + section, + "The " + itemChoice + " choice is present in section " + section); + } + + // Leave submenu after checking. + if (waitForText("^Cancel$")) { + mSolo.clickOnText("^Cancel$"); + } else { + // Some submenus aren't dialogs, but are nested screens; exit using "back". + mActions.sendSpecialKey(Actions.SpecialKey.BACK); + } + } + } + + // Navigate back if on a phone. Tablets shouldn't do this because they use headers and fragments. + if (mDevice.type.equals("phone")) { + int menuDepth = menuPath.length; + while (menuDepth > 0) { + mActions.sendSpecialKey(Actions.SpecialKey.BACK); + menuDepth--; + // Sleep so subsequent back actions aren't lost. + mSolo.sleep(150); + } + } + } + } +}