189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott/* 289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * Copyright (C) 2016 The Android Open Source Project 389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * 489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * Licensed under the Apache License, Version 2.0 (the "License"); 589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * you may not use this file except in compliance with the License. 689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * You may obtain a copy of the License at 789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * 889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * http://www.apache.org/licenses/LICENSE-2.0 989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * 1089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * Unless required by applicable law or agreed to in writing, software 1189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * distributed under the License is distributed on an "AS IS" BASIS, 1289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * See the License for the specific language governing permissions and 1489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott * limitations under the License. 1589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott */ 1669c182afb0e6d82a341a28b4317aa703af768906Gary Maipackage com.android.contacts.database; 1789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 180a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static android.os.Build.VERSION_CODES; 190a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai 200a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static com.android.contacts.tests.ContactsMatchers.DataCursor.hasEmail; 210a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static com.android.contacts.tests.ContactsMatchers.DataCursor.hasName; 220a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static com.android.contacts.tests.ContactsMatchers.DataCursor.hasPhone; 230a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static com.android.contacts.tests.ContactsMatchers.isSimContactWithNameAndPhone; 240a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai 250a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static org.hamcrest.Matchers.allOf; 260a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static org.hamcrest.Matchers.equalTo; 270a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static org.junit.Assert.assertThat; 280a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static org.junit.Assert.assertTrue; 29aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerottimport static org.mockito.Matchers.any; 30aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerottimport static org.mockito.Matchers.anyString; 310a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static org.mockito.Mockito.mock; 320a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport static org.mockito.Mockito.when; 330a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai 34aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerottimport android.content.ContentProvider; 3589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.content.ContentProviderOperation; 3689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.content.ContentResolver; 3789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.content.Context; 38a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.content.OperationApplicationException; 3989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.database.Cursor; 40aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerottimport android.net.Uri; 41aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerottimport android.os.CancellationSignal; 42a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.os.RemoteException; 4389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.provider.ContactsContract; 44a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.provider.ContactsContract.CommonDataKinds.Email; 45a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.provider.ContactsContract.CommonDataKinds.Phone; 46a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.provider.ContactsContract.CommonDataKinds.StructuredName; 47a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.provider.ContactsContract.Data; 4889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.support.annotation.RequiresApi; 4989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.support.test.InstrumentationRegistry; 5089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.support.test.filters.LargeTest; 5189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.support.test.filters.SdkSuppress; 52a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.support.test.filters.SmallTest; 5389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.support.test.filters.Suppress; 5489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport android.support.test.runner.AndroidJUnit4; 55a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.test.mock.MockContentResolver; 56a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport android.test.mock.MockContext; 5789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 5869c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.SimCard; 5969c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.SimContact; 6069c182afb0e6d82a341a28b4317aa703af768906Gary Maiimport com.android.contacts.model.account.AccountWithDataSet; 610a49afa2ad697307cc04ef4cb86570574fa720f2Gary Maiimport com.android.contacts.test.mocks.MockContentProvider; 6289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport com.android.contacts.tests.AccountsTestHelper; 63b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerottimport com.android.contacts.tests.ContactsMatchers; 6489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport com.android.contacts.tests.SimContactsTestHelper; 65b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerottimport com.android.contacts.tests.StringableCursor; 660a49afa2ad697307cc04ef4cb86570574fa720f2Gary Mai 67a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport com.google.common.collect.ImmutableMap; 68a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport com.google.common.collect.ImmutableSet; 6989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 70a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport org.hamcrest.Matchers; 7189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport org.junit.After; 72a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport org.junit.AfterClass; 7389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport org.junit.Before; 74a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport org.junit.BeforeClass; 7589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport org.junit.Test; 7689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport org.junit.experimental.runners.Enclosed; 7789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport org.junit.runner.RunWith; 7889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 7989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport java.util.ArrayList; 8089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottimport java.util.Arrays; 812b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerottimport java.util.List; 82a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport java.util.Locale; 832b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerottimport java.util.Map; 84a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerottimport java.util.Random; 852b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerottimport java.util.Set; 8689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 8789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott@RunWith(Enclosed.class) 8889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerottpublic class SimContactDaoTests { 8989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 90a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott // Some random area codes for generating realistic US phones when 91a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott // generating fake data for the SIM contacts or CP2 92a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static final String[] AREA_CODES = 93a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott {"360", "509", "416", "831", "212", "208"}; 94a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static final Random sRandom = new Random(); 95a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 96a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott // Approximate maximum number of contacts that can be stored on a SIM card for testing 97a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott // boundary cases 98a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public static final int MAX_SIM_CONTACTS = 600; 99a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 100ce8a02769a4a19eeaa3e56f3f27c2b868e8668d6Marcus Hagerott // On pre-M addAccountExplicitly (which we call via AccountsTestHelper) causes a 101ce8a02769a4a19eeaa3e56f3f27c2b868e8668d6Marcus Hagerott // SecurityException to be thrown unless we add AUTHENTICATE_ACCOUNTS permission to the app 102ce8a02769a4a19eeaa3e56f3f27c2b868e8668d6Marcus Hagerott // manifest. Instead of adding the extra permission just for tests we'll just only run them 103ce8a02769a4a19eeaa3e56f3f27c2b868e8668d6Marcus Hagerott // on M or newer 104ce8a02769a4a19eeaa3e56f3f27c2b868e8668d6Marcus Hagerott @SdkSuppress(minSdkVersion = VERSION_CODES.M) 105ce8a02769a4a19eeaa3e56f3f27c2b868e8668d6Marcus Hagerott // Lollipop MR1 is required for removeAccountExplicitly 10689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @RequiresApi(api = VERSION_CODES.LOLLIPOP_MR1) 10789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @LargeTest 10889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @RunWith(AndroidJUnit4.class) 10989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public static class ImportIntegrationTest { 11089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott private AccountWithDataSet mAccount; 11189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott private AccountsTestHelper mAccountsHelper; 11289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott private ContentResolver mResolver; 11389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 11489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @Before 11589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void setUp() throws Exception { 11689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccountsHelper = new AccountsTestHelper(); 11789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccount = mAccountsHelper.addTestAccount(); 11889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mResolver = getContext().getContentResolver(); 11989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 12089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 12189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @After 12289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void tearDown() throws Exception { 12389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccountsHelper.cleanup(); 12489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 12589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 12689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @Test 12789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void importFromSim() throws Exception { 12889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott final SimContactDao sut = SimContactDao.create(getContext()); 12989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 13089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott sut.importContacts(Arrays.asList( 131a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(1, "Test One", "15095550101"), 132a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(2, "Test Two", "15095550102"), 13389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new SimContact(3, "Test Three", "15095550103", new String[] { 13489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott "user@example.com", "user2@example.com" 13589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott }) 13689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ), mAccount); 13789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 13889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott Cursor cursor = queryContactWithName("Test One"); 139b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(cursor, ContactsMatchers.hasCount(2)); 14089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, hasName("Test One")); 14189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, hasPhone("15095550101")); 14289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott cursor.close(); 14389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 14489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott cursor = queryContactWithName("Test Two"); 145b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(cursor, ContactsMatchers.hasCount(2)); 14689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, hasName("Test Two")); 14789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, hasPhone("15095550102")); 14889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott cursor.close(); 14989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 15089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott cursor = queryContactWithName("Test Three"); 151b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(cursor, ContactsMatchers.hasCount(4)); 15289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, hasName("Test Three")); 15389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, hasPhone("15095550103")); 15489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, allOf(hasEmail("user@example.com"), hasEmail("user2@example.com"))); 15589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott cursor.close(); 15689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 15789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 15889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @Test 15989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void importContactWhichOnlyHasName() throws Exception { 16089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott final SimContactDao sut = SimContactDao.create(getContext()); 16189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 16289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott sut.importContacts(Arrays.asList( 16389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new SimContact(1, "Test importJustName", null, null) 16489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ), mAccount); 16589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 16689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott Cursor cursor = queryAllDataInAccount(); 16789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 168b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(cursor, ContactsMatchers.hasCount(1)); 16989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, hasName("Test importJustName")); 17089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott cursor.close(); 17189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 17289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 17389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @Test 17489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void importContactWhichOnlyHasPhone() throws Exception { 17589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott final SimContactDao sut = SimContactDao.create(getContext()); 17689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 17789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott sut.importContacts(Arrays.asList( 17889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new SimContact(1, null, "15095550111", null) 17989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ), mAccount); 18089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 18189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott Cursor cursor = queryAllDataInAccount(); 18289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 183b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(cursor, ContactsMatchers.hasCount(1)); 18489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(cursor, hasPhone("15095550111")); 18589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott cursor.close(); 18689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 18789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 18889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @Test 18989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void ignoresEmptyContacts() throws Exception { 19089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott final SimContactDao sut = SimContactDao.create(getContext()); 19189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 19289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott // This probably isn't possible but we'll test it to demonstrate expected behavior and 19389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott // just in case it does occur 19489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott sut.importContacts(Arrays.asList( 19589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new SimContact(1, null, null, null), 19689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new SimContact(2, null, null, null), 19789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new SimContact(3, null, null, null), 19889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new SimContact(4, "Not null", null, null) 19989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ), mAccount); 20089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 20189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott final Cursor contactsCursor = queryAllRawContactsInAccount(); 202b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(contactsCursor, ContactsMatchers.hasCount(1)); 20389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott contactsCursor.close(); 20489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 20589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott final Cursor dataCursor = queryAllDataInAccount(); 206b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(dataCursor, ContactsMatchers.hasCount(1)); 20789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 20889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott dataCursor.close(); 20989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 21089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 211a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott /** 212a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * Tests importing a large number of contacts 213a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * 214a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * Make sure that {@link android.os.TransactionTooLargeException} is not thrown 215a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott */ 216a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 217a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void largeImport() throws Exception { 218a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = SimContactDao.create(getContext()); 219a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 220a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<SimContact> contacts = new ArrayList<>(); 221a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 222a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott for (int i = 0; i < MAX_SIM_CONTACTS; i++) { 223a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott contacts.add(new SimContact(i + 1, "Contact " + (i + 1), randomPhone(), 224a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new String[] { randomEmail("contact" + (i + 1) + "_")})); 225a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 226a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 227a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sut.importContacts(contacts, mAccount); 228a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 229a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final Cursor contactsCursor = queryAllRawContactsInAccount(); 230b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(contactsCursor, ContactsMatchers.hasCount(MAX_SIM_CONTACTS)); 231a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott contactsCursor.close(); 232a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 233a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final Cursor dataCursor = queryAllDataInAccount(); 234a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott // Each contact has one data row for each of name, phone and email 235b414d110265d84a461af674115010bf7f349c8a4Marcus Hagerott assertThat(dataCursor, ContactsMatchers.hasCount(MAX_SIM_CONTACTS * 3)); 236a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 237a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott dataCursor.close(); 238a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 239a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 24089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott private Cursor queryAllRawContactsInAccount() { 24189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott return new StringableCursor(mResolver.query(ContactsContract.RawContacts.CONTENT_URI, 24289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott null, ContactsContract.RawContacts.ACCOUNT_NAME + "=? AND " + 24389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ContactsContract.RawContacts.ACCOUNT_TYPE+ "=?", 24489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new String[] { 24589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccount.name, 24689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccount.type 24789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott }, null)); 24889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 24989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 25089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott private Cursor queryAllDataInAccount() { 251a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott return new StringableCursor(mResolver.query(Data.CONTENT_URI, null, 25289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ContactsContract.RawContacts.ACCOUNT_NAME + "=? AND " + 25389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ContactsContract.RawContacts.ACCOUNT_TYPE+ "=?", 25489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new String[] { 25589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccount.name, 25689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccount.type 25789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott }, null)); 25889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 25989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 26089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott private Cursor queryContactWithName(String name) { 261a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott return new StringableCursor(mResolver.query(Data.CONTENT_URI, null, 26289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ContactsContract.RawContacts.ACCOUNT_NAME + "=? AND " + 26389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott ContactsContract.RawContacts.ACCOUNT_TYPE+ "=? AND " + 264a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott Data.DISPLAY_NAME + "=?", 26589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott new String[] { 26689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccount.name, 26789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mAccount.type, 26889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott name 26989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott }, null)); 27089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 27189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 27289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 273a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott /** 274a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * Tests for {@link SimContactDao#findAccountsOfExistingSimContacts(List)} 275a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * 276a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * These are integration tests that query CP2 so that the SQL will be validated in addition 277a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * to the detection algorithm 278a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott */ 2792b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott @SdkSuppress(minSdkVersion = VERSION_CODES.M) 2802b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott // Lollipop MR1 is required for removeAccountExplicitly 2812b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott @RequiresApi(api = VERSION_CODES.LOLLIPOP_MR1) 282a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @LargeTest 2832b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott @RunWith(AndroidJUnit4.class) 284a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public static class FindAccountsIntegrationTests { 2852b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 2862b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott private Context mContext; 2872b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott private AccountsTestHelper mAccountHelper; 288a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private List<AccountWithDataSet> mAccounts; 2892b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott // We need to generate something distinct to prevent flakiness on devices that may not 2902b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott // start with an empty CP2 DB 291a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private String mNameSuffix; 292a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 293a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static AccountWithDataSet sSeedAccount; 294a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 295a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @BeforeClass 296a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public static void setUpClass() throws Exception { 297a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final AccountsTestHelper helper = new AccountsTestHelper( 298a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott InstrumentationRegistry.getContext()); 299a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sSeedAccount = helper.addTestAccount(helper.generateAccountName("seedAccount")); 300a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 301a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott seedCp2(); 302a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 303a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 304a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @AfterClass 305a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public static void tearDownClass() { 306a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final AccountsTestHelper helper = new AccountsTestHelper( 307a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott InstrumentationRegistry.getContext()); 308a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott helper.removeTestAccount(sSeedAccount); 309a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sSeedAccount = null; 310a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 3112b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 3122b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott @Before 313a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void setUp() throws Exception { 3142b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott mContext = InstrumentationRegistry.getTargetContext(); 3152b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott mAccountHelper = new AccountsTestHelper(InstrumentationRegistry.getContext()); 316a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccounts = new ArrayList<>(); 317a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mNameSuffix = getClass().getSimpleName() + "At" + System.nanoTime(); 318a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 319a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott seedCp2(); 3202b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott } 3212b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 3222b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott @After 3232b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott public void tearDown() { 324a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott for (AccountWithDataSet account : mAccounts) { 325a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccountHelper.removeTestAccount(account); 326a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 3272b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott } 3282b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 3292b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott @Test 330a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void returnsEmptyMapWhenNoMatchingContactsExist() { 331a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccounts.add(mAccountHelper.addTestAccount()); 332a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 3332b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott final SimContactDao sut = createDao(); 3342b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 3352b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott final List<SimContact> contacts = Arrays.asList( 336a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(1, "Name 1 " + mNameSuffix, "5550101"), 337a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(2, "Name 2 " + mNameSuffix, "5550102"), 338a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(3, "Name 3 " + mNameSuffix, "5550103"), 339a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(4, "Name 4 " + mNameSuffix, "5550104")); 3402b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 3412b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott final Map<AccountWithDataSet, Set<SimContact>> existing = sut 3422b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott .findAccountsOfExistingSimContacts(contacts); 3432b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 3442b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott assertTrue(existing.isEmpty()); 3452b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott } 3462b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 347a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 348a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void hasAccountWithMatchingContactsWhenSingleMatchingContactExists() 349a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott throws Exception { 350a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = createDao(); 351a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 352a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final AccountWithDataSet account = mAccountHelper.addTestAccount( 353a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccountHelper.generateAccountName("primary_")); 354a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccounts.add(account); 355a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 356a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact existing1 = 357a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(2, "Exists 2 " + mNameSuffix, "5550102"); 358a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact existing2 = 359a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(4, "Exists 4 " + mNameSuffix, "5550104"); 360a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 361a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<SimContact> contacts = Arrays.asList( 362a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(1, "Missing 1 " + mNameSuffix, "5550101"), 363a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existing1), 364a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(3, "Missing 3 " + mNameSuffix, "5550103"), 365a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existing2)); 366a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 367a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sut.importContacts(Arrays.asList( 368a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existing1), 369a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existing2) 370a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ), account); 371a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 372a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 373a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final Map<AccountWithDataSet, Set<SimContact>> existing = sut 374a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .findAccountsOfExistingSimContacts(contacts); 375a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 376a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(existing.size(), equalTo(1)); 377a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(existing.get(account), 378a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott Matchers.<Set<SimContact>>equalTo(ImmutableSet.of(existing1, existing2))); 379a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 380a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 381a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 382a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void hasMultipleAccountsWhenMultipleMatchingContactsExist() throws Exception { 383a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = createDao(); 384a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 385a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final AccountWithDataSet account1 = mAccountHelper.addTestAccount( 386a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccountHelper.generateAccountName("account1_")); 387a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccounts.add(account1); 388a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final AccountWithDataSet account2 = mAccountHelper.addTestAccount( 389a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccountHelper.generateAccountName("account2_")); 390a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccounts.add(account2); 391a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 392a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact existsInBoth = 393a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(2, "Exists Both " + mNameSuffix, "5550102"); 394a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact existsInAccount1 = 395a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(4, "Exists 1 " + mNameSuffix, "5550104"); 396a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact existsInAccount2 = 397a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(5, "Exists 2 " + mNameSuffix, "5550105"); 398a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 399a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<SimContact> contacts = Arrays.asList( 400a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(1, "Missing 1 " + mNameSuffix, "5550101"), 401a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existsInBoth), 402a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(3, "Missing 3 " + mNameSuffix, "5550103"), 403a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existsInAccount1), 404a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existsInAccount2)); 405a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 406a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sut.importContacts(Arrays.asList( 407a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existsInBoth), 408a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existsInAccount1) 409a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ), account1); 410a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 411a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sut.importContacts(Arrays.asList( 412a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existsInBoth), 413a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(existsInAccount2) 414a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ), account2); 415a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 416a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 417a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final Map<AccountWithDataSet, Set<SimContact>> existing = sut 418a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .findAccountsOfExistingSimContacts(contacts); 419a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 420a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(existing.size(), equalTo(2)); 421a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(existing, Matchers.<Map<AccountWithDataSet, Set<SimContact>>>equalTo( 422a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ImmutableMap.<AccountWithDataSet, Set<SimContact>>of( 423a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott account1, ImmutableSet.of(existsInBoth, existsInAccount1), 424a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott account2, ImmutableSet.of(existsInBoth, existsInAccount2)))); 425a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 426a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 427a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 428a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void matchesByNameIfSimContactHasNoPhone() throws Exception { 429a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = createDao(); 430a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 431a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final AccountWithDataSet account = mAccountHelper.addTestAccount( 432a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccountHelper.generateAccountName("account_")); 433a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccounts.add(account); 434a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 435a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact noPhone = new SimContact(1, "Nophone " + mNameSuffix, null); 436a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact otherExisting = new SimContact( 437a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 5, "Exists 1 " + mNameSuffix, "5550105"); 438a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 439a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<SimContact> contacts = Arrays.asList( 440a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(noPhone), 441a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(2, "Name 2 " + mNameSuffix, "5550102"), 442a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(3, "Name 3 " + mNameSuffix, "5550103"), 443a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(4, "Name 4 " + mNameSuffix, "5550104"), 444a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(otherExisting)); 445a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 446a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sut.importContacts(Arrays.asList( 447a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(noPhone), 448a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(otherExisting) 449a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ), account); 450a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 451a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final Map<AccountWithDataSet, Set<SimContact>> existing = sut 452a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .findAccountsOfExistingSimContacts(contacts); 453a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 454a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(existing.size(), equalTo(1)); 455a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(existing.get(account), Matchers.<Set<SimContact>>equalTo( 456a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ImmutableSet.of(noPhone, otherExisting))); 457a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 458a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 459a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 460a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void largeNumberOfSimContacts() throws Exception { 461a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = createDao(); 462a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 463a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<SimContact> contacts = new ArrayList<>(); 464a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott for (int i = 0; i < MAX_SIM_CONTACTS; i++) { 465a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott contacts.add(new SimContact( 466a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott i + 1, "Contact " + (i + 1) + " " + mNameSuffix, randomPhone())); 467a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 468a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott // The work has to be split into batches to avoid hitting SQL query parameter limits 469a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott // so test contacts that will be at boundary points 470a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact imported1 = contacts.get(0); 471a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact imported2 = contacts.get(99); 472a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact imported3 = contacts.get(100); 473a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact imported4 = contacts.get(101); 474a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContact imported5 = contacts.get(MAX_SIM_CONTACTS - 1); 475a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 476a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final AccountWithDataSet account = mAccountHelper.addTestAccount( 477a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccountHelper.generateAccountName("account_")); 478a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccounts.add(account); 479a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 480a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sut.importContacts(Arrays.asList(imported1, imported2, imported3, imported4, imported5), 481a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott account); 482a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 483a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mAccounts.add(account); 484a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 485a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final Map<AccountWithDataSet, Set<SimContact>> existing = sut 486a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .findAccountsOfExistingSimContacts(contacts); 487a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 488a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(existing.size(), equalTo(1)); 489a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(existing.get(account), Matchers.<Set<SimContact>>equalTo( 490a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ImmutableSet.of(imported1, imported2, imported3, imported4, imported5))); 491a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 492a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 493a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 4942b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott private SimContactDao createDao() { 4952b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott return SimContactDao.create(mContext); 4962b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott } 497a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 498a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott /** 499a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * Adds a bunch of random contact data to CP2 to make the test environment more realistic 500a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott */ 501a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static void seedCp2() throws RemoteException, OperationApplicationException { 502a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 503a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final ArrayList<ContentProviderOperation> ops = new ArrayList<>(); 504a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 505a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("John Smith", sSeedAccount, ops); 506a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Marcus Seed", sSeedAccount, ops); 507a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Gary Seed", sSeedAccount, ops); 508a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Michael Seed", sSeedAccount, ops); 509a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Isaac Seed", sSeedAccount, ops); 510a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Sean Seed", sSeedAccount, ops); 511a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Nate Seed", sSeedAccount, ops); 512a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Andrey Seed", sSeedAccount, ops); 513a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Cody Seed", sSeedAccount, ops); 514a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("John Seed", sSeedAccount, ops); 515a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact("Alex Seed", sSeedAccount, ops); 516a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 517a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott InstrumentationRegistry.getTargetContext() 518a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 519a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 520a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 521a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static void appendCreateContact(String name, AccountWithDataSet account, 522a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ArrayList<ContentProviderOperation> ops) { 523a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final int emailCount = sRandom.nextInt(10); 524a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final int phoneCount = sRandom.nextInt(5); 525a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 526a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<String> phones = new ArrayList<>(); 527a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott for (int i = 0; i < phoneCount; i++) { 528a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott phones.add(randomPhone()); 529a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 530a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<String> emails = new ArrayList<>(); 531a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott for (int i = 0; i < emailCount; i++) { 532a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott emails.add(randomEmail(name)); 533a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 534a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott appendCreateContact(name, phones, emails, account, ops); 535a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 536a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 537a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 538a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static void appendCreateContact(String name, List<String> phoneNumbers, 539a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott List<String> emails, AccountWithDataSet account, List<ContentProviderOperation> ops) { 540a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott int index = ops.size(); 541a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 542a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ops.add(account.newRawContactOperation()); 543a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ops.add(insertIntoData(name, StructuredName.CONTENT_ITEM_TYPE, index)); 544a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott for (String phone : phoneNumbers) { 545a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ops.add(insertIntoData(phone, Phone.CONTENT_ITEM_TYPE, Phone.TYPE_MOBILE, index)); 546a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 547a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott for (String email : emails) { 548a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ops.add(insertIntoData(email, Email.CONTENT_ITEM_TYPE, Email.TYPE_HOME, index)); 549a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 550a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 551a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 552a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static ContentProviderOperation insertIntoData(String value, String mimeType, 553a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott int idBackReference) { 554a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott return ContentProviderOperation.newInsert(Data.CONTENT_URI) 555a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withValue(Data.DATA1, value) 556a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withValue(Data.MIMETYPE, mimeType) 557a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withValueBackReference(Data.RAW_CONTACT_ID, idBackReference).build(); 558a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 559a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 560a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static ContentProviderOperation insertIntoData(String value, String mimeType, 561a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott int type, int idBackReference) { 562a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott return ContentProviderOperation.newInsert(Data.CONTENT_URI) 563a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withValue(Data.DATA1, value) 564a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withValue(ContactsContract.Data.DATA2, type) 565a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withValue(Data.MIMETYPE, mimeType) 566a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withValueBackReference(Data.RAW_CONTACT_ID, idBackReference).build(); 567a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 568a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 569a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 570a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott /** 571a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * Tests for {@link SimContactDao#loadContactsForSim(SimCard)} 572a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * 573a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * These are unit tests that verify that {@link SimContact}s are created correctly from 574a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott * the cursors that are returned by queries to the IccProvider 575a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott */ 576a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @SmallTest 577a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @RunWith(AndroidJUnit4.class) 578a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public static class LoadContactsUnitTests { 579a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 580a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private MockContentProvider mMockIccProvider; 581a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private Context mContext; 582a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 583a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Before 584a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void setUp() { 585a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mContext = mock(MockContext.class); 586a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final MockContentResolver mockResolver = new MockContentResolver(); 587a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mMockIccProvider = new MockContentProvider(); 588a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mockResolver.addProvider("icc", mMockIccProvider); 589a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott when(mContext.getContentResolver()).thenReturn(mockResolver); 590a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 591a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 592a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 593a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 594a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void createsContactsFromCursor() { 595a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mMockIccProvider.expect(MockContentProvider.Query.forAnyUri()) 596a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withDefaultProjection( 597a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl._ID, SimContactDaoImpl.NAME, 598a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) 599a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnyProjection() 600a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySelection() 601a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySortOrder() 602a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(1, "Name One", "5550101", null) 603a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(2, "Name Two", "5550102", null) 604a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(3, "Name Three", null, null) 605a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(4, null, "5550104", null) 606a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(5, "Name Five", "5550105", 607a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott "five@example.com,nf@example.com,name.five@example.com") 608a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(6, "Name Six", "5550106", "thesix@example.com"); 609a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 610a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = SimContactDao.create(mContext); 611a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<SimContact> contacts = sut 612a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us")); 613a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 614a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(contacts, equalTo( 615a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott Arrays.asList( 616a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(1, "Name One", "5550101", null), 617a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(2, "Name Two", "5550102", null), 618a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(3, "Name Three", null, null), 619a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(4, null, "5550104", null), 620a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(5, "Name Five", "5550105", new String[] { 621a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott "five@example.com", "nf@example.com", "name.five@example.com" 622a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott }), 623a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(6, "Name Six", "5550106", new String[] { 624a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott "thesix@example.com" 625a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott }) 626a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ))); 627a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 628a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 629a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 630a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void excludesEmptyContactsFromResult() { 631a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mMockIccProvider.expect(MockContentProvider.Query.forAnyUri()) 632a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withDefaultProjection( 633a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl._ID, SimContactDaoImpl.NAME, 634a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) 635a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnyProjection() 636a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySelection() 637a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySortOrder() 638a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(1, "Non Empty1", "5550101", null) 639a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(2, "", "", "") 640a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(3, "Non Empty2", null, null) 641a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(4, null, null, null) 642a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(5, "", null, null) 643a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(6, null, "5550102", null) 644a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnRow(7, null, null, "user@example.com"); 645a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 646a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = SimContactDao.create(mContext); 647a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final List<SimContact> contacts = sut 648a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us")); 649a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 650a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertThat(contacts, equalTo( 651a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott Arrays.asList( 652a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(1, "Non Empty1", "5550101", null), 653a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(3, "Non Empty2", null, null), 654a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(6, null, "5550102", null), 655a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott new SimContact(7, null, null, new String[] { "user@example.com" }) 656a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott ))); 657a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 658a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 659a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 660a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void usesSimCardSubscriptionIdIfAvailable() { 661a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mMockIccProvider.expectQuery(SimContactDaoImpl.ICC_CONTENT_URI.buildUpon() 662a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .appendPath("subId").appendPath("2").build()) 663a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withDefaultProjection( 664a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl._ID, SimContactDaoImpl.NAME, 665a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) 666a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnyProjection() 667a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySelection() 668a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySortOrder() 669a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnEmptyCursor(); 670a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 671a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = SimContactDao.create(mContext); 672a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sut.loadContactsForSim(new SimCard("123", 2, "carrier", "sim", null, "us")); 673a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mMockIccProvider.verify(); 674a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 675a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 676a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 677a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void omitsSimCardSubscriptionIdIfUnavailable() { 678a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mMockIccProvider.expectQuery(SimContactDaoImpl.ICC_CONTENT_URI) 679a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withDefaultProjection( 680a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl._ID, SimContactDaoImpl.NAME, 681a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) 682a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnyProjection() 683a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySelection() 684a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySortOrder() 685a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnEmptyCursor(); 686a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 687a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = SimContactDao.create(mContext); 688a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sut.loadContactsForSim(new SimCard("123", SimCard.NO_SUBSCRIPTION_ID, 689a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott "carrier", "sim", null, "us")); 690a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mMockIccProvider.verify(); 691a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 692a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 693a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott @Test 694a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public void returnsEmptyListForEmptyCursor() { 695a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott mMockIccProvider.expect(MockContentProvider.Query.forAnyUri()) 696a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withDefaultProjection( 697a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl._ID, SimContactDaoImpl.NAME, 698a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott SimContactDaoImpl.NUMBER, SimContactDaoImpl.EMAILS) 699a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnyProjection() 700a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySelection() 701a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .withAnySortOrder() 702a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .returnEmptyCursor(); 703a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 704a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott final SimContactDao sut = SimContactDao.create(mContext); 705a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott List<SimContact> result = sut 706a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us")); 707a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott assertTrue(result.isEmpty()); 708a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 709aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott 710aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott @Test 711aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott public void returnsEmptyListForNullCursor() { 712aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott mContext = mock(MockContext.class); 713aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott final MockContentResolver mockResolver = new MockContentResolver(); 714aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott final ContentProvider mockProvider = mock(android.test.mock.MockContentProvider.class); 715aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott when(mockProvider.query(any(Uri.class), any(String[].class), anyString(), 716aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott any(String[].class), anyString())) 717aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott .thenReturn(null); 718aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott when(mockProvider.query(any(Uri.class), any(String[].class), anyString(), 719aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott any(String[].class), anyString(), any(CancellationSignal.class))) 720aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott .thenReturn(null); 721aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott 722aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott mockResolver.addProvider("icc", mockProvider); 723aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott when(mContext.getContentResolver()).thenReturn(mockResolver); 724aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott 725aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott final SimContactDao sut = SimContactDao.create(mContext); 726aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott final List<SimContact> result = sut 727aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott .loadContactsForSim(new SimCard("123", "carrier", "sim", null, "us")); 728aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott assertTrue(result.isEmpty()); 729aa16ca2105bc6038edf35e3dce13977f8bc77874Marcus Hagerott } 7302b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott } 7312b2cbe9c117e6d1b8fd58c708a8c5a08771964fbMarcus Hagerott 73289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @LargeTest 73389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott // suppressed because failed assumptions are reported as test failures by the build server 73489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @Suppress 73589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @RunWith(AndroidJUnit4.class) 736a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott public static class LoadContactsIntegrationTest { 73789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott private SimContactsTestHelper mSimTestHelper; 73889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott private ArrayList<ContentProviderOperation> mSimSnapshot; 73989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 74089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @Before 74189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void setUp() throws Exception { 74289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mSimTestHelper = new SimContactsTestHelper(); 74389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 74489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mSimTestHelper.assumeSimWritable(); 74589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott if (!mSimTestHelper.isSimWritable()) return; 74689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 74789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mSimSnapshot = mSimTestHelper.captureRestoreSnapshot(); 74889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mSimTestHelper.deleteAllSimContacts(); 74989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 75089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 75189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @After 75289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void tearDown() throws Exception { 75389456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mSimTestHelper.restore(mSimSnapshot); 75489456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 75589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 75689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott @Test 75789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott public void readFromSim() { 75889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mSimTestHelper.addSimContact("Test Simone", "15095550101"); 75989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mSimTestHelper.addSimContact("Test Simtwo", "15095550102"); 76089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott mSimTestHelper.addSimContact("Test Simthree", "15095550103"); 76189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 76289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott final SimContactDao sut = SimContactDao.create(getContext()); 7632bb4984ee2f2e345e9073b9cc40af2afc35b9809Marcus Hagerott final SimCard sim = sut.getSimCards().get(0); 7642bb4984ee2f2e345e9073b9cc40af2afc35b9809Marcus Hagerott final ArrayList<SimContact> contacts = sut.loadContactsForSim(sim); 76589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 76689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(contacts.get(0), isSimContactWithNameAndPhone("Test Simone", "15095550101")); 76789456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(contacts.get(1), isSimContactWithNameAndPhone("Test Simtwo", "15095550102")); 76889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott assertThat(contacts.get(2), 76989456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott isSimContactWithNameAndPhone("Test Simthree", "15095550103")); 77089456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 77189456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott } 77289456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott 773a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static String randomPhone() { 774a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott return String.format(Locale.US, "1%s55501%02d", 775a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott AREA_CODES[sRandom.nextInt(AREA_CODES.length)], 776a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott sRandom.nextInt(100)); 777a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 778a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 779a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott private static String randomEmail(String name) { 780a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott return String.format("%s%d@example.com", name.replace(" ", ".").toLowerCase(Locale.US), 781a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 1000 + sRandom.nextInt(1000)); 782a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 783a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 784a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott 78589456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott static Context getContext() { 78689456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott return InstrumentationRegistry.getTargetContext(); 787a75206b1cba895ce629b9383e4fd0fef24049e7bMarcus Hagerott } 78889456cececb473cc4ddcf4696c4ef85df55ec48dMarcus Hagerott} 789