VoicemailProviderTest.java revision 4b571ba0de4fac4ff9d2a4277032b8c6548fdbfa
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 1906f995b614e0ebe59ff75f170e20ca96c9b17f0cDebashish Chatterjeeimport android.content.ComponentName; 201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentProvider; 211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentUris; 221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContentValues; 231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.Context; 241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.ContextWrapper; 251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.content.Intent; 2600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport android.database.Cursor; 271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.net.Uri; 2800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport android.provider.CallLog.Calls; 29975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjeeimport android.provider.VoicemailContract; 301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.provider.VoicemailContract.Voicemails; 311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport android.test.MoreAsserts; 321975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.File; 341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.InputStream; 351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.io.OutputStream; 361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.util.ArrayList; 3700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjeeimport java.util.Arrays; 381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.util.Collections; 391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeeimport java.util.List; 401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee/** 421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Unit tests for {@link VoicemailContentProvider}. 431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * 441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Run the test like this: 451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * <code> 461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * runtest -c com.android.providers.contacts.VoicemailProviderTest contactsprov 471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * </code> 481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee */ 4900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee// TODO: Test that calltype and voicemail_uri are auto populated by the provider. 501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjeepublic class VoicemailProviderTest extends BaseContactsProvider2Test { 511975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private static final String ALL_PERMISSION = 5200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee "com.android.voicemail.permission.READ_WRITE_ALL_VOICEMAIL"; 531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private static final String OWN_PERMISSION = 5400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee "com.android.voicemail.permission.READ_WRITE_OWN_VOICEMAIL"; 5500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee /** Fields specific to call_log provider that should not be exposed by voicemail provider. */ 5600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee private static final String[] CALLLOG_PROVIDER_SPECIFIC_COLUMNS = { 5700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.CACHED_NAME, 5800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.CACHED_NUMBER_LABEL, 5900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.CACHED_NUMBER_TYPE, 6000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.TYPE, 6100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.VOICEMAIL_URI, 6200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Calls.COUNTRY_ISO 6300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee }; 6400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee /** Total number of columns exposed by voicemail provider. */ 6500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee private static final int NUM_VOICEMAIL_FIELDS = 11; 6600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee 671975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 681975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee protected Class<? extends ContentProvider> getProviderClass() { 691975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return TestVoicemailProvider.class; 701975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 711975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 721975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 731975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee protected String getAuthority() { 741975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return VoicemailContract.AUTHORITY; 751975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 761975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 771975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private boolean mUseSourceUri = false; 781975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private File mTestDirectory; 791975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 801975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 811975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee protected void setUp() throws Exception { 821975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee super.setUp(); 831975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee addProvider(TestVoicemailProvider.class, VoicemailContract.AUTHORITY); 841975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForOwnPermission(); 851975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee TestVoicemailProvider.setVvmProviderCallDelegate(createMockProviderCalls()); 861975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 871975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 881975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 891975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee protected void tearDown() throws Exception { 901975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee removeTestDirectory(); 911975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee super.tearDown(); 921975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 931975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 941975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private void setUpForOwnPermission() { 951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Give away full permission, in case it was granted previously. 961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mActor.removePermissions(ALL_PERMISSION); 971975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mActor.addPermissions(OWN_PERMISSION); 98e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee mUseSourceUri = true; 991975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1001975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1011975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private void setUpForFullPermission() { 1021975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mActor.addPermissions(OWN_PERMISSION); 1031975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mActor.addPermissions(ALL_PERMISSION); 104e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee mUseSourceUri = false; 1051975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1061975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1071975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private void setUpForNoPermission() { 1081975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mActor.removePermissions(OWN_PERMISSION); 1091975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mActor.removePermissions(ALL_PERMISSION); 1101975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mUseSourceUri = true; 1111975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1121975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1131975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private Uri contentUri() { 114e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee return mUseSourceUri ? 115e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee Voicemails.buildSourceUri(mActor.packageName) : Voicemails.CONTENT_URI; 1161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testInsert() throws Exception { 1191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee ContentValues values = getDefaultVoicemailValues(); 1201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee Uri uri = mResolver.insert(contentUri(), values); 1211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertStoredValues(uri, values); 1221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertSelection(uri, values, Voicemails._ID, ContentUris.parseId(uri)); 1231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(1, countFilesInTestDirectory()); 1241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Test to ensure that media content can be written and read back. 1271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testFileContent() throws Exception { 1281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee Uri uri = insertVoicemail(); 1291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee OutputStream out = mResolver.openOutputStream(uri); 1301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee byte[] outBuffer = {0x1, 0x2, 0x3, 0x4}; 1311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee out.write(outBuffer); 1321975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee out.flush(); 1331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee out.close(); 1341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee InputStream in = mResolver.openInputStream(uri); 1351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee byte[] inBuffer = new byte[4]; 1361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee int numBytesRead = in.read(inBuffer); 1371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(numBytesRead, outBuffer.length); 1381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee MoreAsserts.assertEquals(outBuffer, inBuffer); 1391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // No more data should be left. 1401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(-1, in.read(inBuffer)); 1411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee in.close(); 1421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testUpdate() { 1451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee Uri uri = insertVoicemail(); 1461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee ContentValues values = new ContentValues(); 1471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.NUMBER, "1-800-263-7643"); 1481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.DATE, 2000); 1491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.DURATION, 40); 1501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.STATE, 2); 1511975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.HAS_CONTENT, 1); 1521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.SOURCE_DATA, "foo"); 1531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee int count = mResolver.update(uri, values, null, null); 1541975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(1, count); 1551975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertStoredValues(uri, values); 1561975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1571975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1581975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testDelete() { 1591975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee Uri uri = insertVoicemail(); 1601975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee int count = mResolver.delete(contentUri(), Voicemails._ID + "=" 1611975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee + ContentUris.parseId(uri), null); 1621975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(1, count); 1631975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(0, getCount(uri, null, null)); 1641975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 1651975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 1664b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void testGetType() throws Exception { 1674b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee // voicemail with no MIME type. 1684b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee ContentValues values = getDefaultVoicemailValues(); 1694b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee Uri uri = mResolver.insert(contentUri(), values); 1704b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee assertEquals(null, mResolver.getType(uri)); 1714b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 1724b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee values.put(Voicemails.MIME_TYPE, "foo/bar"); 1734b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee uri = mResolver.insert(contentUri(), values); 1744b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee assertEquals("foo/bar", mResolver.getType(uri)); 1754b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 1764b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee // base URIs. 1774b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee assertEquals(Voicemails.DIR_TYPE, mResolver.getType(Voicemails.CONTENT_URI)); 1784b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee assertEquals(Voicemails.DIR_TYPE, mResolver.getType(Voicemails.buildSourceUri("foo"))); 1794b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 1804b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 1814b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee // Test to ensure that without full permission it is not possible to use the base uri (i.e. with 1824b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee // no package URI specified). 1834b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void testMustUsePackageUriWithoutFullPermission() { 1844b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee setUpForOwnPermission(); 1854b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 1864b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee @Override 1874b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void run() { 1884b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee mResolver.insert(Voicemails.CONTENT_URI, getDefaultVoicemailValues()); 1894b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 1904b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee }); 1914b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 1924b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 1934b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee @Override 1944b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void run() { 1954b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee mResolver.update(Voicemails.CONTENT_URI, getDefaultVoicemailValues(), null, null); 1964b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 1974b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee }); 1984b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 1994b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2004b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee @Override 2014b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void run() { 2024b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee mResolver.query(Voicemails.CONTENT_URI, null, null, null, null); 2034b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2044b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee }); 2054b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 2064b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2074b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee @Override 2084b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee public void run() { 2094b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee mResolver.delete(Voicemails.CONTENT_URI, null, null); 2104b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2114b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee }); 2124b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee } 2134b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee 2141975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testPermissions_InsertAndQuery() { 2151975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForFullPermission(); 2161975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Insert two records - one each with own and another package. 2171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee insertVoicemail(); 2181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee insertVoicemailForSourcePackage("another-package"); 2191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(2, getCount(contentUri(), null, null)); 2201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 2211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Now give away full permission and check that only 1 message is accessible. 2221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForOwnPermission(); 2231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(1, getCount(contentUri(), null, null)); 2241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 2251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Once again try to insert message for another package. This time 2261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // it should fail. 2271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 2291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 2301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee insertVoicemailForSourcePackage("another-package"); 2311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2321975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 2331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 2351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testPermissions_UpdateAndDelete() { 2361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForFullPermission(); 2371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Insert two records - one each with own and another package. 2381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee final Uri ownVoicemail = insertVoicemail(); 2391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee final Uri anotherVoicemail = insertVoicemailForSourcePackage("another-package"); 2401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertEquals(2, getCount(contentUri(), null, null)); 2411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 2421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Now give away full permission and check that we can update and delete only 2431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // the own voicemail. 2441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForOwnPermission(); 245e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee mResolver.update(withSourcePackageParam(ownVoicemail), 246e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee getDefaultVoicemailValues(), null, null); 247e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee mResolver.delete(withSourcePackageParam(ownVoicemail), null, null); 2481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 2491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // However, attempting to update or delete another-package's voicemail should fail. 2501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2511975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 2521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 2531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mResolver.update(anotherVoicemail, null, null, null); 2541975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2551975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 2561975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2571975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 2581975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 2591975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mResolver.delete(anotherVoicemail, null, null); 2601975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2611975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 2621975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2631975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 264e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee private Uri withSourcePackageParam(Uri uri) { 265e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee return uri.buildUpon() 266e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee .appendQueryParameter(VoicemailContract.PARAM_KEY_SOURCE_PACKAGE, mActor.packageName) 267e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee .build(); 268e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee } 269e36e13b9e92759bb861a10ff22195853359c267dDebashish Chatterjee 2701975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // Test to ensure that all operations fail when no voicemail permission is granted. 2711975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void testNoPermissions() { 2721975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee setUpForNoPermission(); 2731975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2741975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 2751975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 2761975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mResolver.insert(contentUri(), getDefaultVoicemailValues()); 2771975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2781975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 2791975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2801975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 2811975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 2821975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mResolver.update(contentUri(), getDefaultVoicemailValues(), null, null); 2831975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2841975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 2851975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2861975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 2871975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 2881975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mResolver.query(contentUri(), null, null, null, null); 2891975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2901975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 2911975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee EvenMoreAsserts.assertThrows(SecurityException.class, new Runnable() { 2921975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 2931975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void run() { 2941975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mResolver.delete(contentUri(), null, null); 2951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }); 2971975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 2981975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 29900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // Test to check that none of the call_log provider specific fields are 30000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // insertable through voicemail provider. 30100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void testCannotAccessCallLogSpecificFields_Insert() { 30200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) { 30300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee final ContentValues values = getDefaultVoicemailValues(); 30400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee values.put(callLogColumn, "foo"); 30500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee EvenMoreAsserts.assertThrows("Column: " + callLogColumn, 30600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee IllegalArgumentException.class, new Runnable() { 30700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee @Override 30800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void run() { 30900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee mResolver.insert(contentUri(), values); 31000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 31100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee }); 31200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 31300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 31400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee 31500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // Test to check that none of the call_log provider specific fields are 31600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // exposed through voicemail provider query. 31700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void testCannotAccessCallLogSpecificFields_Query() { 31800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // Query. 31900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee Cursor cursor = mResolver.query(contentUri(), null, null, null, null); 32000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee List<String> columnNames = Arrays.asList(cursor.getColumnNames()); 32100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee assertEquals(NUM_VOICEMAIL_FIELDS, columnNames.size()); 32200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // None of the call_log provider specific columns should be present. 32300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) { 32400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee assertFalse("Unexpected column: '" + callLogColumn + "' returned.", 32500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee columnNames.contains(callLogColumn)); 32600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 32700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 32800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee 32900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // Test to check that none of the call_log provider specific fields are 33000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee // updatable through voicemail provider. 33100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void testCannotAccessCallLogSpecificFields_Update() { 33200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee for (String callLogColumn : CALLLOG_PROVIDER_SPECIFIC_COLUMNS) { 33300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee final Uri insertedUri = insertVoicemail(); 33400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee final ContentValues values = getDefaultVoicemailValues(); 33500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee values.put(callLogColumn, "foo"); 33600e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee EvenMoreAsserts.assertThrows("Column: " + callLogColumn, 33700e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee IllegalArgumentException.class, new Runnable() { 33800e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee @Override 33900e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee public void run() { 34000e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee mResolver.update(insertedUri, values, null, null); 34100e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 34200e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee }); 34300e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 34400e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee } 34500e7c94b70f4b477653534dbe559d1759d796157Debashish Chatterjee 3461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee /** 3471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * Inserts a voicemail record with no source package set. The content provider 3481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee * will detect source package. 3491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee */ 3501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private Uri insertVoicemail() { 3511975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return mResolver.insert(contentUri(), getDefaultVoicemailValues()); 3521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3541975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee /** Inserts a voicemail record for the specified source package. */ 3551975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private Uri insertVoicemailForSourcePackage(String sourcePackage) { 3561975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee ContentValues values = getDefaultVoicemailValues(); 3571975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.SOURCE_PACKAGE, sourcePackage); 3581975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return mResolver.insert(contentUri(), values); 3591975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3601975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3611975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private ContentValues getDefaultVoicemailValues() { 3621975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee ContentValues values = new ContentValues(); 3631975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.NUMBER, "1-800-4664-411"); 3641975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.DATE, 1000); 3651975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.DURATION, 30); 3661975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.NEW, 1); 3671975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.HAS_CONTENT, 0); 3681975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.SOURCE_DATA, "1234"); 3691975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee values.put(Voicemails.STATE, Voicemails.STATE_INBOX); 3701975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return values; 3711975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3721975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3731975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee /** The calls that we need to mock out for our VvmProvider, used by TestVoicemailProvider. */ 3741975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public interface VvmProviderCalls { 3751975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void sendOrderedBroadcast(Intent intent, String receiverPermission); 3761975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public File getDir(String name, int mode); 3771975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3781975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3791975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public static class TestVoicemailProvider extends VoicemailContentProvider { 3801975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private static VvmProviderCalls mDelgate; 3811975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3821975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public static synchronized void setVvmProviderCallDelegate(VvmProviderCalls delegate) { 3831975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mDelgate = delegate; 3841975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3851975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3861975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 3871975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee protected ContactsDatabaseHelper getDatabaseHelper(Context context) { 3881975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return new ContactsDatabaseHelper(context); 3891975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 3901975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 3911975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 3921975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee protected Context context() { 3931975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return new ContextWrapper(getContext()) { 3941975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 3951975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public File getDir(String name, int mode) { 3961975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return mDelgate.getDir(name, mode); 3971975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 398975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjee @Override 399975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjee public void sendBroadcast(Intent intent, String receiverPermission) { 4004b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee mDelgate.sendOrderedBroadcast(intent, receiverPermission); 401975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjee } 4021975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }; 4031975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4041975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 4051975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 4061975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee protected String getCallingPackage() { 4071975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return getContext().getPackageName(); 4081975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 409975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjee 410975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjee @Override 41106f995b614e0ebe59ff75f170e20ca96c9b17f0cDebashish Chatterjee protected List<ComponentName> getBroadcastReceiverComponents(String intentAction, Uri uri) { 41206f995b614e0ebe59ff75f170e20ca96c9b17f0cDebashish Chatterjee List<ComponentName> broadcastReceiverComponents = new ArrayList<ComponentName>(); 41306f995b614e0ebe59ff75f170e20ca96c9b17f0cDebashish Chatterjee broadcastReceiverComponents.add(new ComponentName( 41406f995b614e0ebe59ff75f170e20ca96c9b17f0cDebashish Chatterjee getContext().getPackageName(), "TestReceiverClass")); 41506f995b614e0ebe59ff75f170e20ca96c9b17f0cDebashish Chatterjee return broadcastReceiverComponents; 416975d52af754e6f05089fcd9f7066df05c290c3b7Debashish Chatterjee } 4171975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4181975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 4191975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee /** Lazily construct the test directory when required. */ 4201975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private synchronized File getTestDirectory() { 4211975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee if (mTestDirectory == null) { 4221975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee File baseDirectory = getContext().getCacheDir(); 4231975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee mTestDirectory = new File(baseDirectory, Long.toString(System.currentTimeMillis())); 4241975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertFalse(mTestDirectory.exists()); 4251975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertTrue(mTestDirectory.mkdirs()); 4261975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4271975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return mTestDirectory; 4281975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4291975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 4301975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private void removeTestDirectory() { 4311975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee if (mTestDirectory != null) { 4321975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee recursiveDeleteAll(mTestDirectory); 4331975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4341975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4351975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 4361975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private static void recursiveDeleteAll(File input) { 4371975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee if (input.isDirectory()) { 4381975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee for (File file : input.listFiles()) { 4391975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee recursiveDeleteAll(file); 4401975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4411975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4421975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee assertTrue("error deleting " + input.getAbsolutePath(), input.delete()); 4431975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4441975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 4451975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private List<File> findAllFiles(File input) { 4461975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee if (input == null) { 4471975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return Collections.emptyList(); 4481975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4491975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee if (!input.isDirectory()) { 4501975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return Collections.singletonList(input); 4511975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4521975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee List<File> results = new ArrayList<File>(); 4531975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee for (File file : input.listFiles()) { 4541975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee results.addAll(findAllFiles(file)); 4551975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4561975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return results; 4571975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4581975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 4591975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private int countFilesInTestDirectory() { 4601975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return findAllFiles(mTestDirectory).size(); 4611975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4621975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 4631975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee // TODO: Use a mocking framework to mock these calls. 4641975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee private VvmProviderCalls createMockProviderCalls() { 4651975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return new VvmProviderCalls() { 4661975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 4671975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public void sendOrderedBroadcast(Intent intent, String receiverPermission) { 4684b571ba0de4fac4ff9d2a4277032b8c6548fdbfaDebashish Chatterjee // Do nothing for now. 4691975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4701975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee 4711975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee @Override 4721975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee public File getDir(String name, int mode) { 4731975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee return getTestDirectory(); 4741975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4751975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee }; 4761975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee } 4771975b56a3368b4b7684429ffa79e7b9dbc35b475Debashish Chatterjee} 478