Merge "Seeding CTS tests for ContactsContract." into eclair
diff --git a/tests/tests/accounts/AndroidManifest.xml b/tests/tests/accounts/AndroidManifest.xml
index 623e1ad..a54d423 100644
--- a/tests/tests/accounts/AndroidManifest.xml
+++ b/tests/tests/accounts/AndroidManifest.xml
@@ -22,12 +22,13 @@
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
+ <uses-permission android:name="android.permission.USE_CREDENTIALS" />
<application>
<uses-library android:name="android.test.runner" />
<service android:name="MockAccountService" android:exported="true"
- android:process="android.accounts.cts">
+ android:process="android.accounts.cts">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator" />
</intent-filter>
diff --git a/tests/tests/accounts/res/drawable/ic_cts_minitab_selected.png b/tests/tests/accounts/res/drawable/ic_cts_minitab_selected.png
index 73b0b38..c730050 100644
--- a/tests/tests/accounts/res/drawable/ic_cts_minitab_selected.png
+++ b/tests/tests/accounts/res/drawable/ic_cts_minitab_selected.png
Binary files differ
diff --git a/tests/tests/accounts/res/drawable/ic_cts_selected.png b/tests/tests/accounts/res/drawable/ic_cts_selected.png
index 0af7914..72a065c 100644
--- a/tests/tests/accounts/res/drawable/ic_cts_selected.png
+++ b/tests/tests/accounts/res/drawable/ic_cts_selected.png
Binary files differ
diff --git a/tests/tests/accounts/res/values/strings.xml b/tests/tests/accounts/res/values/strings.xml
index 6f12b72..442669b 100644
--- a/tests/tests/accounts/res/values/strings.xml
+++ b/tests/tests/accounts/res/values/strings.xml
@@ -19,5 +19,5 @@
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
<!-- Label for this package -->
- <string name="label">Android CTS</string>
+ <string name="label">Android CTS - Account</string>
</resources>
\ No newline at end of file
diff --git a/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java b/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
index 0a86a5e..d625b06 100644
--- a/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
+++ b/tests/tests/accounts/src/android/accounts/cts/AccountManagerTest.java
@@ -16,49 +16,1105 @@
package android.accounts.cts;
-import dalvik.annotation.KnownFailure;
-
import android.accounts.Account;
import android.accounts.AccountManager;
+import android.accounts.AccountManagerCallback;
import android.accounts.AccountManagerFuture;
+import android.accounts.AuthenticatorDescription;
+import android.accounts.AuthenticatorException;
+import android.accounts.OnAccountsUpdateListener;
+import android.accounts.OperationCanceledException;
+import android.app.Activity;
+import android.content.Context;
import android.os.Bundle;
+import android.os.Handler;
import android.test.AndroidTestCase;
+import java.io.IOException;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
public class AccountManagerTest extends AndroidTestCase {
- @KnownFailure(value="failure removing account bug 2342468")
- public void testAddAndRemoveAccount() throws Exception {
- AccountManager am = AccountManager.get(getContext());
+ public static final String ACCOUNT_NAME = "android.accounts.cts.account.name";
+ public static final String ACCOUNT_NAME_OTHER = "android.accounts.cts.account.name.other";
+ public static final String ACCOUNT_TYPE = "android.accounts.cts.account.type";
+ public static final String ACCOUNT_TYPE_OTHER = "android.accounts.cts.account.type.other";
+
+ public static final String ACCOUNT_PASSWORD = "android.accounts.cts.account.password";
+
+ public static final String AUTH_TOKEN = "mockAuthToken";
+ public static final String AUTH_TOKEN_TYPE = "mockAuthTokenType";
+ public static final String AUTH_TOKEN_LABEL = "mockAuthTokenLabel";
+
+ public static final String FEATURE_1 = "feature.1";
+ public static final String FEATURE_2 = "feature.2";
+ public static final String NON_EXISTING_FEATURE = "feature.3";
+
+ public static final String OPTION_NAME_1 = "option.name.1";
+ public static final String OPTION_VALUE_1 = "option.value.1";
+
+ public static final String OPTION_NAME_2 = "option.name.2";
+ public static final String OPTION_VALUE_2 = "option.value.2";
+
+ public static final String[] REQUIRED_FEATURES = new String[] { FEATURE_1, FEATURE_2 };
+
+ public static final Activity ACTIVITY = new Activity();
+ public static final Bundle OPTIONS_BUNDLE = new Bundle();
+
+ public static final Bundle USERDATA_BUNDLE = new Bundle();
+
+ public static final String USERDATA_NAME_1 = "user.data.name.1";
+ public static final String USERDATA_NAME_2 = "user.data.name.2";
+ public static final String USERDATA_VALUE_1 = "user.data.value.1";
+ public static final String USERDATA_VALUE_2 = "user.data.value.2";
+
+ public static final Account ACCOUNT = new Account(ACCOUNT_NAME, ACCOUNT_TYPE);
+ public static final Account ACCOUNT_SAME_TYPE = new Account(ACCOUNT_NAME_OTHER, ACCOUNT_TYPE);
+
+ private static MockAccountAuthenticator mockAuthenticator;
+ private static final int LATCH_TIMEOUT_MS = 500;
+ private static AccountManager am;
+
+ public synchronized static MockAccountAuthenticator getMockAuthenticator(Context context) {
+ if (null == mockAuthenticator) {
+ mockAuthenticator = new MockAccountAuthenticator(context);
+ }
+ return mockAuthenticator;
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ OPTIONS_BUNDLE.putString(OPTION_NAME_1, OPTION_VALUE_1);
+ OPTIONS_BUNDLE.putString(OPTION_NAME_2, OPTION_VALUE_2);
+
+ USERDATA_BUNDLE.putString(USERDATA_NAME_1, USERDATA_VALUE_1);
+
+ getMockAuthenticator(getContext());
+
+ am = AccountManager.get(getContext());
+ }
+
+ @Override
+ public void tearDown() throws Exception, AuthenticatorException, OperationCanceledException {
+ mockAuthenticator.clearData();
+
+ // Need to clean up created account
+ assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
+ assertTrue(removeAccount(am, ACCOUNT_SAME_TYPE, null /* callback */));
+
+ // need to clean up the authenticator cached data
+ mockAuthenticator.clearData();
+
+ super.tearDown();
+ }
+
+ private void validateNonNullResult(Bundle result) {
+ assertEquals(ACCOUNT_NAME, result.get(AccountManager.KEY_ACCOUNT_NAME));
+ assertEquals(ACCOUNT_TYPE, result.get(AccountManager.KEY_ACCOUNT_TYPE));
+ assertEquals(AUTH_TOKEN, result.get(AccountManager.KEY_AUTHTOKEN));
+ }
+
+ private void validateNullResult(Bundle resultBundle) {
+ assertNull(resultBundle.get(AccountManager.KEY_ACCOUNT_NAME));
+ assertNull(resultBundle.get(AccountManager.KEY_ACCOUNT_TYPE));
+ assertNull(resultBundle.get(AccountManager.KEY_AUTHTOKEN));
+ }
+
+ private void validateAccountAndAuthTokenType() {
+ assertEquals(ACCOUNT_TYPE, mockAuthenticator.getAccountType());
+ assertEquals(AUTH_TOKEN_TYPE, mockAuthenticator.getAuthTokenType());
+ }
+
+ private void validateFeatures() {
+ assertEquals(REQUIRED_FEATURES[0], mockAuthenticator.getRequiredFeatures()[0]);
+ assertEquals(REQUIRED_FEATURES[1], mockAuthenticator.getRequiredFeatures()[1]);
+ }
+
+ private void validateOptions() {
+ assertNotNull(mockAuthenticator.getOptions());
+ assertEquals(OPTION_VALUE_1, mockAuthenticator.getOptions().get(OPTION_NAME_1));
+ assertEquals(OPTION_VALUE_2, mockAuthenticator.getOptions().get(OPTION_NAME_2));
+ }
+
+ private void validateCredentials() {
+ assertEquals(ACCOUNT, mockAuthenticator.getAccount());
+
+ assertEquals(OPTION_VALUE_1, mockAuthenticator.getOptions().get(OPTION_NAME_1));
+ assertEquals(OPTION_VALUE_2, mockAuthenticator.getOptions().get(OPTION_NAME_2));
+ }
+
+ private int getAccountsCount() {
Account[] accounts = am.getAccounts();
assertNotNull(accounts);
- final int accountsCount = accounts.length;
+ return accounts.length;
+ }
+
+ private Bundle addAccount(AccountManager am, String accountType, String authTokenType,
+ String[] requiredFeatures, Bundle options, Activity activity,
+ AccountManagerCallback<Bundle> callback, Handler handler) throws
+ IOException, AuthenticatorException, OperationCanceledException {
AccountManagerFuture<Bundle> futureBundle = am.addAccount(
- MockAccountAuthenticator.MOCK_ACCOUNT_TYPE,
- MockAccountAuthenticator.MOCK_AUTH_TOKEN_TYPE,
- null, null, null, null, null);
+ accountType,
+ authTokenType,
+ requiredFeatures,
+ options,
+ activity,
+ callback,
+ handler);
Bundle resultBundle = futureBundle.getResult();
assertTrue(futureBundle.isDone());
assertNotNull(resultBundle);
- assertEquals(MockAccountAuthenticator.MOCK_ACCOUNT_NAME,
- resultBundle.get(AccountManager.KEY_ACCOUNT_NAME));
- assertEquals(MockAccountAuthenticator.MOCK_ACCOUNT_TYPE,
- resultBundle.get(AccountManager.KEY_ACCOUNT_TYPE));
- assertNotNull(resultBundle.get(AccountManager.KEY_AUTHTOKEN));
- accounts = am.getAccounts();
- assertNotNull(accounts);
- assertEquals(1 + accountsCount, accounts.length);
+ return resultBundle;
+ }
- AccountManagerFuture<Boolean> futureBoolean = am.removeAccount(accounts[0], null, null);
+ private boolean removeAccount(AccountManager am, Account account,
+ AccountManagerCallback<Boolean> callback) throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ AccountManagerFuture<Boolean> futureBoolean = am.removeAccount(account,
+ callback,
+ null /* handler */);
Boolean resultBoolean = futureBoolean.getResult();
assertTrue(futureBoolean.isDone());
- assertNotNull(resultBoolean);
+ return resultBoolean;
+ }
+
+ private void addAccountExplicitly(Account account, String password, Bundle userdata) {
+ assertTrue(am.addAccountExplicitly(account, password, userdata));
+ }
+
+ private Bundle getAuthTokenByFeature(String[] features, Activity activity)
+ throws IOException, AuthenticatorException, OperationCanceledException {
+
+ AccountManagerFuture<Bundle> futureBundle = am.getAuthTokenByFeatures(ACCOUNT_TYPE,
+ AUTH_TOKEN_TYPE,
+ features,
+ activity,
+ OPTIONS_BUNDLE,
+ OPTIONS_BUNDLE,
+ null /* no callback */,
+ null /* no handler */
+ );
+
+ Bundle resultBundle = futureBundle.getResult();
+
+ assertTrue(futureBundle.isDone());
+ assertNotNull(resultBundle);
+
+ return resultBundle;
+ }
+
+ private boolean isAccountPresent(Account[] accounts, Account accountToCheck) {
+ if (null == accounts || null == accountToCheck) {
+ return false;
+ }
+ boolean result = false;
+ int length = accounts.length;
+ for (int n=0; n<length; n++) {
+ if(accountToCheck.equals(accounts[n])) {
+ result = true;
+ break;
+ }
+ }
+ return result;
+ }
+
+ /**
+ * Test singleton
+ */
+ public void testGet() {
+ assertNotNull(AccountManager.get(getContext()));
+ }
+
+ /**
+ * Test a basic addAccount()
+ */
+ public void testAddAccount() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ Bundle resultBundle = addAccount(am,
+ ACCOUNT_TYPE,
+ AUTH_TOKEN_TYPE,
+ REQUIRED_FEATURES,
+ OPTIONS_BUNDLE,
+ ACTIVITY,
+ null /* callback */,
+ null /* handler */);
+
+ // Assert parameters has been passed correctly
+ validateAccountAndAuthTokenType();
+ validateFeatures();
+ validateOptions();
+
+ // Assert returned result
+ validateNonNullResult(resultBundle);
+ }
+
+ /**
+ * Test addAccount() with callback and handler
+ */
+ public void testAddAccountWithCallbackAndHandler() throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ testAddAccountWithCallbackAndHandler(null /* handler */);
+ testAddAccountWithCallbackAndHandler(new Handler());
+ }
+
+ private void testAddAccountWithCallbackAndHandler(Handler handler) throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+ public void run(AccountManagerFuture<Bundle> bundleFuture) {
+ Bundle resultBundle = null;
+ try {
+ resultBundle = bundleFuture.getResult();
+ } catch (OperationCanceledException e) {
+ fail("should not throw an OperationCanceledException");
+ } catch (IOException e) {
+ fail("should not throw an IOException");
+ } catch (AuthenticatorException e) {
+ fail("should not throw an AuthenticatorException");
+ }
+
+ // Assert parameters has been passed correctly
+ validateAccountAndAuthTokenType();
+ validateFeatures();
+ validateOptions();
+
+ // Assert return result
+ validateNonNullResult(resultBundle);
+
+ latch.countDown();
+ }
+ };
+
+ Bundle resultBundle = addAccount(am,
+ ACCOUNT_TYPE,
+ AUTH_TOKEN_TYPE,
+ REQUIRED_FEATURES,
+ OPTIONS_BUNDLE,
+ ACTIVITY,
+ callback,
+ handler);
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+ }
+
+ /**
+ * Test addAccountExplicitly() and removeAccount()
+ */
+ public void testAddAccountExplicitlyAndRemoveAccount() throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ final int accountsCount = getAccountsCount();
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ // Assert that we have one more account
+ Account[] accounts = am.getAccounts();
+ assertNotNull(accounts);
+ assertEquals(1 + accountsCount, accounts.length);
+ assertTrue(isAccountPresent(am.getAccounts(), ACCOUNT));
+
+ // Need to clean up
+ assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
+
+ // and verify that we go back to the initial state
accounts = am.getAccounts();
assertNotNull(accounts);
assertEquals(accountsCount, accounts.length);
}
+
+ /**
+ * Test getAccounts() and getAccountsByType()
+ */
+ public void testGetAccountsAndGetAccountsByType() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ assertEquals(false, isAccountPresent(am.getAccounts(), ACCOUNT));
+ assertEquals(false, isAccountPresent(am.getAccounts(), ACCOUNT_SAME_TYPE));
+
+ final int accountsCount = getAccountsCount();
+
+ // Add a first account
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ // Check that we have the new account
+ Account[] accounts = am.getAccounts();
+ assertEquals(1 + accountsCount, accounts.length);
+ assertEquals(true, isAccountPresent(accounts, ACCOUNT));
+
+ // Add another account
+ addAccountExplicitly(ACCOUNT_SAME_TYPE, ACCOUNT_PASSWORD, null /* userData */);
+
+ // Check that we have one more account again
+ accounts = am.getAccounts();
+ assertEquals(2 + accountsCount, accounts.length);
+ assertEquals(true, isAccountPresent(accounts, ACCOUNT_SAME_TYPE));
+
+ // Check if we have one from first type
+ accounts = am.getAccountsByType(ACCOUNT_TYPE);
+ assertEquals(2, accounts.length);
+
+ // Check if we dont have any account from the other type
+ accounts = am.getAccountsByType(ACCOUNT_TYPE_OTHER);
+ assertEquals(0, accounts.length);
+ }
+
+ /**
+ * Test getAuthenticatorTypes()
+ */
+ public void testGetAuthenticatorTypes() {
+ AuthenticatorDescription[] types = am.getAuthenticatorTypes();
+ for(AuthenticatorDescription description: types) {
+ if (description.type.equals(ACCOUNT_TYPE)) {
+ return;
+ }
+ }
+ fail("should have found Authenticator type: " + ACCOUNT_TYPE);
+ }
+
+ /**
+ * Test setPassword() and getPassword()
+ */
+ public void testSetAndGetAndClearPassword() {
+ // Add a first account
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ // Check that the password is the one we defined
+ assertEquals(ACCOUNT_PASSWORD, am.getPassword(ACCOUNT));
+
+ // Clear the password and check that it is cleared
+ am.clearPassword(ACCOUNT);
+ assertNull(am.getPassword(ACCOUNT));
+
+ // Reset the password
+ am.setPassword(ACCOUNT, ACCOUNT_PASSWORD);
+
+ // Check that the password is the one we defined
+ assertEquals(ACCOUNT_PASSWORD, am.getPassword(ACCOUNT));
+ }
+
+ /**
+ * Test setUserData() and getUserData()
+ */
+ public void testSetAndGetUserData() {
+ // Add a first account
+ boolean result = am.addAccountExplicitly(ACCOUNT,
+ ACCOUNT_PASSWORD,
+ USERDATA_BUNDLE);
+
+ assertTrue(result);
+
+ // Check that the UserData is the one we defined
+ assertEquals(USERDATA_VALUE_1, am.getUserData(ACCOUNT, USERDATA_NAME_1));
+
+ am.setUserData(ACCOUNT, USERDATA_NAME_2, USERDATA_VALUE_2);
+
+ // Check that the UserData is the one we defined
+ assertEquals(USERDATA_VALUE_2, am.getUserData(ACCOUNT, USERDATA_NAME_2));
+ }
+
+ /**
+ * Test getAccountsByTypeAndFeatures()
+ */
+ public void testGetAccountsByTypeAndFeatures() throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ AccountManagerFuture<Account[]> futureAccounts = am.getAccountsByTypeAndFeatures(
+ ACCOUNT_TYPE, REQUIRED_FEATURES, null, null);
+
+ Account[] accounts = futureAccounts.getResult();
+
+ assertNotNull(accounts);
+ assertEquals(1, accounts.length);
+ assertEquals(true, isAccountPresent(accounts, ACCOUNT));
+
+ futureAccounts = am.getAccountsByTypeAndFeatures(ACCOUNT_TYPE,
+ new String[] { NON_EXISTING_FEATURE },
+ null /* callback*/,
+ null /* handler */);
+ accounts = futureAccounts.getResult();
+
+ assertNotNull(accounts);
+ assertEquals(0, accounts.length);
+ }
+
+ /**
+ * Test getAccountsByTypeAndFeatures() with callback and handler
+ */
+ public void testGetAccountsByTypeAndFeaturesWithCallbackAndHandler() throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ testGetAccountsByTypeAndFeaturesWithCallbackAndHandler(null /* handler */);
+ testGetAccountsByTypeAndFeaturesWithCallbackAndHandler(new Handler());
+ }
+
+ private void testGetAccountsByTypeAndFeaturesWithCallbackAndHandler(Handler handler) throws
+ IOException, AuthenticatorException, OperationCanceledException {
+
+ final CountDownLatch latch1 = new CountDownLatch(1);
+
+ AccountManagerCallback<Account[]> callback1 = new AccountManagerCallback<Account[]>() {
+ public void run(AccountManagerFuture<Account[]> accountsFuture) {
+ try {
+ Account[] accounts = accountsFuture.getResult();
+ assertNotNull(accounts);
+ assertEquals(1, accounts.length);
+ assertEquals(true, isAccountPresent(accounts, ACCOUNT));
+ } catch (OperationCanceledException e) {
+ fail("should not throw an OperationCanceledException");
+ } catch (IOException e) {
+ fail("should not throw an IOException");
+ } catch (AuthenticatorException e) {
+ fail("should not throw an AuthenticatorException");
+ } finally {
+ latch1.countDown();
+ }
+ }
+ };
+
+ AccountManagerFuture<Account[]> futureAccounts = am.getAccountsByTypeAndFeatures(
+ ACCOUNT_TYPE,
+ REQUIRED_FEATURES,
+ callback1,
+ handler);
+
+ Account[] accounts = futureAccounts.getResult();
+
+ assertNotNull(accounts);
+ assertEquals(1, accounts.length);
+ assertEquals(true, isAccountPresent(accounts, ACCOUNT));
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch1.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+
+ final CountDownLatch latch2 = new CountDownLatch(1);
+
+ AccountManagerCallback<Account[]> callback2 = new AccountManagerCallback<Account[]>() {
+ public void run(AccountManagerFuture<Account[]> accountsFuture) {
+ try {
+ Account[] accounts = accountsFuture.getResult();
+ assertNotNull(accounts);
+ assertEquals(0, accounts.length);
+ } catch (OperationCanceledException e) {
+ fail("should not throw an OperationCanceledException");
+ } catch (IOException e) {
+ fail("should not throw an IOException");
+ } catch (AuthenticatorException e) {
+ fail("should not throw an AuthenticatorException");
+ } finally {
+ latch2.countDown();
+ }
+ }
+ };
+
+ accounts = null;
+
+ futureAccounts = am.getAccountsByTypeAndFeatures(ACCOUNT_TYPE,
+ new String[] { NON_EXISTING_FEATURE },
+ callback2,
+ handler);
+
+ accounts = futureAccounts.getResult();
+ assertNotNull(accounts);
+ assertEquals(0, accounts.length);
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch2.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+ }
+
+ /**
+ * Test setAuthToken() and peekAuthToken()
+ */
+ public void testSetAndPeekAndInvalidateAuthToken() {
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ am.setAuthToken(ACCOUNT, AUTH_TOKEN_TYPE, AUTH_TOKEN);
+
+ // Ask for the AuthToken
+ String token = am.peekAuthToken(ACCOUNT, AUTH_TOKEN_TYPE);
+ assertNotNull(token);
+ assertEquals(AUTH_TOKEN, token);
+
+ am.invalidateAuthToken(ACCOUNT_TYPE, AUTH_TOKEN);
+ token = am.peekAuthToken(ACCOUNT, AUTH_TOKEN_TYPE);
+ assertNull(token);
+ }
+
+ /**
+ * Test blockingGetAuthToken()
+ */
+ public void testBlockingGetAuthToken() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null);
+
+ String token = am.blockingGetAuthToken(ACCOUNT,
+ AUTH_TOKEN_TYPE,
+ false /* no failure notification */);
+
+ // Ask for the AuthToken
+ assertNotNull(token);
+ assertEquals(AUTH_TOKEN, token);
+ }
+
+ /**
+ * Test getAuthToken()
+ */
+ public void testGetAuthToken() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
+ AUTH_TOKEN_TYPE,
+ false /* no failure notification */,
+ null /* no callback */,
+ null /* no handler */
+ );
+
+ Bundle resultBundle = futureBundle.getResult();
+
+ assertTrue(futureBundle.isDone());
+ assertNotNull(resultBundle);
+
+ // Assert returned result
+ validateNonNullResult(resultBundle);
+ }
+
+ /**
+ * Test getAuthToken() with callback and handler
+ */
+ public void testGetAuthTokenWithCallbackAndHandler() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ testGetAuthTokenWithCallbackAndHandler(null /* handler */);
+ testGetAuthTokenWithCallbackAndHandler(new Handler());
+ }
+
+ private void testGetAuthTokenWithCallbackAndHandler(Handler handler) throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+ public void run(AccountManagerFuture<Bundle> bundleFuture) {
+
+ Bundle resultBundle = null;
+ try {
+ resultBundle = bundleFuture.getResult();
+
+ // Assert returned result
+ validateNonNullResult(resultBundle);
+
+ } catch (OperationCanceledException e) {
+ fail("should not throw an OperationCanceledException");
+ } catch (IOException e) {
+ fail("should not throw an IOException");
+ } catch (AuthenticatorException e) {
+ fail("should not throw an AuthenticatorException");
+ }
+ finally {
+ latch.countDown();
+ }
+ }
+ };
+
+ AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
+ AUTH_TOKEN_TYPE,
+ false /* no failure notification */,
+ callback,
+ handler
+ );
+
+ Bundle resultBundle = futureBundle.getResult();
+
+ assertTrue(futureBundle.isDone());
+ assertNotNull(resultBundle);
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+ }
+
+ /**
+ * test getAuthToken() with options
+ */
+ public void testGetAuthTokenWithOptions() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
+ AUTH_TOKEN_TYPE,
+ OPTIONS_BUNDLE,
+ ACTIVITY,
+ null /* no callback */,
+ null /* no handler */
+ );
+
+ Bundle resultBundle = futureBundle.getResult();
+
+ assertTrue(futureBundle.isDone());
+ assertNotNull(resultBundle);
+
+ // Assert returned result
+ validateNonNullResult(resultBundle);
+
+ validateOptions();
+ }
+
+ /**
+ * test getAuthToken() with options and callback and handler
+ */
+ public void testGetAuthTokenWithOptionsAndCallback() throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ testGetAuthTokenWithOptionsAndCallbackAndHandler(null /* handler */);
+ testGetAuthTokenWithOptionsAndCallbackAndHandler(new Handler());
+ }
+
+ private void testGetAuthTokenWithOptionsAndCallbackAndHandler(Handler handler) throws
+ IOException, AuthenticatorException, OperationCanceledException {
+
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+ public void run(AccountManagerFuture<Bundle> bundleFuture) {
+
+ Bundle resultBundle = null;
+ try {
+ resultBundle = bundleFuture.getResult();
+
+ // Assert returned result
+ validateNonNullResult(resultBundle);
+
+ } catch (OperationCanceledException e) {
+ fail("should not throw an OperationCanceledException");
+ } catch (IOException e) {
+ fail("should not throw an IOException");
+ } catch (AuthenticatorException e) {
+ fail("should not throw an AuthenticatorException");
+ }
+ finally {
+ latch.countDown();
+ }
+ }
+ };
+
+ AccountManagerFuture<Bundle> futureBundle = am.getAuthToken(ACCOUNT,
+ AUTH_TOKEN_TYPE,
+ OPTIONS_BUNDLE,
+ ACTIVITY,
+ callback,
+ handler
+ );
+
+ Bundle resultBundle = futureBundle.getResult();
+
+ assertTrue(futureBundle.isDone());
+ assertNotNull(resultBundle);
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+ }
+
+ /**
+ * Test getAuthTokenByFeatures()
+ */
+ public void testGetAuthTokenByFeatures() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ Bundle resultBundle = getAuthTokenByFeature(
+ new String[] { NON_EXISTING_FEATURE },
+ null /* activity */
+ );
+
+ // Assert returned result
+ validateNullResult(resultBundle);
+
+ assertNull(mockAuthenticator.getOptions());
+ mockAuthenticator.clearData();
+
+ // Now test with existing features and an activity
+ resultBundle = getAuthTokenByFeature(
+ new String[] { NON_EXISTING_FEATURE },
+ ACTIVITY
+ );
+
+ // Assert returned result
+ validateNonNullResult(resultBundle);
+
+ validateOptions();
+ mockAuthenticator.clearData();
+
+ // Now test with existing features and no activity
+ resultBundle = getAuthTokenByFeature(
+ REQUIRED_FEATURES,
+ null /* activity */
+ );
+
+ // Assert returned result
+ validateNonNullResult(resultBundle);
+
+ assertNull(mockAuthenticator.getOptions());
+ mockAuthenticator.clearData();
+
+ // Now test with existing features and an activity
+ resultBundle = getAuthTokenByFeature(
+ REQUIRED_FEATURES,
+ ACTIVITY
+ );
+
+ // Assert returned result
+ validateNonNullResult(resultBundle);
+
+ assertNull(mockAuthenticator.getOptions());
+ }
+
+ /**
+ * Test confirmCredentials()
+ */
+ public void testConfirmCredentials() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ AccountManagerFuture<Bundle> futureBundle = am.confirmCredentials(ACCOUNT,
+ OPTIONS_BUNDLE,
+ ACTIVITY,
+ null /* callback*/,
+ null /* handler */);
+
+ futureBundle.getResult();
+
+ // Assert returned result
+ validateCredentials();
+ }
+
+ /**
+ * Test confirmCredentials() with callback
+ */
+ public void testConfirmCredentialsWithCallbackAndHandler() throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ testConfirmCredentialsWithCallbackAndHandler(null /* handler */);
+ testConfirmCredentialsWithCallbackAndHandler(new Handler());
+ }
+
+ private void testConfirmCredentialsWithCallbackAndHandler(Handler handler) throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+ public void run(AccountManagerFuture<Bundle> bundleFuture) {
+
+ Bundle resultBundle = null;
+ try {
+ resultBundle = bundleFuture.getResult();
+
+ // Assert returned result
+ validateCredentials();
+
+ } catch (OperationCanceledException e) {
+ fail("should not throw an OperationCanceledException");
+ } catch (IOException e) {
+ fail("should not throw an IOException");
+ } catch (AuthenticatorException e) {
+ fail("should not throw an AuthenticatorException");
+ }
+ finally {
+ latch.countDown();
+ }
+ }
+ };
+
+ AccountManagerFuture<Bundle> futureBundle = am.confirmCredentials(ACCOUNT,
+ OPTIONS_BUNDLE,
+ ACTIVITY,
+ callback,
+ handler);
+
+ futureBundle.getResult();
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+ }
+
+ /**
+ * Test updateCredentials()
+ */
+ public void testUpdateCredentials() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ AccountManagerFuture<Bundle> futureBundle = am.updateCredentials(ACCOUNT,
+ AUTH_TOKEN_TYPE,
+ OPTIONS_BUNDLE,
+ ACTIVITY,
+ null /* callback*/,
+ null /* handler */);
+
+ futureBundle.getResult();
+
+ // Assert returned result
+ validateCredentials();
+ }
+
+ /**
+ * Test updateCredentials() with callback and handler
+ */
+ public void testUpdateCredentialsWithCallbackAndHandler() throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ testUpdateCredentialsWithCallbackAndHandler(null /* handler */);
+ testUpdateCredentialsWithCallbackAndHandler(new Handler());
+ }
+
+ private void testUpdateCredentialsWithCallbackAndHandler(Handler handler) throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+ public void run(AccountManagerFuture<Bundle> bundleFuture) {
+
+ Bundle resultBundle = null;
+ try {
+ resultBundle = bundleFuture.getResult();
+
+ // Assert returned result
+ validateCredentials();
+
+ } catch (OperationCanceledException e) {
+ fail("should not throw an OperationCanceledException");
+ } catch (IOException e) {
+ fail("should not throw an IOException");
+ } catch (AuthenticatorException e) {
+ fail("should not throw an AuthenticatorException");
+ }
+ finally {
+ latch.countDown();
+ }
+ }
+ };
+
+ AccountManagerFuture<Bundle> futureBundle = am.updateCredentials(ACCOUNT,
+ AUTH_TOKEN_TYPE,
+ OPTIONS_BUNDLE,
+ ACTIVITY,
+ callback,
+ handler);
+
+ futureBundle.getResult();
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+ }
+
+ /**
+ * Test editProperties()
+ */
+ public void testEditProperties() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ AccountManagerFuture<Bundle> futureBundle = am.editProperties(ACCOUNT_TYPE,
+ ACTIVITY,
+ null /* callback */,
+ null /* handler*/);
+
+ futureBundle.getResult();
+
+ // Assert returned result
+ assertEquals(ACCOUNT_TYPE, mockAuthenticator.getAccountType());
+ }
+
+ /**
+ * Test editProperties() with callback and handler
+ */
+ public void testEditPropertiesWithCallbackAndHandler() {
+ testEditPropertiesWithCallbackAndHandler(null /* handler */);
+ testEditPropertiesWithCallbackAndHandler(new Handler());
+ }
+
+ private void testEditPropertiesWithCallbackAndHandler(Handler handler) {
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ AccountManagerCallback<Bundle> callback = new AccountManagerCallback<Bundle>() {
+ public void run(AccountManagerFuture<Bundle> bundleFuture) {
+ try {
+ // Assert returned result
+ assertEquals(ACCOUNT_TYPE, mockAuthenticator.getAccountType());
+ }
+ finally {
+ latch.countDown();
+ }
+ }
+ };
+
+ AccountManagerFuture<Bundle> futureBundle = am.editProperties(ACCOUNT_TYPE,
+ ACTIVITY,
+ callback,
+ handler);
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+ }
+
+ /**
+ * Test addOnAccountsUpdatedListener() with handler
+ */
+ public void testAddOnAccountsUpdatedListenerWithHandler() throws IOException,
+ AuthenticatorException, OperationCanceledException {
+
+ testAddOnAccountsUpdatedListenerWithHandler(null /* handler */,
+ false /* updateImmediately */);
+
+ // Need to cleanup intermediate state
+ assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
+
+ testAddOnAccountsUpdatedListenerWithHandler(null /* handler */,
+ true /* updateImmediately */);
+
+ // Need to cleanup intermediate state
+ assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
+
+ testAddOnAccountsUpdatedListenerWithHandler(new Handler(),
+ false /* updateImmediately */);
+
+ // Need to cleanup intermediate state
+ assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
+
+ testAddOnAccountsUpdatedListenerWithHandler(new Handler(),
+ true /* updateImmediately */);
+ }
+
+ private void testAddOnAccountsUpdatedListenerWithHandler(Handler handler,
+ boolean updateImmediately) {
+
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ OnAccountsUpdateListener listener = new OnAccountsUpdateListener() {
+ public void onAccountsUpdated(Account[] accounts) {
+ latch.countDown();
+ }
+ };
+
+ // Add a listener
+ am.addOnAccountsUpdatedListener(listener,
+ handler,
+ updateImmediately);
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+
+ // Cleanup
+ am.removeOnAccountsUpdatedListener(listener);
+ }
+
+ /**
+ * Test removeOnAccountsUpdatedListener() with handler
+ */
+ public void testRemoveOnAccountsUpdatedListener() throws IOException, AuthenticatorException,
+ OperationCanceledException {
+
+ testRemoveOnAccountsUpdatedListenerWithHandler(null /* handler */);
+
+ // Need to cleanup intermediate state
+ assertTrue(removeAccount(am, ACCOUNT, null /* callback */));
+
+ testRemoveOnAccountsUpdatedListenerWithHandler(new Handler());
+ }
+
+ private void testRemoveOnAccountsUpdatedListenerWithHandler(Handler handler) {
+ final CountDownLatch latch = new CountDownLatch(1);
+
+ OnAccountsUpdateListener listener = new OnAccountsUpdateListener() {
+ public void onAccountsUpdated(Account[] accounts) {
+ fail("should not be called");
+ }
+ };
+
+ // First add a listener
+ am.addOnAccountsUpdatedListener(listener,
+ handler,
+ false /* updateImmediately */);
+
+ // Then remove the listener
+ am.removeOnAccountsUpdatedListener(listener);
+
+ addAccountExplicitly(ACCOUNT, ACCOUNT_PASSWORD, null /* userData */);
+
+ // Wait with timeout for the callback to do its work
+ try {
+ latch.await(LATCH_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+ } catch (InterruptedException e) {
+ fail("should not throw an InterruptedException");
+ }
+ }
}
diff --git a/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java b/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
index 19d9f57..9843385 100644
--- a/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
+++ b/tests/tests/accounts/src/android/accounts/cts/MockAccountAuthenticator.java
@@ -16,61 +16,84 @@
package android.accounts.cts;
-import android.accounts.*;
+import android.accounts.AbstractAccountAuthenticator;
+import android.accounts.Account;
+import android.accounts.AccountAuthenticatorResponse;
+import android.accounts.AccountManager;
+import android.accounts.NetworkErrorException;
import android.content.Context;
import android.os.Bundle;
import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
/**
* A simple Mock Account Authenticator
*/
public class MockAccountAuthenticator extends AbstractAccountAuthenticator {
- public static final String MOCK_ACCOUNT_NAME = "android.accounts.cts.account.name";
- public static final String MOCK_ACCOUNT_TYPE = "android.accounts.cts.account.type";
- public static final String MOCK_ACCOUNT_PASSWORD = "android.accounts.cts.account.password";
- public static final String MOCK_AUTH_TOKEN = "mockAuthToken";
- public static final String MOCK_AUTH_TOKEN_TYPE = "mockAuthTokenType";
- public static final String MOCK_AUTH_TOKEN_LABEL = "mockAuthTokenLabel";
-
- public static final int ERROR_CODE_ACCOUNT_TYPE = 11;
- public static final String ERROR_MESSAGE_ACCOUNT_TYPE = "Account Type Unknown";
-
- public static final int ERROR_CODE_ACCOUNT_CANNOT_ADD = 12;
- public static final String ERROR_MESSAGE_ACCOUNT_CANNOT_ADD = "Cannot add account explicitely";
-
- public static final int ERROR_CODE_ACCOUNT_UNKNOWN = 13;
- public static final String ERROR_MESSAGE_ACCOUNT_UNKNOWN = "Account Unknown";
-
- public static final int ERROR_CODE_AUTH_TOKEN_TYPE = 21;
- public static final String ERROR_MESSAGE_AUTH_TOKEN_TYPE = "Auth Token Unknown";
-
- public static final int ERROR_CODE_FEATURE_UNKNOWN = 31;
- public static final String ERROR_MESSAGE_FEATURE_UNKNOWN = "Feature Unknown";
-
- public static final String MOCK_FEATURE_1 = "feature1";
- public static final String MOCK_FEATURE_2 = "feature2";
-
- private final Map<String, Map<Integer, Account>> accountMapByType;
- private final Context mContext;
+ private AccountAuthenticatorResponse mResponse;
+ private String mAccountType;
+ private String mAuthTokenType;
+ private String[] mRequiredFeatures;
+ private Bundle mOptions;
+ private Account mAccount;
+ private String[] mFeatures;
private final ArrayList<String> mockFeatureList = new ArrayList<String>();
public MockAccountAuthenticator(Context context) {
super(context);
- accountMapByType = new HashMap<String, Map<Integer, Account>>();
+ // Create some mock features
+ mockFeatureList.add(AccountManagerTest.FEATURE_1);
+ mockFeatureList.add(AccountManagerTest.FEATURE_2);
+ }
- // we need the Context and AbstractAccountAuthenticator doe not provide
- // access to it even if it stores it, so just duplicate it
- mContext = context;
+ public AccountAuthenticatorResponse getResponse() {
+ return mResponse;
+ }
- // create some mock features
- mockFeatureList.add(MOCK_FEATURE_1);
- mockFeatureList.add(MOCK_FEATURE_2);
+ public String getAccountType() {
+ return mAccountType;
+ }
+
+ public String getAuthTokenType() {
+ return mAuthTokenType;
+ }
+
+ public String[] getRequiredFeatures() {
+ return mRequiredFeatures;
+ }
+
+ public Bundle getOptions() {
+ return mOptions;
+ }
+
+ public Account getAccount() {
+ return mAccount;
+ }
+
+ public String[] getFeatures() {
+ return mFeatures;
+ }
+
+ public void clearData() {
+ mResponse = null;
+ mAccountType = null;
+ mAuthTokenType = null;
+ mRequiredFeatures = null;
+ mOptions = null;
+ mAccount = null;
+ mFeatures = null;
+ }
+
+ private Bundle createResultBundle() {
+ Bundle result = new Bundle();
+ result.putString(AccountManager.KEY_ACCOUNT_NAME, AccountManagerTest.ACCOUNT_NAME);
+ result.putString(AccountManager.KEY_ACCOUNT_TYPE, AccountManagerTest.ACCOUNT_TYPE);
+ result.putString(AccountManager.KEY_AUTHTOKEN, AccountManagerTest.AUTH_TOKEN);
+
+ return result;
}
/**
@@ -81,52 +104,13 @@
String authTokenType, String[] requiredFeatures, Bundle options)
throws NetworkErrorException {
- if(null == response) {
- throw new IllegalArgumentException("response cannot be null");
- }
- if(null == accountType) {
- throw new IllegalArgumentException("accountType cannot be null");
- }
- if(null == authTokenType) {
- throw new IllegalArgumentException("authTokenType cannot be null");
- }
+ this.mResponse = response;
+ this.mAccountType = accountType;
+ this.mAuthTokenType = authTokenType;
+ this.mRequiredFeatures = requiredFeatures;
+ this.mOptions = options;
- Bundle result = new Bundle();
-
- if (accountType.equals(MOCK_ACCOUNT_TYPE)) {
- Account account = new Account(MOCK_ACCOUNT_NAME, MOCK_ACCOUNT_TYPE);
- // Add the account in the DB
- if(AccountManager.get(mContext).addAccountExplicitly(account,
- MOCK_ACCOUNT_PASSWORD,
- null)) {
- getAccountMapByType(accountType).put(account.hashCode(), account);
-
- result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
- result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
- result.putString(AccountManager.KEY_AUTHTOKEN, getAuthTokenForAccount(account));
- }
- else {
- result.putInt(AccountManager.KEY_ERROR_CODE , ERROR_CODE_ACCOUNT_CANNOT_ADD);
- result.putString(AccountManager.KEY_ERROR_MESSAGE , ERROR_MESSAGE_ACCOUNT_CANNOT_ADD);
- }
-
- } else {
- result.putInt(AccountManager.KEY_ERROR_CODE , ERROR_CODE_ACCOUNT_TYPE);
- result.putString(AccountManager.KEY_ERROR_MESSAGE , ERROR_MESSAGE_ACCOUNT_TYPE);
- }
-
- return result;
- }
-
- private Map<Integer, Account> getAccountMapByType(String accountType) {
- String type = (null != accountType) ? accountType : "";
-
- Map<Integer, Account> map = accountMapByType.get(type);
- if(null == map) {
- map = new HashMap<Integer, Account>();
- }
-
- return map;
+ return createResultBundle();
}
/**
@@ -136,45 +120,12 @@
public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account,
String authTokenType, Bundle options) throws NetworkErrorException {
- if(null == response) {
- throw new IllegalArgumentException("response cannot be null");
- }
- if(null == account) {
- throw new IllegalArgumentException("account cannot be null");
- }
+ this.mResponse = response;
+ this.mAccount = account;
+ this.mAuthTokenType = authTokenType;
+ this.mOptions = options;
- Bundle result = new Bundle();
-
- Account accountInMap = getAccountMapByType(account.type).get(account.hashCode());
- if(null == accountInMap) {
- result.putInt(AccountManager.KEY_ERROR_CODE , ERROR_CODE_ACCOUNT_UNKNOWN);
- result.putString(AccountManager.KEY_ERROR_MESSAGE , ERROR_MESSAGE_ACCOUNT_UNKNOWN);
- }
-
- if(authTokenType.equals(MOCK_AUTH_TOKEN_TYPE)) {
- result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
- result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
- result.putString(AccountManager.KEY_AUTHTOKEN, getAuthTokenForAccount(account));
- } else {
- result.putInt(AccountManager.KEY_ERROR_CODE , ERROR_CODE_AUTH_TOKEN_TYPE);
- result.putString(AccountManager.KEY_ERROR_MESSAGE , ERROR_MESSAGE_AUTH_TOKEN_TYPE);
- }
-
- return result;
- }
-
- private String getAuthTokenForAccount(Account account) {
- StringBuilder sb = new StringBuilder(MOCK_AUTH_TOKEN);
- sb.append(":");
- if(null != account) {
- sb.append(account.name);
- }
- sb.append(":");
- if(null != account) {
- sb.append(account.type);
- }
-
- return sb.toString();
+ return createResultBundle();
}
/**
@@ -184,7 +135,11 @@
*/
@Override
public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
- throw new UnsupportedOperationException();
+
+ this.mResponse = response;
+ this.mAccountType = accountType;
+
+ return createResultBundle();
}
/**
@@ -194,24 +149,13 @@
public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account,
Bundle options) throws NetworkErrorException {
- if(null == response) {
- throw new IllegalArgumentException("response cannot be null");
- }
- if(null == account) {
- throw new IllegalArgumentException("account cannot be null");
- }
+ this.mResponse = response;
+ this.mAccount = account;
+ this.mOptions = options;
Bundle result = new Bundle();
+ result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
- Account accountInMap = getAccountMapByType(account.type).get(account.hashCode());
- if(null == accountInMap) {
- result.putInt(AccountManager.KEY_ERROR_CODE , ERROR_CODE_ACCOUNT_UNKNOWN);
- result.putString(AccountManager.KEY_ERROR_MESSAGE , ERROR_MESSAGE_ACCOUNT_UNKNOWN);
- }
- else {
- result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
- }
-
return result;
}
@@ -222,36 +166,12 @@
public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account,
String authTokenType, Bundle options) throws NetworkErrorException {
- if(null == response) {
- throw new IllegalArgumentException("response cannot be null");
- }
- if(null == account) {
- throw new IllegalArgumentException("account cannot be null");
- }
- if(null == authTokenType) {
- throw new IllegalArgumentException("authTokenType cannot be null");
- }
+ this.mResponse = response;
+ this.mAccount = account;
+ this.mAuthTokenType = authTokenType;
+ this.mOptions = options;
- Bundle result = new Bundle();
-
- Account accountInMap = getAccountMapByType(account.type).get(account.hashCode());
- if(null == accountInMap) {
- result.putInt(AccountManager.KEY_ERROR_CODE , ERROR_CODE_ACCOUNT_UNKNOWN);
- result.putString(AccountManager.KEY_ERROR_MESSAGE , ERROR_MESSAGE_ACCOUNT_UNKNOWN);
- }
- else {
- if(authTokenType.equals(MOCK_AUTH_TOKEN_TYPE)) {
- result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
- result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
- result.putString(AccountManager.KEY_AUTHTOKEN, getAuthTokenForAccount(account));
- }
- else {
- result.putInt(AccountManager.KEY_ERROR_CODE , ERROR_CODE_AUTH_TOKEN_TYPE);
- result.putString(AccountManager.KEY_ERROR_MESSAGE , ERROR_MESSAGE_AUTH_TOKEN_TYPE);
- }
- }
-
- return result;
+ return createResultBundle();
}
/**
@@ -259,14 +179,9 @@
*/
@Override
public String getAuthTokenLabel(String authTokenType) {
- if(null == authTokenType) {
- throw new IllegalArgumentException("authTokenType cannot be null");
- }
- if(! authTokenType.equals(MOCK_AUTH_TOKEN_TYPE)) {
- throw new IllegalArgumentException("unknown authTokenType: " + authTokenType);
- }
+ this.mAuthTokenType = authTokenType;
- return MOCK_AUTH_TOKEN_LABEL;
+ return AccountManagerTest.AUTH_TOKEN_LABEL;
}
/**
@@ -276,33 +191,24 @@
public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account,
String[] features) throws NetworkErrorException {
- if(null == response) {
- throw new IllegalArgumentException("response cannot be null");
- }
- if(null == account) {
- throw new IllegalArgumentException("account cannot be null");
- }
- if(null == features) {
- throw new IllegalArgumentException("featues cannot be null");
- }
+ this.mResponse = response;
+ this.mAccount = account;
+ this.mFeatures = features;
Bundle result = new Bundle();
-
- Account accountInMap = getAccountMapByType(account.type).get(account.hashCode());
- if(null == accountInMap) {
- result.putInt(AccountManager.KEY_ERROR_CODE , ERROR_CODE_ACCOUNT_UNKNOWN);
- result.putString(AccountManager.KEY_ERROR_MESSAGE , ERROR_MESSAGE_ACCOUNT_UNKNOWN);
- }
- else {
- for(String featureName: features) {
- if(! mockFeatureList.contains(featureName)) {
- result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, false);
- return result;
- }
- }
+ if (null == features) {
result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, true);
}
-
+ else {
+ boolean booleanResult = true;
+ for (String feature: features) {
+ if (!mockFeatureList.contains(feature)) {
+ booleanResult = false;
+ break;
+ }
+ }
+ result.putBoolean(AccountManager.KEY_BOOLEAN_RESULT, booleanResult);
+ }
return result;
}
}
\ No newline at end of file
diff --git a/tests/tests/accounts/src/android/accounts/cts/MockAccountService.java b/tests/tests/accounts/src/android/accounts/cts/MockAccountService.java
index bde2042..a52f580 100644
--- a/tests/tests/accounts/src/android/accounts/cts/MockAccountService.java
+++ b/tests/tests/accounts/src/android/accounts/cts/MockAccountService.java
@@ -25,15 +25,8 @@
*/
public class MockAccountService extends Service {
- private MockAccountAuthenticator mAuthenticator;
-
@Override
public IBinder onBind(Intent intent) {
- return mAuthenticator.getIBinder();
- }
-
- @Override
- public void onCreate() {
- mAuthenticator = new MockAccountAuthenticator(this);
+ return AccountManagerTest.getMockAuthenticator(this).getIBinder();
}
}
diff --git a/tests/tests/text/src/android/text/format/cts/TimeTest.java b/tests/tests/text/src/android/text/format/cts/TimeTest.java
index 45dcfed..a8f2acd 100644
--- a/tests/tests/text/src/android/text/format/cts/TimeTest.java
+++ b/tests/tests/text/src/android/text/format/cts/TimeTest.java
@@ -17,6 +17,7 @@
package android.text.format.cts;
import java.util.Calendar;
+import java.util.TimeZone;
import android.test.AndroidTestCase;
import android.text.format.Time;
@@ -653,7 +654,7 @@
public void testSet0() throws Exception {
Time t = new Time(Time.TIMEZONE_UTC);
long time = System.currentTimeMillis();
- Calendar date = Calendar.getInstance();
+ Calendar date = Calendar.getInstance(TimeZone.getTimeZone("UTC"));
date.setTimeInMillis(time);
t.set(time);
assertEquals(date.get(Calendar.YEAR), t.year);
diff --git a/tests/tests/view/src/android/view/cts/KeyEventTest.java b/tests/tests/view/src/android/view/cts/KeyEventTest.java
index 6da754f..dc1696c6 100644
--- a/tests/tests/view/src/android/view/cts/KeyEventTest.java
+++ b/tests/tests/view/src/android/view/cts/KeyEventTest.java
@@ -532,35 +532,6 @@
@TestTargetNew(
level = TestLevel.COMPLETE,
- notes = "Test {@link KeyEvent#getMatch(char[], int)}",
- method = "getMatch",
- args = {char[].class, int.class}
- )
- @ToBeFixed(bug = "1695243", explanation = "Android API javadocs are incomplete, " +
- "should add NPE description in javadoc.")
- public void testGetMatch2() {
- char[] codes1 = { '0', '1', '2' };
- assertEquals('\0', mKeyEvent.getMatch(codes1, KeyEvent.KEYCODE_SHIFT_LEFT));
-
- char[] codes2 = { 'A', 'B', 'C' };
- assertEquals('\0', mKeyEvent.getMatch(codes2, KeyEvent.KEYCODE_SHIFT_LEFT));
- assertEquals('\0', mKeyEvent.getMatch(codes2, 0));
-
- char[] codes3 = { '2', 's' };
- mKeyEvent = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_S);
- assertEquals('\0', mKeyEvent.getMatch(codes3, KeyEvent.KEYCODE_ALT_LEFT));
- assertEquals('s', mKeyEvent.getMatch(codes3, 0));
-
- try {
- mKeyEvent.getMatch(null, 0);
- fail("Should throw NullPointerException ");
- } catch (NullPointerException e) {
- // empty
- }
- }
-
- @TestTargetNew(
- level = TestLevel.COMPLETE,
notes = "Test {@link KeyEvent#getAction()}",
method = "getAction",
args = {}