DirectoryTest.java revision d3d812af96f7d77e13dc60652626b39f25907147
1d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov/*
2d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
4d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * you may not use this file except in compliance with the License.
6d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * You may obtain a copy of the License at
7d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
8d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
10d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * See the License for the specific language governing permissions and
14d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * limitations under the License.
15d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */
16d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
17d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovpackage com.android.providers.contacts;
18d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
19d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport com.google.android.collect.Lists;
20d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
21d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.accounts.Account;
22d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.ContentUris;
23d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.ContentValues;
24d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.Context;
25d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.content.pm.ProviderInfo;
26d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.database.Cursor;
27d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.database.MatrixCursor;
28d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.net.Uri;
29d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract;
30d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Contacts;
31d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Directory;
32d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.provider.ContactsContract.Settings;
33d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.test.mock.MockContentProvider;
34d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest;
35d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
36d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
37d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov/**
38d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Unit tests for {@link ContactsProvider2}, directory functionality.
39d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *
40d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * Run the test like this:
41d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * <code>
42d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * adb shell am instrument -e class com.android.providers.contacts.DirectoryTest -w \
43d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov *         com.android.providers.contacts.tests/android.test.InstrumentationTestRunner
44d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov * </code>
45d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov */
46d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov@LargeTest
47d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikovpublic class DirectoryTest extends BaseContactsProvider2Test {
48d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
49d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDefaultDirectory() {
50d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
51d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri defaultDirectoryUri =
52d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.DEFAULT);
53d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
54d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, "contactsTestPackage");
55d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY);
56d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, R.string.default_directory);
57d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
58d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_NAME);
59d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_TYPE);
60d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.DISPLAY_NAME);
61d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
62d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValues(defaultDirectoryUri, values);
63d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
64d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
65d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testInvisibleLocalDirectory() {
66d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
67d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri defaultDirectoryUri =
68d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            ContentUris.withAppendedId(Directory.CONTENT_URI, Directory.LOCAL_INVISIBLE);
69d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
70d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, "contactsTestPackage");
71d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, ContactsContract.AUTHORITY);
72d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, R.string.local_invisible_directory);
73d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
74d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_NAME);
75d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.ACCOUNT_TYPE);
76d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.putNull(Directory.DISPLAY_NAME);
77d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
78d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValues(defaultDirectoryUri, values);
79d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
80d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
81d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDirectoryInsert() {
82d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
83d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY);
84d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "my_authority");
85d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, 42);
86d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DISPLAY_NAME, "Universe");
87d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_ANY_ACCOUNT);
88d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.ACCOUNT_NAME, "accountName");
89d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.ACCOUNT_TYPE, "accountType");
90d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
91d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
92d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
93d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri uri = mResolver.insert(Directory.CONTENT_URI, values);
94d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValues(uri, values);
95d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
96d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
97d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDirectoryInsertWrongPackage() {
98d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
99d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, "wrong.package");
100d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "my_authority");
101d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
102d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
103d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
104d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        try {
105d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            mResolver.insert(Directory.CONTENT_URI, values);
106d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            fail("Was expecting an IllegalArgumentException");
107d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        } catch (IllegalArgumentException ex) {
108d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            // Expected
109d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        }
110d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
111d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
112d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDirectoryUpdate() {
113d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
114d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY);
115d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "my_authority");
116d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, 42);
117d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DISPLAY_NAME, "Universe");
118d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_ANY_ACCOUNT);
119d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.ACCOUNT_NAME, "accountName");
120d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.ACCOUNT_TYPE, "accountType");
121d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
122d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
123d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
124d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri uri = mResolver.insert(Directory.CONTENT_URI, values);
125d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
126d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "different_authority");
127d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.TYPE_RESOURCE_ID, 43);
128d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DISPLAY_NAME, "Beyond Universe");
129d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.EXPORT_SUPPORT, Directory.EXPORT_SUPPORT_NONE);
130d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.ACCOUNT_NAME, "newName");
131d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.ACCOUNT_TYPE, "newType");
132d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
133d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        int count = mResolver.update(uri, values, null, null);
134d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, count);
135d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValues(uri, values);
136d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
137d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
138d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDirectoryUpdateWrongPackage() {
139d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
140d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY);
141d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "my_authority");
142d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
143d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
144d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri uri = mResolver.insert(Directory.CONTENT_URI, values);
145d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
146d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "different_authority");
147d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
148d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.packageName = "different.package";
149d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
150d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
151d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        try {
152d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            mResolver.update(uri, values, null, null);
153d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            fail("Was expecting an IllegalArgumentException");
154d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        } catch (IllegalArgumentException ex) {
155d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            // Expected
156d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        }
157d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
158d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
159d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDirectorDelete() {
160d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
161d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY);
162d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "my_authority");
163d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
164d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
165d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
166d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri uri = mResolver.insert(Directory.CONTENT_URI, values);
167d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
168d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mResolver.delete(uri, null, null);
169d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
170d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(0, getCount(uri, null, null));
171d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
172d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
173d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testDirectorDeleteWrongPackage() {
174d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
175d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY);
176d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "my_authority");
177d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
178d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
179d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri uri = mResolver.insert(Directory.CONTENT_URI, values);
180d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
181d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "different_authority");
182d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
183d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.packageName = "different.package";
184d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
185d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        try {
186d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            mResolver.delete(uri, null, null);
187d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            fail("Was expecting an IllegalArgumentException");
188d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        } catch (IllegalArgumentException ex) {
189d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            // Expected
190d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        }
191d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
192d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
193d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testAccountRemoval() {
194d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ((ContactsProvider2)getProvider()).onAccountsUpdated(
195d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new Account[]{new Account("accountName", "accountType")});
196d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
197d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
198d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY);
199d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "my_authority");
200d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.ACCOUNT_NAME, "accountName");
201d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.ACCOUNT_TYPE, "accountType");
202d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
203d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
204d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri uri = mResolver.insert(Directory.CONTENT_URI, values);
205d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
206d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ((ContactsProvider2)getProvider()).onAccountsUpdated(
207d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new Account[]{new Account("name", "type")});
208d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
209d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        // Removing the account should trigger the removal of the directory
210d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(0, getCount(uri, null, null));
211d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
212d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
213d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testPackageRemoval() {
214d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
215d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY);
216d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "my_authority");
217d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
218d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
219d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri uri = mResolver.insert(Directory.CONTENT_URI, values);
220d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
221d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ((ContactsProvider2)getProvider()).onPackageUninstalled(ContactsActor.PACKAGE_GREY);
222d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
223d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        // Uninstalling the package should trigger the removal of the directory
224d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(0, getCount(uri, null, null));
225d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
226d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
227d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testForwardingToLocalContacts() {
228d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        long contactId = queryContactId(createRawContactWithName());
229d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
230d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
231d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.DEFAULT)).build();
232d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
233d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Cursor cursor = mResolver.query(contentUri,
234d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
235d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertNotNull(cursor);
236d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, cursor.getCount());
237d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.moveToFirst();
238d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(contactId, cursor.getLong(0));
239d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("John Doe", cursor.getString(1));
240d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.close();
241d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
242d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
243d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testForwardingToLocalInvisibleContacts() {
244d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        long visibleContactId = queryContactId(createRawContactWithName("Bob", "Parr"));
245d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
246d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, visibleContactId),
247d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                Contacts.IN_VISIBLE_GROUP, "1");
248d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
249d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        long hiddenContactId = queryContactId(createRawContactWithName("Helen", "Parr",
250d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new Account("accountName", "accountType")));
251d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
252d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertStoredValue(ContentUris.withAppendedId(Contacts.CONTENT_URI, hiddenContactId),
253d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                Contacts.IN_VISIBLE_GROUP, "0");
254d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
255d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
256d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(Directory.LOCAL_INVISIBLE))
257d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                .build();
258d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
259d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Cursor cursor = mResolver.query(contentUri,
260d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
261d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertNotNull(cursor);
262d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, cursor.getCount());
263d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.moveToFirst();
264d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(hiddenContactId, cursor.getLong(0));
265d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("Helen Parr", cursor.getString(1));
266d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.close();
267d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
268d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri filterUri = Contacts.CONTENT_FILTER_URI.buildUpon().appendEncodedPath("parr")
269d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                .appendQueryParameter(ContactsContract.DIRECTORY_PARAM_KEY,
270d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                        String.valueOf(Directory.LOCAL_INVISIBLE)).build();
271d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
272d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor = mResolver.query(filterUri,
273d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new String[]{Contacts._ID, Contacts.DISPLAY_NAME}, null, null, null);
274d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertNotNull(cursor);
275d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, cursor.getCount());
276d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.moveToFirst();
277d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(hiddenContactId, cursor.getLong(0));
278d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("Helen Parr", cursor.getString(1));
279d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.close();
280d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
281d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
282d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public void testForwardingToDirectoryProvider() throws Exception {
283d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        addProvider(TestProvider.class, "test_authority");
284d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
285d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        ContentValues values = new ContentValues();
286d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.PACKAGE_NAME, ContactsActor.PACKAGE_GREY);
287d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        values.put(Directory.DIRECTORY_AUTHORITY, "test_authority");
288d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
289d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        mActor.ensureCallingPackage();
290d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri uri = mResolver.insert(Directory.CONTENT_URI, values);
291d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        long directoryId = ContentUris.parseId(uri);
292d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
293d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Uri contentUri = Contacts.CONTENT_URI.buildUpon().appendQueryParameter(
294d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(directoryId)).build();
295d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
296d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        // The request should be forwarded to TestProvider, which will simply
297d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        // package arguments and return them to us for verification
298d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        Cursor cursor = mResolver.query(contentUri,
299d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                new String[]{"f1", "f2"}, "query", new String[]{"s1", "s2"}, "so");
300d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertNotNull(cursor);
301d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals(1, cursor.getCount());
302d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.moveToFirst();
303d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("[f1, f2]", cursor.getString(cursor.getColumnIndex("projection")));
304d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("query", cursor.getString(cursor.getColumnIndex("selection")));
305d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("[s1, s2]", cursor.getString(cursor.getColumnIndex("selectionArgs")));
306d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        assertEquals("so", cursor.getString(cursor.getColumnIndex("sortOrder")));
307d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        cursor.close();
308d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
309d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
310d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    public static class TestProvider extends MockContentProvider {
311d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
312d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        @Override
313d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        public void attachInfo(Context context, ProviderInfo info) {
314d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        }
315d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
316d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        @Override
317d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
318d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                String sortOrder) {
319d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            MatrixCursor cursor = new MatrixCursor(new String[] {
320d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                    "projection", "selection", "selectionArgs", "sortOrder"
321d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            });
322d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            cursor.addRow(new Object[] {
323d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                Lists.newArrayList(projection).toString(),
324d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                selection,
325d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                Lists.newArrayList(selectionArgs).toString(),
326d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov                sortOrder
327d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            });
328d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov            return cursor;
329d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov        }
330d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov    }
331d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov}
332d3d812af96f7d77e13dc60652626b39f25907147Dmitri Plotnikov
333