1819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott/*
2819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * Copyright (C) 2016 The Android Open Source Project
3819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott *
4819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * Licensed under the Apache License, Version 2.0 (the "License");
5819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * you may not use this file except in compliance with the License.
6819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * You may obtain a copy of the License at
7819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott *
8819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott *      http://www.apache.org/licenses/LICENSE-2.0
9819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott *
10819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * Unless required by applicable law or agreed to in writing, software
11819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * distributed under the License is distributed on an "AS IS" BASIS,
12819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * See the License for the specific language governing permissions and
14819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott * limitations under the License.
15819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott */
16819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottpackage com.android.contacts.tests;
17819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
180a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static junit.framework.Assert.assertNotNull;
190a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static junit.framework.Assert.assertTrue;
200a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai
21819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.accounts.Account;
22819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.accounts.AccountManager;
23819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.content.ContentResolver;
24819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.content.Context;
25819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.os.Build;
26819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.provider.ContactsContract.RawContacts;
27819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.support.annotation.NonNull;
28819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.support.annotation.RequiresApi;
29819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottimport android.support.test.InstrumentationRegistry;
30819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
3169c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountWithDataSet;
3295246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott
33a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerottimport java.util.ArrayList;
3495246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerottimport java.util.Arrays;
3595246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerottimport java.util.List;
3695246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott
37819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott@SuppressWarnings("MissingPermission")
38819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerottpublic class AccountsTestHelper {
39fd79e87e893054e20f86cbe5e0c48aa64ecd3955Marcus Hagerott    private static final String TAG = "AccountsTestHelper";
40fd79e87e893054e20f86cbe5e0c48aa64ecd3955Marcus Hagerott
41819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    public static final String TEST_ACCOUNT_TYPE = "com.android.contacts.tests.testauth.basic";
42819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
43819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    private final Context mContext;
44819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    private final AccountManager mAccountManager;
45819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    private final ContentResolver mResolver;
46819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
47a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott    private List<Account> mAddedAccounts;
48819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
49819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    public AccountsTestHelper() {
50819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        // Use context instead of target context because the test package has the permissions needed
51819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        // to add and remove accounts.
52819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        this(InstrumentationRegistry.getContext());
53819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
54819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
55819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    public AccountsTestHelper(Context context) {
56819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        mContext = context;
57819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        mAccountManager = AccountManager.get(mContext);
58819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        mResolver = mContext.getContentResolver();
59a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        mAddedAccounts = new ArrayList<>();
60a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott    }
61a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott
62a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott    public void addTestAccount(AccountWithDataSet account) {
63e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott        Account newAccount = new Account(account.name, account.type);
64e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott        assertTrue(mAccountManager.addAccountExplicitly(newAccount, null, null));
65e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott        mAddedAccounts.add(newAccount);
66819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
67819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
68819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    public AccountWithDataSet addTestAccount() {
69819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        return addTestAccount(generateAccountName());
70819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
71819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
72a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott    public AccountWithDataSet addTestAccount(@NonNull String name) {
73a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        // remember the most recent one. If the caller wants to add multiple accounts they will
74a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        // have to keep track of them themselves.
75a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        final AccountWithDataSet account = new AccountWithDataSet(name, TEST_ACCOUNT_TYPE, null);
76a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        addTestAccount(account);
77a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        return account;
78a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott    }
79a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott
80819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    public String generateAccountName(String prefix) {
81819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        return prefix + "_t" + System.nanoTime();
82819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
83819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
84819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    public String generateAccountName() {
85819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        return generateAccountName("test");
86819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
87819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
88819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
89819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    public void removeTestAccount(AccountWithDataSet account) {
90819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        final Account remove = account.getAccountOrNull();
91819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        mAccountManager.removeAccountExplicitly(remove);
92a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        mAddedAccounts.remove(remove);
93819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
94819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
9595246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
9695246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott    public void removeTestAccount(String accountName) {
97a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        removeTestAccount(new AccountWithDataSet(accountName, TEST_ACCOUNT_TYPE, null));
9895246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott    }
9995246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott
10095246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott    public boolean hasTestAccount(String name) {
10195246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott        final List<Account> accounts = Arrays.asList(
10295246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott                mAccountManager.getAccountsByType(TEST_ACCOUNT_TYPE));
10395246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott        return accounts.contains(new Account(name, TEST_ACCOUNT_TYPE));
10495246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott    }
10595246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott
10695246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott    public void removeContactsForAccount(AccountWithDataSet account) {
107819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        mResolver.delete(RawContacts.CONTENT_URI,
108819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott                RawContacts.ACCOUNT_NAME + "=? AND " + RawContacts.ACCOUNT_TYPE + "=?",
10995246bb89a1c45459fe15eefdc6d924963247944Marcus Hagerott                new String[] { account.name, account.type });
110819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
111819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
112819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
113819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    public void cleanup() {
114819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        // Note that we don't need to cleanup up the contact data associated with the account.
115819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        // CP2 will eventually do that automatically so as long as we're using unique account
116819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        // names we should be safe. Note that cleanup is not done synchronously when the account
117819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        // is removed so if multiple tests are using the same account name then the data should
118819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott        // be manually deleted after each test run.
119819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
120a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        for (Account account : mAddedAccounts) {
121a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott            mAccountManager.removeAccountExplicitly(account);
122a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        }
123a7d3c002d28e994c39227993522bf3fd5e5f3c7fMarcus Hagerott        mAddedAccounts.clear();
124819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
125819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott
126e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott    @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP_MR1)
127e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott    public static void removeAccountsWithPrefix(Context context, String prefix) {
128e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott        final AccountManager accountManager =
129e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott                (AccountManager) context.getSystemService(Context.ACCOUNT_SERVICE);
130e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott        final Account[] accounts = accountManager.getAccountsByType(TEST_ACCOUNT_TYPE);
131e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott        for (Account account : accounts) {
132e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott            if (account.name.startsWith(prefix)) {
133e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott                accountManager.removeAccountExplicitly(account);
134e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott            }
135e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott        }
136e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott
137e6f3239c787af62461cdcd2bc027f78c20b4ed90Marcus Hagerott
138819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott    }
139819214d472fdadf3d69cb4580e238506194ed30eMarcus Hagerott}
140