| Index: blimp/client/app/android/javatests/src/org/chromium/blimp/auth/RetryingTokenSourceTest.java
|
| diff --git a/blimp/client/app/android/javatests/src/org/chromium/blimp/auth/RetryingTokenSourceTest.java b/blimp/client/app/android/javatests/src/org/chromium/blimp/auth/RetryingTokenSourceTest.java
|
| deleted file mode 100644
|
| index 33fa7c550d6cd035979a487e789d47632f9fad93..0000000000000000000000000000000000000000
|
| --- a/blimp/client/app/android/javatests/src/org/chromium/blimp/auth/RetryingTokenSourceTest.java
|
| +++ /dev/null
|
| @@ -1,259 +0,0 @@
|
| -// Copyright 2015 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.blimp.auth;
|
| -
|
| -import android.content.Intent;
|
| -import android.test.InstrumentationTestCase;
|
| -import android.test.suitebuilder.annotation.SmallTest;
|
| -
|
| -import java.util.ArrayList;
|
| -import java.util.List;
|
| -import java.util.concurrent.Semaphore;
|
| -import java.util.concurrent.TimeUnit;
|
| -import java.util.concurrent.atomic.AtomicReference;
|
| -
|
| -/**
|
| - * Tests the basic behavior of a {@link RetryingTokenSource}.
|
| - */
|
| -public class RetryingTokenSourceTest extends InstrumentationTestCase {
|
| - private static final String TEST_TOKEN = "abcdefg";
|
| - private static final int SEMAPHORE_TIMEOUT_MS = 4000;
|
| -
|
| - /**
|
| - * A wrapper for a {@link RetryingTokenSource} that minimizes the retry delay for testing
|
| - * purposes. The original delay is still tracked. This also implements a
|
| - * {@link TokenSource#Callback} and notifies {@link Semaphore}s when certain callback methods
|
| - * are called.
|
| - */
|
| - private static class TestRetryingTokenSource extends RetryingTokenSource {
|
| - private final List<Integer> mRetryDelays = new ArrayList<Integer>();
|
| - private final Semaphore mSuccessSemaphore;
|
| - private final Semaphore mFailSemaphore;
|
| - private final Semaphore mNeedsAccountSemaphore;
|
| -
|
| - /**
|
| - * The token received from the underlying {@link TokenSource} or {@code null} if no token
|
| - * was received.
|
| - */
|
| - private String mReceivedToken;
|
| -
|
| - private TokenSource.Callback mCallback = new TokenSource.Callback() {
|
| - @Override
|
| - public void onTokenReceived(String token) {
|
| - mReceivedToken = token;
|
| - if (mSuccessSemaphore != null) mSuccessSemaphore.release();
|
| - }
|
| -
|
| - @Override
|
| - public void onTokenUnavailable(boolean isTransient) {
|
| - assertFalse("getToken() failed in a recoverable way for a RetryingTokenSource.",
|
| - isTransient);
|
| - if (mFailSemaphore != null) mFailSemaphore.release();
|
| - }
|
| -
|
| - @Override
|
| - public void onNeedsAccountToBeSelected(Intent intent) {
|
| - if (mNeedsAccountSemaphore != null) mNeedsAccountSemaphore.release();
|
| - }
|
| - };
|
| -
|
| - /**
|
| - * @param tokenSource The underlying {@link TokenSource} to use.
|
| - * @param successSemaphore A {@link Semaphore} to track calls to
|
| - * {@link TokenSource#Callback#onTokenReceived(String)}.
|
| - * @param failureSemaphore A {@link Semaphore} to track calls to
|
| - * {@link TokenSource#Callback#onTokenUnavailable(boolean)}.
|
| - * @param needsAccountSemaphore A {@link Semaphore} to track calls to {@link
|
| - * TokenSource#Callback#onNeedsAccountToBeSelected(Intent)}.
|
| - */
|
| - public TestRetryingTokenSource(TokenSource tokenSource, Semaphore successSemaphore,
|
| - Semaphore failureSemaphore, Semaphore needsAccountSemaphore) {
|
| - super(tokenSource);
|
| -
|
| - mSuccessSemaphore = successSemaphore;
|
| - mFailSemaphore = failureSemaphore;
|
| - mNeedsAccountSemaphore = needsAccountSemaphore;
|
| -
|
| - setCallback(mCallback);
|
| - }
|
| -
|
| - /**
|
| - * @return The token received from the underlying {@link TokenSource} or {@code null} if
|
| - * no token was received.
|
| - */
|
| - public String getReceivedToken() {
|
| - return mReceivedToken;
|
| - }
|
| -
|
| - /**
|
| - * @return A {@link List} of the delays (in ms) that would have been between each retry
|
| - * attempt.
|
| - */
|
| - public List<Integer> getRetryDelays() {
|
| - return mRetryDelays;
|
| - }
|
| -
|
| - /**
|
| - * Minimize the actual delay for testing purposes, but save the original delay to validate
|
| - * that the backoff is working.
|
| - * @param delay The original delay the {@link RetryingTokenSource} would like to use.
|
| - * @return A small delay to be used during testing.
|
| - */
|
| - @Override
|
| - protected int finalizeRetryDelay(int delay) {
|
| - mRetryDelays.add(delay);
|
| - return 1;
|
| - }
|
| - }
|
| -
|
| - private AtomicReference<TestRetryingTokenSource> buildAndTriggerTokenSource(
|
| - final String correctToken,
|
| - final int transientFailures,
|
| - final boolean hardFailure,
|
| - final Semaphore successSemaphore,
|
| - final Semaphore failureSemaphore,
|
| - final Semaphore needsAccountSemaphore) {
|
| - final AtomicReference<TestRetryingTokenSource> tokenSource =
|
| - new AtomicReference<TestRetryingTokenSource>();
|
| - getInstrumentation().runOnMainSync(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - TokenSource mockTokenSource =
|
| - new MockTokenSource(correctToken, transientFailures, hardFailure);
|
| - tokenSource.set(new TestRetryingTokenSource(mockTokenSource,
|
| - successSemaphore, failureSemaphore, needsAccountSemaphore));
|
| - tokenSource.get().getToken();
|
| - assertTrue("RetryingTokenSource is not attempting to get a token.",
|
| - tokenSource.get().isRetrievingToken());
|
| - }
|
| - });
|
| - return tokenSource;
|
| - }
|
| -
|
| - private void validateTokenSourceResults(
|
| - final AtomicReference<TestRetryingTokenSource> tokenSource,
|
| - final String expectedToken,
|
| - final int expectedTransientFailures) {
|
| - getInstrumentation().runOnMainSync(new Runnable() {
|
| - @Override
|
| - public void run() {
|
| - String token = tokenSource.get().getReceivedToken();
|
| - assertEquals("getToken() resulted in the wrong token.", expectedToken, token);
|
| -
|
| - List<Integer> delays = tokenSource.get().getRetryDelays();
|
| - assertEquals("getToken() resulted in an incorrect number of retries.",
|
| - expectedTransientFailures + 1, delays.size());
|
| -
|
| - Integer prevDelay = Integer.MIN_VALUE;
|
| - for (int i = 0; i < delays.size(); i++) {
|
| - Integer delay = delays.get(i);
|
| - assertTrue("RetryingTokenSource did not increase delays between attempts "
|
| - + "(" + prevDelay + " < " + delay + " failed).",
|
| - prevDelay < delay);
|
| - assertTrue("RetryingTokenSource used a negative delay.",
|
| - delay >= 0);
|
| - assertTrue("RetryingTokenSource used no delay for retries.",
|
| - delay > 0 || i == 0);
|
| - prevDelay = delay;
|
| - }
|
| - }
|
| - });
|
| - }
|
| -
|
| - /**
|
| - * Tests basic behavior when the token is returned successfully.
|
| - * @throws InterruptedException
|
| - */
|
| - @SmallTest
|
| - public void testSuccessfulTokenSource() throws InterruptedException {
|
| - Semaphore success = new Semaphore(0);
|
| - Semaphore failure = new Semaphore(0);
|
| - Semaphore needsAccount = new Semaphore(0);
|
| - AtomicReference<TestRetryingTokenSource> tokenSource =
|
| - buildAndTriggerTokenSource(TEST_TOKEN, 0, false, success, failure, needsAccount);
|
| -
|
| - // Validate that the callbacks got the expected results.
|
| - assertTrue("Did not receive a successful token in time.",
|
| - success.tryAcquire(SEMAPHORE_TIMEOUT_MS, TimeUnit.MILLISECONDS));
|
| - assertFalse("getToken() failed.", failure.tryAcquire());
|
| - assertFalse("getToken() needed an account.", needsAccount.tryAcquire());
|
| -
|
| - validateTokenSourceResults(tokenSource, TEST_TOKEN, 0);
|
| - }
|
| -
|
| - /**
|
| - * Tests retry behavior when there is a transient error multiple times before the token is
|
| - * returned successfully.
|
| - * @throws InterruptedException
|
| - */
|
| - @SmallTest
|
| - public void testRecoveringTokenSource() throws InterruptedException {
|
| - int failureCount = 6;
|
| -
|
| - Semaphore success = new Semaphore(0);
|
| - Semaphore failure = new Semaphore(0);
|
| - Semaphore needsAccount = new Semaphore(0);
|
| - AtomicReference<TestRetryingTokenSource> tokenSource =
|
| - buildAndTriggerTokenSource(TEST_TOKEN, failureCount, false, success, failure,
|
| - needsAccount);
|
| -
|
| - assertTrue("Did not receive a successful token in time.",
|
| - success.tryAcquire(SEMAPHORE_TIMEOUT_MS, TimeUnit.MILLISECONDS));
|
| - assertFalse("getToken() failed.", failure.tryAcquire());
|
| - assertFalse("getToken() needed an account.", needsAccount.tryAcquire());
|
| -
|
| - validateTokenSourceResults(tokenSource, TEST_TOKEN, failureCount);
|
| - }
|
| -
|
| - /**
|
| - * Tests failure behavior for when there is an unrecoverable error after multiple transient
|
| - * errors.
|
| - * @throws InterruptedException
|
| - */
|
| - @SmallTest
|
| - public void testFailedTokenSource() throws InterruptedException {
|
| - int failureCount = 6;
|
| -
|
| - Semaphore success = new Semaphore(0);
|
| - Semaphore failure = new Semaphore(0);
|
| - Semaphore needsAccount = new Semaphore(0);
|
| - AtomicReference<TestRetryingTokenSource> tokenSource =
|
| - buildAndTriggerTokenSource(TEST_TOKEN, failureCount, true, success, failure,
|
| - needsAccount);
|
| -
|
| - assertTrue("Did not receive a failure in time.",
|
| - failure.tryAcquire(SEMAPHORE_TIMEOUT_MS, TimeUnit.MILLISECONDS));
|
| - assertFalse("getToken() succeeded.", success.tryAcquire());
|
| - assertFalse("getToken() needed an account.", needsAccount.tryAcquire());
|
| -
|
| - validateTokenSourceResults(tokenSource, null, failureCount);
|
| - }
|
| -
|
| - /**
|
| - * Tests failure behavior for when there is an unrecoverable error after multiple transient
|
| - * errors.
|
| - * @throws InterruptedException
|
| - */
|
| - @SmallTest
|
| - public void testTooManyTransientFailures() throws InterruptedException {
|
| - int failureCount = RetryingTokenSource.MAX_NUMBER_OF_RETRIES + 1;
|
| -
|
| - Semaphore success = new Semaphore(0);
|
| - Semaphore failure = new Semaphore(0);
|
| - Semaphore needsAccount = new Semaphore(0);
|
| - AtomicReference<TestRetryingTokenSource> tokenSource =
|
| - buildAndTriggerTokenSource(TEST_TOKEN, failureCount, false, success, failure,
|
| - needsAccount);
|
| -
|
| - assertTrue("Did not receive a failure in time.",
|
| - failure.tryAcquire(SEMAPHORE_TIMEOUT_MS, TimeUnit.MILLISECONDS));
|
| - assertFalse("getToken() succeeded.", success.tryAcquire());
|
| - assertFalse("getToken() needed an account.", needsAccount.tryAcquire());
|
| -
|
| - // Expect one less transient error than MAX_NUMBER_OF_RETRIES.
|
| - validateTokenSourceResults(
|
| - tokenSource, null, RetryingTokenSource.MAX_NUMBER_OF_RETRIES - 1);
|
| - }
|
| -}
|
|
|