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

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

Issue 141533006: [Android] Move the java content/ package to content_public/ to start the split. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Small fixes and findbugs line update Created 6 years, 11 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/BindingManagerImplTest.java
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/BindingManagerImplTest.java b/content/public/android/javatests/src/org/chromium/content/browser/BindingManagerImplTest.java
deleted file mode 100644
index 1d9fa1f4af665bfa18d1cba4de9ec0d13a3e4de7..0000000000000000000000000000000000000000
--- a/content/public/android/javatests/src/org/chromium/content/browser/BindingManagerImplTest.java
+++ /dev/null
@@ -1,351 +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 android.os.Bundle;
-import android.test.InstrumentationTestCase;
-import android.test.suitebuilder.annotation.SmallTest;
-
-import org.chromium.base.test.util.Feature;
-import org.chromium.content.common.IChildProcessCallback;
-import org.chromium.content.common.IChildProcessService;
-
-/**
- * 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. Unbinding delays are set to 0, so that we don't need to deal with waiting, but we
- * still can test if the unbinding tasks are posted or executed synchronously.
- */
-public class BindingManagerImplTest extends InstrumentationTestCase {
- private static class MockChildProcessConnection implements ChildProcessConnection {
- boolean mInitialBindingBound;
- int mStrongBindingCount;
- final int mPid;
-
- /**
- * Creates a mock binding corresponding to real ChildProcessConnectionImpl after the
- * connection is established: with initial binding bound and no strong binding.
- */
- MockChildProcessConnection(int pid) {
- mInitialBindingBound = true;
- mStrongBindingCount = 0;
- mPid = pid;
- }
-
- @Override
- public int getPid() {
- return mPid;
- }
-
- @Override
- public boolean isInitialBindingBound() {
- return mInitialBindingBound;
- }
-
- @Override
- public boolean isStrongBindingBound() {
- return mStrongBindingCount > 0;
- }
-
- @Override
- public void removeInitialBinding() {
- mInitialBindingBound = false;
- }
-
- @Override
- public boolean isOomProtectedOrWasWhenDied() {
- return mInitialBindingBound || mStrongBindingCount > 0;
- }
-
- @Override
- public void dropOomBindings() {
- mInitialBindingBound = false;
- mStrongBindingCount = 0;
- }
-
- @Override
- public void addStrongBinding() {
- mStrongBindingCount++;
- }
-
- @Override
- public void removeStrongBinding() {
- assert mStrongBindingCount > 0;
- mStrongBindingCount--;
- }
-
- @Override
- public void stop() {
- mInitialBindingBound = false;
- mStrongBindingCount = 0;
- }
-
- @Override
- public int getServiceNumber() { throw new UnsupportedOperationException(); }
-
- @Override
- public boolean isInSandbox() { throw new UnsupportedOperationException(); }
-
- @Override
- public IChildProcessService getService() { throw new UnsupportedOperationException(); }
-
- @Override
- public void start(String[] commandLine) { throw new UnsupportedOperationException(); }
-
- @Override
- public void setupConnection(String[] commandLine, FileDescriptorInfo[] filesToBeMapped,
- IChildProcessCallback processCallback, ConnectionCallback connectionCallbacks,
- Bundle sharedRelros) {
- throw new UnsupportedOperationException();
- }
- }
-
- /**
- * 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.";
- }
- }
-
- // The managers are created in setUp() for convenience.
- BindingManagerImpl mLowEndManager;
- BindingManagerImpl mHighEndManager;
- ManagerEntry[] mAllManagers;
-
- @Override
- protected void setUp() {
- mLowEndManager = BindingManagerImpl.createBindingManagerForTesting(true);
- mHighEndManager = BindingManagerImpl.createBindingManagerForTesting(false);
- mAllManagers = new ManagerEntry[] {
- new ManagerEntry(mLowEndManager, "low-end"),
- new ManagerEntry(mHighEndManager, "high-end")};
- }
-
- /**
- * Verifies that when running on low-end, the binding manager drops the oom bindings for the
- * previously bound connection when a new connection is added.
- */
- @SmallTest
- @Feature({"ProcessManagement"})
- public void testNewConnectionDropsPreviousOnLowEnd() {
- // This test applies only to the low-end manager.
- BindingManagerImpl manager = mLowEndManager;
-
- // Add a connection to the manager.
- MockChildProcessConnection firstConnection = new MockChildProcessConnection(1);
- manager.addNewConnection(firstConnection.getPid(), firstConnection);
-
- // Bind a strong binding on the connection.
- manager.setInForeground(firstConnection.getPid(), true);
- assertTrue(firstConnection.isStrongBindingBound());
-
- // Add a new connection.
- MockChildProcessConnection secondConnection = new MockChildProcessConnection(2);
- manager.addNewConnection(secondConnection.getPid(), secondConnection);
-
- // Verify that the strong binding for the first connection was dropped.
- assertFalse(firstConnection.isStrongBindingBound());
- }
-
- /**
- * Verifies the binding removal policies for low end devices:
- * - removal of the initial binding should be delayed
- * - removal of a strong binding should be executed synchronously
- */
- @SmallTest
- @Feature({"ProcessManagement"})
- public void testBindingRemovalOnLowEnd() throws Throwable {
- // This test applies only to the low-end manager.
- final BindingManagerImpl manager = mLowEndManager;
-
- // Add a connection to the manager.
- final MockChildProcessConnection connection = new MockChildProcessConnection(1);
- manager.addNewConnection(connection.getPid(), connection);
- assertTrue(connection.isInitialBindingBound());
- assertFalse(connection.isStrongBindingBound());
-
- // This has to happen on the UI thread, so that we can check the binding status right after
- // the call to remove it, before the any other task is executed on the main thread.
- runTestOnUiThread(new Runnable() {
- @Override
- public void run() {
- // Add a strong binding, verify that the initial binding is not removed immediately.
- manager.setInForeground(connection.getPid(), true);
- assertTrue(connection.isStrongBindingBound());
- assertTrue(connection.isInitialBindingBound());
-
- // Remove the strong binding, verify that the strong binding is removed immediately.
- manager.setInForeground(connection.getPid(), false);
- assertFalse(connection.isStrongBindingBound());
- }
- });
-
- // Wait until the posted unbinding task gets executed and verify that the inital binding was
- // eventually removed. Note that this works only because the test binding manager has the
- // unbinding delay set to 0.
- getInstrumentation().waitForIdleSync();
- assertFalse(connection.isInitialBindingBound());
- }
-
- /**
- * Verifies the binding removal policies for high end devices, where the removal of both initial
- * and strong binding should be delayed.
- */
- @SmallTest
- @Feature({"ProcessManagement"})
- public void testBindingRemovalOnHighEnd() throws Throwable {
- // This test applies only to the high-end manager.
- final BindingManagerImpl manager = mHighEndManager;
-
- // Add a connection to the manager.
- final MockChildProcessConnection connection = new MockChildProcessConnection(1);
- manager.addNewConnection(connection.getPid(), connection);
- assertTrue(connection.isInitialBindingBound());
- assertFalse(connection.isStrongBindingBound());
- // This has to happen on the UI thread, so that we can check the binding status right after
- // the call to remove it, before the any other task is executed on the main thread.
- runTestOnUiThread(new Runnable() {
- @Override
- public void run() {
- // Add a strong binding, verify that the initial binding is not removed immediately.
- manager.setInForeground(connection.getPid(), true);
- assertTrue(connection.isStrongBindingBound());
- assertTrue(connection.isInitialBindingBound());
-
- // Remove the strong binding, verify that the strong binding is not removed
- // immediately.
- manager.setInForeground(connection.getPid(), false);
- assertTrue(connection.isStrongBindingBound());
- }
- });
-
- // Wait until the posted unbinding tasks get executed and verify that both bindings were
- // eventually removed. Note that this works only because the test binding manager has the
- // unbinding delay set to 0.
- getInstrumentation().waitForIdleSync();
- assertFalse(connection.isInitialBindingBound());
- assertFalse(connection.isStrongBindingBound());
- }
-
- /**
- * Verifies that BindingManagerImpl correctly stashes the status of the connection oom bindings
- * when the connection is cleared. BindingManagerImpl should reply to isOomProtected() queries
- * with live status of the connection while it's still around and reply with stashed status
- * after clearConnection() is called.
- *
- * This test corresponds to a process crash scenario: after a process dies and its connection is
- * cleared, isOomProtected() may be called to decide if it was a crash or out-of-memory kill.
- */
- @SmallTest
- @Feature({"ProcessManagement"})
- public void testIsOomProtected() {
- // This test applies to both low-end and high-end policies.
- for (ManagerEntry managerEntry : mAllManagers) {
- BindingManagerImpl manager = managerEntry.mManager;
- String message = managerEntry.getErrorMessage();
-
- // Add a connection to the manager.
- MockChildProcessConnection connection = new MockChildProcessConnection(1);
- manager.addNewConnection(connection.getPid(), connection);
-
- // Initial binding is an oom binding.
- assertTrue(message, manager.isOomProtected(connection.getPid()));
-
- // After initial binding is removed, the connection is no longer oom protected.
- manager.setInForeground(connection.getPid(), false);
- getInstrumentation().waitForIdleSync();
- assertFalse(message, manager.isOomProtected(connection.getPid()));
-
- // Add a strong binding, restoring the oom protection.
- manager.setInForeground(connection.getPid(), true);
- assertTrue(message, manager.isOomProtected(connection.getPid()));
-
- // Simulate a process crash - clear a connection in binding manager and remove the
- // bindings.
- assertFalse(manager.isConnectionCleared(connection.getPid()));
- manager.clearConnection(connection.getPid());
- 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.
- assertFalse(message, connection.isInitialBindingBound());
- assertFalse(message, connection.isStrongBindingBound());
- assertTrue(message, manager.isOomProtected(connection.getPid()));
- }
- }
-
- /**
- * Verifies that onSentToBackground() / onBroughtToForeground() correctly attach and remove
- * additional strong binding keept 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.
- */
- @SmallTest
- @Feature({"ProcessManagement"})
- public void testBackgroundPeriodBinding() {
- // This test applies to both low-end and high-end policies.
- for (ManagerEntry managerEntry : mAllManagers) {
- BindingManagerImpl manager = managerEntry.mManager;
- String message = managerEntry.getErrorMessage();
-
- // Add two connections, bind and release each.
- MockChildProcessConnection firstConnection = new MockChildProcessConnection(1);
- manager.addNewConnection(firstConnection.getPid(), firstConnection);
- manager.setInForeground(firstConnection.getPid(), true);
- manager.setInForeground(firstConnection.getPid(), false);
-
- MockChildProcessConnection secondConnection = new MockChildProcessConnection(2);
- manager.addNewConnection(secondConnection.getPid(), secondConnection);
- manager.setInForeground(secondConnection.getPid(), true);
- manager.setInForeground(secondConnection.getPid(), false);
-
- // Add third connection, do not bind it.
- MockChildProcessConnection thirdConnection = new MockChildProcessConnection(3);
- manager.addNewConnection(thirdConnection.getPid(), thirdConnection);
- manager.setInForeground(thirdConnection.getPid(), false);
-
- // Sanity check: verify that no connection has a strong binding.
- getInstrumentation().waitForIdleSync();
- assertFalse(message, firstConnection.isStrongBindingBound());
- assertFalse(message, secondConnection.isStrongBindingBound());
- 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();
- assertFalse(message, firstConnection.isStrongBindingBound());
- assertTrue(message, secondConnection.isStrongBindingBound());
- assertFalse(message, thirdConnection.isStrongBindingBound());
-
- // Call onBroughtToForeground() and verify that the strong binding was removed.
- manager.onBroughtToForeground();
- getInstrumentation().waitForIdleSync();
- assertFalse(message, firstConnection.isStrongBindingBound());
- assertFalse(message, secondConnection.isStrongBindingBound());
- assertFalse(message, thirdConnection.isStrongBindingBound());
- }
- }
-}

Powered by Google App Engine
This is Rietveld 408576698