| Index: chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheLauncherTest.java
|
| diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheLauncherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheLauncherTest.java
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..ae43fdaca395899087ca5fc68da0173bbf881356
|
| --- /dev/null
|
| +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/precache/PrecacheLauncherTest.java
|
| @@ -0,0 +1,191 @@
|
| +// Copyright 2015 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +package org.chromium.chrome.browser.precache;
|
| +
|
| +import android.content.Context;
|
| +import android.test.suitebuilder.annotation.SmallTest;
|
| +
|
| +import org.chromium.base.ThreadUtils;
|
| +import org.chromium.base.test.util.Feature;
|
| +import org.chromium.chrome.browser.preferences.privacy.PrivacyPreferencesManager;
|
| +import org.chromium.chrome.browser.sync.ProfileSyncService;
|
| +import org.chromium.content.browser.test.NativeLibraryTestBase;
|
| +
|
| +/**
|
| + * Unit tests for {@link PrecacheLauncher}.
|
| + *
|
| + * setUp/tearDown code was inspired by org.chromium.chrome.browser.sync.ui.PassphraseActivityTest.
|
| + */
|
| +public class PrecacheLauncherTest extends NativeLibraryTestBase {
|
| + private StubProfileSyncService mSync;
|
| + private PrecacheLauncherUnderTest mLauncher;
|
| +
|
| + private class PrecacheLauncherUnderTest extends PrecacheLauncher {
|
| + private boolean mShouldRun = false;
|
| +
|
| + @Override
|
| + protected void onPrecacheCompleted() {}
|
| +
|
| + @Override
|
| + boolean nativeShouldRun() {
|
| + return mShouldRun;
|
| + }
|
| +
|
| + /**
|
| + * Modify the return value of nativeShouldRun. This will notify sync state subscribers, as
|
| + * if the user changed their sync preferences.
|
| + */
|
| + void setShouldRun(boolean shouldRun) {
|
| + mShouldRun = shouldRun;
|
| + notifySyncChanged();
|
| + }
|
| + }
|
| +
|
| + private static class StubProfileSyncService extends ProfileSyncService {
|
| + private boolean mSyncInitialized = false;
|
| +
|
| + public StubProfileSyncService(Context context) {
|
| + super(context);
|
| + }
|
| +
|
| + @Override
|
| + public boolean isSyncInitialized() {
|
| + return mSyncInitialized;
|
| + }
|
| +
|
| + public void setSyncInitialized(boolean syncInitialized) {
|
| + mSyncInitialized = syncInitialized;
|
| + syncStateChanged();
|
| + }
|
| + }
|
| +
|
| + @Override
|
| + protected void setUp() throws Exception {
|
| + super.setUp();
|
| +
|
| + // This is a PrecacheLauncher with a stubbed out nativeShouldRun so we can change that on
|
| + // the fly without needing to set up a sync backend.
|
| + mLauncher = new PrecacheLauncherUnderTest();
|
| +
|
| + // The target context persists throughout the entire test run, and so leaks state between
|
| + // tests. We reset the is_precaching_enabled pref to false to make the test run consistent,
|
| + // in case another test class has modified this pref.
|
| + PrecacheServiceLauncher.setIsPrecachingEnabled(getTargetContext(), false);
|
| +
|
| + // ProfileSyncService needs the browser process to be running.
|
| + loadNativeLibraryAndInitBrowserProcess();
|
| +
|
| + // ProfileSyncService must be initialized on the UI thread. Oddly, even though
|
| + // ThreadUtils.runningOnUiThread() is true here, it's, no, not really, no.
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + // The StubProfileSyncService stubs out isSyncInitialized so we can change that on
|
| + // the fly.
|
| + mSync = new StubProfileSyncService(getTargetContext());
|
| + ProfileSyncService.overrideForTests(mSync);
|
| +
|
| + // This is currently the default, but let's verify that, lest it ever change and we
|
| + // get confusing test failures later.
|
| + assertTrue(PrivacyPreferencesManager.getInstance(getTargetContext())
|
| + .shouldPrerender());
|
| + }
|
| + });
|
| + }
|
| +
|
| + @Override
|
| + protected void tearDown() throws Exception {
|
| + ProfileSyncService.overrideForTests(null);
|
| + PrecacheServiceLauncher.setIsPrecachingEnabled(getTargetContext(), false);
|
| + super.tearDown();
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"Precache"})
|
| + public void testUpdateEnabled_SyncNotReady_ThenDisabled() {
|
| + mLauncher.updateEnabled(getTargetContext());
|
| + waitUntilUiThreadIdle();
|
| +
|
| + assertEquals(false, isPrecachingEnabled());
|
| +
|
| + setSyncInitialized(true);
|
| + assertEquals(false, isPrecachingEnabled());
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"Precache"})
|
| + public void testUpdateEnabled_SyncNotReady_ThenEnabled() {
|
| + mLauncher.updateEnabled(getTargetContext());
|
| + waitUntilUiThreadIdle();
|
| +
|
| + assertEquals(false, isPrecachingEnabled());
|
| +
|
| + mLauncher.setShouldRun(true);
|
| + setSyncInitialized(true);
|
| + assertEquals(true, isPrecachingEnabled());
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"Precache"})
|
| + public void testUpdateEnabled_Disabled_ThenEnabled() {
|
| + setSyncInitialized(true);
|
| + mLauncher.updateEnabled(getTargetContext());
|
| + waitUntilUiThreadIdle();
|
| +
|
| + assertEquals(false, isPrecachingEnabled());
|
| +
|
| + mLauncher.setShouldRun(true);
|
| + assertEquals(true, isPrecachingEnabled());
|
| + }
|
| +
|
| + @SmallTest
|
| + @Feature({"Precache"})
|
| + public void testUpdateEnabled_Enabled_ThenDisabled() {
|
| + mLauncher.setShouldRun(true);
|
| + setSyncInitialized(true);
|
| + mLauncher.updateEnabled(getTargetContext());
|
| + waitUntilUiThreadIdle();
|
| +
|
| + assertEquals(true, isPrecachingEnabled());
|
| +
|
| + mLauncher.setShouldRun(false);
|
| + assertEquals(false, isPrecachingEnabled());
|
| + }
|
| +
|
| + /** Return the Context for the Chromium app. */
|
| + private Context getTargetContext() {
|
| + return getInstrumentation().getTargetContext();
|
| + }
|
| +
|
| + /** Block until all tasks posted to the UI thread have completed. */
|
| + private void waitUntilUiThreadIdle() {
|
| + getInstrumentation().waitForIdleSync();
|
| + }
|
| +
|
| + /** Return the value of the is_precaching_enabled pref, as set by updateEnabledSync. */
|
| + private boolean isPrecachingEnabled() {
|
| + return PrecacheServiceLauncher.isPrecachingEnabled(getTargetContext());
|
| + }
|
| +
|
| + /** Pretend the sync backend is initialized or not. */
|
| + private void setSyncInitialized(final boolean syncInitialized) {
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mSync.setSyncInitialized(syncInitialized);
|
| + }
|
| + });
|
| + }
|
| +
|
| + /** Notify listeners that sync preferences have changed. This is run by setShouldRun. */
|
| + private void notifySyncChanged() {
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mSync.syncStateChanged();
|
| + }
|
| + });
|
| + }
|
| +}
|
|
|