LegacyContactsProviderTest.java revision 3cebbf7141252768d3e272e049e9c5b0cb9d710e
1bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov/*
2bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Copyright (C) 2009 The Android Open Source Project
3bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov *
4bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Licensed under the Apache License, Version 2.0 (the "License");
5bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * you may not use this file except in compliance with the License.
6bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * You may obtain a copy of the License at
7bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov *
8bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov *      http://www.apache.org/licenses/LICENSE-2.0
9bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov *
10bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Unless required by applicable law or agreed to in writing, software
11bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * distributed under the License is distributed on an "AS IS" BASIS,
12bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * See the License for the specific language governing permissions and
14bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * limitations under the License.
15bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov */
16bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
17bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovpackage com.android.providers.contacts;
18bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
19bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentProvider;
20bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentUris;
21bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.ContentValues;
22bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.content.res.Resources;
23bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.database.Cursor;
24bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.net.Uri;
25bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts;
26bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.ContactMethods;
27bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Extensions;
28bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.GroupMembership;
29bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Groups;
30bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Organizations;
31bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.People;
32bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Phones;
33bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Photos;
34bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.provider.Contacts.Presence;
35bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport android.test.suitebuilder.annotation.LargeTest;
36bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
37bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.io.ByteArrayOutputStream;
38bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.io.IOException;
39bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.io.InputStream;
40bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.util.Map;
41bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovimport java.util.Set;
42bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
43bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov/**
44bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov * Tests for legacy contacts APIs.
45bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov */
46bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov@LargeTest
47bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikovpublic class LegacyContactsProviderTest extends BaseContactsProvider2Test {
48bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
49f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    private static final boolean USE_LEGACY_PROVIDER = false;
50f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov
51bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    @Override
52bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    protected Class<? extends ContentProvider> getProviderClass() {
53f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov       return USE_LEGACY_PROVIDER ? ContactsProvider.class : SynchronousContactsProvider2.class;
54bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
55bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
56bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    @Override
57bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    protected String getAuthority() {
58bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        return Contacts.AUTHORITY;
59bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
60bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
61bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    public void testPeopleInsert() {
62bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
63bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
64bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
65bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(People.CONTENT_URI, values);
66bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
67bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
68bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
69f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
70f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPeopleDelete() {
71bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
72bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "John Doe");
73bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personId = mResolver.insert(People.CONTENT_URI, values);
74bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(personId, null, null);
75bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
76bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(personId, null, People.NAME + "='John Doe'" , null, null);
77bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals("Record count after deletion", 0, c.getCount());
78bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        c.close();
79bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
80bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
81bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.query(People.DELETED_CONTENT_URI, null, null, null, null);
82bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (UnsupportedOperationException e) {
83bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Expected exception
84bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
85bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
86bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
87f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
88f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPeopleFilter() {
89bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
90bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Deer Doe");
91bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
92bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
93bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
94bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Dear Dough");
95bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
96bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
97bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
98bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "D.R. Dauwe");
99bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(People.CONTENT_URI, values);
100bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
101bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("d", "Deer Doe", "Dear Dough", "D.R. Dauwe");
102bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("de", "Deer Doe", "Dear Dough");
103bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("dee", "Deer Doe");
104bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertFilteredContacts("der");
105bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
106bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
107f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
108f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testDefaultDisplayName() {
109bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
110bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "John Doe");
111bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
112bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, People.DISPLAY_NAME, "John Doe");
113bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
114bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
1153cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public void testPrimaryOrganization() {
116bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
117bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
118bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
119bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
120bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
121bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
122bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
123bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Google");
124bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_WORK);
125bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
126bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri orgUri1 = mResolver.insert(Organizations.CONTENT_URI, values);
127bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
128bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
129bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
130bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Acme");
131bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_WORK);
132bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
133bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri orgUri2 = mResolver.insert(Organizations.CONTENT_URI, values);
134bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
135bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
136bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_ORGANIZATION_ID, ContentUris.parseId(orgUri1));
137bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "Google");
138bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
139bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
140bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the original primary organization
141bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(orgUri1, null, null);
142bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
143bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
144bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_ORGANIZATION_ID, ContentUris.parseId(orgUri2));
145bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "Acme");
146bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
147bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
148bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining organization
149bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(orgUri2, null, null);
150bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
151bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
152bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_ORGANIZATION_ID);
153bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
154bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
155bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
156bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
157f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
158f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPrimaryPhone() {
159bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
160bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
161bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
162bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
163bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
164bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
165bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
166bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_WORK);
167bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
168bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "12345");
169bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri phoneUri1 = mResolver.insert(Phones.CONTENT_URI, values);
170bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
171bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
172bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
173bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_WORK);
174bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
175bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "67890");
176bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri phoneUri2 = mResolver.insert(Phones.CONTENT_URI, values);
177bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
178bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
179bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri1));
180bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "12345");
181bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
182bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
183bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the primary phone number
184bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(phoneUri1, null, null);
185bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
186bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
187bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_PHONE_ID, ContentUris.parseId(phoneUri2));
188bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "67890");
189bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
190bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
191bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining phone number
192bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(phoneUri2, null, null);
193bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
194bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
195bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_PHONE_ID);
196bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
197bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
198bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
199bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
200f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
201f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPrimaryEmail() {
202bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
203bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
204bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
205bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
206bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Primary
207bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
208bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
209bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
210bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
211bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "foo@acme.com");
212bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, 1);
213bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri emailUri1 = mResolver.insert(ContactMethods.CONTENT_URI, values);
214bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
215bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Non-primary
216bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
217bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
218bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
219bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_WORK);
220bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "bar@acme.com");
221bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri emailUri2 = mResolver.insert(ContactMethods.CONTENT_URI, values);
222bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
223bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
224bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri1));
225bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "foo@acme.com");
226bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
227bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
228bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the primary email
229bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(emailUri1, null, null);
230bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
231bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
232bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRIMARY_EMAIL_ID, ContentUris.parseId(emailUri2));
233bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.DISPLAY_NAME, "bar@acme.com");
234bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
235bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
236bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Remove the remaining email
237bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.delete(emailUri2, null, null);
238bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
239bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
240bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.PRIMARY_EMAIL_ID);
241bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.putNull(People.DISPLAY_NAME);
242bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
243bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
244bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
245bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    public void testMarkAsContacted() {
246bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
247bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
248bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
249bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
250bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int timesContactedBefore =
251bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Integer.parseInt(getStoredValue(personUri, People.TIMES_CONTACTED));
252bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long timeBefore = System.currentTimeMillis();
253bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        People.markAsContacted(mResolver, personId);
254bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long timeAfter = System.currentTimeMillis();
255bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
256bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long lastContacted = Long.parseLong(getStoredValue(personUri, People.LAST_TIME_CONTACTED));
257bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int timesContactedAfter =
258bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            Integer.parseInt(getStoredValue(personUri, People.TIMES_CONTACTED));
259bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
260bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTrue(lastContacted >= timeBefore);
261bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTrue(lastContacted <= timeAfter);
262bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals(timesContactedAfter, timesContactedBefore + 1);
263bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
264bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
2653cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov    public void testOrganizationsInsert() {
266bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
267bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
268bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
269bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
270bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
271bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.COMPANY, "Sierra");
272bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.PERSON_ID, personId);
273bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TYPE, Organizations.TYPE_CUSTOM);
274bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.LABEL, "Club");
275bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.TITLE, "Member");
276bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Organizations.ISPRIMARY, 1);
277bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
278bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Organizations.CONTENT_URI, values);
279bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
280bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
281bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(Organizations.CONTENT_URI, Organizations.TYPE,
282bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.TYPE_WORK);
283bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
284bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(Organizations.CONTENT_URI, Organizations.PERSON_ID, personId,
285bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.TYPE, Organizations.TYPE_CUSTOM, Organizations.TYPE_OTHER,
286bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Organizations.LABEL);
287bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
288bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
289f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
290f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPhonesInsert() {
291bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
292bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
293bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
294bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
295bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
296bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
297bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.PERSON_ID, personId);
298bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.TYPE, Phones.TYPE_CUSTOM);
299bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.LABEL, "Directory");
300bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER, "1-800-4664-411");
301bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.ISPRIMARY, 1);
302bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
303bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Phones.CONTENT_URI, values);
304bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
305bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Adding another value to assert
306bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Phones.NUMBER_KEY, "11446640081");
307bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
308bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // The result is joined with People
309bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
310bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
311bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
312bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the phone through People
313bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.Phones.CONTENT_DIRECTORY);
314bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
315bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
316bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Now the person should be joined with Phone
317bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
318bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
319bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.TYPE, Phones.TYPE_CUSTOM);
320bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.LABEL, "Directory");
321bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NUMBER, "1-800-4664-411");
322bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
323bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
324bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(Phones.CONTENT_URI, Phones.TYPE, Phones.TYPE_WORK);
325bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
326bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(Phones.CONTENT_URI, Phones.PERSON_ID, personId, Phones.TYPE,
327bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                Phones.TYPE_CUSTOM, Phones.TYPE_OTHER, Phones.LABEL);
328bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
329bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
330f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
331f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testContactMethodsInsert() {
332bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
333bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
334bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
335bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
336bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
337bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
338bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
339bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_POSTAL);
340bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_CUSTOM);
341bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.LABEL, "Some other way");
342bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "Foo");
343bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, "Bar");
344bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.ISPRIMARY, 1);
345bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
346bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(ContactMethods.CONTENT_URI, values);
347bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
348bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // The result is joined with People
349bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
350bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
351bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
352bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the email through People
353bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.ContactMethods.CONTENT_DIRECTORY);
354bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
355bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
356bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertPersonIdConstraint(ContactMethods.CONTENT_URI, ContactMethods.TYPE,
357bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.TYPE_WORK);
358bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
359bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertTypeAndLabelConstraints(ContactMethods.CONTENT_URI, ContactMethods.PERSON_ID,
360bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                personId, ContactMethods.TYPE, ContactMethods.TYPE_CUSTOM,
361bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.TYPE_OTHER, ContactMethods.LABEL);
362bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
363bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
364f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
365f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testExtensionsInsert() {
366bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
367bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Uri personUri = mResolver.insert(People.CONTENT_URI, values);
368bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
369bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
370bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
371bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.PERSON_ID, personId);
372bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.NAME, "Foo");
373bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Extensions.VALUE, "Bar");
374bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
375bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri uri = mResolver.insert(Extensions.CONTENT_URI, values);
376bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(uri, values);
377bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
378bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Access the extensions through People
379bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri twigUri = Uri.withAppendedPath(personUri, People.Extensions.CONTENT_DIRECTORY);
380bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(twigUri, values);
381bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
382bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
383f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
384f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testGroupsInsert() {
385bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
386bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
387bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
388bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
389bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
390bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(groupUri, values);
391bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
392bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
393f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
394f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testGroupMembershipsInsert() {
395bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
396bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
397bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NOTES, "Abel");
398bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
399bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
400bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
401bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Klein");
402bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
403bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
404bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long groupId = ContentUris.parseId(groupUri);
405bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
406bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
407bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values1 = new ContentValues();
408bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values1.put(GroupMembership.GROUP_ID, groupId);
409bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values1.put(GroupMembership.PERSON_ID, personId);
410bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri membershipUri = mResolver.insert(GroupMembership.CONTENT_URI, values1);
411bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(membershipUri, values1);
412bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
413bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personsGroupsUri = Uri.withAppendedPath(personUri, GroupMembership.CONTENT_DIRECTORY);
414bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personsGroupsUri, values1);
415bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
416bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
417f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
418f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testAddToGroup() {
419bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
420bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
421bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
422bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
423bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
424bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Groups.NAME, "Galois");
425bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri groupUri = mResolver.insert(Groups.CONTENT_URI, values);
426bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
427bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        People.addToGroup(mResolver, personId, "Galois");
428bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
429bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
430bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(GroupMembership.GROUP_ID, ContentUris.parseId(groupUri));
431bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(GroupMembership.PERSON_ID, personId);
432bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
433bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personsGroupsUri = Uri.withAppendedPath(personUri, GroupMembership.CONTENT_DIRECTORY);
434bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personsGroupsUri, values);
435bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
436bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
437f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
438f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPresenceInsertMatchOnHandle() {
439bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
440bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
441bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
442bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
443bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
444bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        String encodedProtocol =
445bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                ContactMethods.encodePredefinedImProtocol(ContactMethods.PROTOCOL_GOOGLE_TALK);
446bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
447bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
448bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
449bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_IM);
450bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
451bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "Android");
452bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.AUX_DATA, encodedProtocol);
453bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(ContactMethods.CONTENT_URI, values);
454bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
455bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
456bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_PROTOCOL, encodedProtocol);
457bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_HANDLE, "Android");
458bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_ACCOUNT, "foo");
459bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
460bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri presenceUri = mResolver.insert(Presence.CONTENT_URI, values);
461bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
462bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.PERSON_ID, personId);
463bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
464bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Presence is joined with People
465bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
466bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(presenceUri, values);
467bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
468bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
469f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
470f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPresenceInsertMatchOnEmail() {
471bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
472bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
473bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
474bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        long personId = ContentUris.parseId(personUri);
475bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
476bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        String protocol =
477bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            ContactMethods.encodePredefinedImProtocol(ContactMethods.PROTOCOL_GOOGLE_TALK);
478bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
479bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
480bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.PERSON_ID, personId);
481bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.KIND, Contacts.KIND_EMAIL);
482bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.TYPE, ContactMethods.TYPE_HOME);
483bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(ContactMethods.DATA, "Android@android.com");
484bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.insert(ContactMethods.CONTENT_URI, values);
485bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
486bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
487bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_PROTOCOL, protocol);
488bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_HANDLE, "Android@android.com");
489bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.IM_ACCOUNT, "foo");
490bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.PRESENCE_STATUS, Presence.OFFLINE);
491bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.PRESENCE_CUSTOM_STATUS, "Coding for Android");
492bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
493bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri presenceUri = mResolver.insert(Presence.CONTENT_URI, values);
494bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
495bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Presence.PERSON_ID, personId);
496bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(presenceUri, values);
497bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
498bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Now the person should be joined with Presence
499bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
500bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        putContactValues(values);
501bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.IM_PROTOCOL, protocol);
502bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.IM_HANDLE, "Android@android.com");
503bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.IM_ACCOUNT, "foo");
504bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRESENCE_STATUS, Presence.OFFLINE);
505bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PRESENCE_CUSTOM_STATUS, "Coding for Android");
506bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(personUri, values);
507bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
508bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
509f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    // TODO fix and reenable the test
510f4e1358f1c8f5fe5e9e7689e36e04c57c2385169Dmitri Plotnikov    public void __testPhotoUpdate() throws Exception {
511bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        byte[] photo = loadTestPhoto();
512bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
513bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
514bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri personUri = mResolver.insert(People.CONTENT_URI, values);
515bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
516bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
517bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(Photos.DATA, photo);
518bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
519bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri photoUri = Uri.withAppendedPath(personUri, Photos.CONTENT_DIRECTORY);
520bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        mResolver.update(photoUri, values, null, null);
521bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertStoredValues(photoUri, values);
522bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
523bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
524bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void putContactValues(ContentValues values) {
525bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        // Populating only unhidden columns
526bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NAME, "Deer Dough");
527bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.PHONETIC_NAME, "Dear Doe");
528bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.NOTES, "Cash Cow");
529bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.TIMES_CONTACTED, 3);
530bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.LAST_TIME_CONTACTED, 10);
531bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.CUSTOM_RINGTONE, "ringtone");
532bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.SEND_TO_VOICEMAIL, 1);
533bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(People.STARRED, 1);
534bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
535bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
536bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private byte[] loadTestPhoto() throws IOException {
537bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        final Resources resources = getContext().getResources();
538bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        InputStream is =
539bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                resources.openRawResource(com.android.internal.R.drawable.ic_contact_picture);
540bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ByteArrayOutputStream os = new ByteArrayOutputStream();
541bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        byte[] buffer = new byte[1000];
542bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        int count;
543bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        while((count = is.read(buffer)) != -1) {
544bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            os.write(buffer, 0, count);
545bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
546bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        return os.toByteArray();
547bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
548bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
549bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertFilteredContacts(String filter, String... expectedNames) {
550bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Uri filterUri = Uri.withAppendedPath(People.CONTENT_FILTER_URI, filter);
551bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(filterUri, null, null, null, null);
552bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
553bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            assertEquals("Record count", expectedNames.length, c.getCount());
554bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            int column = c.getColumnIndex(People.NAME);
555bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            for (int i = 0; i < expectedNames.length; i++) {
556bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                c.moveToNext();
557bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                assertEquals(expectedNames[i], c.getString(column));
558bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            }
559bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } finally {
560bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            c.close();
561bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
562bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
563bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
564bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertPersonIdConstraint(Uri uri, String typeColumn, int defaultType) {
565bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
566bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(typeColumn, defaultType);
567bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
568bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
569bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            fail("Inserted row without person ID");
570bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
571bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
572bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
573bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
574bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
575bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertTypeAndLabelConstraints(Uri uri, String personIdColumn, long personId,
576bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            String typeColumn, int defaultType, int otherType, String labelColumn) {
577bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        ContentValues values = new ContentValues();
578bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(personIdColumn, personId);
579bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(typeColumn, defaultType);
580bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
581bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
582bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            fail("Inserted row with custom type but without label");
583bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
584bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
585bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
586bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
587bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
588bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(personIdColumn, personId);
589bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
590bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
591bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            fail("Inserted row without either type or label");
592bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
593bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
594bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
595bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
596bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.clear();
597bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(personIdColumn, personId);
598bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(typeColumn, otherType);
599bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        values.put(labelColumn, "Foo");
600bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
601bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            mResolver.insert(uri, values);
6023cebbf7141252768d3e272e049e9c5b0cb9d710eDmitri Plotnikov            fail("Inserted row with both type and label");
603bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } catch (Exception e) {
604bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            // Exception expected
605bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
606bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
607bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
608bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertStoredValues(Uri rowUri, String column, String expectedValue) {
609bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        String value = getStoredValue(rowUri, column);
610bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        assertEquals("Column value " + column, expectedValue, value);
611bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
612bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
613bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private String getStoredValue(Uri rowUri, String column) {
614bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        String value;
615bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(rowUri, new String[] { column }, null, null, null);
616bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
617bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            c.moveToFirst();
618bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            value = c.getString(c.getColumnIndex(column));
619bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } finally {
620bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            c.close();
621bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
622bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        return value;
623bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
624bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
625bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertStoredValues(Uri rowUri, ContentValues expectedValues) {
626bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Cursor c = mResolver.query(rowUri, null, null, null, null);
627bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        try {
628bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            assertEquals("Record count", 1, c.getCount());
629bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            c.moveToFirst();
630bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            assertCursorValues(c, expectedValues);
631bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        } finally {
632bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            c.close();
633bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
634bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
635bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov
636bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    private void assertCursorValues(Cursor cursor, ContentValues expectedValues) {
637bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        Set<Map.Entry<String, Object>> entries = expectedValues.valueSet();
638bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        for (Map.Entry<String, Object> entry : entries) {
639bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            String column = entry.getKey();
640bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            int index = cursor.getColumnIndex(column);
641bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            assertTrue("No such column: " + column, index != -1);
642bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            Object expectedValue = expectedValues.get(column);
643bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            String value;
644bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            if (expectedValue instanceof byte[]) {
645bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                expectedValue = Hex.encodeHex((byte[])expectedValue, false);
646bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                value = Hex.encodeHex(cursor.getBlob(index), false);
647bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            } else {
648bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                expectedValue = expectedValues.getAsString(column);
649bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov                value = cursor.getString(index);
650bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            }
651bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov            assertEquals("Column value " + column, expectedValue, value);
652bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov        }
653bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov    }
654bee1a6b2e7cbea778195890e442c9e50f2a4e6d9Dmitri Plotnikov}
655