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