VoicemailProviderTest.java revision eeffa7edb048e785ebc665c830dc84d87f174b07
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
19eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjeeimport com.android.common.io.MoreCloseables;
20eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentUris;
221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentValues;
2300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport android.database.Cursor;
241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.net.Uri;
25eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjeeimport android.os.ParcelFileDescriptor;
2600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport android.provider.CallLog.Calls;
27975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjeeimport android.provider.VoicemailContract;
289cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjeeimport android.provider.VoicemailContract.Status;
291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.provider.VoicemailContract.Voicemails;
301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.test.MoreAsserts;
311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
329cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjeeimport java.io.FileNotFoundException;
33eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjeeimport java.io.IOException;
341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.InputStream;
351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.OutputStream;
3600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport java.util.Arrays;
371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.util.List;
381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee/**
401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Unit tests for {@link VoicemailContentProvider}.
411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee *
421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Run the test like this:
431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * <code>
441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * runtest -c com.android.providers.contacts.VoicemailProviderTest contactsprov
451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * </code>
461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee */
4700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee// TODO: Test that calltype and voicemail_uri are auto populated by the provider.
48c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjeepublic class VoicemailProviderTest extends BaseVoicemailProviderTest {
4900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    /** Fields specific to call_log provider that should not be exposed by voicemail provider. */
5000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    private static final String[] CALLLOG_PROVIDER_SPECIFIC_COLUMNS = {
5100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.CACHED_NAME,
5200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.CACHED_NUMBER_LABEL,
5300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.CACHED_NUMBER_TYPE,
5400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.TYPE,
5500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.VOICEMAIL_URI,
5600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            Calls.COUNTRY_ISO
5700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    };
5800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    /** Total number of columns exposed by voicemail provider. */
590b442c4154c77f39aeb84216f433e5bd11cbf79eDebashish Chatterjee    private static final int NUM_VOICEMAIL_FIELDS = 13;
6000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee
611975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    @Override
621975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    protected void setUp() throws Exception {
631975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        super.setUp();
641975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForOwnPermission();
651975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
661975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
679cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    /** Returns the appropriate /voicemail URI. */
689cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private Uri voicemailUri() {
69e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee        return mUseSourceUri ?
70e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee                Voicemails.buildSourceUri(mActor.packageName) : Voicemails.CONTENT_URI;
711975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
721975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
739cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    /** Returns the appropriate /status URI. */
749cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private Uri statusUri() {
759cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return mUseSourceUri ?
769cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                Status.buildSourceUri(mActor.packageName) : Status.CONTENT_URI;
779cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
789cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
791975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testInsert() throws Exception {
809cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestVoicemailValues();
819cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = mResolver.insert(voicemailUri(), values);
821975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertStoredValues(uri, values);
831975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertSelection(uri, values, Voicemails._ID, ContentUris.parseId(uri));
841975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(1, countFilesInTestDirectory());
851975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
861975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
871975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    // Test to ensure that media content can be written and read back.
881975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testFileContent() throws Exception {
891975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        Uri uri = insertVoicemail();
901975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        OutputStream out = mResolver.openOutputStream(uri);
911975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        byte[] outBuffer = {0x1, 0x2, 0x3, 0x4};
921975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        out.write(outBuffer);
931975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        out.flush();
941975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        out.close();
951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        InputStream in = mResolver.openInputStream(uri);
961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        byte[] inBuffer = new byte[4];
971975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        int numBytesRead = in.read(inBuffer);
981975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(numBytesRead, outBuffer.length);
991975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        MoreAsserts.assertEquals(outBuffer, inBuffer);
1001975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // No more data should be left.
1011975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(-1, in.read(inBuffer));
1021975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        in.close();
1031975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
1041975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1051975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testUpdate() {
1061975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        Uri uri = insertVoicemail();
1071975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        ContentValues values = new ContentValues();
1081975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.NUMBER, "1-800-263-7643");
1091975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.DATE, 2000);
1101975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.DURATION, 40);
1111975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.STATE, 2);
1121975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.HAS_CONTENT, 1);
1131975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.SOURCE_DATA, "foo");
1141975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        int count = mResolver.update(uri, values, null, null);
1151975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(1, count);
1161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertStoredValues(uri, values);
1171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
1181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testDelete() {
1201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        Uri uri = insertVoicemail();
1219cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        int count = mResolver.delete(voicemailUri(), Voicemails._ID + "="
1221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee                + ContentUris.parseId(uri), null);
1231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(1, count);
1241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        assertEquals(0, getCount(uri, null, null));
1251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
1261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
127c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    public void testGetType_ItemUri() throws Exception {
128c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        // Random item uri.
129c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        assertEquals(Voicemails.ITEM_TYPE,
130c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee                mResolver.getType(ContentUris.withAppendedId(Voicemails.CONTENT_URI, 100)));
131c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee        // Item uri of an inserted voicemail.
1329cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestVoicemailValues();
1334b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        values.put(Voicemails.MIME_TYPE, "foo/bar");
134d558ccc921460ac382850a8e6e2e668f3a2b9b26Debashish Chatterjee        Uri uri = mResolver.insert(voicemailUri(), values);
135d558ccc921460ac382850a8e6e2e668f3a2b9b26Debashish Chatterjee        assertEquals(Voicemails.ITEM_TYPE, mResolver.getType(uri));
136c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    }
1374b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
138c6eb4fe44502116f834fadcc54214b3fa93ff564Debashish Chatterjee    public void testGetType_DirUri() throws Exception {
1394b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        assertEquals(Voicemails.DIR_TYPE, mResolver.getType(Voicemails.CONTENT_URI));
1404b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        assertEquals(Voicemails.DIR_TYPE, mResolver.getType(Voicemails.buildSourceUri("foo")));
1414b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    }
1424b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1434b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    // Test to ensure that without full permission it is not possible to use the base uri (i.e. with
1444b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    // no package URI specified).
1454b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    public void testMustUsePackageUriWithoutFullPermission() {
1464b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        setUpForOwnPermission();
1474b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1484b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            @Override
1494b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            public void run() {
1509cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.insert(Voicemails.CONTENT_URI, getTestVoicemailValues());
1514b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            }
1524b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        });
1534b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1544b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1554b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            @Override
1564b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            public void run() {
1579cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.update(Voicemails.CONTENT_URI, getTestVoicemailValues(), null, null);
1584b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            }
1594b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        });
1604b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1614b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1624b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            @Override
1634b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            public void run() {
1644b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee                mResolver.query(Voicemails.CONTENT_URI, null, null, null, null);
1654b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            }
1664b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        });
1674b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1684b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1694b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            @Override
1704b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            public void run() {
1714b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee                mResolver.delete(Voicemails.CONTENT_URI, null, null);
1724b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee            }
1734b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee        });
1744b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee    }
1754b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee
1761975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testPermissions_InsertAndQuery() {
1771975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForFullPermission();
1781975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Insert two records - one each with own and another package.
1791975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        insertVoicemail();
1801975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        insertVoicemailForSourcePackage("another-package");
1819cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(2, getCount(voicemailUri(), null, null));
1821975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1831975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Now give away full permission and check that only 1 message is accessible.
1841975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForOwnPermission();
1859cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, getCount(voicemailUri(), null, null));
1861975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1871975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Once again try to insert message for another package. This time
1881975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // it should fail.
1891975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
1901975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
1911975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
1921975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee                insertVoicemailForSourcePackage("another-package");
1931975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
1941975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
1951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
1961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
1971975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testPermissions_UpdateAndDelete() {
1981975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForFullPermission();
1991975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Insert two records - one each with own and another package.
2001975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        final Uri ownVoicemail = insertVoicemail();
2011975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        final Uri anotherVoicemail = insertVoicemailForSourcePackage("another-package");
2029cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(2, getCount(voicemailUri(), null, null));
2031975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
2041975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // Now give away full permission and check that we can update and delete only
2051975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // the own voicemail.
2061975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForOwnPermission();
207e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee        mResolver.update(withSourcePackageParam(ownVoicemail),
2089cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                getTestVoicemailValues(), null, null);
209e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee        mResolver.delete(withSourcePackageParam(ownVoicemail), null, null);
2101975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
2111975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        // However, attempting to update or delete another-package's voicemail should fail.
2121975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
2131975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
2141975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
2151975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee                mResolver.update(anotherVoicemail, null, null, null);
2161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
2171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
2181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
2191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
2201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
2211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee                mResolver.delete(anotherVoicemail, null, null);
2221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
2231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
2241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
2251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
226e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee    private Uri withSourcePackageParam(Uri uri) {
227e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee        return uri.buildUpon()
228e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee            .appendQueryParameter(VoicemailContract.PARAM_KEY_SOURCE_PACKAGE, mActor.packageName)
229e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee            .build();
230e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee    }
231e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee
232eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    public void testUriPermissions() {
233eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        setUpForFullPermission();
234eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        final Uri uri1 = insertVoicemail();
235eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        final Uri uri2 = insertVoicemail();
236eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        // Give away all permissions before querying. Access to both uris should be denied.
237eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        setUpForNoPermission();
238eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoAccessToUri(uri1);
239eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoAccessToUri(uri2);
240eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
241eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        // Just grant permission to uri1. uri1 should pass but uri2 should still fail.
242eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        mActor.addUriPermissions(uri1);
243eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasReadOnlyAccessToUri(uri1);
244eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoAccessToUri(uri2);
245eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
246eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        // Cleanup.
247eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        mActor.removeUriPermissions(uri1);
248eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
249eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
250eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasNoAccessToUri(final Uri uri) {
251eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoReadAccessToUri(uri);
252eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoWriteAccessToUri(uri);
253eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
254eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
255eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasReadOnlyAccessToUri(final Uri uri) {
256eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasReadAccessToUri(uri);
257eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        checkHasNoWriteAccessToUri(uri);
258eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
259eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
260eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasReadAccessToUri(final Uri uri) {
261eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        Cursor cursor = null;
262eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        try {
263eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            cursor = mResolver.query(uri, null, null ,null, null);
264eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            assertEquals(1, cursor.getCount());
265eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            try {
266eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                ParcelFileDescriptor fd = mResolver.openFileDescriptor(uri, "r");
267eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                assertNotNull(fd);
268eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                fd.close();
269eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            } catch (FileNotFoundException e) {
270eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                fail(e.getMessage());
271eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            } catch (IOException e) {
272eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                fail(e.getMessage());
273eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
274eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        } finally {
275eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            MoreCloseables.closeQuietly(cursor);
276eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        }
277eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
278eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
279eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasNoReadAccessToUri(final Uri uri) {
280eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
281eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
282eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
283eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                mResolver.query(uri, null, null ,null, null);
284eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
285eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
286eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
287eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
288eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
289eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                try {
290eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    mResolver.openFileDescriptor(uri, "r");
291eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                } catch (FileNotFoundException e) {
292eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    fail(e.getMessage());
293eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                }
294eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
295eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
296eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
297eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
298eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    private void checkHasNoWriteAccessToUri(final Uri uri) {
299eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
300eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
301eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
302eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                mResolver.update(uri, getTestVoicemailValues(), null, null);
303eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
304eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
305eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
306eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
307eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
308eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                mResolver.delete(uri, null, null);
309eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
310eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
311eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
312eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
313eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
314eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                try {
315eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    mResolver.openFileDescriptor(uri, "w");
316eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                } catch (FileNotFoundException e) {
317eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    fail(e.getMessage());
318eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                }
319eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
320eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
321eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
322eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            @Override
323eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            public void run() {
324eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                try {
325eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    mResolver.openFileDescriptor(uri, "rw");
326eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                } catch (FileNotFoundException e) {
327eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                    fail(e.getMessage());
328eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee                }
329eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee            }
330eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee        });
331eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee    }
332eeffa7edb048e785ebc665c830dc84d87f174b07Debashish Chatterjee
3331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    // Test to ensure that all operations fail when no voicemail permission is granted.
3341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    public void testNoPermissions() {
3351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        setUpForNoPermission();
3361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
3371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
3381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
3399cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.insert(voicemailUri(), getTestVoicemailValues());
3401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
3411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
3421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
3431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
3441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
3459cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.update(voicemailUri(), getTestVoicemailValues(), null, null);
3461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
3471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
3481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
3491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
3501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
3519cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.query(voicemailUri(), null, null, null, null);
3521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
3531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
3541975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
3551975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            @Override
3561975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            public void run() {
3579cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.delete(voicemailUri(), null, null);
3581975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee            }
3591975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        });
3601975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
3611975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
36200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // Test to check that none of the call_log provider specific fields are
36300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // insertable through voicemail provider.
36400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    public void testCannotAccessCallLogSpecificFields_Insert() {
36500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) {
3669cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            final ContentValues values = getTestVoicemailValues();
36700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            values.put(callLogColumn, "foo");
36800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            EvenMoreAsserts.assertThrows("Column: " + callLogColumn,
36900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    IllegalArgumentException.class, new Runnable() {
37000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    @Override
37100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    public void run() {
3729cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                        mResolver.insert(voicemailUri(), values);
37300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    }
37400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                });
37500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        }
37600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    }
37700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee
37800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // Test to check that none of the call_log provider specific fields are
37900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // exposed through voicemail provider query.
38000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    public void testCannotAccessCallLogSpecificFields_Query() {
38100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        // Query.
3829cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Cursor cursor = mResolver.query(voicemailUri(), null, null, null, null);
38300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        List<String> columnNames = Arrays.asList(cursor.getColumnNames());
38400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        assertEquals(NUM_VOICEMAIL_FIELDS, columnNames.size());
38500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        // None of the call_log provider specific columns should be present.
38600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) {
38700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            assertFalse("Unexpected column: '" + callLogColumn + "' returned.",
38800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    columnNames.contains(callLogColumn));
38900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        }
39000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    }
39100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee
39200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // Test to check that none of the call_log provider specific fields are
39300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    // updatable through voicemail provider.
39400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    public void testCannotAccessCallLogSpecificFields_Update() {
39500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) {
39600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            final Uri insertedUri = insertVoicemail();
3979cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            final ContentValues values = getTestVoicemailValues();
39800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            values.put(callLogColumn, "foo");
39900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee            EvenMoreAsserts.assertThrows("Column: " + callLogColumn,
40000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    IllegalArgumentException.class, new Runnable() {
40100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    @Override
40200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    public void run() {
40300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                        mResolver.update(insertedUri, values, null, null);
40400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                    }
40500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee                });
40600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee        }
40700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee    }
40800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee
4099cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    // Tests for voicemail status table.
4109cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4119cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusInsert() throws Exception {
4129cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestStatusValues();
4139cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = mResolver.insert(statusUri(), values);
4149cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertStoredValues(uri, values);
4159cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertSelection(uri, values, Status._ID, ContentUris.parseId(uri));
4169cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4179cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4189cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    // Test to ensure that duplicate entries for the same package still end up as the same record.
4199cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusInsertDuplicate() throws Exception {
4209cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        setUpForFullPermission();
4219cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestStatusValues();
4229cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertNotNull(mResolver.insert(statusUri(), values));
4239cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, getCount(statusUri(), null, null));
4249cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4259cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Insertion request for the same package should fail with no change in count.
4269cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_NO_CONNECTION);
4279cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertNull(mResolver.insert(statusUri(), values));
4289cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, getCount(statusUri(), null, null));
4299cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4309cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Now insert entry for another source package, and it should end up as a separate record.
4319cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, "another.package");
4329cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertNotNull(mResolver.insert(statusUri(), values));
4339cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(2, getCount(statusUri(), null, null));
4349cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4359cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4369cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusUpdate() throws Exception {
4379cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = insertTestStatusEntry();
4389cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestStatusValues();
4399cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_NO_CONNECTION);
4409cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.NOTIFICATION_CHANNEL_STATE,
4419cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                Status.NOTIFICATION_CHANNEL_STATE_MESSAGE_WAITING);
4429cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        int count = mResolver.update(uri, values, null, null);
4439cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, count);
4449cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertStoredValues(uri, values);
4459cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4469cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4479cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusDelete() {
4489cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = insertTestStatusEntry();
4499cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        int count = mResolver.delete(statusUri(), Status._ID + "="
4509cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                + ContentUris.parseId(uri), null);
4519cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(1, count);
4529cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(0, getCount(uri, null, null));
4539cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4549cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4559cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusGetType() throws Exception {
4569cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Item URI.
4579cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        Uri uri = insertTestStatusEntry();
4589cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(Status.ITEM_TYPE, mResolver.getType(uri));
4599cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4609cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // base URIs.
4619cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(Status.DIR_TYPE, mResolver.getType(Status.CONTENT_URI));
4629cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertEquals(Status.DIR_TYPE, mResolver.getType(Status.buildSourceUri("foo")));
4639cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4649cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4659cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    // Basic permission checks for the status table.
4669cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusPermissions() throws Exception {
4679cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        final ContentValues values = getTestStatusValues();
4689cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Inserting for another package should fail with any of the URIs.
4699cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, "another.package");
4709cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
4719cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
4729cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
4739cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.insert(Status.CONTENT_URI, values);
4749cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
4759cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
4769cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
4779cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
4789cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
4799cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.insert(Status.buildSourceUri(mActor.packageName), values);
4809cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
4819cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
4829cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4839cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // But insertion with own package should succeed with the right uri.
4849cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, mActor.packageName);
4859cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        final Uri uri = mResolver.insert(Status.buildSourceUri(mActor.packageName), values);
4869cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        assertNotNull(uri);
4879cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4889cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        // Updating source_package should not work as well.
4899cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, "another.package");
4909cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() {
4919cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
4929cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
4939cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                mResolver.update(uri, values, null, null);
4949cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
4959cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
4969cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
4979cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
4989cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    // File operation is not supported by /status URI.
4999cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    public void testStatusFileOperation() throws Exception {
5009cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        final Uri uri = insertTestStatusEntry();
5019cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(UnsupportedOperationException.class, new Runnable() {
5029cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
5039cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
5049cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                try {
5059cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                    mResolver.openOutputStream(uri);
5069cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                } catch (FileNotFoundException e) {
5079cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                    fail("Unexpected exception " + e);
5089cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                }
5099cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
5109cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
5119cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
5129cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        EvenMoreAsserts.assertThrows(UnsupportedOperationException.class, new Runnable() {
5139cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            @Override
5149cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            public void run() {
5159cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                try {
5169cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                    mResolver.openInputStream(uri);
5179cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                } catch (FileNotFoundException e) {
5189cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                    fail("Unexpected exception " + e);
5199cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee                }
5209cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee            }
5219cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        });
5229cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
5239cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
5241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    /**
5251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee     * Inserts a voicemail record with no source package set. The content provider
5261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee     * will detect source package.
5271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee     */
5281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    private Uri insertVoicemail() {
5299cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return mResolver.insert(voicemailUri(), getTestVoicemailValues());
5301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
5311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
5321975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    /** Inserts a voicemail record for the specified source package. */
5331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    private Uri insertVoicemailForSourcePackage(String sourcePackage) {
5349cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = getTestVoicemailValues();
5351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.SOURCE_PACKAGE, sourcePackage);
5369cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return mResolver.insert(voicemailUri(), values);
5371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
5381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
5399cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private ContentValues getTestVoicemailValues() {
5401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        ContentValues values = new ContentValues();
5411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.NUMBER, "1-800-4664-411");
5421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.DATE, 1000);
5431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.DURATION, 30);
544b2197b235e3d96e7f70c24d548b7dac52dab88d8Flavio Lerda        values.put(Voicemails.IS_READ, 0);
5451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.HAS_CONTENT, 0);
5461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.SOURCE_DATA, "1234");
5471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        values.put(Voicemails.STATE, Voicemails.STATE_INBOX);
5481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee        return values;
5491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee    }
5501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee
5519cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private Uri insertTestStatusEntry() {
5529cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return mResolver.insert(statusUri(), getTestStatusValues());
5539cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
5549cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee
5559cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    private ContentValues getTestStatusValues() {
5569cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        ContentValues values = new ContentValues();
5579cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SOURCE_PACKAGE, mActor.packageName);
5589cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.VOICEMAIL_ACCESS_URI, "tel:901");
5599cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.SETTINGS_URI, "com.example.voicemail.source.SettingsActivity");
5609cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.CONFIGURATION_STATE, Status.CONFIGURATION_STATE_OK);
5619cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.DATA_CHANNEL_STATE, Status.DATA_CHANNEL_STATE_OK);
5629cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        values.put(Status.NOTIFICATION_CHANNEL_STATE, Status.NOTIFICATION_CHANNEL_STATE_OK);
5639cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee        return values;
5649cf06e7bcb0be759f1c930412fd2e41eba4f5f03Debashish Chatterjee    }
5651975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee}
566