Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(524)

Unified Diff: content/public/android/javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java

Issue 22272006: Add support for multiple asynchronous browser startups. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated tests to use assert messages. Cleaned some of them up a bit. Rebased. Created 7 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/public/android/javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..541c96ee7711c41a5a12ed398a0782f455384a8e
--- /dev/null
+++ b/content/public/android/javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java
@@ -0,0 +1,357 @@
+// Copyright 2013 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.content.browser;
+
+import android.content.Context;
+import android.test.InstrumentationTestCase;
+import android.test.suitebuilder.annotation.SmallTest;
+
+import org.chromium.base.ThreadUtils;
+import org.chromium.base.test.util.AdvancedMockContext;
+import org.chromium.content.common.ProcessInitException;
+
+public class BrowserStartupControllerTest extends InstrumentationTestCase {
+
+ private TestBrowserStartupController mController;
+
+ private static class TestBrowserStartupController extends BrowserStartupController {
+
+ private boolean mThrowProcessInitException;
+ private int mStartupResult;
+ private boolean mAlreadyInitialized = false;
+ private int mInitializedCounter = 0;
+ private boolean mCallbackWasSetup;
+
+ private TestBrowserStartupController(Context context) {
+ super(context);
+ }
+
+ @Override
+ void enableAsynchronousStartup() {
+ mCallbackWasSetup = true;
+ }
+
+ @Override
+ boolean initializeAndroidBrowserProcess() throws ProcessInitException {
+ mInitializedCounter++;
+ if (mThrowProcessInitException) {
+ throw new ProcessInitException(4);
+ }
+ if (!mAlreadyInitialized) {
+ // Post to the UI thread to emulate what would happen in a real scenario.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ BrowserStartupController.browserStartupComplete(mStartupResult);
+ }
+ });
+ }
+ return mAlreadyInitialized;
+ }
+
+ private boolean hasBeenInitializedOneTime() {
+ return mInitializedCounter == 1;
+ }
+ }
+
+ private static class TestStartupCallback implements BrowserStartupController.StartupCallback {
+ private boolean mWasSuccess;
+ private boolean mWasFailure;
+ private boolean mHasStartupResult;
+ private boolean mAlreadyStarted;
+
+ @Override
+ public void onSuccess(boolean alreadyStarted) {
+ assert !mHasStartupResult;
+ mWasSuccess = true;
+ mAlreadyStarted = alreadyStarted;
+ mHasStartupResult = true;
+ }
+
+ @Override
+ public void onFailure() {
+ assert !mHasStartupResult;
+ mWasFailure = true;
+ mHasStartupResult = true;
+ }
+ }
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ Context context = new AdvancedMockContext(getInstrumentation().getTargetContext());
+ mController = new TestBrowserStartupController(context);
+ // Setting the static singleton instance field enables more correct testing, since it is
+ // is possible to call {@link BrowserStartupController#browserStartupComplete(int)} instead
+ // of {@link BrowserStartupController#executeEnqueuedCallbacks(int, boolean)} directly.
+ BrowserStartupController.overrideInstanceForTest(mController);
+ }
+
+ @SmallTest
+ public void testSingleAsynchronousStartupRequest() {
+ mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
+ final TestStartupCallback callback = new TestStartupCallback();
+
+ // Kick off the asynchronous startup request.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback);
+ }
+ });
+
+ assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
+ assertTrue("The browser process should have been initialized one time.",
+ mController.hasBeenInitializedOneTime());
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback should have been executed.", callback.mHasStartupResult);
+ assertTrue("Callback should have been a success.", callback.mWasSuccess);
+ assertFalse("Callback should be told that the browser process was not already started.",
+ callback.mAlreadyStarted);
+ }
+
+ @SmallTest
+ public void testMultipleAsynchronousStartupRequests() {
+ mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
+ final TestStartupCallback callback1 = new TestStartupCallback();
+ final TestStartupCallback callback2 = new TestStartupCallback();
+ final TestStartupCallback callback3 = new TestStartupCallback();
+
+ // Kick off the asynchronous startup requests.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback1);
+ }
+ });
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback2);
+ }
+ });
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.addStartupCompletedObserver(callback3);
+ }
+ });
+
+ assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
+ assertTrue("The browser process should have been initialized one time.",
+ mController.hasBeenInitializedOneTime());
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback 1 should have been executed.", callback1.mHasStartupResult);
+ assertTrue("Callback 1 should have been a success.", callback1.mWasSuccess);
+ assertTrue("Callback 2 should have been executed.", callback2.mHasStartupResult);
+ assertTrue("Callback 2 should have been a success.", callback2.mWasSuccess);
+ assertTrue("Callback 3 should have been executed.", callback3.mHasStartupResult);
+ assertTrue("Callback 3 should have been a success.", callback3.mWasSuccess);
+ // Some startup tasks might have been enqueued after the browser process was started, but
+ // not the first one which kicked of the startup.
+ assertFalse("Callback 1 should be told that the browser process was not already started.",
+ callback1.mAlreadyStarted);
+ }
+
+ @SmallTest
+ public void testConsecutiveAsynchronousStartupRequests() {
+ mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
+ final TestStartupCallback callback1 = new TestStartupCallback();
+ final TestStartupCallback callback2 = new TestStartupCallback();
+
+ // Kick off the asynchronous startup requests.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback1);
+ }
+ });
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.addStartupCompletedObserver(callback2);
+ }
+ });
+
+ assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
+ assertTrue("The browser process should have been initialized one time.",
+ mController.hasBeenInitializedOneTime());
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback 1 should have been executed.", callback1.mHasStartupResult);
+ assertTrue("Callback 1 should have been a success.", callback1.mWasSuccess);
+ assertTrue("Callback 2 should have been executed.", callback2.mHasStartupResult);
+ assertTrue("Callback 2 should have been a success.", callback2.mWasSuccess);
+
+ final TestStartupCallback callback3 = new TestStartupCallback();
+ final TestStartupCallback callback4 = new TestStartupCallback();
+
+ // Kick off more asynchronous startup requests.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback3);
+ }
+ });
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.addStartupCompletedObserver(callback4);
+ }
+ });
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback 3 should have been executed.", callback3.mHasStartupResult);
+ assertTrue("Callback 3 should have been a success.", callback3.mWasSuccess);
+ assertTrue("Callback 3 should be told that the browser process was already started.",
+ callback3.mAlreadyStarted);
+ assertTrue("Callback 4 should have been executed.", callback4.mHasStartupResult);
+ assertTrue("Callback 4 should have been a success.", callback4.mWasSuccess);
+ assertTrue("Callback 4 should be told that the browser process was already started.",
+ callback4.mAlreadyStarted);
+ }
+
+ @SmallTest
+ public void testSingleFailedAsynchronousStartupRequest() {
+ mController.mStartupResult = BrowserStartupController.STARTUP_FAILURE;
+ final TestStartupCallback callback = new TestStartupCallback();
+
+ // Kick off the asynchronous startup request.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback);
+ }
+ });
+
+ assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
+ assertTrue("The browser process should have been initialized one time.",
+ mController.hasBeenInitializedOneTime());
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback should have been executed.", callback.mHasStartupResult);
+ assertTrue("Callback should have been a failure.", callback.mWasFailure);
+ }
+
+ @SmallTest
+ public void testConsecutiveFailedAsynchronousStartupRequests() {
+ mController.mStartupResult = BrowserStartupController.STARTUP_FAILURE;
+ final TestStartupCallback callback1 = new TestStartupCallback();
+ final TestStartupCallback callback2 = new TestStartupCallback();
+
+ // Kick off the asynchronous startup requests.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback1);
+ }
+ });
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.addStartupCompletedObserver(callback2);
+ }
+ });
+
+ assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
+ assertTrue("The browser process should have been initialized one time.",
+ mController.hasBeenInitializedOneTime());
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback 1 should have been executed.", callback1.mHasStartupResult);
+ assertTrue("Callback 1 should have been a failure.", callback1.mWasFailure);
+ assertTrue("Callback 2 should have been executed.", callback2.mHasStartupResult);
+ assertTrue("Callback 2 should have been a failure.", callback2.mWasFailure);
+
+ final TestStartupCallback callback3 = new TestStartupCallback();
+ final TestStartupCallback callback4 = new TestStartupCallback();
+
+ // Kick off more asynchronous startup requests.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback3);
+ }
+ });
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.addStartupCompletedObserver(callback4);
+ }
+ });
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback 3 should have been executed.", callback3.mHasStartupResult);
+ assertTrue("Callback 3 should have been a failure.", callback3.mWasFailure);
+ assertTrue("Callback 4 should have been executed.", callback4.mHasStartupResult);
+ assertTrue("Callback 4 should have been a failure.", callback4.mWasFailure);
+ }
+
+ @SmallTest
+ public void testAndroidBrowserStartupThrowsException() {
+ mController.mThrowProcessInitException = true;
+ final TestStartupCallback callback = new TestStartupCallback();
+
+ // Kick off the asynchronous startup request.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback);
+ }
+ });
+
+ assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
+ assertTrue("The browser process should have been initialized one time.",
+ mController.hasBeenInitializedOneTime());
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback should have been executed.", callback.mHasStartupResult);
+ assertTrue("Callback should have been a failure.", callback.mWasFailure);
+ }
+
+ @SmallTest
+ public void testAndroidBrowserProcessAlreadyInitializedByOtherPartsOfCode() {
+ mController.mAlreadyInitialized = true;
+ final TestStartupCallback callback = new TestStartupCallback();
+
+ // Kick off the asynchronous startup request.
+ ThreadUtils.runOnUiThreadBlocking(new Runnable() {
+ @Override
+ public void run() {
+ mController.startBrowserProcessesAsync(callback);
+ }
+ });
+
+ assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
+ assertTrue("The browser process should have been initialized one time.",
+ mController.hasBeenInitializedOneTime());
+
+ // Wait for callbacks to complete.
+ getInstrumentation().waitForIdleSync();
+
+ assertTrue("Callback should have been executed.", callback.mHasStartupResult);
+ assertTrue("Callback should have been a success.", callback.mWasSuccess);
+ assertTrue("Callback should be told that the browser process was already started.",
+ callback.mAlreadyStarted);
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698