Chromium Code Reviews| 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..dc758beb12c863e75b1f150cb5867ca6ecff77e9 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,41 @@ 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; |
| + |
| + @Override |
| + void prepareToStartBrowserProcess(int numRenderers) throws ProcessInitException { |
| + if (!mLibraryLoadSucceeds) { |
|
nyquist
2013/08/23 06:28:32
Nit: Unnecessary braces
aberent
2013/08/23 11:40:21
Required by Java Code Style document.
|
| + throw new ProcessInitException(ResultCodes.RESULT_CODE_NATIVE_LIBRARY_LOAD_FAILED); |
| + } |
| + } |
| private TestBrowserStartupController(Context context) { |
| super(context); |
| } |
| - @Override |
| - void enableAsynchronousStartup() { |
| - mCallbackWasSetup = true; |
| - } |
| + |
|
nyquist
2013/08/23 06:28:32
Nit: Unnecessary newline.
aberent
2013/08/23 11:40:21
Done.
|
| @Override |
| - boolean initializeAndroidBrowserProcess() throws ProcessInitException { |
| + void 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; |
| } |
| - private boolean hasBeenInitializedOneTime() { |
| - return mInitializedCounter == 1; |
| + private int initializedCounter() { |
| + return mInitializedCounter; |
| } |
| } |
| @@ -92,6 +93,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 +104,12 @@ 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()); |
| + // Asynchronous mode should have been set. |
|
nyquist
2013/08/23 06:28:32
Nit: Unnecessary comment. If the assert message is
aberent
2013/08/23 11:40:21
Done.
|
| + assertTrue("Asynchronous mode should have been set.", |
| + BrowserStartupController.browserMayStartAsynchonously()); |
| + // Ensure that it ends up trying to initialize the browser process. |
| + assertEquals("The browser process should have been initialized one time.", 1, |
|
nyquist
2013/08/23 06:28:32
Nit: I know it is room for the 1 on the first line
aberent
2013/08/23 11:40:21
Done.
|
| + mController.initializedCounter()); |
| // Wait for callbacks to complete. |
| getInstrumentation().waitForIdleSync(); |
| @@ -118,6 +123,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 +148,12 @@ 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()); |
| + // Asynchronous mode should have been set. |
| + assertTrue("Asynchronous mode should have been set.", |
| + BrowserStartupController.browserMayStartAsynchonously()); |
| + // Ensure that it ends up trying to initialize the browser process. |
| + assertEquals("The browser process should have been initialized one time.", |
| + 1, mController.initializedCounter()); |
| // Wait for callbacks to complete. |
| getInstrumentation().waitForIdleSync(); |
| @@ -164,6 +173,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 +191,12 @@ 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()); |
| + // Asynchronous mode should have been set. |
| + assertTrue("Asynchronous mode should have been set.", |
| + BrowserStartupController.browserMayStartAsynchonously()); |
| + // Ensure that it ends up trying to initialize the browser process. |
| + assertEquals("The browser process should have been initialized one time.", |
| + 1, mController.initializedCounter()); |
| // Wait for callbacks to complete. |
| getInstrumentation().waitForIdleSync(); |
| @@ -226,6 +239,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 +250,12 @@ 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()); |
| + // Asynchronous mode should have been set. |
| + assertTrue("Asynchronous mode should have been set.", |
| + BrowserStartupController.browserMayStartAsynchonously()); |
| + // Ensure that it ends up trying to initialize the browser process. |
| + assertEquals("The browser process should have been initialized one time.", |
| + 1, mController.initializedCounter()); |
| // Wait for callbacks to complete. |
| getInstrumentation().waitForIdleSync(); |
| @@ -250,6 +267,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 +285,12 @@ 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()); |
| + // Asynchronous mode should have been set. |
| + assertTrue("Asynchronous mode should have been set.", |
| + BrowserStartupController.browserMayStartAsynchonously()); |
| + // Ensure that it ends up trying to initialize the browser process. |
| + assertEquals("The browser process should have been initialized one time.", |
| + 1, mController.initializedCounter()); |
| // Wait for callbacks to complete. |
| getInstrumentation().waitForIdleSync(); |
| @@ -306,32 +327,61 @@ 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 succesfully", |
|
nyquist
2013/08/23 06:28:32
Nit: successfully
aberent
2013/08/23 11:40:21
Done.
|
| + mController.startBrowserProcessesSync(1)); |
| + } |
| + }); |
| + // We should have forced synchronous startup |
| + assertFalse("Synchronous mode should have been set", |
| + BrowserStartupController.browserMayStartAsynchonously()); |
| + |
| + // Ensure that it ends up trying to initialize the browser process. |
| + assertEquals("The browser process should have been initialized one time.", |
| + 1, mController.initializedCounter()); |
| + } |
| + @SmallTest |
|
nyquist
2013/08/23 06:28:32
Nit: Missing newline
aberent
2013/08/23 11:40:21
Done.
|
| + 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 succesfully", |
| + mController.startBrowserProcessesSync(1)); |
| } |
| }); |
| + // We should have forced synchronous startup |
| + assertFalse("Synchronous mode should have been set", |
| + BrowserStartupController.browserMayStartAsynchonously()); |
| - 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(); |
| + // The browser process should have been called twice! |
| + assertEquals("The browser process should have been initialized twice.", |
| + 2, mController.initializedCounter()); |
| + // Sync startup should have forced execution of our callbacks. |
| 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); |
| + assertFalse("Callback should be told that the browser process was not already started.", |
| + callback.mAlreadyStarted); |
|
nyquist
2013/08/23 06:28:32
Question: How do you think about adding a simple e
aberent
2013/08/23 11:40:21
Done. Probably a sensible extra case.
|
| } |
| @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 +392,17 @@ 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()); |
| + // The browser should not have been initialized. |
| + 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); |
| } |
| + |
| } |