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

Unified Diff: content/public/android/junit/src/org/chromium/content/browser/BindingManagerImplTest.java

Issue 2845243002: Moving BindingManager and ChildProcessConnection to base/.
Patch Set: Moving BindingManager and ChildProcessConnection to base/. Created 3 years, 8 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/junit/src/org/chromium/content/browser/BindingManagerImplTest.java
diff --git a/content/public/android/junit/src/org/chromium/content/browser/BindingManagerImplTest.java b/content/public/android/junit/src/org/chromium/content/browser/BindingManagerImplTest.java
deleted file mode 100644
index 42578238305513ab3cb7e24e3ef3b90c16606d7e..0000000000000000000000000000000000000000
--- a/content/public/android/junit/src/org/chromium/content/browser/BindingManagerImplTest.java
+++ /dev/null
@@ -1,681 +0,0 @@
-// Copyright 2014 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 static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_CRITICAL;
-import static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_LOW;
-import static android.content.ComponentCallbacks2.TRIM_MEMORY_RUNNING_MODERATE;
-
-import android.app.Activity;
-import android.app.Application;
-import android.util.Pair;
-
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.robolectric.Robolectric;
-import org.robolectric.annotation.Config;
-import org.robolectric.shadows.ShadowLooper;
-
-import org.chromium.base.process_launcher.ChildProcessCreationParams;
-import org.chromium.base.test.util.Feature;
-import org.chromium.testing.local.LocalRobolectricTestRunner;
-
-import java.util.ArrayList;
-
-/**
- * Unit tests for BindingManagerImpl. The tests run agains mock ChildProcessConnection
- * implementation, thus testing only the BindingManagerImpl itself.
- *
- * Default property of being low-end device is overriden, so that both low-end and high-end policies
- * are tested.
- */
-@RunWith(LocalRobolectricTestRunner.class)
-@Config(manifest = Config.NONE)
-public class BindingManagerImplTest {
- private static class MockChildServiceConnection
- implements BaseChildProcessConnection.ChildServiceConnection {
- private boolean mBound;
-
- @Override
- public boolean bind() {
- mBound = true;
- return true;
- }
-
- @Override
- public void unbind() {
- mBound = false;
- }
-
- @Override
- public boolean isBound() {
- return mBound;
- }
- }
-
- private static class TestChildProcessConnection extends ManagedChildProcessConnection {
- private final int mPid;
- private boolean mConnected;
-
- /**
- * Creates a mock binding corresponding to real ManagedChildProcessConnection after the
- * connection is established: with initial binding bound and no strong binding.
- */
- private TestChildProcessConnection(int pid) {
- super(null /* context */, pid /* number */, true /* sandboxed */,
- null /* deathCallback */, null /* serviceClassName */,
- null /* childProcessCommonParameters */,
- new ChildProcessCreationParams("org.chromium.test",
- false /* isExternalService */, 0 /* libraryProcessType */,
- false /* bindToCallerCheck */));
- mPid = pid;
- }
-
- @Override
- public int getPid() {
- return mPid;
- }
-
- @Override
- protected ChildServiceConnection createServiceConnection(int bindFlags) {
- return new MockChildServiceConnection();
- }
-
- // We don't have a real service so we have to mock the connection status.
- @Override
- public void start(StartCallback startCallback) {
- super.start(startCallback);
- mConnected = true;
- }
-
- @Override
- public void stop() {
- super.stop();
- mConnected = false;
- }
-
- @Override
- public boolean isConnected() {
- return mConnected;
- }
- }
-
- /**
- * Helper class that stores a manager along with its text label. This is used for tests that
- * iterate over all managers to indicate which manager was being tested when an assertion
- * failed.
- */
- private static class ManagerEntry {
- BindingManagerImpl mManager;
- String mLabel; // Name of the manager.
-
- ManagerEntry(BindingManagerImpl manager, String label) {
- mManager = manager;
- mLabel = label;
- }
-
- String getErrorMessage() {
- return "Failed for the " + mLabel + " manager.";
- }
- }
-
- Activity mActivity;
-
- // The managers are created in setUp() for convenience.
- BindingManagerImpl mLowEndManager;
- BindingManagerImpl mHighEndManager;
- BindingManagerImpl mModerateBindingManager;
- ManagerEntry[] mAllManagers;
-
- @Before
- public void setUp() {
- // The tests run on only one thread. Pretend that is the launcher thread so LauncherThread
- // asserts are not triggered.
- LauncherThread.setCurrentThreadAsLauncherThread();
-
- mActivity = Robolectric.buildActivity(Activity.class).setup().get();
-
- mLowEndManager =
- BindingManagerImpl.createBindingManagerForTesting(true /* isLowEndDevice */);
- mHighEndManager =
- BindingManagerImpl.createBindingManagerForTesting(false /* isLowEndDevice */);
- mModerateBindingManager =
- BindingManagerImpl.createBindingManagerForTesting(false /* isLowEndDevice */);
- mModerateBindingManager.startModerateBindingManagement(mActivity, 4 /* maxSize */);
- mAllManagers = new ManagerEntry[] {
- new ManagerEntry(mLowEndManager, "low-end"),
- new ManagerEntry(mHighEndManager, "high-end"),
- new ManagerEntry(mModerateBindingManager, "moderate-binding")};
- }
-
- @After
- public void tearDown() {
- LauncherThread.setLauncherThreadAsLauncherThread();
- }
-
- /**
- * Verifies that when running on low-end, the binding manager drops the oom bindings for the
- * previously bound connection when a new connection is used in foreground.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testNewConnectionDropsPreviousOnLowEnd() {
- // This test applies only to the low-end manager.
- BindingManagerImpl manager = mLowEndManager;
-
- // Add a connection to the manager.
- TestChildProcessConnection firstConnection = new TestChildProcessConnection(1);
- firstConnection.start(null /* startCallback */);
- manager.addNewConnection(firstConnection.getPid(), firstConnection);
-
- // Bind a strong binding on the connection.
- manager.setInForeground(firstConnection.getPid(), true);
- Assert.assertTrue(firstConnection.isStrongBindingBound());
-
- // Add a new connection.
- TestChildProcessConnection secondConnection = new TestChildProcessConnection(2);
- secondConnection.start(null /* startCallback */);
- manager.addNewConnection(secondConnection.getPid(), secondConnection);
-
- // Verify that the strong binding for the first connection wasn't dropped.
- Assert.assertTrue(firstConnection.isStrongBindingBound());
-
- // Verify that the strong binding for the first connection was dropped when a new connection
- // got used in foreground.
- manager.setInForeground(secondConnection.getPid(), true);
- Assert.assertFalse(firstConnection.isStrongBindingBound());
- }
-
- /**
- * Verifies the strong binding removal policies for low end devices:
- * - the initial binding should not be affected
- * - removal of a strong binding should be executed synchronously
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testStrongBindingRemovalOnLowEnd() throws Throwable {
- // This test applies only to the low-end manager.
- final BindingManagerImpl manager = mLowEndManager;
-
- // Add a connection to the manager.
- final TestChildProcessConnection connection = new TestChildProcessConnection(1);
- connection.start(null /* startCallback */);
- manager.addNewConnection(connection.getPid(), connection);
- Assert.assertTrue(connection.isInitialBindingBound());
- Assert.assertFalse(connection.isStrongBindingBound());
-
- // Add a strong binding, verify that the initial binding is not removed.
- manager.setInForeground(connection.getPid(), true);
- Assert.assertTrue(connection.isStrongBindingBound());
- Assert.assertTrue(connection.isInitialBindingBound());
-
- // Remove the strong binding, verify that the strong binding is removed immediately
- // and that the initial binding is not affected.
- manager.setInForeground(connection.getPid(), false);
- Assert.assertFalse(connection.isStrongBindingBound());
- Assert.assertTrue(connection.isInitialBindingBound());
- }
-
- /**
- * Verifies the strong binding removal policies for high end devices, where the removal should
- * be delayed.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testStrongBindingRemovalOnHighEnd() throws Throwable {
- // This test applies only to the high-end manager.
- final BindingManagerImpl manager = mHighEndManager;
-
- // Add a connection to the manager.
- final TestChildProcessConnection connection = new TestChildProcessConnection(1);
- connection.start(null /* startCallback */);
- manager.addNewConnection(connection.getPid(), connection);
- Assert.assertTrue(connection.isInitialBindingBound());
- Assert.assertFalse(connection.isStrongBindingBound());
-
- // Add a strong binding, verify that the initial binding is not removed.
- manager.setInForeground(connection.getPid(), true);
- Assert.assertTrue(connection.isStrongBindingBound());
- Assert.assertTrue(connection.isInitialBindingBound());
-
- // Remove the strong binding, verify that the strong binding is not removed
- // immediately.
- manager.setInForeground(connection.getPid(), false);
- Assert.assertTrue(connection.isStrongBindingBound());
- Assert.assertTrue(connection.isInitialBindingBound());
-
- // Wait until the posted unbinding tasks get executed and verify that the strong binding was
- // removed while the initial binding is not affected.
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertFalse(connection.isStrongBindingBound());
- Assert.assertTrue(connection.isInitialBindingBound());
- }
-
- /**
- * Verifies the strong binding removal policies with moderate binding management, where the
- * moderate binding should be bound.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testStrongBindingRemovalWithModerateBinding() throws Throwable {
- // This test applies only to the moderate-binding manager.
- final BindingManagerImpl manager = mModerateBindingManager;
-
- // Add a connection to the manager and start it.
- final TestChildProcessConnection connection = new TestChildProcessConnection(1);
- connection.start(null /* startCallback */);
- manager.addNewConnection(connection.getPid(), connection);
-
- Assert.assertTrue(connection.isInitialBindingBound());
- Assert.assertFalse(connection.isStrongBindingBound());
- Assert.assertFalse(connection.isModerateBindingBound());
-
- // Add a strong binding, verify that the initial binding is not removed.
- manager.setInForeground(connection.getPid(), true);
- Assert.assertTrue(connection.isStrongBindingBound());
- Assert.assertTrue(connection.isInitialBindingBound());
- Assert.assertFalse(connection.isModerateBindingBound());
-
- // Remove the strong binding, verify that the strong binding is not removed
- // immediately.
- manager.setInForeground(connection.getPid(), false);
- Assert.assertTrue(connection.isStrongBindingBound());
- Assert.assertTrue(connection.isInitialBindingBound());
- Assert.assertFalse(connection.isModerateBindingBound());
-
- // Wait until the posted unbinding tasks get executed and verify that the strong binding was
- // removed while the initial binding is not affected, and the moderate binding is bound.
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertFalse(connection.isStrongBindingBound());
- Assert.assertTrue(connection.isInitialBindingBound());
- Assert.assertTrue(connection.isModerateBindingBound());
- }
-
- /**
- * Verifies that the initial binding is removed after onDeterminedVisibility() is called.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testInitialBindingRemoval() {
- // This test applies to low-end, high-end and moderate-binding policies.
- for (ManagerEntry managerEntry : mAllManagers) {
- BindingManagerImpl manager = managerEntry.mManager;
- String message = managerEntry.getErrorMessage();
-
- // Add a connection to the manager.
- TestChildProcessConnection connection = new TestChildProcessConnection(1);
- connection.start(null /* startCallback */);
- manager.addNewConnection(connection.getPid(), connection);
-
- // Verify that the initial binding is held.
- Assert.assertTrue(connection.isInitialBindingBound());
-
- // Call onDeterminedVisibility() and verify that the initial binding was released.
- manager.onDeterminedVisibility(connection.getPid());
- Assert.assertFalse(connection.isInitialBindingBound());
- }
- }
-
- /**
- * This test corresponds to a process crash scenario: after a process dies and its connection is
- * cleared, isOomProtectedOrWasWhenDied() may be called on the connection to decide if it was a
- * crash or out-of-memory kill.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testIsOomProtected() {
- // This test applies to low-end, high-end and moderate-binding policies.
- for (ManagerEntry managerEntry : mAllManagers) {
- BindingManagerImpl manager = managerEntry.mManager;
- String message = managerEntry.getErrorMessage();
-
- // Add a connection to the manager.
- TestChildProcessConnection connection = new TestChildProcessConnection(1);
- connection.start(null /* startCallback */);
- manager.addNewConnection(connection.getPid(), connection);
-
- // Initial binding is an oom binding.
- Assert.assertTrue(message, connection.isOomProtectedOrWasWhenDied());
-
- // After initial binding is removed, the connection is no longer oom protected.
- manager.setInForeground(connection.getPid(), false);
- manager.onDeterminedVisibility(connection.getPid());
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertFalse(message, connection.isOomProtectedOrWasWhenDied());
-
- // Add a strong binding, restoring the oom protection.
- manager.setInForeground(connection.getPid(), true);
- Assert.assertTrue(message, connection.isOomProtectedOrWasWhenDied());
-
- // Simulate a process crash - clear a connection in binding manager and remove the
- // bindings.
- Assert.assertFalse(manager.isConnectionCleared(connection.getPid()));
- manager.removeConnection(connection.getPid());
- Assert.assertTrue(manager.isConnectionCleared(connection.getPid()));
- connection.stop();
-
- // Verify that the connection doesn't keep any oom bindings, but the manager reports the
- // oom status as protected.
- Assert.assertFalse(message, connection.isInitialBindingBound());
- Assert.assertFalse(message, connection.isStrongBindingBound());
- Assert.assertTrue(message, connection.isOomProtectedOrWasWhenDied());
- }
- }
-
- /**
- * Verifies that onSentToBackground() / onBroughtToForeground() correctly attach and remove
- * additional strong binding kept on the most recently bound renderer for the background
- * period.
- *
- * The renderer that will be bound for the background period should be the one that was most
- * recendly bound using .setInForeground(), even if there is one that was added using
- * .addNewConnection() after that. Otherwise we would bound a background renderer when user
- * loads a new tab in background and leaves the browser.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testBackgroundPeriodBinding() {
- // This test applies to low-end, high-end and moderate-binding policies.
- for (ManagerEntry managerEntry : mAllManagers) {
- BindingManagerImpl manager = managerEntry.mManager;
- String message = managerEntry.getErrorMessage();
-
- // Add two connections, bind and release each.
- TestChildProcessConnection firstConnection = new TestChildProcessConnection(1);
- firstConnection.start(null /* startCallback */);
- manager.addNewConnection(firstConnection.getPid(), firstConnection);
- manager.setInForeground(firstConnection.getPid(), true);
- manager.setInForeground(firstConnection.getPid(), false);
-
- TestChildProcessConnection secondConnection = new TestChildProcessConnection(2);
- secondConnection.start(null /* startCallback */);
- manager.addNewConnection(secondConnection.getPid(), secondConnection);
- manager.setInForeground(secondConnection.getPid(), true);
- manager.setInForeground(secondConnection.getPid(), false);
-
- // Add third connection, do not bind it.
- TestChildProcessConnection thirdConnection = new TestChildProcessConnection(3);
- thirdConnection.start(null /* startCallback */);
- manager.addNewConnection(thirdConnection.getPid(), thirdConnection);
- manager.setInForeground(thirdConnection.getPid(), false);
-
- // Sanity check: verify that no connection has a strong binding.
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertFalse(message, firstConnection.isStrongBindingBound());
- Assert.assertFalse(message, secondConnection.isStrongBindingBound());
- Assert.assertFalse(message, thirdConnection.isStrongBindingBound());
-
- // Call onSentToBackground() and verify that a strong binding was added for the second
- // connection:
- // - not the first one, because it was bound earlier than the second
- // - not the thirs one, because it was never bound at all
- manager.onSentToBackground();
- Assert.assertFalse(message, firstConnection.isStrongBindingBound());
- Assert.assertTrue(message, secondConnection.isStrongBindingBound());
- Assert.assertFalse(message, thirdConnection.isStrongBindingBound());
-
- // Call onBroughtToForeground() and verify that the strong binding was removed.
- manager.onBroughtToForeground();
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertFalse(message, firstConnection.isStrongBindingBound());
- Assert.assertFalse(message, secondConnection.isStrongBindingBound());
- Assert.assertFalse(message, thirdConnection.isStrongBindingBound());
- }
- }
-
- /**
- * Verifies that onSentToBackground() drops all the moderate bindings after some delay, and
- * onBroughtToForeground() doesn't recover them.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testModerateBindingDropOnBackground() {
- // This test applies only to the moderate-binding manager.
- final BindingManagerImpl manager = mModerateBindingManager;
-
- TestChildProcessConnection[] connections = new TestChildProcessConnection[3];
- for (int i = 0; i < connections.length; i++) {
- connections[i] = new TestChildProcessConnection(i + 1);
- connections[i].start(null /* startCallback */);
- manager.addNewConnection(connections[i].getPid(), connections[i]);
- }
-
- // Verify that each connection has a moderate binding after binding and releasing a strong
- // binding.
- for (TestChildProcessConnection connection : connections) {
- manager.setInForeground(connection.getPid(), true);
- manager.setInForeground(connection.getPid(), false);
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertTrue(connection.isModerateBindingBound());
- }
-
- // Exclude lastInForeground because it will be kept in foreground when onSentToBackground()
- // is called as |mLastInForeground|.
- TestChildProcessConnection lastInForeground = new TestChildProcessConnection(0);
- manager.addNewConnection(lastInForeground.getPid(), lastInForeground);
- lastInForeground.start(null /* startCallback */);
- manager.setInForeground(lastInForeground.getPid(), true);
- manager.setInForeground(lastInForeground.getPid(), false);
-
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
-
- // Verify that leaving the application for a short time doesn't clear the moderate bindings.
- manager.onSentToBackground();
- for (TestChildProcessConnection connection : connections) {
- Assert.assertTrue(connection.isModerateBindingBound());
- }
- Assert.assertTrue(lastInForeground.isStrongBindingBound());
- Assert.assertFalse(lastInForeground.isModerateBindingBound());
- manager.onBroughtToForeground();
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- for (TestChildProcessConnection connection : connections) {
- Assert.assertTrue(connection.isModerateBindingBound());
- }
-
- // Call onSentToBackground() and verify that all the moderate bindings drop after some
- // delay.
- manager.onSentToBackground();
- for (TestChildProcessConnection connection : connections) {
- Assert.assertTrue(connection.isModerateBindingBound());
- }
- Assert.assertTrue(lastInForeground.isStrongBindingBound());
- Assert.assertFalse(lastInForeground.isModerateBindingBound());
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- for (TestChildProcessConnection connection : connections) {
- Assert.assertFalse(connection.isModerateBindingBound());
- }
-
- // Call onBroughtToForeground() and verify that the previous moderate bindings aren't
- // recovered.
- manager.onBroughtToForeground();
- for (TestChildProcessConnection connection : connections) {
- Assert.assertFalse(connection.isModerateBindingBound());
- }
- }
-
- /**
- * Verifies that onLowMemory() drops all the moderate bindings.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testModerateBindingDropOnLowMemory() {
- final Application app = mActivity.getApplication();
- final BindingManagerImpl manager = mModerateBindingManager;
-
- TestChildProcessConnection[] connections = new TestChildProcessConnection[4];
- for (int i = 0; i < connections.length; i++) {
- connections[i] = new TestChildProcessConnection(i + 1);
- connections[i].start(null /* startCallback */);
- manager.addNewConnection(connections[i].getPid(), connections[i]);
- }
-
- // Verify that each connection has a moderate binding after binding and releasing a strong
- // binding.
- for (TestChildProcessConnection connection : connections) {
- manager.setInForeground(connection.getPid(), true);
- manager.setInForeground(connection.getPid(), false);
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertTrue(connection.isModerateBindingBound());
- }
-
- // Call onLowMemory() and verify that all the moderate bindings drop.
- app.onLowMemory();
- for (TestChildProcessConnection connection : connections) {
- Assert.assertFalse(connection.isModerateBindingBound());
- }
- }
-
- /**
- * Verifies that onTrimMemory() drops moderate bindings properly.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testModerateBindingDropOnTrimMemory() {
- final Application app = mActivity.getApplication();
- // This test applies only to the moderate-binding manager.
- final BindingManagerImpl manager = mModerateBindingManager;
-
- ArrayList<Pair<Integer, Integer>> levelAndExpectedVictimCountList = new ArrayList<>();
- levelAndExpectedVictimCountList.add(
- new Pair<Integer, Integer>(TRIM_MEMORY_RUNNING_MODERATE, 1));
- levelAndExpectedVictimCountList.add(new Pair<Integer, Integer>(TRIM_MEMORY_RUNNING_LOW, 2));
- levelAndExpectedVictimCountList.add(
- new Pair<Integer, Integer>(TRIM_MEMORY_RUNNING_CRITICAL, 4));
-
- TestChildProcessConnection[] connections = new TestChildProcessConnection[4];
- for (int i = 0; i < connections.length; i++) {
- connections[i] = new TestChildProcessConnection(i + 1);
- connections[i].start(null /* startCallback */);
- manager.addNewConnection(connections[i].getPid(), connections[i]);
- }
-
- for (Pair<Integer, Integer> pair : levelAndExpectedVictimCountList) {
- String message = "Failed for the level=" + pair.first;
- // Verify that each connection has a moderate binding after binding and releasing a
- // strong binding.
- for (TestChildProcessConnection connection : connections) {
- manager.setInForeground(connection.getPid(), true);
- manager.setInForeground(connection.getPid(), false);
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertTrue(message, connection.isModerateBindingBound());
- }
-
- app.onTrimMemory(pair.first);
- // Verify that some of moderate bindings drop.
- for (int i = 0; i < connections.length; i++) {
- Assert.assertEquals(
- message, i >= pair.second, connections[i].isModerateBindingBound());
- }
- }
- }
-
- /**
- * Verifies that BindingManager.releaseAllModerateBindings() drops all the moderate bindings.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testModerateBindingDropOnReleaseAllModerateBindings() {
- // This test applies only to the moderate-binding manager.
- final BindingManagerImpl manager = mModerateBindingManager;
-
- TestChildProcessConnection[] connections = new TestChildProcessConnection[4];
- for (int i = 0; i < connections.length; i++) {
- connections[i] = new TestChildProcessConnection(i + 1);
- connections[i].start(null /* startCallback */);
- manager.addNewConnection(connections[i].getPid(), connections[i]);
- }
-
- // Verify that each connection has a moderate binding after binding and releasing a strong
- // binding.
- for (TestChildProcessConnection connection : connections) {
- manager.setInForeground(connection.getPid(), true);
- manager.setInForeground(connection.getPid(), false);
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertTrue(connection.isModerateBindingBound());
- }
-
- // Call BindingManager.releaseAllModerateBindings() and verify that all the moderate
- // bindings drop.
- manager.releaseAllModerateBindings();
- for (TestChildProcessConnection connection : connections) {
- Assert.assertFalse(connection.isModerateBindingBound());
- }
- }
-
- /*
- * Test that a moderate binding is added to background renderer processes when the initial
- * binding is removed.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testModerateBindingTillBackgroundedBackgroundProcess() {
- BindingManagerImpl manager = BindingManagerImpl.createBindingManagerForTesting(false);
- manager.startModerateBindingManagement(mActivity, 4);
-
- TestChildProcessConnection connection = new TestChildProcessConnection(0);
- connection.start(null /* startCallback */);
- manager.addNewConnection(connection.getPid(), connection);
- Assert.assertTrue(connection.isInitialBindingBound());
- Assert.assertFalse(connection.isModerateBindingBound());
-
- manager.setInForeground(connection.getPid(), false);
- manager.onDeterminedVisibility(connection.getPid());
- Assert.assertFalse(connection.isInitialBindingBound());
- Assert.assertTrue(connection.isModerateBindingBound());
- }
-
- /*
- * Test that a moderate binding is not added to foreground renderer processes when the initial
- * binding is removed.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testModerateBindingTillBackgroundedForegroundProcess() {
- BindingManagerImpl manager = BindingManagerImpl.createBindingManagerForTesting(false);
- manager.startModerateBindingManagement(mActivity, 4);
-
- TestChildProcessConnection connection = new TestChildProcessConnection(0);
- connection.start(null /* startCallback */);
- manager.addNewConnection(connection.getPid(), connection);
- Assert.assertTrue(connection.isInitialBindingBound());
- Assert.assertFalse(connection.isStrongBindingBound());
- Assert.assertFalse(connection.isModerateBindingBound());
-
- manager.setInForeground(connection.getPid(), true);
- manager.onDeterminedVisibility(connection.getPid());
- Assert.assertFalse(connection.isInitialBindingBound());
- Assert.assertTrue(connection.isStrongBindingBound());
- Assert.assertFalse(connection.isModerateBindingBound());
- }
-
- /*
- * Test that Chrome is sent to the background, that the initially added moderate bindings are
- * removed and are not re-added when Chrome is brought back to the foreground.
- */
- @Test
- @Feature({"ProcessManagement"})
- public void testModerateBindingTillBackgroundedSentToBackground() {
- BindingManagerImpl manager = BindingManagerImpl.createBindingManagerForTesting(false);
- manager.startModerateBindingManagement(mActivity, 4);
-
- TestChildProcessConnection connection = new TestChildProcessConnection(0);
- connection.start(null /* startCallback */);
- manager.addNewConnection(connection.getPid(), connection);
- manager.setInForeground(connection.getPid(), false);
- manager.onDeterminedVisibility(connection.getPid());
- Assert.assertTrue(connection.isModerateBindingBound());
-
- manager.onSentToBackground();
- ShadowLooper.runUiThreadTasksIncludingDelayedTasks();
- Assert.assertFalse(connection.isModerateBindingBound());
-
- // Bringing Chrome to the foreground should not re-add the moderate bindings.
- manager.onBroughtToForeground();
- Assert.assertFalse(connection.isModerateBindingBound());
- }
-}

Powered by Google App Engine
This is Rietveld 408576698