2013-11-07 08:18:51 -08:00
package org.mozilla.gecko.tests ;
2013-03-18 02:15:17 -07:00
2013-11-07 08:18:51 -08:00
import org.mozilla.gecko.* ;
2013-03-18 02:15:17 -07:00
import android.app.Activity ;
import android.provider.Browser ;
import android.content.ContentValues ;
import android.content.ContentResolver ;
import android.database.Cursor ;
import android.net.Uri ;
import java.util.ArrayList ;
import java.util.Arrays ;
/ * *
* This test covers the Import from Android feature
* The test will save the existing bookmarks and history then will do an Import
* After the import it will check that the bookmarks and history items from Android are imported
* Then it will test that the old data from Firefox is not lost
* At the end will test that a second import will not duplicate information
* /
2013-08-13 05:37:48 -07:00
public class testImportFromAndroid extends AboutHomeTest {
2013-08-26 07:15:26 -07:00
private static final int MAX_WAIT_TIMEOUT = 15000 ;
2013-03-18 02:15:17 -07:00
ArrayList < String > androidData = new ArrayList < String > ( ) ;
ArrayList < String > firefoxHistory = new ArrayList < String > ( ) ;
@Override
protected int getTestType ( ) {
return TEST_MOCHITEST ;
}
public void testImportFromAndroid ( ) {
ArrayList < String > firefoxBookmarks = new ArrayList < String > ( ) ;
ArrayList < String > oldFirefoxHistory = new ArrayList < String > ( ) ;
ArrayList < String > oldFirefoxBookmarks = new ArrayList < String > ( ) ;
blockForGeckoReady ( ) ;
2013-08-26 07:15:26 -07:00
// Get the Android history
2013-03-18 02:15:17 -07:00
androidData = getAndroidUrls ( " history " ) ;
// Add some overlapping data from the Android Stock Browser to Firefox before import
addData ( ) ;
// Get the initial bookmarks and history
2013-08-21 07:11:13 -07:00
oldFirefoxBookmarks = mDatabaseHelper . getBrowserDBUrls ( DatabaseHelper . BrowserDataType . BOOKMARKS ) ;
oldFirefoxHistory = mDatabaseHelper . getBrowserDBUrls ( DatabaseHelper . BrowserDataType . HISTORY ) ;
2013-03-18 02:15:17 -07:00
// Import the bookmarks and history
importDataFromAndroid ( ) ;
// Get the Android history and the Firefox bookmarks and history lists
2013-08-21 07:11:13 -07:00
firefoxHistory = mDatabaseHelper . getBrowserDBUrls ( DatabaseHelper . BrowserDataType . HISTORY ) ;
firefoxBookmarks = mDatabaseHelper . getBrowserDBUrls ( DatabaseHelper . BrowserDataType . BOOKMARKS ) ;
2013-03-18 02:15:17 -07:00
/ * *
* Add a delay to make sure the imported items are added to the array lists
* if there are a lot of history items in the Android Browser database
* /
boolean success = waitForTest ( new BooleanTest ( ) {
@Override
public boolean test ( ) {
if ( androidData . size ( ) < = firefoxHistory . size ( ) ) {
return true ;
} else {
return false ;
}
}
} , MAX_WAIT_MS ) ;
/ * *
* Verify the history and bookmarks are imported
* Android history also contains the android bookmarks so we don ' t need to get them separately here
* /
for ( String url : androidData ) {
mAsserter . ok ( firefoxHistory . contains ( url ) | | firefoxBookmarks . contains ( url ) , " Checking if Android " + ( firefoxBookmarks . contains ( url ) ? " Bookmark " : " History item " ) + " is present " , url + " was imported " ) ;
}
// Verify the original Firefox Bookmarks are not deleted
for ( String url : oldFirefoxBookmarks ) {
mAsserter . ok ( firefoxBookmarks . contains ( url ) , " Checking if original Firefox Bookmark is present " , " Firefox Bookmark " + url + " was not removed " ) ;
}
// Verify the original Firefox History is not deleted
for ( String url : oldFirefoxHistory ) {
mAsserter . ok ( firefoxHistory . contains ( url ) , " Checking original Firefox History item is present " , " Firefox History item " + url + " was not removed " ) ;
}
// Import data again and make sure bookmarks are not duplicated
importDataFromAndroid ( ) ;
// Verify bookmarks are not duplicated
ArrayList < String > verifiedBookmarks = new ArrayList < String > ( ) ;
2013-08-21 07:11:13 -07:00
firefoxBookmarks = mDatabaseHelper . getBrowserDBUrls ( DatabaseHelper . BrowserDataType . BOOKMARKS ) ;
2013-03-18 02:15:17 -07:00
for ( String url : firefoxBookmarks ) {
if ( verifiedBookmarks . contains ( url ) ) {
mAsserter . ok ( false , " Bookmark " + url + " should not be duplicated " , " Bookmark is duplicated " ) ;
} else {
verifiedBookmarks . add ( url ) ;
mAsserter . ok ( true , " Bookmark " + url + " was not duplicated " , " Bookmark is unique " ) ;
}
}
// Verify history count is not increased after the second import
2013-08-21 07:11:13 -07:00
mAsserter . ok ( firefoxHistory . size ( ) = = mDatabaseHelper . getBrowserDBUrls ( DatabaseHelper . BrowserDataType . HISTORY ) . size ( ) , " The number of history entries was not increased " , " None of the items were duplicated " ) ;
2013-03-18 02:15:17 -07:00
}
private void addData ( ) {
ArrayList < String > androidBookmarks = getAndroidUrls ( " bookmarks " ) ;
// Add a few Bookmarks from Android to Firefox Mobile
for ( String url : androidBookmarks ) {
// Add every 3rd bookmark to Firefox Mobile
if ( ( androidBookmarks . indexOf ( url ) % 3 ) = = 0 ) {
2013-08-21 07:11:13 -07:00
mDatabaseHelper . addOrUpdateMobileBookmark ( " Bookmark Number " + String . valueOf ( androidBookmarks . indexOf ( url ) ) , url ) ;
2013-03-18 02:15:17 -07:00
}
}
// Add a few history items in Firefox Mobile
ContentResolver resolver = getActivity ( ) . getContentResolver ( ) ;
2013-11-07 08:18:51 -08:00
Uri uri = Uri . parse ( " content:// " + TestConstants . ANDROID_PACKAGE_NAME + " .db.browser/history " ) ;
2014-01-14 21:45:59 -08:00
uri = uri . buildUpon ( ) . appendQueryParameter ( " profile " , GeckoProfile . DEFAULT_PROFILE )
2013-03-18 02:15:17 -07:00
. appendQueryParameter ( " sync " , " true " ) . build ( ) ;
for ( String url : androidData ) {
// Add every 3rd website from Android History to Firefox Mobile
if ( ( androidData . indexOf ( url ) % 3 ) = = 0 ) {
ContentValues values = new ContentValues ( ) ;
values . put ( " title " , " Page " + url ) ;
values . put ( " url " , url ) ;
values . put ( " date " , System . currentTimeMillis ( ) ) ;
values . put ( " visits " , androidData . indexOf ( url ) ) ;
resolver . insert ( uri , values ) ;
}
}
}
private void importDataFromAndroid ( ) {
waitForText ( " Enter Search or Address " ) ;
2013-08-21 07:11:13 -07:00
selectSettingsItem ( StringHelper . CUSTOMIZE_SECTION_LABEL , StringHelper . IMPORT_FROM_ANDROID_LABEL ) ;
2013-03-18 02:15:17 -07:00
2013-08-26 07:15:26 -07:00
// Wait for the Import form Android pop-up to be opened. It has the same title as the option so waiting for the "Cancel" button
2013-03-18 02:15:17 -07:00
waitForText ( " Cancel " ) ;
mSolo . clickOnButton ( " Import " ) ;
2013-08-26 07:15:26 -07:00
// Wait until the import pop-up is dismissed. This depending on the number of items in the android history can take up to a few seconds
boolean importComplete = waitForTest ( new BooleanTest ( ) {
public boolean test ( ) {
return ! mSolo . searchText ( " Please wait... " ) ;
}
} , MAX_WAIT_TIMEOUT ) ;
mAsserter . ok ( importComplete , " Waiting for import to finish and the pop-up to be dismissed " , " Import was completed and the pop-up was dismissed " ) ;
2013-03-18 02:15:17 -07:00
// Import has finished. Waiting to get back to the Settings Menu and looking for the Import&Export subsection
2013-06-26 10:57:52 -07:00
if ( " phone " . equals ( mDevice . type ) ) {
// Phones don't have headers like tablets, so we need to pop up one more level.
2013-08-21 07:11:13 -07:00
waitForText ( StringHelper . IMPORT_FROM_ANDROID_LABEL ) ;
2013-06-26 10:57:52 -07:00
mActions . sendSpecialKey ( Actions . SpecialKey . BACK ) ;
}
2013-08-26 07:15:26 -07:00
waitForText ( " Privacy " ) ; // Settings is a header for the settings menu page. Waiting for Privacy ensures we are back in the top Settings view
2013-03-18 02:15:17 -07:00
mActions . sendSpecialKey ( Actions . SpecialKey . BACK ) ; // Exit Settings
2013-06-26 10:57:52 -07:00
// Make sure the settings menu has been closed.
mAsserter . ok ( mSolo . waitForText ( " Enter Search or Address " ) , " Waiting for search bar " , " Search bar found " ) ;
2013-03-18 02:15:17 -07:00
}
public ArrayList < String > getAndroidUrls ( String data ) {
// Return bookmarks or history depending on what the user asks for
ArrayList < String > urls = new ArrayList < String > ( ) ;
ContentResolver resolver = getActivity ( ) . getContentResolver ( ) ;
Browser mBrowser = new Browser ( ) ;
Cursor cursor = null ;
try {
if ( data . equals ( " history " ) ) {
cursor = mBrowser . getAllVisitedUrls ( resolver ) ;
} else if ( data . equals ( " bookmarks " ) ) {
cursor = mBrowser . getAllBookmarks ( resolver ) ;
}
if ( cursor ! = null ) {
cursor . moveToFirst ( ) ;
for ( int i = 0 ; i < cursor . getCount ( ) ; i + + ) {
urls . add ( cursor . getString ( cursor . getColumnIndex ( " url " ) ) ) ;
if ( ! cursor . isLast ( ) ) {
cursor . moveToNext ( ) ;
}
}
}
} finally {
if ( cursor ! = null ) {
cursor . close ( ) ;
}
}
return urls ;
}
public void deleteImportedData ( ) {
// Bookmarks
ArrayList < String > androidBookmarks = getAndroidUrls ( " bookmarks " ) ;
for ( String url : androidBookmarks ) {
2013-08-21 07:11:13 -07:00
mDatabaseHelper . deleteBookmark ( url ) ;
2013-03-18 02:15:17 -07:00
}
// History
for ( String url : androidData ) {
2013-08-21 07:11:13 -07:00
mDatabaseHelper . deleteHistoryItem ( url ) ;
2013-03-18 02:15:17 -07:00
}
}
public void tearDown ( ) throws Exception {
deleteImportedData ( ) ;
super . tearDown ( ) ;
}
}