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

Unified Diff: chrome/test/android/javatests/src/org/chromium/chrome/test/util/SigninUtils.java

Issue 1258563005: Added Signin Utilities (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 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: chrome/test/android/javatests/src/org/chromium/chrome/test/util/SigninUtils.java
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SigninUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SigninUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..380598893a666b184a266e245a208dce49925944
--- /dev/null
+++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/SigninUtils.java
@@ -0,0 +1,240 @@
+// 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.chrome.test.util;
+
+import android.accounts.Account;
+import android.accounts.AccountManager;
+import android.accounts.AccountManagerCallback;
+import android.accounts.AccountManagerFuture;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+
+import org.chromium.base.test.BaseActivityInstrumentationTestCase;
+import org.chromium.chrome.test.services.accountauthenticator.AccountConstants;
+import org.chromium.sync.signin.ChromeSigninController;
+
+import java.io.IOException;
+
+/**
+ * A tool used for running tests as signed in. Currently this only works for instrumentation tests
+ * that extened {@link ChromeActivityTestCaseBase} and only signs in to the Chrome app.
+ */
+public class SigninUtils {
+ private AccountManager mAccountManager;
+ private Context mTargetContext;
+
+ /**
+ * The constructor for SigninUtils for a given test case.
+ *
+ * @param testCase the test case to perform signin operations with.
+ */
+ public SigninUtils(BaseActivityInstrumentationTestCase testCase) {
+ mTargetContext = testCase.getInstrumentation().getTargetContext();
+ mAccountManager = AccountManager.get(testCase.getInstrumentation().getContext());
+ }
+
+ /**
+ * Removes account from the app.
+ */
+ public void removeAccountFromApp() {
+ ChromeSigninController.get(mTargetContext).clearSignedInUser();
+ }
+
+ /**
+ * Checks if an existing fake account is on the app.
+ *
+ * @return true if fake account is signed in on app, false otherwise.
+ */
+ public boolean isExistingAccountOnApp() {
+ return ChromeSigninController.get(mTargetContext).isSignedIn();
+ }
+
+ /**
+ * Adds an account to the app.
+ *
+ * @param username the username for the logged in account. must be a gaia account.
+ */
+ public void addAccountToApp(String username) {
+ if (isExistingAccountOnApp()) {
+ removeAccountFromApp();
+ }
+ ChromeSigninController.get(mTargetContext).setSignedInAccountName(username);
+ }
+
+ /**
+ * Adds a fake account to the OS.
+ */
+ public void addFakeAccountToOs(String username, String password) {
+ addAccountToOs(username, password, AccountConstants.FAKE_ACCOUNT_TYPE);
+ }
+
+ /**
+ * Removes a fake account from the OS.
+ */
+ public void removeFakeAccountFromOs(String username) {
+ Account account = new Account(username, AccountConstants.FAKE_ACCOUNT_TYPE);
+ mAccountManager.removeAccountExplicitly(account);
+ }
+
+ /**
+ * Removes all fake accounts from the OS.
+ */
+ public void removeAllFakeAccountsFromOs() {
+ removeAllAccountsOfTypeFromOs(AccountConstants.FAKE_ACCOUNT_TYPE);
+ }
+
+ /**
+ * Checks if an existing fake account is on the OS.
+ *
+ * @return true if fake account is on OS, false otherwise.
+ */
+ public boolean isExistingFakeAccountOnOs() {
+ return mAccountManager.getAccountsByType(AccountConstants.FAKE_ACCOUNT_TYPE).length > 0;
+ }
+
+ /**
+ * Adds a Gaia account to the OS.
+ */
+ public void addGaiaAccountToOs(String username, String password, String type) {
+ final Bundle options = new Bundle();
+ options.putString(AccountConstants.USERNAME, username);
+ options.putString(AccountConstants.PASSWORD, password);
+ options.putBoolean(AccountConstants.ALLOW_SKIP, true);
+
+ AuthenticationCallback authCallback = new AuthenticationCallback();
+ mAccountManager.addAccount(AccountConstants.GOOGLE_ACCOUNT_TYPE, type, null, options, null,
+ authCallback, null);
+
+ Bundle authResult = authCallback.waitForAuthCompletion();
+
+ if (authResult.containsKey(AccountManager.KEY_ERROR_CODE)) {
+ throw new IllegalStateException(String.format("AddAccount failed. Reason: %s",
+ authResult.get(AccountManager.KEY_ERROR_MESSAGE)));
+ }
+ }
+
+ /**
+ * Checks to see if an existing Gaia account is on OS.
+ *
+ * @return {@code true} if one or more gaia accounts exists on OS, {@code false} otherwise
+ */
+ public boolean isExistingGaiaAccountOnOs() {
+ return mAccountManager.getAccountsByType(AccountConstants.GOOGLE_ACCOUNT_TYPE).length > 0;
+ }
+
+ /**
+ * Removes all Gaia accounts from the OS.
+ */
+ public void removeAllGaiaAccountsFromOs() {
+ removeAllAccountsOfTypeFromOs(AccountConstants.GOOGLE_ACCOUNT_TYPE);
+ }
+
+ /**
+ * Helper class for adding Gaia accounts to OS.
+ *
+ * Usage: Use this as the callback parameter when using {@link addAccount} in
+ * {@link android.accounts.AccountManager}.
+ */
+ private class AuthenticationCallback implements AccountManagerCallback<Bundle> {
+ /** Stores the result of account authentication. Null means not finished. */
+ private Bundle mResultBundle = null;
+
+ /**
+ * Block and wait for the authentication callback to complete.
+ *
+ * @return the {@link Bundle} result from the authentication.
+ */
+ public synchronized Bundle waitForAuthCompletion() {
+ while (mResultBundle == null) {
+ try {
+ wait();
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
+ return mResultBundle;
+ }
+
+ public void run(AccountManagerFuture<Bundle> future) {
+ try {
+ mResultBundle = future.getResult();
+ } catch (OperationCanceledException e) {
+ mResultBundle = buildExceptionBundle(e);
+ } catch (IOException e) {
+ mResultBundle = buildExceptionBundle(e);
+ } catch (AuthenticatorException e) {
+ mResultBundle = buildExceptionBundle(e);
+ }
+ synchronized (this) {
+ notifyAll();
+ }
+ }
+
+ /**
+ * Create a result bundle for a given exception.
+ *
+ * @param e the exception to be made into a {@link Bundle}
+ * @return the {@link Bundle} for the given exception e.
+ */
+ private Bundle buildExceptionBundle(Exception e) {
+ Bundle bundle = new Bundle();
+ bundle.putInt(AccountManager.KEY_ERROR_CODE,
+ AccountManager.ERROR_CODE_INVALID_RESPONSE);
+ bundle.putString(AccountManager.KEY_ERROR_MESSAGE, e.toString());
+ return bundle;
+ }
+ }
+
+ /**
+ * Adds a user account. If the account already exists, we do nothing.
+ *
+ * @param username the username of the account.
+ * @param password the password of the account.
+ * @param type the type of the account.
+ * @throws RuntimeException if the account creation fails.
+ */
+ public void addAccountToOs(String username, String password, String type) {
+ Account account = new Account(username, type);
+ mAccountManager.addAccountExplicitly(account, password, new Bundle());
+ }
+
+ /**
+ * Checks if an existing account is on the OS.
+ *
+ * @param username the username of the account signed in (e.g. test@example.com).
+ * @param type the type of account on the OS (e.g. com.example).
+ * @return true if account is signed in on OS, false otherwise.
+ * @throws IllegalArgumentException if username is empty.
+ */
+ private boolean isExistingAccountOnOs(String username, String type) {
+ Account account = new Account(username, type);
+
+ if (TextUtils.isEmpty(username)) {
+ throw new IllegalArgumentException("ERROR: must specify account");
+ }
+
+ // If the account already exists, return false
+ for (Account acct : mAccountManager.getAccountsByType(type)) {
+ if (acct.name.equals(username) && acct.type.equals(type)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Removes all accounts of a certain type from OS.
+ *
+ * @param type the type of account on the OS (e.g. com.example).
+ */
+ private void removeAllAccountsOfTypeFromOs(String type) {
+ for (Account acct : mAccountManager.getAccountsByType(type)) {
+ mAccountManager.removeAccount(acct, null, null);
+ }
+ }
+}

Powered by Google App Engine
This is Rietveld 408576698