blob: 4e62126195060282041fa5d00206c9f6ff815518 [file] [log] [blame]
Marcus Hagerottfac695a2016-08-24 17:02:40 -07001/*
2 * Copyright (C) 2016 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
Gary Mai69c182a2016-12-05 13:07:03 -080016package com.android.contacts.model;
Marcus Hagerottfac695a2016-08-24 17:02:40 -070017
Marcus Hagerottbc510842016-09-09 19:29:45 -070018import android.content.ContentProvider;
Marcus Hagerottfac695a2016-08-24 17:02:40 -070019import android.content.ContentResolver;
20import android.database.Cursor;
21import android.database.MatrixCursor;
22import android.net.Uri;
23import android.os.CancellationSignal;
24import android.provider.ContactsContract;
25import android.provider.ContactsContract.RawContacts;
26import android.support.annotation.Nullable;
Marcus Hagerottc2093f32016-12-12 10:18:12 -080027import android.support.v4.util.ArraySet;
Marcus Hagerottfac695a2016-08-24 17:02:40 -070028import android.test.AndroidTestCase;
29import android.test.mock.MockContentResolver;
30import android.test.suitebuilder.annotation.SmallTest;
31
Gary Mai69c182a2016-12-05 13:07:03 -080032import com.android.contacts.model.account.AccountWithDataSet;
Gary Mai0a49afa2016-12-05 15:53:58 -080033import com.android.contacts.test.mocks.MockContentProvider;
Marcus Hagerottfac695a2016-08-24 17:02:40 -070034import com.android.contacts.tests.FakeDeviceAccountTypeFactory;
Gary Mai0a49afa2016-12-05 15:53:58 -080035import com.android.contacts.util.DeviceLocalAccountTypeFactory;
Marcus Hagerottfac695a2016-08-24 17:02:40 -070036
37import java.util.Arrays;
38import java.util.Collections;
Marcus Hagerottbc510842016-09-09 19:29:45 -070039import java.util.HashMap;
Marcus Hagerottfac695a2016-08-24 17:02:40 -070040import java.util.List;
Marcus Hagerottbc510842016-09-09 19:29:45 -070041import java.util.Map;
Marcus Hagerottfac695a2016-08-24 17:02:40 -070042
43@SmallTest
Marcus Hagerott7a756ab2016-11-01 18:16:02 -070044public class Cp2DeviceLocalAccountLocatorTests extends AndroidTestCase {
Marcus Hagerottfac695a2016-08-24 17:02:40 -070045
46 // Basic smoke test that just checks that it doesn't throw when loading from CP2. We don't
47 // care what CP2 actually contains for this.
48 public void testShouldNotCrash() {
Marcus Hagerott7a756ab2016-11-01 18:16:02 -070049 final DeviceLocalAccountLocator sut = new Cp2DeviceLocalAccountLocator(
Marcus Hagerottfac695a2016-08-24 17:02:40 -070050 getContext().getContentResolver(),
51 new DeviceLocalAccountTypeFactory.Default(getContext()),
Marcus Hagerottc2093f32016-12-12 10:18:12 -080052 Collections.<String>emptySet());
Marcus Hagerottfac695a2016-08-24 17:02:40 -070053 sut.getDeviceLocalAccounts();
54 // We didn't throw so it passed
55 }
56
Marcus Hagerottbc510842016-09-09 19:29:45 -070057 public void test_getDeviceLocalAccounts_returnsEmptyListWhenQueryReturnsNull() {
58 final DeviceLocalAccountLocator sut = createWithQueryResult(null);
59 assertTrue(sut.getDeviceLocalAccounts().isEmpty());
60 }
61
Marcus Hagerottfac695a2016-08-24 17:02:40 -070062 public void test_getDeviceLocalAccounts_returnsEmptyListWhenNoRawContactsHaveDeviceType() {
63 final DeviceLocalAccountLocator sut = createWithQueryResult(queryResult(
64 "user", "com.example",
65 "user", "com.example",
66 "user", "com.example"));
67 assertTrue(sut.getDeviceLocalAccounts().isEmpty());
68 }
69
70 public void test_getDeviceLocalAccounts_returnsListWithItemForNullAccount() {
71 final DeviceLocalAccountLocator sut = createWithQueryResult(queryResult(
72 "user", "com.example",
73 null, null,
74 "user", "com.example",
75 null, null));
76
77 assertEquals(1, sut.getDeviceLocalAccounts().size());
78 }
79
80 public void test_getDeviceLocalAccounts_containsItemForEachDeviceAccount() {
81 final DeviceLocalAccountTypeFactory stubFactory = new FakeDeviceAccountTypeFactory()
82 .withDeviceTypes(null, "vnd.sec.contact.phone")
83 .withSimTypes("vnd.sec.contact.sim");
Marcus Hagerottc2093f32016-12-12 10:18:12 -080084 final DeviceLocalAccountLocator sut = createLocator(queryResult(
85 "user", "com.example",
86 "user", "com.example",
87 "phone_account", "vnd.sec.contact.phone",
88 null, null,
89 "phone_account", "vnd.sec.contact.phone",
90 "user", "com.example",
91 null, null,
92 "sim_account", "vnd.sec.contact.sim",
93 "sim_account_2", "vnd.sec.contact.sim"
94 ), stubFactory);
95
Marcus Hagerottfac695a2016-08-24 17:02:40 -070096
97 assertEquals(4, sut.getDeviceLocalAccounts().size());
98 }
99
Marcus Hagerottc2093f32016-12-12 10:18:12 -0800100 public void test_getDeviceLocalAccounts_doesNotContainItemsForKnownAccountTypes() {
Marcus Hagerott7a756ab2016-11-01 18:16:02 -0700101 final Cp2DeviceLocalAccountLocator sut = new Cp2DeviceLocalAccountLocator(
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700102 getContext().getContentResolver(), new FakeDeviceAccountTypeFactory(),
Marcus Hagerottc2093f32016-12-12 10:18:12 -0800103 new ArraySet<>(Arrays.asList("com.example", "com.example.1")));
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700104
Marcus Hagerottc2093f32016-12-12 10:18:12 -0800105 assertTrue("Selection should filter known accounts",
106 sut.getSelection().contains("NOT IN (?,?)"));
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700107
108 final List<String> args = Arrays.asList(sut.getSelectionArgs());
109 assertEquals(2, args.size());
110 assertTrue("Selection args is missing an expected value", args.contains("com.example"));
111 assertTrue("Selection args is missing an expected value", args.contains("com.example.1"));
112 }
113
Marcus Hagerottbc510842016-09-09 19:29:45 -0700114 public void test_getDeviceLocalAccounts_includesAccountsFromSettings() {
115 final DeviceLocalAccountTypeFactory stubFactory = new FakeDeviceAccountTypeFactory()
116 .withDeviceTypes(null, "vnd.sec.contact.phone")
117 .withSimTypes("vnd.sec.contact.sim");
Marcus Hagerottc2093f32016-12-12 10:18:12 -0800118 final DeviceLocalAccountLocator sut = createLocator(new FakeContactsProvider()
119 .withQueryResult(ContactsContract.Settings.CONTENT_URI, queryResult(
120 "phone_account", "vnd.sec.contact.phone",
121 "sim_account", "vnd.sec.contact.sim"
122 )), stubFactory);
Marcus Hagerottbc510842016-09-09 19:29:45 -0700123
124 assertEquals(2, sut.getDeviceLocalAccounts().size());
125 }
126
127 public void test_getDeviceLocalAccounts_includesAccountsFromGroups() {
128 final DeviceLocalAccountTypeFactory stubFactory = new FakeDeviceAccountTypeFactory()
129 .withDeviceTypes(null, "vnd.sec.contact.phone")
130 .withSimTypes("vnd.sec.contact.sim");
Marcus Hagerottc2093f32016-12-12 10:18:12 -0800131 final DeviceLocalAccountLocator sut = createLocator(new FakeContactsProvider()
132 .withQueryResult(ContactsContract.Groups.CONTENT_URI, queryResult(
133 "phone_account", "vnd.sec.contact.phone",
134 "sim_account", "vnd.sec.contact.sim"
135 )), stubFactory);
Marcus Hagerottbc510842016-09-09 19:29:45 -0700136
137 assertEquals(2, sut.getDeviceLocalAccounts().size());
138 }
139
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700140 private DeviceLocalAccountLocator createWithQueryResult(
141 Cursor cursor) {
Marcus Hagerottc2093f32016-12-12 10:18:12 -0800142 return createLocator(cursor, new DeviceLocalAccountTypeFactory.Default(mContext));
143 }
144
145 private DeviceLocalAccountLocator createLocator(ContentProvider contactsProvider,
146 DeviceLocalAccountTypeFactory localAccountTypeFactory) {
147 final DeviceLocalAccountLocator locator = new Cp2DeviceLocalAccountLocator(
148 createContentResolverWithProvider(contactsProvider),
149 localAccountTypeFactory, Collections.<String>emptySet());
150 return locator;
151 }
152
153 private DeviceLocalAccountLocator createLocator(Cursor cursor,
154 DeviceLocalAccountTypeFactory localAccountTypeFactory) {
Marcus Hagerott7a756ab2016-11-01 18:16:02 -0700155 final DeviceLocalAccountLocator locator = new Cp2DeviceLocalAccountLocator(
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700156 createStubResolverWithContentQueryResult(cursor),
Marcus Hagerottc2093f32016-12-12 10:18:12 -0800157 localAccountTypeFactory,
158 Collections.<String>emptySet());
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700159 return locator;
160 }
161
Marcus Hagerottbc510842016-09-09 19:29:45 -0700162 private ContentResolver createContentResolverWithProvider(ContentProvider contactsProvider) {
163 final MockContentResolver resolver = new MockContentResolver();
164 resolver.addProvider(ContactsContract.AUTHORITY, contactsProvider);
165 return resolver;
166 }
167
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700168 private ContentResolver createStubResolverWithContentQueryResult(Cursor cursor) {
169 final MockContentResolver resolver = new MockContentResolver();
Marcus Hagerottbc510842016-09-09 19:29:45 -0700170 resolver.addProvider(ContactsContract.AUTHORITY, new FakeContactsProvider()
171 .withDefaultQueryResult(cursor));
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700172 return resolver;
173 }
174
175 private Cursor queryResult(String... nameTypePairs) {
176 final MatrixCursor cursor = new MatrixCursor(new String[]
177 { RawContacts.ACCOUNT_NAME, RawContacts.ACCOUNT_TYPE, RawContacts.DATA_SET });
178 for (int i = 0; i < nameTypePairs.length; i+=2) {
179 cursor.newRow().add(nameTypePairs[i]).add(nameTypePairs[i+1])
180 .add(null);
181 }
182 return cursor;
183 }
184
185 private static class FakeContactsProvider extends MockContentProvider {
186 public Cursor mNextQueryResult;
Marcus Hagerottbc510842016-09-09 19:29:45 -0700187 public Map<Uri, Cursor> mNextResultMapping = new HashMap<>();
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700188
189 public FakeContactsProvider() {}
190
Marcus Hagerottbc510842016-09-09 19:29:45 -0700191 public FakeContactsProvider withDefaultQueryResult(Cursor cursor) {
192 mNextQueryResult = cursor;
193 return this;
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700194 }
195
Marcus Hagerottbc510842016-09-09 19:29:45 -0700196 public FakeContactsProvider withQueryResult(Uri uri, Cursor cursor) {
197 mNextResultMapping.put(uri, cursor);
198 return this;
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700199 }
200
201 @Override
202 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
203 String sortOrder) {
204 return query(uri, projection, selection, selectionArgs, sortOrder, null);
205 }
206
207 @Nullable
208 @Override
209 public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
210 String sortOrder, CancellationSignal cancellationSignal) {
Marcus Hagerottbc510842016-09-09 19:29:45 -0700211 final Cursor result = mNextResultMapping.get(uri);
212 if (result == null) {
213 return mNextQueryResult;
214 } else {
215 return result;
216 }
217 }
Marcus Hagerottfac695a2016-08-24 17:02:40 -0700218 }
219}