| 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
|
| index 541c96ee7711c41a5a12ed398a0782f455384a8e..d60b04d335c6de3e395110464db9602b481ef8b4 100644
|
| --- a/content/public/android/javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java
|
| +++ b/content/public/android/javatests/src/org/chromium/content/browser/BrowserStartupControllerTest.java
|
| @@ -11,6 +11,7 @@ import android.test.suitebuilder.annotation.SmallTest;
|
| import org.chromium.base.ThreadUtils;
|
| import org.chromium.base.test.util.AdvancedMockContext;
|
| import org.chromium.content.common.ProcessInitException;
|
| +import org.chromium.content.common.ResultCodes;
|
|
|
| public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
|
|
| @@ -18,41 +19,40 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
|
|
| private static class TestBrowserStartupController extends BrowserStartupController {
|
|
|
| - private boolean mThrowProcessInitException;
|
| private int mStartupResult;
|
| - private boolean mAlreadyInitialized = false;
|
| + private boolean mLibraryLoadSucceeds;
|
| private int mInitializedCounter = 0;
|
| - private boolean mCallbackWasSetup;
|
|
|
| - private TestBrowserStartupController(Context context) {
|
| - super(context);
|
| + @Override
|
| + void prepareToStartBrowserProcess(int numRenderers) throws ProcessInitException {
|
| + if (!mLibraryLoadSucceeds) {
|
| + throw new ProcessInitException(ResultCodes.RESULT_CODE_NATIVE_LIBRARY_LOAD_FAILED);
|
| + }
|
| }
|
|
|
| - @Override
|
| - void enableAsynchronousStartup() {
|
| - mCallbackWasSetup = true;
|
| + private TestBrowserStartupController(Context context) {
|
| + super(context);
|
| }
|
|
|
| @Override
|
| - boolean initializeAndroidBrowserProcess() throws ProcessInitException {
|
| + int contentStart() {
|
| mInitializedCounter++;
|
| - if (mThrowProcessInitException) {
|
| - throw new ProcessInitException(4);
|
| - }
|
| - if (!mAlreadyInitialized) {
|
| + if(BrowserStartupController.browserMayStartAsynchonously()) {
|
| // Post to the UI thread to emulate what would happen in a real scenario.
|
| - ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + ThreadUtils.postOnUiThread(new Runnable() {
|
| @Override
|
| public void run() {
|
| BrowserStartupController.browserStartupComplete(mStartupResult);
|
| }
|
| });
|
| + } else {
|
| + BrowserStartupController.browserStartupComplete(mStartupResult);
|
| }
|
| - return mAlreadyInitialized;
|
| + return mStartupResult;
|
| }
|
|
|
| - private boolean hasBeenInitializedOneTime() {
|
| - return mInitializedCounter == 1;
|
| + private int initializedCounter() {
|
| + return mInitializedCounter;
|
| }
|
| }
|
|
|
| @@ -92,6 +92,7 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| @SmallTest
|
| public void testSingleAsynchronousStartupRequest() {
|
| mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
|
| + mController.mLibraryLoadSucceeds = true;
|
| final TestStartupCallback callback = new TestStartupCallback();
|
|
|
| // Kick off the asynchronous startup request.
|
| @@ -102,9 +103,10 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| }
|
| });
|
|
|
| - assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
|
| - assertTrue("The browser process should have been initialized one time.",
|
| - mController.hasBeenInitializedOneTime());
|
| + assertTrue("Asynchronous mode should have been set.",
|
| + BrowserStartupController.browserMayStartAsynchonously());
|
| + assertEquals("The browser process should have been initialized one time.",
|
| + 1, mController.initializedCounter());
|
|
|
| // Wait for callbacks to complete.
|
| getInstrumentation().waitForIdleSync();
|
| @@ -118,6 +120,7 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| @SmallTest
|
| public void testMultipleAsynchronousStartupRequests() {
|
| mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
|
| + mController.mLibraryLoadSucceeds = true;
|
| final TestStartupCallback callback1 = new TestStartupCallback();
|
| final TestStartupCallback callback2 = new TestStartupCallback();
|
| final TestStartupCallback callback3 = new TestStartupCallback();
|
| @@ -142,9 +145,10 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| }
|
| });
|
|
|
| - assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
|
| - assertTrue("The browser process should have been initialized one time.",
|
| - mController.hasBeenInitializedOneTime());
|
| + assertTrue("Asynchronous mode should have been set.",
|
| + BrowserStartupController.browserMayStartAsynchonously());
|
| + assertEquals("The browser process should have been initialized one time.",
|
| + 1, mController.initializedCounter());
|
|
|
| // Wait for callbacks to complete.
|
| getInstrumentation().waitForIdleSync();
|
| @@ -164,6 +168,7 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| @SmallTest
|
| public void testConsecutiveAsynchronousStartupRequests() {
|
| mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
|
| + mController.mLibraryLoadSucceeds = true;
|
| final TestStartupCallback callback1 = new TestStartupCallback();
|
| final TestStartupCallback callback2 = new TestStartupCallback();
|
|
|
| @@ -181,9 +186,10 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| }
|
| });
|
|
|
| - assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
|
| - assertTrue("The browser process should have been initialized one time.",
|
| - mController.hasBeenInitializedOneTime());
|
| + assertTrue("Asynchronous mode should have been set.",
|
| + BrowserStartupController.browserMayStartAsynchonously());
|
| + assertEquals("The browser process should have been initialized one time.",
|
| + 1, mController.initializedCounter());
|
|
|
| // Wait for callbacks to complete.
|
| getInstrumentation().waitForIdleSync();
|
| @@ -226,6 +232,7 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| @SmallTest
|
| public void testSingleFailedAsynchronousStartupRequest() {
|
| mController.mStartupResult = BrowserStartupController.STARTUP_FAILURE;
|
| + mController.mLibraryLoadSucceeds = true;
|
| final TestStartupCallback callback = new TestStartupCallback();
|
|
|
| // Kick off the asynchronous startup request.
|
| @@ -236,9 +243,10 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| }
|
| });
|
|
|
| - assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
|
| - assertTrue("The browser process should have been initialized one time.",
|
| - mController.hasBeenInitializedOneTime());
|
| + assertTrue("Asynchronous mode should have been set.",
|
| + BrowserStartupController.browserMayStartAsynchonously());
|
| + assertEquals("The browser process should have been initialized one time.",
|
| + 1, mController.initializedCounter());
|
|
|
| // Wait for callbacks to complete.
|
| getInstrumentation().waitForIdleSync();
|
| @@ -250,6 +258,7 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| @SmallTest
|
| public void testConsecutiveFailedAsynchronousStartupRequests() {
|
| mController.mStartupResult = BrowserStartupController.STARTUP_FAILURE;
|
| + mController.mLibraryLoadSucceeds = true;
|
| final TestStartupCallback callback1 = new TestStartupCallback();
|
| final TestStartupCallback callback2 = new TestStartupCallback();
|
|
|
| @@ -267,9 +276,10 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| }
|
| });
|
|
|
| - assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
|
| - assertTrue("The browser process should have been initialized one time.",
|
| - mController.hasBeenInitializedOneTime());
|
| + assertTrue("Asynchronous mode should have been set.",
|
| + BrowserStartupController.browserMayStartAsynchonously());
|
| + assertEquals("The browser process should have been initialized one time.",
|
| + 1, mController.initializedCounter());
|
|
|
| // Wait for callbacks to complete.
|
| getInstrumentation().waitForIdleSync();
|
| @@ -306,11 +316,76 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| }
|
|
|
| @SmallTest
|
| - public void testAndroidBrowserStartupThrowsException() {
|
| - mController.mThrowProcessInitException = true;
|
| + public void testSingleSynchronousRequest() {
|
| + mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
|
| + mController.mLibraryLoadSucceeds = true;
|
| + // Kick off the synchronous startup.
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + assertTrue("Browser should have started successfully",
|
| + mController.startBrowserProcessesSync(1));
|
| + }
|
| + });
|
| + assertFalse("Synchronous mode should have been set",
|
| + BrowserStartupController.browserMayStartAsynchonously());
|
| +
|
| + assertEquals("The browser process should have been initialized one time.",
|
| + 1, mController.initializedCounter());
|
| + }
|
| +
|
| + @SmallTest
|
| + public void testAsyncThenSyncRequests() {
|
| + mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
|
| + mController.mLibraryLoadSucceeds = true;
|
| final TestStartupCallback callback = new TestStartupCallback();
|
|
|
| - // Kick off the asynchronous startup request.
|
| + // Kick off the startups.
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + mController.startBrowserProcessesAsync(callback);
|
| + // To ensure that the async startup doesn't complete too soon we have
|
| + // to do both these in a since Runnable instance. This avoids the
|
| + // unpredictable race that happens in real situations.
|
| + assertTrue("Browser should have started successfully",
|
| + mController.startBrowserProcessesSync(1));
|
| + }
|
| + });
|
| + assertFalse("Synchronous mode should have been set",
|
| + BrowserStartupController.browserMayStartAsynchonously());
|
| +
|
| + assertEquals("The browser process should have been initialized twice.",
|
| + 2, mController.initializedCounter());
|
| +
|
| + 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 testSyncThenAsyncRequests() {
|
| + mController.mStartupResult = BrowserStartupController.STARTUP_SUCCESS;
|
| + mController.mLibraryLoadSucceeds = true;
|
| + final TestStartupCallback callback = new TestStartupCallback();
|
| +
|
| + // Do a synchronous startup first.
|
| + ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| + @Override
|
| + public void run() {
|
| + assertTrue("Browser should have started successfully",
|
| + mController.startBrowserProcessesSync(1));
|
| + }
|
| + });
|
| +
|
| + assertEquals("The browser process should have been initialized once.",
|
| + 1, mController.initializedCounter());
|
| +
|
| + assertFalse("Synchronous mode should have been set",
|
| + BrowserStartupController.browserMayStartAsynchonously());
|
| +
|
| + // Kick off the asynchronous startup request. This should just queue the callback.
|
| ThreadUtils.runOnUiThreadBlocking(new Runnable() {
|
| @Override
|
| public void run() {
|
| @@ -318,20 +393,21 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| }
|
| });
|
|
|
| - assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
|
| - assertTrue("The browser process should have been initialized one time.",
|
| - mController.hasBeenInitializedOneTime());
|
| + assertEquals("The browser process should not have been initialized a second time.",
|
| + 1, mController.initializedCounter());
|
|
|
| // Wait for callbacks to complete.
|
| getInstrumentation().waitForIdleSync();
|
|
|
| assertTrue("Callback should have been executed.", callback.mHasStartupResult);
|
| - assertTrue("Callback should have been a failure.", callback.mWasFailure);
|
| + assertTrue("Callback should have been a success.", callback.mWasSuccess);
|
| + assertTrue("Callback should be told that the browser process was already started.",
|
| + callback.mAlreadyStarted);
|
| }
|
|
|
| @SmallTest
|
| - public void testAndroidBrowserProcessAlreadyInitializedByOtherPartsOfCode() {
|
| - mController.mAlreadyInitialized = true;
|
| + public void testLibraryLoadFails() {
|
| + mController.mLibraryLoadSucceeds = false;
|
| final TestStartupCallback callback = new TestStartupCallback();
|
|
|
| // Kick off the asynchronous startup request.
|
| @@ -342,16 +418,16 @@ public class BrowserStartupControllerTest extends InstrumentationTestCase {
|
| }
|
| });
|
|
|
| - assertTrue("The callback should have been setup", mController.mCallbackWasSetup);
|
| - assertTrue("The browser process should have been initialized one time.",
|
| - mController.hasBeenInitializedOneTime());
|
| + assertEquals("The browser process should not have been initialized.",
|
| + 0, mController.initializedCounter());
|
|
|
| // 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.",
|
| + assertFalse("Callback should have been a failure.", callback.mWasSuccess);
|
| + assertFalse("Callback should be told that the browser process was not already started.",
|
| callback.mAlreadyStarted);
|
| }
|
| +
|
| }
|
|
|