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;
25import android.test.suitebuilder.annotation.Suppress;
26
27import com.android.email.provider.EmailProvider;
28import com.android.email.provider.ProviderTestUtils;
29import com.android.emailcommon.provider.Account;
30import com.android.emailcommon.provider.EmailContent;
31
32import java.io.IOException;
33import java.util.ArrayList;
34import java.util.HashSet;
35
36/**
37 * Base class for unit tests that use {@link android.accounts.Account}.
38 */
39@Suppress
40public abstract class AccountTestCase extends ProviderTestCase2<EmailProvider> {
41
42    protected static final String TEST_ACCOUNT_PREFIX = "__test";
43    protected static final String TEST_ACCOUNT_SUFFIX = "@android.com";
44    protected static final String TEST_ACCOUNT_TYPE = "com.android.test_exchange";
45
46    public AccountTestCase() {
47        super(EmailProvider.class, EmailContent.AUTHORITY);
48    }
49
50    protected android.accounts.Account[] getExchangeAccounts() {
51        return AccountManager.get(getContext()).getAccountsByType(TEST_ACCOUNT_TYPE);
52    }
53
54    protected android.accounts.Account makeAccountManagerAccount(String username) {
55        return new android.accounts.Account(username, TEST_ACCOUNT_TYPE);
56    }
57
58    protected void createAccountManagerAccount(String username) {
59        final android.accounts.Account account = makeAccountManagerAccount(username);
60        AccountManager.get(getContext()).addAccountExplicitly(account, "password", null);
61    }
62
63    protected Account setupProviderAndAccountManagerAccount(String username) {
64        // Note that setupAccount creates the email address username@android.com, so that's what
65        // we need to use for the account manager
66        createAccountManagerAccount(username + TEST_ACCOUNT_SUFFIX);
67        return ProviderTestUtils.setupAccount(username, true, getMockContext());
68    }
69
70    protected ArrayList<Account> makeExchangeServiceAccountList() {
71        ArrayList<Account> accountList = new ArrayList<Account>();
72        Cursor c = getMockContext().getContentResolver().query(Account.CONTENT_URI,
73                Account.CONTENT_PROJECTION, null, null, null);
74        try {
75            while (c.moveToNext()) {
76                Account account = new Account();
77                account.restore(c);
78                accountList.add(account);
79            }
80        } finally {
81            c.close();
82        }
83        return accountList;
84    }
85
86    protected void deleteAccountManagerAccount(android.accounts.Account account) {
87        AccountManagerFuture<Boolean> future =
88            AccountManager.get(getContext()).removeAccount(account, null, null);
89        try {
90            future.getResult();
91        } catch (OperationCanceledException e) {
92        } catch (AuthenticatorException e) {
93        } catch (IOException e) {
94        }
95    }
96
97    protected void deleteTemporaryAccountManagerAccounts() {
98        for (android.accounts.Account accountManagerAccount: getExchangeAccounts()) {
99            if (accountManagerAccount.name.startsWith(TEST_ACCOUNT_PREFIX) &&
100                    accountManagerAccount.name.endsWith(TEST_ACCOUNT_SUFFIX)) {
101                deleteAccountManagerAccount(accountManagerAccount);
102            }
103        }
104    }
105
106    protected String getTestAccountName(String name) {
107        return TEST_ACCOUNT_PREFIX + name;
108    }
109
110    protected String getTestAccountEmailAddress(String name) {
111        return TEST_ACCOUNT_PREFIX + name + TEST_ACCOUNT_SUFFIX;
112    }
113
114    /**
115     * Helper to retrieve account manager accounts *and* remove any preexisting accounts
116     * from the list, to "hide" them from the reconciler.
117     */
118    protected android.accounts.Account[] getAccountManagerAccounts(
119            android.accounts.Account[] baseline) {
120        android.accounts.Account[] rawList = getExchangeAccounts();
121        if (baseline.length == 0) {
122            return rawList;
123        }
124        HashSet<android.accounts.Account> set = new HashSet<android.accounts.Account>();
125        for (android.accounts.Account addAccount : rawList) {
126            set.add(addAccount);
127        }
128        for (android.accounts.Account removeAccount : baseline) {
129            set.remove(removeAccount);
130        }
131        return set.toArray(new android.accounts.Account[0]);
132    }
133}
134