gecko-dev/mobile/android/base/tests/testDistribution.java
Brian Nicholson 4a207df851 Bug 905703 - Remove preprocessing from robocop harness and tests. r=nalexander
--HG--
rename : build/mobile/robocop/Actions.java.in => build/mobile/robocop/Actions.java
rename : build/mobile/robocop/Assert.java.in => build/mobile/robocop/Assert.java
rename : build/mobile/robocop/Driver.java.in => build/mobile/robocop/Driver.java
rename : build/mobile/robocop/Element.java.in => build/mobile/robocop/Element.java
rename : build/mobile/robocop/FennecInstrumentationTestRunner.java.in => build/mobile/robocop/FennecInstrumentationTestRunner.java
rename : build/mobile/robocop/FennecMochitestAssert.java.in => build/mobile/robocop/FennecMochitestAssert.java
rename : build/mobile/robocop/FennecNativeActions.java.in => build/mobile/robocop/FennecNativeActions.java
rename : build/mobile/robocop/FennecNativeDriver.java.in => build/mobile/robocop/FennecNativeDriver.java
rename : build/mobile/robocop/FennecNativeElement.java.in => build/mobile/robocop/FennecNativeElement.java
rename : build/mobile/robocop/FennecTalosAssert.java.in => build/mobile/robocop/FennecTalosAssert.java
rename : build/mobile/robocop/PaintedSurface.java.in => build/mobile/robocop/PaintedSurface.java
rename : build/mobile/robocop/RoboCopException.java.in => build/mobile/robocop/RoboCopException.java
rename : build/mobile/robocop/RobocopUtils.java.in => build/mobile/robocop/RobocopUtils.java
rename : mobile/android/base/tests/AboutHomeTest.java.in => mobile/android/base/tests/AboutHomeTest.java
rename : mobile/android/base/tests/BaseTest.java.in => mobile/android/base/tests/BaseTest.java
rename : mobile/android/base/tests/ContentContextMenuTest.java.in => mobile/android/base/tests/ContentContextMenuTest.java
rename : mobile/android/base/tests/ContentProviderTest.java.in => mobile/android/base/tests/ContentProviderTest.java
rename : mobile/android/base/tests/DatabaseHelper.java.in => mobile/android/base/tests/DatabaseHelper.java
rename : mobile/android/base/tests/JavascriptTest.java.in => mobile/android/base/tests/JavascriptTest.java
rename : mobile/android/base/tests/MotionEventHelper.java.in => mobile/android/base/tests/MotionEventHelper.java
rename : mobile/android/base/tests/MotionEventReplayer.java.in => mobile/android/base/tests/MotionEventReplayer.java
rename : mobile/android/base/tests/PixelTest.java.in => mobile/android/base/tests/PixelTest.java
rename : mobile/android/base/tests/StringHelper.java.in => mobile/android/base/tests/StringHelper.java
rename : mobile/android/base/tests/testAboutPage.java.in => mobile/android/base/tests/testAboutPage.java
rename : mobile/android/base/tests/testAddSearchEngine.java.in => mobile/android/base/tests/testAddSearchEngine.java
rename : mobile/android/base/tests/testAddonManager.java.in => mobile/android/base/tests/testAddonManager.java
rename : mobile/android/base/tests/testAwesomebar.java.in => mobile/android/base/tests/testAwesomebar.java
rename : mobile/android/base/tests/testAwesomebarSwipes.java.in => mobile/android/base/tests/testAwesomebarSwipes.java
rename : mobile/android/base/tests/testAxisLocking.java.in => mobile/android/base/tests/testAxisLocking.java
rename : mobile/android/base/tests/testBookmark.java.in => mobile/android/base/tests/testBookmark.java
rename : mobile/android/base/tests/testBookmarkFolders.java.in => mobile/android/base/tests/testBookmarkFolders.java
rename : mobile/android/base/tests/testBookmarkKeyword.java.in => mobile/android/base/tests/testBookmarkKeyword.java
rename : mobile/android/base/tests/testBookmarklets.java.in => mobile/android/base/tests/testBookmarklets.java
rename : mobile/android/base/tests/testBookmarksPage.java.in => mobile/android/base/tests/testBookmarksPage.java
rename : mobile/android/base/tests/testBrowserProvider.java.in => mobile/android/base/tests/testBrowserProvider.java
rename : mobile/android/base/tests/testBrowserProviderPerf.java.in => mobile/android/base/tests/testBrowserProviderPerf.java
rename : mobile/android/base/tests/testBrowserSearchVisibility.java.in => mobile/android/base/tests/testBrowserSearchVisibility.java
rename : mobile/android/base/tests/testCheck.java.in => mobile/android/base/tests/testCheck.java
rename : mobile/android/base/tests/testCheck2.java.in => mobile/android/base/tests/testCheck2.java
rename : mobile/android/base/tests/testClearPrivateData.java.in => mobile/android/base/tests/testClearPrivateData.java
rename : mobile/android/base/tests/testDeviceSearchEngine.java.in => mobile/android/base/tests/testDeviceSearchEngine.java
rename : mobile/android/base/tests/testDistribution.java.in => mobile/android/base/tests/testDistribution.java
rename : mobile/android/base/tests/testDoorHanger.java.in => mobile/android/base/tests/testDoorHanger.java
rename : mobile/android/base/tests/testFindInPage.java.in => mobile/android/base/tests/testFindInPage.java
rename : mobile/android/base/tests/testFlingCorrectness.java.in => mobile/android/base/tests/testFlingCorrectness.java
rename : mobile/android/base/tests/testFormHistory.java.in => mobile/android/base/tests/testFormHistory.java
rename : mobile/android/base/tests/testGetUserMedia.java.in => mobile/android/base/tests/testGetUserMedia.java
rename : mobile/android/base/tests/testHistory.java.in => mobile/android/base/tests/testHistory.java
rename : mobile/android/base/tests/testHomeBanner.java.in => mobile/android/base/tests/testHomeBanner.java
rename : mobile/android/base/tests/testImportFromAndroid.java.in => mobile/android/base/tests/testImportFromAndroid.java
rename : mobile/android/base/tests/testInputUrlBar.java.in => mobile/android/base/tests/testInputUrlBar.java
rename : mobile/android/base/tests/testJNI.java.in => mobile/android/base/tests/testJNI.java
rename : mobile/android/base/tests/testJarReader.java.in => mobile/android/base/tests/testJarReader.java
rename : mobile/android/base/tests/testLinkContextMenu.java.in => mobile/android/base/tests/testLinkContextMenu.java
rename : mobile/android/base/tests/testLoad.java.in => mobile/android/base/tests/testLoad.java
rename : mobile/android/base/tests/testMailToContextMenu.java.in => mobile/android/base/tests/testMailToContextMenu.java
rename : mobile/android/base/tests/testMasterPassword.java.in => mobile/android/base/tests/testMasterPassword.java
rename : mobile/android/base/tests/testNewTab.java.in => mobile/android/base/tests/testNewTab.java
rename : mobile/android/base/tests/testOrderedBroadcast.java.in => mobile/android/base/tests/testOrderedBroadcast.java
rename : mobile/android/base/tests/testOverscroll.java.in => mobile/android/base/tests/testOverscroll.java
rename : mobile/android/base/tests/testPan.java.in => mobile/android/base/tests/testPan.java
rename : mobile/android/base/tests/testPanCorrectness.java.in => mobile/android/base/tests/testPanCorrectness.java
rename : mobile/android/base/tests/testPasswordEncrypt.java.in => mobile/android/base/tests/testPasswordEncrypt.java
rename : mobile/android/base/tests/testPasswordProvider.java.in => mobile/android/base/tests/testPasswordProvider.java
rename : mobile/android/base/tests/testPermissions.java.in => mobile/android/base/tests/testPermissions.java
rename : mobile/android/base/tests/testPictureLinkContextMenu.java.in => mobile/android/base/tests/testPictureLinkContextMenu.java
rename : mobile/android/base/tests/testPrefsObserver.java.in => mobile/android/base/tests/testPrefsObserver.java
rename : mobile/android/base/tests/testPrivateBrowsing.java.in => mobile/android/base/tests/testPrivateBrowsing.java
rename : mobile/android/base/tests/testPromptGridInput.java.in => mobile/android/base/tests/testPromptGridInput.java
rename : mobile/android/base/tests/testReaderMode.java.in => mobile/android/base/tests/testReaderMode.java
rename : mobile/android/base/tests/testSearchSuggestions.java.in => mobile/android/base/tests/testSearchSuggestions.java
rename : mobile/android/base/tests/testSettingsMenuItems.java.in => mobile/android/base/tests/testSettingsMenuItems.java
rename : mobile/android/base/tests/testShareLink.java.in => mobile/android/base/tests/testShareLink.java
rename : mobile/android/base/tests/testSharedPreferences.java.in => mobile/android/base/tests/testSharedPreferences.java
rename : mobile/android/base/tests/testSystemPages.java.in => mobile/android/base/tests/testSystemPages.java
rename : mobile/android/base/tests/testTabHistory.java.in => mobile/android/base/tests/testTabHistory.java
rename : mobile/android/base/tests/testThumbnails.java.in => mobile/android/base/tests/testThumbnails.java
rename : mobile/android/base/tests/testVkbOverlap.java.in => mobile/android/base/tests/testVkbOverlap.java
rename : mobile/android/base/tests/test_bug720538.java.in => mobile/android/base/tests/test_bug720538.java
extra : rebase_source : c8d715aa110b07c6010054a674879e143a5f04e7
extra : amend_source : fb5714b78e055e336b5e0c6a0da8eb8c931ff09e
extra : histedit_source : ec57d8ba94000092438a2ba0bf4fb66091e98513%2C114ade72bb9b72b96557da74f1179734fa347e5c
2013-11-07 11:18:51 -05:00

348 lines
14 KiB
Java

package org.mozilla.gecko.tests;
import org.mozilla.gecko.*;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.ClassLoader;
import java.lang.reflect.Method;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
/**
* Tests distribution customization.
* mock-package.zip should contain the following directory structure:
*
* distribution/
* preferences.json
* bookmarks.json
* searchplugins/
* common/
* engine.xml
*/
public class testDistribution extends ContentProviderTest {
private static final String MOCK_PACKAGE = "mock-package.zip";
private static final int PREF_REQUEST_ID = 0x7357;
private Activity mActivity;
@Override
protected int getTestType() {
return TEST_MOCHITEST;
}
/**
* This is a hack.
*
* Startup results in us writing prefs -- we fetch the Distribution, which
* caches its state. Our tests try to wipe those prefs, but apparently
* sometimes race with startup, which leads to us not getting one of our
* expected messages. The test fails.
*
* This hack waits for any existing background tasks -- such as the one that
* writes prefs -- to finish before we begin the test.
*/
private void waitForBackgroundHappiness() {
try {
ClassLoader classLoader = mActivity.getClassLoader();
Class threadUtilsClass = classLoader.loadClass("org.mozilla.gecko.util.ThreadUtils");
Method postToBackgroundThread = threadUtilsClass.getMethod("postToBackgroundThread", Runnable.class);
final Object signal = new Object();
final Runnable done = new Runnable() {
@Override
public void run() {
synchronized (signal) {
signal.notify();
}
}
};
synchronized (signal) {
postToBackgroundThread.invoke(null, done);
signal.wait();
}
} catch (Exception e) {
mAsserter.ok(false, "Exception waiting on background thread.", e.toString());
}
mAsserter.dumpLog("Background task completed. Proceeding.");
}
public void testDistribution() {
mActivity = getActivity();
String mockPackagePath = getMockPackagePath();
// Wait for any startup-related background distribution shenanigans to
// finish. This reduces the chance of us racing with startup pref writes.
waitForBackgroundHappiness();
// Pre-clear distribution pref, run basic preferences and en-US localized preferences Tests
clearDistributionPref();
setTestLocale("en-US");
initDistribution(mockPackagePath);
checkPreferences();
checkLocalizedPreferences("en-US");
checkSearchPlugin();
// Pre-clear distribution pref, and run es-MX localized preferences Test
clearDistributionPref();
setTestLocale("es-MX");
initDistribution(mockPackagePath);
checkLocalizedPreferences("es-MX");
}
// Initialize the distribution from the mock package.
private void initDistribution(String aPackagePath) {
try {
// Call Distribution.init with the mock package.
ClassLoader classLoader = mActivity.getClassLoader();
Class distributionClass = classLoader.loadClass("org.mozilla.gecko.Distribution");
Method init = distributionClass.getMethod("init", Context.class, String.class, String.class);
Actions.EventExpecter distributionSetExpecter = mActions.expectGeckoEvent("Distribution:Set:OK");
init.invoke(null, mActivity, aPackagePath, "prefs-" + System.currentTimeMillis());
distributionSetExpecter.blockForEvent();
distributionSetExpecter.unregisterListener();
} catch (Exception e) {
mAsserter.ok(false, "exception initializing distribution", e.toString());
}
}
// Test distribution and preferences values stored in preferences.json
private void checkPreferences() {
String prefID = "distribution.id";
String prefAbout = "distribution.about";
String prefVersion = "distribution.version";
String prefTestBoolean = "distribution.test.boolean";
String prefTestString = "distribution.test.string";
String prefTestInt = "distribution.test.int";
try {
final String[] prefNames = { prefID,
prefAbout,
prefVersion,
prefTestBoolean,
prefTestString,
prefTestInt };
Actions.RepeatedEventExpecter eventExpecter = mActions.expectGeckoEvent("Preferences:Data");
mActions.sendPreferencesGetEvent(PREF_REQUEST_ID, prefNames);
JSONObject data = null;
int requestId = -1;
// Wait until we get the correct "Preferences:Data" event
while (requestId != PREF_REQUEST_ID) {
data = new JSONObject(eventExpecter.blockForEventData());
requestId = data.getInt("requestId");
}
eventExpecter.unregisterListener();
JSONArray preferences = data.getJSONArray("preferences");
for (int i = 0; i < preferences.length(); i++) {
JSONObject pref = (JSONObject) preferences.get(i);
String name = pref.getString("name");
if (name.equals(prefID)) {
mAsserter.is(pref.getString("value"), "test-partner", "check " + prefID);
} else if (name.equals(prefAbout)) {
mAsserter.is(pref.getString("value"), "Test Partner", "check " + prefAbout);
} else if (name.equals(prefVersion)) {
mAsserter.is(pref.getInt("value"), 1, "check " + prefVersion);
} else if (name.equals(prefTestBoolean)) {
mAsserter.is(pref.getBoolean("value"), true, "check " + prefTestBoolean);
} else if (name.equals(prefTestString)) {
mAsserter.is(pref.getString("value"), "test", "check " + prefTestString);
} else if (name.equals(prefTestInt)) {
mAsserter.is(pref.getInt("value"), 5, "check " + prefTestInt);
}
}
} catch (JSONException e) {
mAsserter.ok(false, "exception getting preferences", e.toString());
}
}
private void checkSearchPlugin() {
Actions.RepeatedEventExpecter eventExpecter = mActions.expectGeckoEvent("SearchEngines:Data");
mActions.sendGeckoEvent("SearchEngines:Get", null);
try {
JSONObject data = new JSONObject(eventExpecter.blockForEventData());
eventExpecter.unregisterListener();
JSONArray searchEngines = data.getJSONArray("searchEngines");
boolean foundEngine = false;
for (int i = 0; i < searchEngines.length(); i++) {
JSONObject engine = (JSONObject) searchEngines.get(i);
String name = engine.getString("name");
if (name.equals("Test search engine")) {
foundEngine = true;
break;
}
}
mAsserter.ok(foundEngine, "check search plugin", "found test search plugin");
} catch (JSONException e) {
mAsserter.ok(false, "exception getting search plugins", e.toString());
}
}
// Sets the distribution locale preference for the test
private void setTestLocale(String aLocale) {
String prefUseragentLocale = "general.useragent.locale";
JSONObject jsonPref = new JSONObject();
try {
// Request the pref change to the locale.
jsonPref.put("name", prefUseragentLocale);
jsonPref.put("type", "string");
jsonPref.put("value", aLocale);
mActions.sendGeckoEvent("Preferences:Set", jsonPref.toString());
// Wait for confirmation of the pref change.
final String[] prefNames = { prefUseragentLocale };
Actions.RepeatedEventExpecter eventExpecter = mActions.expectGeckoEvent("Preferences:Data");
mActions.sendPreferencesGetEvent(PREF_REQUEST_ID, prefNames);
JSONObject data = null;
int requestId = -1;
// Wait until we get the correct "Preferences:Data" event
while (requestId != PREF_REQUEST_ID) {
data = new JSONObject(eventExpecter.blockForEventData());
requestId = data.getInt("requestId");
}
eventExpecter.unregisterListener();
} catch (Exception e) {
mAsserter.ok(false, "exception setting test locale", e.toString());
}
}
// Test localized distribution and preferences values stored in preferences.json
private void checkLocalizedPreferences(String aLocale) {
String prefAbout = "distribution.about";
String prefLocalizeable = "distribution.test.localizeable";
String prefLocalizeableOverride = "distribution.test.localizeable-override";
try {
final String[] prefNames = { prefAbout, prefLocalizeable, prefLocalizeableOverride };
Actions.RepeatedEventExpecter eventExpecter = mActions.expectGeckoEvent("Preferences:Data");
mActions.sendPreferencesGetEvent(PREF_REQUEST_ID, prefNames);
JSONObject data = null;
int requestId = -1;
// Wait until we get the correct "Preferences:Data" event
while (requestId != PREF_REQUEST_ID) {
data = new JSONObject(eventExpecter.blockForEventData());
requestId = data.getInt("requestId");
}
eventExpecter.unregisterListener();
JSONArray preferences = data.getJSONArray("preferences");
for (int i = 0; i < preferences.length(); i++) {
JSONObject pref = (JSONObject) preferences.get(i);
String name = pref.getString("name");
if (name.equals(prefAbout)) {
if (aLocale.equals("en-US")) {
mAsserter.is(pref.getString("value"), "Test Partner", "check " + prefAbout);
} else if (aLocale.equals("es-MX")) {
mAsserter.is(pref.getString("value"), "Afiliado de Prueba", "check " + prefAbout);
}
} else if (name.equals(prefLocalizeable)) {
if (aLocale.equals("en-US")) {
mAsserter.is(pref.getString("value"), "http://test.org/en-US/en-US/", "check " + prefLocalizeable);
} else if (aLocale.equals("es-MX")) {
mAsserter.is(pref.getString("value"), "http://test.org/es-MX/es-MX/", "check " + prefLocalizeable);
}
} else if (name.equals(prefLocalizeableOverride)) {
if (aLocale.equals("en-US")) {
mAsserter.is(pref.getString("value"), "http://cheese.com", "check " + prefLocalizeableOverride);
} else if (aLocale.equals("es-MX")) {
mAsserter.is(pref.getString("value"), "http://test.org/es-MX/", "check " + prefLocalizeableOverride);
}
}
}
} catch (JSONException e) {
mAsserter.ok(false, "exception getting preferences", e.toString());
}
}
// Copies the mock package to the data directory and returns the file path to it.
private String getMockPackagePath() {
String mockPackagePath = "";
try {
InputStream inStream = getAsset(MOCK_PACKAGE);
File dataDir = new File(mActivity.getApplicationInfo().dataDir);
File outFile = new File(dataDir, MOCK_PACKAGE);
OutputStream outStream = new FileOutputStream(outFile);
int b;
while ((b = inStream.read()) != -1) {
outStream.write(b);
}
inStream.close();
outStream.close();
mockPackagePath = outFile.getPath();
} catch (Exception e) {
mAsserter.ok(false, "exception copying mock distribution package to data directory", e.toString());
}
return mockPackagePath;
}
// Clears the distribution pref to return distribution state to STATE_UNKNOWN
private void clearDistributionPref() {
mAsserter.dumpLog("Clearing distribution pref.");
SharedPreferences settings = mActivity.getSharedPreferences("GeckoApp", Activity.MODE_PRIVATE);
String keyName = mActivity.getPackageName() + ".distribution_state";
settings.edit().remove(keyName).commit();
}
@Override
public void setUp() throws Exception {
// TODO: Set up the content provider after setting the distribution.
super.setUp("org.mozilla.gecko.db.BrowserProvider", "AUTHORITY");
}
private void delete(File file) throws Exception {
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File f : files) {
delete(f);
}
}
mAsserter.ok(file.delete(), "clean up distribution files", "deleted " + file.getPath());
}
@Override
public void tearDown() throws Exception {
File dataDir = new File(mActivity.getApplicationInfo().dataDir);
// Delete mock package from data directory.
File mockPackage = new File(dataDir, MOCK_PACKAGE);
mAsserter.ok(mockPackage.delete(), "clean up mock package", "deleted " + mockPackage.getPath());
// Recursively delete distribution files that Distribution.init copied to data directory.
File distDir = new File(dataDir, "distribution");
delete(distDir);
clearDistributionPref();
super.tearDown();
}
}