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