100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee/*
200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * Copyright (C) 2011 The Android Open Source Project
300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee *
400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * Licensed under the Apache License, Version 2.0 (the "License");
500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * you may not use this file except in compliance with the License.
600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * You may obtain a copy of the License at
700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee *
800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee *      http://www.apache.org/licenses/LICENSE-2.0
900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee *
1000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * Unless required by applicable law or agreed to in writing, software
1100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * distributed under the License is distributed on an "AS IS" BASIS,
1200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * See the License for the specific language governing permissions and
1400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee * limitations under the License
1500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee */
161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeepackage com.android.providers.contacts;
181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentUris;
201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentValues;
2100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport android.database.Cursor;
221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.net.Uri;
23eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjeeimport android.os.ParcelFileDescriptor;
2400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport android.provider.CallLog.Calls;
25975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjeeimport android.provider.VoicemailContract;
269cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjeeimport android.provider.VoicemailContract.Status;
271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.provider.VoicemailContract.Voicemails;
281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.test.MoreAsserts;
299d84fd3de4464d8d19a8aa419682f75d0089c752Makoto Onukiimport android.test.suitebuilder.annotation.SmallTest;
301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
3138210445730ee04c351c7cc1b3800cfe23e34325Makoto Onukiimport com.android.common.io.MoreCloseables;
3238210445730ee04c351c7cc1b3800cfe23e34325Makoto Onuki
339cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjeeimport java.io.FileNotFoundException;
34eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjeeimport java.io.IOException;
351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.InputStream;
361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.OutputStream;
3700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport java.util.Arrays;
381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.util.List;
391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee/**
411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Unit tests for {@link VoicemailContentProvider}.
421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee *
431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Run the test like this:
441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * <code>
451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * runtest -c com.android.providers.contacts.VoicemailProviderTest contactsprov
461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * </code>
471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee */
4800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee// TODO: Test that calltype and voicemail_uri are auto populated by the provider.
499d84fd3de4464d8d19a8aa419682f75d0089c752Makoto Onuki@SmallTest
50c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeepublic class VoicemailProviderTest extends BaseVoicemailProviderTest {
5100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    /** Fields specific to call_log provider that should not be exposed by voicemail provider. */
5200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    private static final String[] CALLLOG_PROVIDER_SPECIFIC_COLUMNS = {
5300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.CACHED_NAME,
5400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.CACHED_NUMBER_LABEL,
5500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.CACHED_NUMBER_TYPE,
5600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.TYPE,
5700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.VOICEMAIL_URI,
5800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.COUNTRY_ISO
5900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    };
6000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    /** Total number of columns exposed by voicemail provider. */
610b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee    private static final int NUM_VOICEMAIL_FIELDS = 13;
6200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee
631975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    @Override
641975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    protected void setUp() throws Exception {
651975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        super.setUp();
661975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForOwnPermission();
671975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
681975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
699cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    /** Returns the appropriate /voicemail URI. */
709cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private Uri voicemailUri() {
71e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee        return mUseSourceUri ?
72e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee                Voicemails.buildSourceUri(mActor.packageName) : Voicemails.CONTENT_URI;
731975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
741975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
759cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    /** Returns the appropriate /status URI. */
769cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private Uri statusUri() {
779cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return mUseSourceUri ?
789cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                Status.buildSourceUri(mActor.packageName) : Status.CONTENT_URI;
799cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
809cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
811975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testInsert() throws Exception {
82aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        Uri uri = mResolver.insert(voicemailUri(), getTestVoicemailValues());
83aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        // We create on purpose a new set of ContentValues here, because the code above modifies
84aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        // the copy it gets.
85aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        assertStoredValues(uri, getTestVoicemailValues());
86aeaba441ddb05dede8bd86291ca78f42d670d54cFlavio Lerda        assertSelection(uri, getTestVoicemailValues(), Voicemails._ID, ContentUris.parseId(uri));
871975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(1, countFilesInTestDirectory());
881975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
891975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
901975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    // Test to ensure that media content can be written and read back.
911975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testFileContent() throws Exception {
921975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        Uri uri = insertVoicemail();
931975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        OutputStream out = mResolver.openOutputStream(uri);
941975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        byte[] outBuffer = {0x1, 0x2, 0x3, 0x4};
951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        out.write(outBuffer);
961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        out.flush();
971975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        out.close();
981975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        InputStream in = mResolver.openInputStream(uri);
991975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        byte[] inBuffer = new byte[4];
1001975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        int numBytesRead = in.read(inBuffer);
1011975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(numBytesRead, outBuffer.length);
1021975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        MoreAsserts.assertEquals(outBuffer, inBuffer);
1031975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // No more data should be left.
1041975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(-1, in.read(inBuffer));
1051975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        in.close();
1061975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
1071975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1081975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testUpdate() {
1091975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        Uri uri = insertVoicemail();
1101975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        ContentValues values = new ContentValues();
1111975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.NUMBER, "1-800-263-7643");
1121975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.DATE, 2000);
1131975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.DURATION, 40);
1141975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.STATE, 2);
1151975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.HAS_CONTENT, 1);
1161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.SOURCE_DATA, "foo");
1171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        int count = mResolver.update(uri, values, null, null);
1181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(1, count);
1191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertStoredValues(uri, values);
1201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
1211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testDelete() {
1231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        Uri uri = insertVoicemail();
1249cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        int count = mResolver.delete(voicemailUri(), Voicemails._ID + "="
1251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee                + ContentUris.parseId(uri), null);
1261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(1, count);
1271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(0, getCount(uri, null, null));
1281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
1291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
130c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    public void testGetType_ItemUri() throws Exception {
131c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        // Random item uri.
132c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        assertEquals(Voicemails.ITEM_TYPE,
133c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                mResolver.getType(ContentUris.withAppendedId(Voicemails.CONTENT_URI, 100)));
134c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        // Item uri of an inserted voicemail.
1359cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestVoicemailValues();
1364b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        values.put(Voicemails.MIME_TYPE, "foo/bar");
137d558ccc921460ac382850a8e6e2e668f3a2b9b26Debashish Chatterjee        Uri uri = mResolver.insert(voicemailUri(), values);
138d558ccc921460ac382850a8e6e2e668f3a2b9b26Debashish Chatterjee        assertEquals(Voicemails.ITEM_TYPE, mResolver.getType(uri));
139c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
1404b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
141c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    public void testGetType_DirUri() throws Exception {
1424b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        assertEquals(Voicemails.DIR_TYPE, mResolver.getType(Voicemails.CONTENT_URI));
1434b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        assertEquals(Voicemails.DIR_TYPE, mResolver.getType(Voicemails.buildSourceUri("foo")));
1444b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    }
1454b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1464b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    // Test to ensure that without full permission it is not possible to use the base uri (i.e. with
1474b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    // no package URI specified).
1484b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    public void testMustUsePackageUriWithoutFullPermission() {
1494b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        setUpForOwnPermission();
1504b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1514b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            @Override
1524b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            public void run() {
1539cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.insert(Voicemails.CONTENT_URI, getTestVoicemailValues());
1544b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            }
1554b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        });
1564b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1574b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1584b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            @Override
1594b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            public void run() {
1609cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.update(Voicemails.CONTENT_URI, getTestVoicemailValues(), null, null);
1614b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            }
1624b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        });
1634b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1644b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1654b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            @Override
1664b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            public void run() {
1674b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee                mResolver.query(Voicemails.CONTENT_URI, null, null, null, null);
1684b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            }
1694b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        });
1704b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1714b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1724b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            @Override
1734b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            public void run() {
1744b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee                mResolver.delete(Voicemails.CONTENT_URI, null, null);
1754b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            }
1764b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        });
1774b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    }
1784b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1791975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testPermissions_InsertAndQuery() {
1801975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForFullPermission();
1811975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Insert two records - one each with own and another package.
1821975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        insertVoicemail();
1831975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        insertVoicemailForSourcePackage("another-package");
1849cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(2, getCount(voicemailUri(), null, null));
1851975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1861975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Now give away full permission and check that only 1 message is accessible.
1871975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForOwnPermission();
1889cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, getCount(voicemailUri(), null, null));
1891975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1901975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Once again try to insert message for another package. This time
1911975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // it should fail.
1921975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1931975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
1941975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
1951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee                insertVoicemailForSourcePackage("another-package");
1961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
1971975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
1981975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
1991975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
2001975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testPermissions_UpdateAndDelete() {
2011975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForFullPermission();
2021975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Insert two records - one each with own and another package.
2031975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        final Uri ownVoicemail = insertVoicemail();
2041975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        final Uri anotherVoicemail = insertVoicemailForSourcePackage("another-package");
2059cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(2, getCount(voicemailUri(), null, null));
2061975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
2071975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Now give away full permission and check that we can update and delete only
2081975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // the own voicemail.
2091975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForOwnPermission();
210e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee        mResolver.update(withSourcePackageParam(ownVoicemail),
2119cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                getTestVoicemailValues(), null, null);
212e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee        mResolver.delete(withSourcePackageParam(ownVoicemail), null, null);
2131975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
2141975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // However, attempting to update or delete another-package's voicemail should fail.
2151975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
2161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
2171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
2181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee                mResolver.update(anotherVoicemail, null, null, null);
2191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
2201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
2211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
2221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
2231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
2241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee                mResolver.delete(anotherVoicemail, null, null);
2251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
2261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
2271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
2281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
229e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee    private Uri withSourcePackageParam(Uri uri) {
230e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee        return uri.buildUpon()
231e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee            .appendQueryParameter(VoicemailContract.PARAM_KEY_SOURCE_PACKAGE, mActor.packageName)
232e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee            .build();
233e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee    }
234e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee
235eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    public void testUriPermissions() {
236eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        setUpForFullPermission();
237eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        final Uri uri1 = insertVoicemail();
238eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        final Uri uri2 = insertVoicemail();
239eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        // Give away all permissions before querying. Access to both uris should be denied.
240eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        setUpForNoPermission();
241eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoAccessToUri(uri1);
242eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoAccessToUri(uri2);
243eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
244eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        // Just grant permission to uri1. uri1 should pass but uri2 should still fail.
245eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        mActor.addUriPermissions(uri1);
246eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasReadOnlyAccessToUri(uri1);
247eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoAccessToUri(uri2);
248eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
249eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        // Cleanup.
250eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        mActor.removeUriPermissions(uri1);
251eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
252eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
253eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasNoAccessToUri(final Uri uri) {
254eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoReadAccessToUri(uri);
255eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoWriteAccessToUri(uri);
256eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
257eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
258eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasReadOnlyAccessToUri(final Uri uri) {
259eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasReadAccessToUri(uri);
260eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoWriteAccessToUri(uri);
261eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
262eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
263eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasReadAccessToUri(final Uri uri) {
264eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        Cursor cursor = null;
265eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        try {
266eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            cursor = mResolver.query(uri, null, null ,null, null);
267eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            assertEquals(1, cursor.getCount());
268eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            try {
269eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                ParcelFileDescriptor fd = mResolver.openFileDescriptor(uri, "r");
270eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                assertNotNull(fd);
271eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                fd.close();
272eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            } catch (FileNotFoundException e) {
273eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                fail(e.getMessage());
274eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            } catch (IOException e) {
275eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                fail(e.getMessage());
276eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
277eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        } finally {
278eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            MoreCloseables.closeQuietly(cursor);
279eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        }
280eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
281eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
282eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasNoReadAccessToUri(final Uri uri) {
283eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
284eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
285eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
286eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                mResolver.query(uri, null, null ,null, null);
287eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
288eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
289eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
290eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
291eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
292eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                try {
293eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    mResolver.openFileDescriptor(uri, "r");
294eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                } catch (FileNotFoundException e) {
295eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    fail(e.getMessage());
296eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                }
297eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
298eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
299eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
300eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
301eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasNoWriteAccessToUri(final Uri uri) {
302eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
303eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
304eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
305eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                mResolver.update(uri, getTestVoicemailValues(), null, null);
306eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
307eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
308eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
309eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
310eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
311eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                mResolver.delete(uri, null, null);
312eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
313eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
314eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
315eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
316eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
317eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                try {
318eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    mResolver.openFileDescriptor(uri, "w");
319eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                } catch (FileNotFoundException e) {
320eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    fail(e.getMessage());
321eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                }
322eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
323eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
324eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
325eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
326eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
327eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                try {
328eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    mResolver.openFileDescriptor(uri, "rw");
329eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                } catch (FileNotFoundException e) {
330eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    fail(e.getMessage());
331eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                }
332eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
333eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
334eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
335eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
3361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    // Test to ensure that all operations fail when no voicemail permission is granted.
3371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testNoPermissions() {
3381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForNoPermission();
3391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
3401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
3411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
3429cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.insert(voicemailUri(), getTestVoicemailValues());
3431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
3441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
3451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
3461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
3471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
3489cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.update(voicemailUri(), getTestVoicemailValues(), null, null);
3491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
3501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
3511975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
3521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
3531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
3549cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.query(voicemailUri(), null, null, null, null);
3551975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
3561975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
3571975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
3581975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
3591975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
3609cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.delete(voicemailUri(), null, null);
3611975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
3621975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
3631975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
3641975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
36500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // Test to check that none of the call_log provider specific fields are
36600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // insertable through voicemail provider.
36700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    public void testCannotAccessCallLogSpecificFields_Insert() {
36800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) {
3699cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            final ContentValues values = getTestVoicemailValues();
37000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            values.put(callLogColumn, "foo");
37100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            EvenMoreAsserts.assertThrows("Column: " + callLogColumn,
37200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    IllegalArgumentException.class, new Runnable() {
37300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    @Override
37400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    public void run() {
3759cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                        mResolver.insert(voicemailUri(), values);
37600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    }
37700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                });
37800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        }
37900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    }
38000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee
38100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // Test to check that none of the call_log provider specific fields are
38200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // exposed through voicemail provider query.
38300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    public void testCannotAccessCallLogSpecificFields_Query() {
38400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        // Query.
3859cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Cursor cursor = mResolver.query(voicemailUri(), null, null, null, null);
38600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        List<String> columnNames = Arrays.asList(cursor.getColumnNames());
38700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        assertEquals(NUM_VOICEMAIL_FIELDS, columnNames.size());
38800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        // None of the call_log provider specific columns should be present.
38900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) {
39000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            assertFalse("Unexpected column: '" + callLogColumn + "' returned.",
39100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    columnNames.contains(callLogColumn));
39200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        }
39300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    }
39400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee
39500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // Test to check that none of the call_log provider specific fields are
39600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // updatable through voicemail provider.
39700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    public void testCannotAccessCallLogSpecificFields_Update() {
39800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) {
39900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            final Uri insertedUri = insertVoicemail();
4009cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            final ContentValues values = getTestVoicemailValues();
40100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            values.put(callLogColumn, "foo");
40200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            EvenMoreAsserts.assertThrows("Column: " + callLogColumn,
40300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    IllegalArgumentException.class, new Runnable() {
40400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    @Override
40500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    public void run() {
40600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                        mResolver.update(insertedUri, values, null, null);
40700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    }
40800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                });
40900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        }
41000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    }
41100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee
4129cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    // Tests for voicemail status table.
4139cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4149cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusInsert() throws Exception {
4159cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestStatusValues();
4169cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = mResolver.insert(statusUri(), values);
4179cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertStoredValues(uri, values);
4189cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertSelection(uri, values, Status._ID, ContentUris.parseId(uri));
4199cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4209cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4219cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    // Test to ensure that duplicate entries for the same package still end up as the same record.
4229cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusInsertDuplicate() throws Exception {
4239cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        setUpForFullPermission();
4249cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestStatusValues();
4259cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertNotNull(mResolver.insert(statusUri(), values));
4269cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, getCount(statusUri(), null, null));
4279cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4289cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Insertion request for the same package should fail with no change in count.
4299cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_NO_CONNECTION);
4309cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertNull(mResolver.insert(statusUri(), values));
4319cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, getCount(statusUri(), null, null));
4329cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4339cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Now insert entry for another source package, and it should end up as a separate record.
4349cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, "another.package");
4359cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertNotNull(mResolver.insert(statusUri(), values));
4369cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(2, getCount(statusUri(), null, null));
4379cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4389cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4399cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusUpdate() throws Exception {
4409cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = insertTestStatusEntry();
4419cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestStatusValues();
4429cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_NO_CONNECTION);
4439cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.NOTIFICATION_CHANNEL_STATE,
4449cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING);
4459cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        int count = mResolver.update(uri, values, null, null);
4469cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, count);
4479cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertStoredValues(uri, values);
4489cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4499cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4509cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusDelete() {
4519cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = insertTestStatusEntry();
4529cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        int count = mResolver.delete(statusUri(), Status._ID + "="
4539cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                + ContentUris.parseId(uri), null);
4549cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, count);
4559cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(0, getCount(uri, null, null));
4569cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4579cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4589cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusGetType() throws Exception {
4599cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Item URI.
4609cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = insertTestStatusEntry();
4619cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(Status.ITEM_TYPE, mResolver.getType(uri));
4629cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4639cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // base URIs.
4649cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(Status.DIR_TYPE, mResolver.getType(Status.CONTENT_URI));
4659cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(Status.DIR_TYPE, mResolver.getType(Status.buildSourceUri("foo")));
4669cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4679cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4689cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    // Basic permission checks for the status table.
4699cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusPermissions() throws Exception {
4709cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        final ContentValues values = getTestStatusValues();
4719cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Inserting for another package should fail with any of the URIs.
4729cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, "another.package");
4739cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
4749cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
4759cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
4769cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.insert(Status.CONTENT_URI, values);
4779cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
4789cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
4799cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
4809cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
4819cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
4829cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.insert(Status.buildSourceUri(mActor.packageName), values);
4839cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
4849cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
4859cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4869cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // But insertion with own package should succeed with the right uri.
4879cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, mActor.packageName);
4889cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        final Uri uri = mResolver.insert(Status.buildSourceUri(mActor.packageName), values);
4899cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertNotNull(uri);
4909cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4919cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Updating source_package should not work as well.
4929cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, "another.package");
4939cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
4949cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
4959cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
4969cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.update(uri, values, null, null);
4979cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
4989cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
4999cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
5009cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
5019cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    // File operation is not supported by /status URI.
5029cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusFileOperation() throws Exception {
5039cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        final Uri uri = insertTestStatusEntry();
5049cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(UnsupportedOperationException.class, new Runnable() {
5059cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
5069cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
5079cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                try {
5089cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                    mResolver.openOutputStream(uri);
5099cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                } catch (FileNotFoundException e) {
5109cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                    fail("Unexpected exception " + e);
5119cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                }
5129cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
5139cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
5149cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
5159cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(UnsupportedOperationException.class, new Runnable() {
5169cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
5179cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
5189cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                try {
5199cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                    mResolver.openInputStream(uri);
5209cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                } catch (FileNotFoundException e) {
5219cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                    fail("Unexpected exception " + e);
5229cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                }
5239cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
5249cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
5259cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
5269cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
5271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    /**
5281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee     * Inserts a voicemail record with no source package set. The content provider
5291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee     * will detect source package.
5301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee     */
5311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    private Uri insertVoicemail() {
5329cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return mResolver.insert(voicemailUri(), getTestVoicemailValues());
5331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
5341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
5351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    /** Inserts a voicemail record for the specified source package. */
5361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    private Uri insertVoicemailForSourcePackage(String sourcePackage) {
5379cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestVoicemailValues();
5381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.SOURCE_PACKAGE, sourcePackage);
5399cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return mResolver.insert(voicemailUri(), values);
5401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
5411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
5429cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private ContentValues getTestVoicemailValues() {
5431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        ContentValues values = new ContentValues();
5441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.NUMBER, "1-800-4664-411");
5451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.DATE, 1000);
5461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.DURATION, 30);
547b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda        values.put(Voicemails.IS_READ, 0);
5481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.HAS_CONTENT, 0);
5491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.SOURCE_DATA, "1234");
5501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.STATE, Voicemails.STATE_INBOX);
5511975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        return values;
5521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
5531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
5549cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private Uri insertTestStatusEntry() {
5559cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return mResolver.insert(statusUri(), getTestStatusValues());
5569cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
5579cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
5589cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private ContentValues getTestStatusValues() {
5599cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = new ContentValues();
5609cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, mActor.packageName);
5619cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.VOICEMAIL_ACCESS_URI, "tel:901");
5629cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SETTINGS_URI, "com.example.voicemail.source.SettingsActivity");
5639cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK);
5649cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_OK);
5659cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.NOTIFICATION_CHANNEL_STATE, Status.NOTIFICATION_CHANNEL_STATE_OK);
5669cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return values;
5679cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
5681975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee}
569