Index: content/public/test/android/javatests/src/org/chromium/content/browser/test/util/CallbackHelper.java |
diff --git a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/CallbackHelper.java b/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/CallbackHelper.java |
deleted file mode 100644 |
index b13fba9928a24d40309bcfa25b390c7d14b18146..0000000000000000000000000000000000000000 |
--- a/content/public/test/android/javatests/src/org/chromium/content/browser/test/util/CallbackHelper.java |
+++ /dev/null |
@@ -1,232 +0,0 @@ |
-// Copyright 2012 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.test.util; |
- |
-import static org.chromium.base.test.util.ScalableTimeout.ScaleTimeout; |
- |
-import java.util.concurrent.TimeUnit; |
-import java.util.concurrent.TimeoutException; |
- |
-/** |
- * A helper class that encapsulates listening and blocking for callbacks. |
- * |
- * Sample usage: |
- * |
- * // Let us assume that this interface is defined by some piece of production code and is used |
- * // to communicate events that occur in that piece of code. Let us further assume that the |
- * // production code runs on the main thread test code runs on a separate test thread. |
- * // An instance that implements this interface would be injected by test code to ensure that the |
- * // methods are being called on another thread. |
- * interface Delegate { |
- * void onOperationFailed(String errorMessage); |
- * void onDataPersisted(); |
- * } |
- * |
- * // This is the inner class you'd write in your test case to later inject into the production |
- * // code. |
- * class TestDelegate implements Delegate { |
- * // This is the preferred way to create a helper that stores the parameters it receives |
- * // when called by production code. |
- * public static class OnOperationFailedHelper extends CallbackHelper { |
- * private String mErrorMessage; |
- * |
- * public void getErrorMessage() { |
- * assert getCallCount() > 0; |
- * return mErrorMessage; |
- * } |
- * |
- * public void notifyCalled(String errorMessage) { |
- * mErrorMessage = errorMessage; |
- * // It's important to call this after all parameter assignments. |
- * notifyCalled(); |
- * } |
- * } |
- * |
- * // There should be one CallbackHelper instance per method. |
- * private OnOperationFailedHelper mOnOperationFailedHelper; |
- * private CallbackHelper mOnDataPersistedHelper; |
- * |
- * public OnOperationFailedHelper getOnOperationFailedHelper() { |
- * return mOnOperationFailedHelper; |
- * } |
- * |
- * public CallbackHelper getOnDataPersistedHelper() { |
- * return mOnDataPersistedHelper; |
- * } |
- * |
- * @Override |
- * public void onOperationFailed(String errorMessage) { |
- * mOnOperationFailedHelper.notifyCalled(errorMessage); |
- * } |
- * |
- * @Override |
- * public void onDataPersisted() { |
- * mOnDataPersistedHelper.notifyCalled(); |
- * } |
- * } |
- * |
- * // This is a sample test case. |
- * public void testCase() throws Exception { |
- * // Create the TestDelegate to inject into production code. |
- * TestDelegate delegate = new TestDelegate(); |
- * // Create the production class instance that is being tested and inject the test delegate. |
- * CodeUnderTest codeUnderTest = new CodeUnderTest(); |
- * codeUnderTest.setDelegate(delegate); |
- * |
- * // Typically you'd get the current call count before performing the operation you expect to |
- * // trigger the callback. There can't be any callbacks 'in flight' at this moment, otherwise |
- * // the call count is unpredictable and the test will be flaky. |
- * int onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount(); |
- * codeUnderTest.doSomethingThatEndsUpCallingOnOperationFailedFromAnotherThread(); |
- * // It's safe to do other stuff here, if needed. |
- * .... |
- * // Wait for the callback if it hadn't been called yet, otherwise return immediately. This |
- * // can throw an exception if the callback doesn't arrive within the timeout. |
- * delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount); |
- * // Access to method parameters is now safe. |
- * assertEquals("server error", delegate.getOnOperationFailedHelper().getErrorMessage()); |
- * |
- * // Being able to pass the helper around lets us build methods which encapsulate commonly |
- * // performed tasks. |
- * doSomeOperationAndWait(codeUnerTest, delegate.getOnOperationFailedHelper()); |
- * |
- * // The helper can be resued for as many calls as needed, just be sure to get the count each |
- * // time. |
- * onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount(); |
- * codeUnderTest.doSomethingElseButStillFailOnAnotherThread(); |
- * delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount); |
- * |
- * // It is also possible to use more than one helper at a time. |
- * onOperationFailedCallCount = delegate.getOnOperationFailedHelper().getCallCount(); |
- * int onDataPersistedCallCount = delegate.getOnDataPersistedHelper().getCallCount(); |
- * codeUnderTest.doSomethingThatPersistsDataButFailsInSomeOtherWayOnAnotherThread(); |
- * delegate.getOnDataPersistedHelper().waitForCallback(onDataPersistedCallCount); |
- * delegate.getOnOperationFailedHelper().waitForCallback(onOperationFailedCallCount); |
- * } |
- * |
- * // Shows how to turn an async operation + completion callback into a synchronous operation. |
- * private void doSomeOperationAndWait(final CodeUnderTest underTest, |
- * CallbackHelper operationHelper) throws InterruptedException, TimeoutException { |
- * final int callCount = operaitonHelper.getCallCount(); |
- * getInstrumentaiton().runOnMainSync(new Runnable() { |
- * @Override |
- * public void run() { |
- * // This schedules a call to a method on the injected TestDelegate. The TestDelegate |
- * // implementation will then call operationHelper.notifyCalled(). |
- * underTest.operation(); |
- * } |
- * }); |
- * operationHelper.waitForCallback(callCount); |
- * } |
- * |
- */ |
-public class CallbackHelper { |
- protected static final long WAIT_TIMEOUT_SECONDS = ScaleTimeout(5); |
- |
- private final Object mLock = new Object(); |
- private int mCallCount = 0; |
- |
- /** |
- * Gets the number of times the callback has been called. |
- * |
- * The call count can be used with the waitForCallback() method, indicating a point |
- * in time after which the caller wishes to record calls to the callback. |
- * |
- * In order to wait for a callback caused by X, the call count should be obtained |
- * before X occurs. |
- * |
- * NOTE: any call to the callback that occurs after the call count is obtained |
- * will result in the corresponding wait call to resume execution. The call count |
- * is intended to 'catch' callbacks that occur after X but before waitForCallback() |
- * is called. |
- */ |
- public int getCallCount() { |
- synchronized (mLock) { |
- return mCallCount; |
- } |
- } |
- |
- /** |
- * Blocks until the callback is called the specified number of |
- * times or throws an exception if we exceeded the specified time frame. |
- * |
- * This will wait for a callback to be called a specified number of times after |
- * the point in time at which the call count was obtained. The method will return |
- * immediately if a call occurred the specified number of times after the |
- * call count was obtained but before the method was called, otherwise the method will |
- * block until the specified call count is reached. |
- * |
- * @param currentCallCount the value obtained by calling getCallCount(). |
- * @param numberOfCallsToWaitFor number of calls (counting since |
- * currentCallCount was obtained) that we will wait for. |
- * @param timeout timeout value. We will wait the specified amount of time for a single |
- * callback to occur so the method call may block up to |
- * <code>numberOfCallsToWaitFor * timeout</code> units. |
- * @param unit timeout unit. |
- * @throws InterruptedException |
- * @throws TimeoutException Thrown if the method times out before onPageFinished is called. |
- */ |
- public void waitForCallback(int currentCallCount, int numberOfCallsToWaitFor, long timeout, |
- TimeUnit unit) throws InterruptedException, TimeoutException { |
- assert mCallCount >= currentCallCount; |
- assert numberOfCallsToWaitFor > 0; |
- synchronized (mLock) { |
- int callCountWhenDoneWaiting = currentCallCount + numberOfCallsToWaitFor; |
- while (callCountWhenDoneWaiting > mCallCount) { |
- int callCountBeforeWait = mCallCount; |
- mLock.wait(unit.toMillis(timeout)); |
- if (callCountBeforeWait == mCallCount) { |
- throw new TimeoutException("waitForCallback timed out!"); |
- } |
- } |
- } |
- } |
- |
- public void waitForCallback(int currentCallCount, int numberOfCallsToWaitFor) |
- throws InterruptedException, TimeoutException { |
- waitForCallback(currentCallCount, numberOfCallsToWaitFor, |
- WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS); |
- } |
- |
- public void waitForCallback(int currentCallCount) |
- throws InterruptedException, TimeoutException { |
- waitForCallback(currentCallCount, 1); |
- } |
- |
- /** |
- * Blocks until the criteria is satisfied or throws an exception |
- * if the specified time frame is exceeded. |
- * @param timeout timeout value. |
- * @param unit timeout unit. |
- */ |
- public void waitUntilCriteria(Criteria criteria, long timeout, TimeUnit unit) |
- throws InterruptedException, TimeoutException { |
- synchronized (mLock) { |
- final long startTime = System.currentTimeMillis(); |
- boolean isSatisfied = criteria.isSatisfied(); |
- while (!isSatisfied && |
- System.currentTimeMillis() - startTime < unit.toMillis(timeout)) { |
- mLock.wait(unit.toMillis(timeout)); |
- isSatisfied = criteria.isSatisfied(); |
- } |
- if (!isSatisfied) throw new TimeoutException("waitUntilCriteria timed out!"); |
- } |
- } |
- |
- public void waitUntilCriteria(Criteria criteria) |
- throws InterruptedException, TimeoutException { |
- waitUntilCriteria(criteria, WAIT_TIMEOUT_SECONDS, TimeUnit.SECONDS); |
- } |
- |
- /** |
- * Should be called when the callback associated with this helper object is called. |
- */ |
- public void notifyCalled() { |
- synchronized (mLock) { |
- mCallCount++; |
- mLock.notifyAll(); |
- } |
- } |
-} |