14e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
24e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
34e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)// found in the LICENSE file.
44e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
54e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)package org.chromium.chrome.browser.signin;
64e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
74e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.accounts.Account;
84e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.test.UiThreadTest;
94e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import android.test.suitebuilder.annotation.MediumTest;
104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.base.ThreadUtils;
124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.base.test.util.AdvancedMockContext;
134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.base.test.util.Feature;
144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.chrome.browser.profiles.Profile;
15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)import org.chromium.chrome.shell.ChromeShellTestBase;
164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.sync.signin.AccountManagerHelper;
174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.sync.signin.ChromeSigninController;
184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.sync.test.util.AccountHolder;
194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import org.chromium.sync.test.util.MockAccountManager;
204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)import java.util.concurrent.atomic.AtomicReference;
224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)/**
244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * Integration test for the OAuth2TokenService.
254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) *
264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) * These tests initialize the native part of the service.
274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) */
28a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)public class OAuth2TokenServiceIntegrationTest extends ChromeShellTestBase {
294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private static final Account TEST_ACCOUNT1 =
314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            AccountManagerHelper.createAccountFromName("foo@gmail.com");
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private static final Account TEST_ACCOUNT2 =
334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            AccountManagerHelper.createAccountFromName("bar@gmail.com");
344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private static final AccountHolder TEST_ACCOUNT_HOLDER_1 =
351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            AccountHolder.create().account(TEST_ACCOUNT1).alwaysAccept(true).build();
364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private static final AccountHolder TEST_ACCOUNT_HOLDER_2 =
371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci            AccountHolder.create().account(TEST_ACCOUNT2).alwaysAccept(true).build();
384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private AdvancedMockContext mContext;
404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private OAuth2TokenService mOAuth2TokenService;
414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private MockAccountManager mAccountManager;
424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private TestObserver mObserver;
434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private ChromeSigninController mChromeSigninController;
444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @Override
464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    protected void setUp() throws Exception {
474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        super.setUp();
484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        clearAppData();
494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        startChromeBrowserProcessSync(getInstrumentation().getTargetContext());
504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set up AccountManager.
524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mContext = new AdvancedMockContext(getInstrumentation().getTargetContext());
534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mAccountManager = new MockAccountManager(mContext, getInstrumentation().getContext());
544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        AccountManagerHelper.overrideAccountManagerHelperForTests(mContext, mAccountManager);
55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        // Make sure there is no account signed in yet.
574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mChromeSigninController = ChromeSigninController.get(mContext);
58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        mChromeSigninController.setSignedInAccountName(null);
594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Get a reference to the service.
614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService = getOAuth2TokenServiceOnUiThread();
624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Set up observer.
644e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mObserver = new TestObserver();
654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        addObserver(mObserver);
664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    /**
694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * The {@link OAuth2TokenService} and the {@link Profile} can only be accessed from the UI
704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * thread, so this helper method is a convenience method to retrieve it.
714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     *
724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     * @return the OAuth2TokenService.
734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)     */
744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private static OAuth2TokenService getOAuth2TokenServiceOnUiThread() {
754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        final AtomicReference<OAuth2TokenService> service =
764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                new AtomicReference<OAuth2TokenService>();
774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            @Override
794e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            public void run() {
804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                service.set(OAuth2TokenService.getForProfile(Profile.getLastUsedProfile()));
814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            }
824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        });
834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        return service.get();
844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private void addObserver(final TestObserver observer) {
874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        ThreadUtils.runOnUiThreadBlocking(new Runnable() {
884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            @Override
894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            public void run() {
904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)                mOAuth2TokenService.addObserver(observer);
914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            }
924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        });
934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @MediumTest
964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @UiThreadTest
974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @Feature({"Sync"})
984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void testFireRefreshTokenAvailableNotifiesJavaObservers() {
994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Adding an observer should not lead to a callback.
1004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getAvailableCallCount());
1014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // An observer should be called with the correct account.
1034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.fireRefreshTokenAvailable(TEST_ACCOUNT1);
1044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(1, mObserver.getAvailableCallCount());
1054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(TEST_ACCOUNT1, mObserver.getLastAccount());
1064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // When mOAuth2TokenService, an observer should not be called.
1084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.removeObserver(mObserver);
1094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.fireRefreshTokenAvailable(TEST_ACCOUNT1);
1104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(1, mObserver.getAvailableCallCount());
1114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // No other observer interface method should ever have been called.
1134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
1144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
1154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @MediumTest
1184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @UiThreadTest
1194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @Feature({"Sync"})
1204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void testFireRefreshTokenRevokedNotifiesJavaObservers() {
1214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Adding an observer should not lead to a callback.
1224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
1234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // An observer should be called with the correct account.
1254e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.fireRefreshTokenRevoked(TEST_ACCOUNT1);
1264e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(1, mObserver.getRevokedCallCount());
1274e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(TEST_ACCOUNT1, mObserver.getLastAccount());
1284e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // When removed, an observer should not be called.
1304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.removeObserver(mObserver);
1314e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.fireRefreshTokenRevoked(TEST_ACCOUNT1);
1324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(1, mObserver.getRevokedCallCount());
1334e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1344e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // No other observer interface method should ever have been called.
1354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getAvailableCallCount());
1364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
1374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @MediumTest
1404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @UiThreadTest
1414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @Feature({"Sync"})
1424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void testFireRefreshTokensLoadedNotifiesJavaObservers() {
1434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Adding an observer should not lead to a callback.
1444e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
1454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // An observer should be called with the correct account.
1474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.fireRefreshTokensLoaded();
1484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(1, mObserver.getLoadedCallCount());
1494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // When removed, an observer should not be called.
1514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.removeObserver(mObserver);
1524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mOAuth2TokenService.fireRefreshTokensLoaded();
1534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(1, mObserver.getLoadedCallCount());
1544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // No other observer interface method should ever have been called.
1564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getAvailableCallCount());
1574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
1584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1604e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @MediumTest
1614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @UiThreadTest
1624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void testValidateAccountsNoAccountsRegisteredAndNoSignedInUser() {
1634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Run test.
164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
1654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Ensure no calls have been made to the observer.
1674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getAvailableCallCount());
1684e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
1694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
1704e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1714e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1724e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @MediumTest
1734e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @UiThreadTest
1744e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void testValidateAccountsOneAccountsRegisteredAndNoSignedInUser() {
1754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Add account.
1764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
1774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1784e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Run test.
179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
1804e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1814e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Ensure no calls have been made to the observer.
1824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getAvailableCallCount());
1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
1844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
1854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
1864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @MediumTest
1884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @UiThreadTest
1894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void testValidateAccountsOneAccountsRegisteredSignedIn() {
1904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Add account.
1914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
1924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Mark user as signed in.
1944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
1954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
1964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Run test.
197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
1984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
199f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        // Ensure one call for the signed in account.
2004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(1, mObserver.getAvailableCallCount());
2014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
2024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
203f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        // Validate again and make sure no new calls are made.
205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(1, mObserver.getAvailableCallCount());
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
210f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        // Validate again with force notifications and make sure one new calls is made.
211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        mOAuth2TokenService.validateAccounts(mContext, true);
212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(2, mObserver.getAvailableCallCount());
213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
2154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
2164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
2174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @MediumTest
2184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @UiThreadTest
2195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    public void testValidateAccountsSingleAccountWithoutChanges() {
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Add account.
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
2225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Mark user as signed in.
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Run one validation.
227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
2285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(1, mObserver.getAvailableCallCount());
2295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getRevokedCallCount());
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getLoadedCallCount());
2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Re-run validation.
233116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
234f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(1, mObserver.getAvailableCallCount());
2355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getRevokedCallCount());
2365c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getLoadedCallCount());
2375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
2385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2395c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @MediumTest
2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @UiThreadTest
2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    public void testValidateAccountsSingleAccountThenAddOne() {
2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Add account.
2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Mark user as signed in.
2465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Run one validation.
249116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
2505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(1, mObserver.getAvailableCallCount());
2515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getRevokedCallCount());
2525c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getLoadedCallCount());
2535c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2545c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Add another account.
2555c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_2);
2565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2575c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Re-run validation.
258116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(2, mObserver.getAvailableCallCount());
2605c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getRevokedCallCount());
2615c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getLoadedCallCount());
2625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
2635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @MediumTest
2655c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @UiThreadTest
2665c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    public void testValidateAccountsTwoAccountsThenRemoveOne() {
2675c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Add accounts.
2685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
2695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_2);
2705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2715c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Mark user as signed in.
2725c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
2735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Run one validation.
275116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
2765c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(2, mObserver.getAvailableCallCount());
2775c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.removeAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_2);
279116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
281f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(2, mObserver.getAvailableCallCount());
2825c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(1, mObserver.getRevokedCallCount());
2835c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getLoadedCallCount());
2845c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
2855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @MediumTest
2875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @UiThreadTest
2885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    public void testValidateAccountsTwoAccountsThenRemoveAll() {
2895c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Add accounts.
2905c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
2915c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_2);
2925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Mark user as signed in.
2945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
2955c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
296116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
2975c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(2, mObserver.getAvailableCallCount());
2985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Remove all.
3005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.removeAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
3015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.removeAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_2);
3025c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Re-validate and run checks.
304116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
3055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(2, mObserver.getRevokedCallCount());
3065c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getLoadedCallCount());
3075c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
3085c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3095c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @MediumTest
3105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @UiThreadTest
3115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    public void testValidateAccountsTwoAccountsThenRemoveAllSignOut() {
3125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Add accounts.
3135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
3145c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_2);
3155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Mark user as signed in.
3175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
3185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
319116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
3205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(2, mObserver.getAvailableCallCount());
3215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Remove all.
3235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mChromeSigninController.clearSignedInUser();
3245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.removeAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
3255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        mAccountManager.removeAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_2);
3265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        // Re-validate and run checks.
328116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
3295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(2, mObserver.getRevokedCallCount());
3305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu        assertEquals(0, mObserver.getLoadedCallCount());
3315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    }
3325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
3335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @MediumTest
3345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    @UiThreadTest
3354e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void testValidateAccountsTwoAccountsRegisteredAndOneSignedIn() {
3364e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Add accounts.
3374e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_1);
3384e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mAccountManager.addAccountHolderExplicitly(TEST_ACCOUNT_HOLDER_2);
3394e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3404e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Mark user as signed in.
3414e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
3424e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3434e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Run test.
344116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
3454e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // All accounts will be notified. It is up to the observer
347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        // to design if any action is needed.
348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)        assertEquals(2, mObserver.getAvailableCallCount());
3494e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
3504e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
3514e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
3524e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3534e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @MediumTest
3544e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    @UiThreadTest
3554e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    public void testValidateAccountsNoAccountsRegisteredButSignedIn() {
3564e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Mark user as signed in without setting up the account.
3574e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
3584e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3594e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Run test.
360116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
3614e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3624e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        // Ensure no calls have been made to the observer.
3634e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getAvailableCallCount());
364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)        assertEquals(0, mObserver.getRevokedCallCount());
3654e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        assertEquals(0, mObserver.getLoadedCallCount());
3664e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
3674e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    @MediumTest
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    @UiThreadTest
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    public void testValidateAccountsFiresEventAtTheEnd() {
371cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        // Mark user as signed in without setting up the account.
372cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        mChromeSigninController.setSignedInAccountName(TEST_ACCOUNT1.name);
373cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        TestObserver ob = new TestObserver() {
374cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            @Override
375cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            public void onRefreshTokenAvailable(Account account) {
376cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                super.onRefreshTokenAvailable(account);
377cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                assertEquals(1, OAuth2TokenService.getAccounts(mContext).length);
378cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)            }
379cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        };
380cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
381cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)        addObserver(ob);
382116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch        mOAuth2TokenService.validateAccounts(mContext, false);
383cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)    }
384cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3854e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    private static class TestObserver implements OAuth2TokenService.OAuth2TokenServiceObserver {
3864e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        private int mAvailableCallCount;
3874e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        private int mRevokedCallCount;
3884e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        private int mLoadedCallCount;
3894e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        private Account mLastAccount;
3904e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3914e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        @Override
3924e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        public void onRefreshTokenAvailable(Account account) {
3934e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mAvailableCallCount++;
3944e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mLastAccount = account;
3954e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
3964e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
3974e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        @Override
3984e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        public void onRefreshTokenRevoked(Account account) {
3994e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mRevokedCallCount++;
4004e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mLastAccount = account;
4014e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
4024e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4034e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        @Override
4044e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        public void onRefreshTokensLoaded() {
4054e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            mLoadedCallCount++;
4064e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
4074e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4084e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        public int getAvailableCallCount() {
4094e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            return mAvailableCallCount;
4104e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
4114e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4124e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        public int getRevokedCallCount() {
4134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            return mRevokedCallCount;
4144e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
4154e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4164e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        public int getLoadedCallCount() {
4174e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            return mLoadedCallCount;
4184e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
4194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)
4204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        public Account getLastAccount() {
4214e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)            return mLastAccount;
4224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        }
4234e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)    }
4244e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}
425