1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License
15 */
16package com.android.providers.contacts;
17
18import android.content.ContentValues;
19import android.database.Cursor;
20import android.provider.VoicemailContract;
21import android.provider.VoicemailContract.Status;
22import android.provider.VoicemailContract.Voicemails;
23import android.test.suitebuilder.annotation.SmallTest;
24
25import com.android.providers.contacts.testutil.TestUtil;
26
27/**
28 * Tests for {@link VoicemailCleanupTest}.
29 */
30@SmallTest
31public class VoicemailCleanupTest extends BaseVoicemailProviderTest {
32    private static final String TEST_PACKAGE_1 = "package1";
33    private static final String TEST_PACKAGE_2 = "package2";
34    private static final String TEST_PACKAGE_3 = "package3";
35
36    @Override
37    protected void setUp() throws Exception {
38        super.setUp();
39        setUpForFullPermission();
40    }
41
42    /**
43     * Test for {@link ContactsPackageMonitor#cleanupVoicemail}.
44     */
45    public void testCleanupVoicemail() {
46        insertDataForPackage(TEST_PACKAGE_1);
47        insertDataForPackage(TEST_PACKAGE_2);
48
49        mPackageManager.addPackage(123456, TEST_PACKAGE_2);
50
51        checkDataExistsForPackage(TEST_PACKAGE_1);
52        checkDataExistsForPackage(TEST_PACKAGE_2);
53
54        ContactsPackageMonitor.cleanupVoicemail(getMockContext(), TEST_PACKAGE_1);
55
56        checkDataDoesNotExistForPackage(TEST_PACKAGE_1);
57        checkDataExistsForPackage(TEST_PACKAGE_2);
58
59        // Call for TEST_PACKAGE_2, which is still installed.
60        ContactsPackageMonitor.cleanupVoicemail(getMockContext(), TEST_PACKAGE_2);
61
62        checkDataDoesNotExistForPackage(TEST_PACKAGE_1);
63        checkDataExistsForPackage(TEST_PACKAGE_2);
64
65        // Uninstall the package and try again.
66        mPackageManager.removePackage(123456);
67        ContactsPackageMonitor.cleanupVoicemail(getMockContext(), TEST_PACKAGE_2);
68
69        checkDataDoesNotExistForPackage(TEST_PACKAGE_1);
70        checkDataDoesNotExistForPackage(TEST_PACKAGE_2);
71    }
72
73    private void insertDataForPackage(String sourcePackage) {
74        ContentValues values = new ContentValues();
75        values.put(VoicemailContract.SOURCE_PACKAGE_FIELD, sourcePackage);
76        mResolver.insert(Voicemails.buildSourceUri(sourcePackage), values);
77        mResolver.insert(Status.buildSourceUri(sourcePackage), values);
78    }
79
80    private static void assertBigger(int smaller, int actual) {
81        if (smaller >= actual) {
82            fail("Expected to be bigger than " + smaller + ", but was " + actual);
83        }
84    }
85
86    private void checkDataExistsForPackage(String sourcePackage) {
87        Cursor cursor = mResolver.query(
88                Voicemails.buildSourceUri(sourcePackage), null, null, null, null);
89        assertBigger(0, cursor.getCount());
90        cursor = mResolver.query(
91                Status.buildSourceUri(sourcePackage), null, null, null, null);
92        assertBigger(0, cursor.getCount());
93    }
94
95    private void checkDataDoesNotExistForPackage(String sourcePackage) {
96        Cursor cursor = mResolver.query(
97                Voicemails.buildSourceUri(sourcePackage), null,
98                "(ifnull(" + Voicemails.DELETED + ",0)==0)", null, null);
99        assertEquals(0, cursor.getCount());
100        cursor = mResolver.query(
101                Status.buildSourceUri(sourcePackage), null, null, null, null);
102        assertEquals(0, cursor.getCount());
103    }
104
105    public void testRemoveStalePackagesAtStartUp() {
106        insertDataForPackage(TEST_PACKAGE_1);
107        insertDataForPackage(TEST_PACKAGE_2);
108        insertDataForPackage(TEST_PACKAGE_3);
109
110        mPackageManager.addPackage(10001, TEST_PACKAGE_1);
111        mPackageManager.addPackage(10002, TEST_PACKAGE_2);
112
113        checkDataExistsForPackage(TEST_PACKAGE_1);
114        checkDataExistsForPackage(TEST_PACKAGE_2);
115        checkDataExistsForPackage(TEST_PACKAGE_3);
116
117        final VoicemailContentProvider provider =
118                (VoicemailContentProvider) mActor.provider;
119
120        // In unit tests, BG tasks are synchronous.
121        provider.scheduleScanStalePackages();
122
123        checkDataExistsForPackage(TEST_PACKAGE_1);
124        checkDataExistsForPackage(TEST_PACKAGE_2);
125        checkDataDoesNotExistForPackage(TEST_PACKAGE_3);
126
127        mPackageManager.removePackage(10001);
128
129        provider.scheduleScanStalePackages();
130
131        checkDataDoesNotExistForPackage(TEST_PACKAGE_1);
132        checkDataExistsForPackage(TEST_PACKAGE_2);
133        checkDataDoesNotExistForPackage(TEST_PACKAGE_3);
134    }
135}
136