1/* 2 * Copyright (C) 2010 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package com.android.email; 18 19import android.accounts.AccountManager; 20import android.accounts.AccountManagerFuture; 21import android.accounts.AuthenticatorException; 22import android.accounts.OperationCanceledException; 23import android.database.Cursor; 24import android.test.ProviderTestCase2; 25 26import com.android.email.provider.EmailProvider; 27import com.android.email.provider.ProviderTestUtils; 28import com.android.emailcommon.provider.Account; 29import com.android.emailcommon.provider.EmailContent; 30 31import java.io.IOException; 32import java.util.ArrayList; 33import java.util.HashSet; 34 35/** 36 * Base class for unit tests that use {@link android.accounts.Account}. 37 */ 38public abstract class AccountTestCase extends ProviderTestCase2<EmailProvider> { 39 40 protected static final String TEST_ACCOUNT_PREFIX = "__test"; 41 protected static final String TEST_ACCOUNT_SUFFIX = "@android.com"; 42 protected static final String TEST_ACCOUNT_TYPE = "com.android.test_exchange"; 43 44 public AccountTestCase() { 45 super(EmailProvider.class, EmailContent.AUTHORITY); 46 } 47 48 protected android.accounts.Account[] getExchangeAccounts() { 49 return AccountManager.get(getContext()).getAccountsByType(TEST_ACCOUNT_TYPE); 50 } 51 52 protected android.accounts.Account makeAccountManagerAccount(String username) { 53 return new android.accounts.Account(username, TEST_ACCOUNT_TYPE); 54 } 55 56 protected void createAccountManagerAccount(String username) { 57 final android.accounts.Account account = makeAccountManagerAccount(username); 58 AccountManager.get(getContext()).addAccountExplicitly(account, "password", null); 59 } 60 61 protected Account setupProviderAndAccountManagerAccount(String username) { 62 // Note that setupAccount creates the email address username@android.com, so that's what 63 // we need to use for the account manager 64 createAccountManagerAccount(username + TEST_ACCOUNT_SUFFIX); 65 return ProviderTestUtils.setupAccount(username, true, getMockContext()); 66 } 67 68 protected ArrayList<Account> makeExchangeServiceAccountList() { 69 ArrayList<Account> accountList = new ArrayList<Account>(); 70 Cursor c = getMockContext().getContentResolver().query(Account.CONTENT_URI, 71 Account.CONTENT_PROJECTION, null, null, null); 72 try { 73 while (c.moveToNext()) { 74 Account account = new Account(); 75 account.restore(c); 76 accountList.add(account); 77 } 78 } finally { 79 c.close(); 80 } 81 return accountList; 82 } 83 84 protected void deleteAccountManagerAccount(android.accounts.Account account) { 85 AccountManagerFuture<Boolean> future = 86 AccountManager.get(getContext()).removeAccount(account, null, null); 87 try { 88 future.getResult(); 89 } catch (OperationCanceledException e) { 90 } catch (AuthenticatorException e) { 91 } catch (IOException e) { 92 } 93 } 94 95 protected void deleteTemporaryAccountManagerAccounts() { 96 for (android.accounts.Account accountManagerAccount: getExchangeAccounts()) { 97 if (accountManagerAccount.name.startsWith(TEST_ACCOUNT_PREFIX) && 98 accountManagerAccount.name.endsWith(TEST_ACCOUNT_SUFFIX)) { 99 deleteAccountManagerAccount(accountManagerAccount); 100 } 101 } 102 } 103 104 protected String getTestAccountName(String name) { 105 return TEST_ACCOUNT_PREFIX + name; 106 } 107 108 protected String getTestAccountEmailAddress(String name) { 109 return TEST_ACCOUNT_PREFIX + name + TEST_ACCOUNT_SUFFIX; 110 } 111 112 113 /** 114 * Helper to retrieve account manager accounts *and* remove any preexisting accounts 115 * from the list, to "hide" them from the reconciler. 116 */ 117 protected android.accounts.Account[] getAccountManagerAccounts( 118 android.accounts.Account[] baseline) { 119 android.accounts.Account[] rawList = getExchangeAccounts(); 120 if (baseline.length == 0) { 121 return rawList; 122 } 123 HashSet<android.accounts.Account> set = new HashSet<android.accounts.Account>(); 124 for (android.accounts.Account addAccount : rawList) { 125 set.add(addAccount); 126 } 127 for (android.accounts.Account removeAccount : baseline) { 128 set.remove(removeAccount); 129 } 130 return set.toArray(new android.accounts.Account[0]); 131 } 132} 133