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