2013-11-07 08:18:51 -08:00
package org.mozilla.gecko.tests ;
2013-01-16 02:34:54 -08:00
2013-11-07 08:18:51 -08:00
import org.mozilla.gecko.* ;
2013-01-16 02:34:54 -08:00
2013-08-26 15:56:44 -07:00
import java.util.Arrays ;
import java.util.ArrayList ;
import java.util.List ;
2013-06-26 10:57:52 -07:00
import java.util.Map ;
import java.util.Map.Entry ;
import java.util.HashMap ;
/ * * This patch tests the Sections present in the Settings Menu and the
2013-02-22 19:42:46 -08:00
* default values for them
* /
2013-01-16 02:34:54 -08:00
public class testSettingsMenuItems extends PixelTest {
2013-09-10 17:18:04 -07:00
int mMidWidth ;
int mMidHeight ;
2013-06-26 10:57:52 -07:00
String BRAND_NAME = " (Fennec|Nightly|Aurora|Firefox|Firefox Beta) " ;
2013-08-26 15:56:44 -07:00
/ * *
* 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 < code > addConditionalSettings < / code > .
* /
// Customize menu items.
2013-06-26 10:57:52 -07:00
String [ ] [ ] OPTIONS_CUSTOMIZE = {
2013-08-26 15:56:44 -07:00
{ " Search settings " , " " , " Show search suggestions " , " Installed search engines " } ,
2013-12-16 20:37:16 -08:00
{ " Home " , " " , " Panels " } ,
2013-08-26 15:56:44 -07:00
{ " Import from Android " , " " , " Bookmarks " , " History " , " Import " } ,
{ " Tabs " , " Don't restore after quitting " + BRAND_NAME , " Always restore " , " Don't restore after quitting " + BRAND_NAME } ,
} ;
2013-06-26 10:57:52 -07:00
2013-08-26 15:56:44 -07:00
// Display menu items.
2013-06-26 10:57:52 -07:00
String [ ] [ ] OPTIONS_DISPLAY = {
{ " Text size " } ,
{ " Title bar " , " Show page title " , " Show page title " , " Show page address " } ,
2013-08-01 19:10:26 -07:00
{ " Advanced " } ,
2013-06-26 10:57:52 -07:00
{ " Character encoding " , " Don't show menu " , " Show menu " , " Don't show menu " } ,
{ " Plugins " , " Tap to play " , " Enabled " , " Tap to play " , " Disabled " } ,
} ;
2013-08-26 15:56:44 -07:00
// Privacy menu items.
2013-06-26 10:57:52 -07:00
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 & download history " , " Downloaded files " , " Form & search history " , " Cookies & active logins " , " Saved passwords " , " Cache " , " Offline website data " , " Site settings " , " Clear data " } ,
} ;
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 " } ,
} ;
2013-01-16 02:34:54 -08:00
2013-08-26 15:56:44 -07:00
/ *
* This sets up a hierarchy of settings to test .
*
* The keys are the top - level settings 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 < String , List < String [ ] > > settingsMap ) {
settingsMap . put ( " Customize " , new ArrayList < String [ ] > ( Arrays . asList ( OPTIONS_CUSTOMIZE ) ) ) ;
settingsMap . put ( " Display " , new ArrayList < String [ ] > ( Arrays . asList ( OPTIONS_DISPLAY ) ) ) ;
settingsMap . put ( " Privacy " , new ArrayList < String [ ] > ( Arrays . asList ( OPTIONS_PRIVACY ) ) ) ;
settingsMap . put ( " Mozilla " , new ArrayList < String [ ] > ( Arrays . asList ( OPTIONS_MOZILLA ) ) ) ;
}
2013-01-16 02:34:54 -08:00
@Override
protected int getTestType ( ) {
return TEST_MOCHITEST ;
}
public void testSettingsMenuItems ( ) {
blockForGeckoReady ( ) ;
2013-09-10 17:18:04 -07:00
mMidWidth = mDriver . getGeckoWidth ( ) / 2 ;
mMidHeight = mDriver . getGeckoHeight ( ) / 2 ;
2013-01-16 02:34:54 -08:00
2013-08-26 15:56:44 -07:00
Map < String , List < String [ ] > > settingsMenuItems = new HashMap < String , List < String [ ] > > ( ) ;
setupSettingsMap ( settingsMenuItems ) ;
// Set special handling for Settings items that are conditionally built.
addConditionalSettings ( settingsMenuItems ) ;
2013-01-16 02:34:54 -08:00
selectMenuItem ( " Settings " ) ;
2013-07-31 08:50:17 -07:00
waitForText ( " Settings " ) ;
2013-01-16 02:34:54 -08:00
2013-02-22 19:42:46 -08:00
// Dismiss the Settings screen and verify that the view is returned to about:home page
2013-01-16 02:34:54 -08:00
mActions . sendSpecialKey ( Actions . SpecialKey . BACK ) ;
2013-08-06 09:51:20 -07:00
// Waiting for page title to appear to be sure that is fully loaded before opening the menu
waitForText ( " Enter Search " ) ;
2013-02-22 19:42:46 -08:00
verifyUrl ( " about:home " ) ;
2013-01-16 02:34:54 -08:00
2013-02-22 19:42:46 -08:00
selectMenuItem ( " Settings " ) ;
2013-07-31 08:50:17 -07:00
waitForText ( " Settings " ) ;
2013-06-26 10:57:52 -07:00
checkForSync ( mDevice ) ;
2013-01-16 02:34:54 -08:00
2013-06-26 10:57:52 -07:00
checkMenuHierarchy ( settingsMenuItems ) ;
2013-01-16 02:34:54 -08:00
}
2013-02-22 19:42:46 -08:00
2013-06-26 10:57:52 -07:00
/ * *
* 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 ) ;
2013-01-16 02:34:54 -08:00
}
2013-06-26 10:57:52 -07:00
mAsserter . ok ( mSolo . waitForText ( " Sync " ) , " Waiting for Sync option " , " The Sync option is present " ) ;
2013-01-16 02:34:54 -08:00
}
2013-06-26 10:57:52 -07:00
2013-08-26 15:56:44 -07:00
/ * *
* Check for conditions for building certain settings , and add them to be tested
* if they are present .
* /
public void addConditionalSettings ( Map < String , List < String [ ] > > settingsMap ) {
2013-11-18 11:50:12 -08:00
// Preferences dependent on RELEASE_BUILD
if ( ! AppConstants . RELEASE_BUILD ) {
// Text reflow - only built if *not* release build
String [ ] textReflowUi = { " Text reflow " } ;
settingsMap . get ( " Display " ) . add ( textReflowUi ) ;
2013-08-26 15:56:44 -07:00
2013-11-18 11:50:12 -08:00
// Anonymous cell tower/wifi collection - only built if *not* release build
String [ ] networkReportingUi = { " Mozilla location services " , " Help improve geolocation services for the Open Web by letting " + BRAND_NAME + " collect and send anonymous cellular tower data " } ;
settingsMap . get ( " Mozilla " ) . add ( networkReportingUi ) ;
}
// Automatic updates
if ( AppConstants . MOZ_UPDATER ) {
2013-11-27 08:39:23 -08:00
String [ ] autoUpdateUi = { " Download updates automatically " , " Only over Wi-Fi " , " Always " , " Only over Wi-Fi " , " Never " } ;
2013-11-18 11:50:12 -08:00
settingsMap . get ( " 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 ( " 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 ( " Mozilla " ) . add ( telemetryUi ) ;
2013-08-26 15:56:44 -07:00
}
}
public void checkMenuHierarchy ( Map < String , List < String [ ] > > settingsMap ) {
2013-06-26 10:57:52 -07:00
// Check the items within each category.
2013-08-26 15:56:44 -07:00
for ( Entry < String , List < String [ ] > > e : settingsMap . entrySet ( ) ) {
2013-06-26 10:57:52 -07:00
String section = " ^ " + e . getKey ( ) + " $ " ;
2013-08-26 15:56:44 -07:00
List < String [ ] > sectionItems = e . getValue ( ) ;
2013-06-26 10:57:52 -07:00
waitForEnabledText ( section ) ;
mSolo . clickOnText ( section ) ;
// 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 ] + " $ " ;
2013-09-10 17:18:07 -07:00
boolean foundText = waitExtraForText ( itemTitle ) ;
2013-09-10 17:18:04 -07:00
mAsserter . ok ( foundText , " Waiting for settings item " + itemTitle + " in section " + section ,
2013-06-26 10:57:52 -07:00
" The " + itemTitle + " option is present in section " + section ) ;
// Check item default, if it exists.
if ( itemLen > 1 ) {
String itemDefault = " ^ " + item [ 1 ] + " $ " ;
2013-09-10 17:18:07 -07:00
foundText = waitExtraForText ( itemDefault ) ;
2013-09-10 17:18:04 -07:00
mAsserter . ok ( foundText , " Waiting for settings item default " + itemDefault
2013-06-26 10:57:52 -07:00
+ " in section " + section ,
" The " + itemDefault + " default is present in section " + section ) ;
2013-02-22 19:42:46 -08:00
}
2013-06-26 10:57:52 -07:00
// Check item choices, if they exist.
if ( itemLen > 2 ) {
2013-09-10 17:18:04 -07:00
waitForEnabledText ( itemTitle ) ;
mSolo . clickOnText ( itemTitle ) ;
for ( int i = 2 ; i < itemLen ; i + + ) {
String itemChoice = " ^ " + item [ i ] + " $ " ;
2013-09-10 17:18:07 -07:00
foundText = waitExtraForText ( itemChoice ) ;
2013-09-10 17:18:04 -07:00
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 ) ;
}
2013-06-26 10:57:52 -07:00
}
}
// Navigate back a screen if on a phone.
if ( mDevice . type . equals ( " phone " ) ) {
// Click back to return to previous menu. Tablets shouldn't do this because they use headers and fragments.
mActions . sendSpecialKey ( Actions . SpecialKey . BACK ) ;
2013-02-22 19:42:46 -08:00
}
}
2013-01-16 02:34:54 -08:00
}
2013-06-26 10:57:52 -07:00
2013-09-10 17:18:07 -07:00
// Solo.waitForText usually scrolls down in a view when text is not visible.
// In this test, Solo.waitForText scrolling does not work, so we use this
// hack to do the same thing.
private boolean waitExtraForText ( String txt ) {
boolean foundText = waitForText ( txt ) ;
if ( ! foundText ) {
// If we don't see the item, scroll down once in case it's off-screen.
// Hacky way to scroll down. solo.scroll* does not work in dialogs.
MotionEventHelper meh = new MotionEventHelper ( getInstrumentation ( ) , mDriver . getGeckoLeft ( ) , mDriver . getGeckoTop ( ) ) ;
meh . dragSync ( mMidWidth , mMidHeight + 100 , mMidWidth , mMidHeight - 100 ) ;
foundText = mSolo . waitForText ( txt ) ;
}
return foundText ;
2013-06-26 10:57:52 -07:00
}
2013-01-16 02:34:54 -08:00
}