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