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