Commit cd33dbf9 authored by Bruno Kim Medeiros Cesar's avatar Bruno Kim Medeiros Cesar Committed by Commit Bot

Add initial support for USM accounts

USM accounts should be treated as child accounts in Chrome. Design doc:
go/usm-accounts-chrome (sorry, internal only).

Bug: 826299
Change-Id: I935a0de549d38674af8ce27a8a9a853ec1e8fa76
Reviewed-on: https://chromium-review.googlesource.com/998632Reviewed-by: default avatarBoris Sazonov <bsazonov@chromium.org>
Commit-Queue: Bruno Kim Medeiros Cesar <brunokim@chromium.org>
Cr-Commit-Position: refs/heads/master@{#549217}
parent e888abde
......@@ -22,6 +22,7 @@ import android.support.annotation.MainThread;
import android.support.annotation.Nullable;
import org.chromium.base.Callback;
import org.chromium.base.CommandLine;
import org.chromium.base.ContextUtils;
import org.chromium.base.Log;
import org.chromium.base.ObserverList;
......@@ -61,6 +62,19 @@ public class AccountManagerFacade {
@VisibleForTesting
public static final String FEATURE_IS_CHILD_ACCOUNT_KEY = "service_uca";
/**
* An account feature (corresponding to a Gaia service flag) that specifies whether the account
* is a USM account.
*/
@VisibleForTesting
public static final String FEATURE_IS_USM_ACCOUNT_KEY = "service_usm";
/**
* Command-line switch that enables USM account support.
*/
@VisibleForTesting
public static final String ENABLE_USM_ACCOUNTS_SWITCH = "enable-usm-accounts";
@VisibleForTesting
public static final String ACCOUNT_RESTRICTION_PATTERNS_KEY = "RestrictAccountsToPatterns";
......@@ -513,20 +527,31 @@ public class AccountManagerFacade {
@MainThread
public void checkChildAccount(Account account, Callback<Boolean> callback) {
hasFeatures(account, new String[] {FEATURE_IS_CHILD_ACCOUNT_KEY}, callback);
final String[] features;
if (CommandLine.getInstance().hasSwitch(ENABLE_USM_ACCOUNTS_SWITCH)) {
features = new String[] {FEATURE_IS_CHILD_ACCOUNT_KEY, FEATURE_IS_USM_ACCOUNT_KEY};
} else {
features = new String[] {FEATURE_IS_CHILD_ACCOUNT_KEY};
}
hasAnyOfFeatures(account, features, callback);
}
private boolean hasFeatures(Account account, String[] features) {
return mDelegate.hasFeatures(account, features);
private boolean hasFeature(Account account, String feature) {
return mDelegate.hasFeatures(account, new String[] {feature});
}
private void hasFeatures(
private void hasAnyOfFeatures(
final Account account, final String[] features, final Callback<Boolean> callback) {
ThreadUtils.assertOnUiThread();
new AsyncTask<Void, Void, Boolean>() {
@Override
public Boolean doInBackground(Void... params) {
return hasFeatures(account, features);
for (String feature : features) {
if (hasFeature(account, feature)) {
return true;
}
}
return false;
}
@Override
......
......@@ -22,6 +22,8 @@ import org.junit.runner.RunWith;
import org.robolectric.RuntimeEnvironment;
import org.robolectric.annotation.Config;
import org.chromium.base.Callback;
import org.chromium.base.CommandLine;
import org.chromium.base.test.BaseRobolectricTestRunner;
import org.chromium.components.signin.AccountManagerDelegateException;
import org.chromium.components.signin.AccountManagerFacade;
......@@ -31,6 +33,10 @@ import org.chromium.components.signin.test.util.FakeAccountManagerDelegate;
import org.chromium.testing.local.CustomShadowAsyncTask;
import org.chromium.testing.local.CustomShadowUserManager;
import java.util.Arrays;
import java.util.HashSet;
import java.util.concurrent.atomic.AtomicInteger;
/**
* Test class for {@link AccountManagerFacade}.
*/
......@@ -214,9 +220,50 @@ public class AccountManagerFacadeTest {
Assert.assertArrayEquals(new Account[] {account}, mFacade.getGoogleAccounts());
}
private Account addTestAccount(String accountName) {
@Test
@SmallTest
public void testCheckChildAccount_usmSwitchOff() throws AccountManagerDelegateException {
Account testAccount = addTestAccount("test@gmail.com");
Account ucaAccount =
addTestAccount("uca@gmail.com", AccountManagerFacade.FEATURE_IS_CHILD_ACCOUNT_KEY);
Account usmAccount =
addTestAccount("usm@gmail.com", AccountManagerFacade.FEATURE_IS_USM_ACCOUNT_KEY);
Account bothAccount = addTestAccount("uca_usm@gmail.com",
AccountManagerFacade.FEATURE_IS_CHILD_ACCOUNT_KEY,
AccountManagerFacade.FEATURE_IS_USM_ACCOUNT_KEY);
assertChildAccountStatus(testAccount, false);
assertChildAccountStatus(ucaAccount, true);
assertChildAccountStatus(usmAccount, false);
assertChildAccountStatus(bothAccount, true);
}
@Test
@SmallTest
public void testCheckChildAccount_usmSwitchOn() throws AccountManagerDelegateException {
Account testAccount = addTestAccount("test@gmail.com");
Account ucaAccount =
addTestAccount("uca@gmail.com", AccountManagerFacade.FEATURE_IS_CHILD_ACCOUNT_KEY);
Account usmAccount =
addTestAccount("usm@gmail.com", AccountManagerFacade.FEATURE_IS_USM_ACCOUNT_KEY);
Account bothAccount = addTestAccount("uca_usm@gmail.com",
AccountManagerFacade.FEATURE_IS_CHILD_ACCOUNT_KEY,
AccountManagerFacade.FEATURE_IS_USM_ACCOUNT_KEY);
CommandLine.getInstance().appendSwitch(AccountManagerFacade.ENABLE_USM_ACCOUNTS_SWITCH);
assertChildAccountStatus(testAccount, false);
assertChildAccountStatus(ucaAccount, true);
assertChildAccountStatus(usmAccount, true);
assertChildAccountStatus(bothAccount, true);
}
private Account addTestAccount(String accountName, String... features) {
Account account = AccountManagerFacade.createAccountFromName(accountName);
AccountHolder holder = AccountHolder.builder(account).alwaysAccept(true).build();
AccountHolder holder = AccountHolder.builder(account)
.alwaysAccept(true)
.featureSet(new HashSet<>(Arrays.asList(features)))
.build();
mDelegate.addAccountHolderExplicitly(holder);
Assert.assertFalse(AccountManagerFacade.get().isUpdatePending());
return account;
......@@ -225,4 +272,16 @@ public class AccountManagerFacadeTest {
private void removeTestAccount(Account account) {
mDelegate.removeAccountHolderExplicitly(AccountHolder.builder(account).build());
}
private void assertChildAccountStatus(Account account, boolean status) {
final AtomicInteger callCount = new AtomicInteger();
AccountManagerFacade.get().checkChildAccount(account, new Callback<Boolean>() {
@Override
public void onResult(Boolean result) {
callCount.incrementAndGet();
Assert.assertEquals(result, status);
}
});
Assert.assertEquals(1, callCount.get());
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment