128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki/*
228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * Copyright (C) 2016 The Android Open Source Project
328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki *
428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * Licensed under the Apache License, Version 2.0 (the "License");
528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * you may not use this file except in compliance with the License.
628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * You may obtain a copy of the License at
728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki *
828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki *      http://www.apache.org/licenses/LICENSE-2.0
928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki *
1028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * Unless required by applicable law or agreed to in writing, software
1128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * distributed under the License is distributed on an "AS IS" BASIS,
1228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * See the License for the specific language governing permissions and
1428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki * limitations under the License
1528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki */
1628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukipackage com.android.providers.blockednumber;
1728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
188f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastryimport static org.mockito.Matchers.anyInt;
198f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastryimport static org.mockito.Matchers.anyString;
208f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastryimport static org.mockito.Matchers.eq;
219818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport static org.mockito.Mockito.doReturn;
229818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport static org.mockito.Mockito.reset;
239818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport static org.mockito.Mockito.spy;
249818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport static org.mockito.Mockito.times;
2575718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastryimport static org.mockito.Mockito.verify;
268f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastryimport static org.mockito.Mockito.when;
278f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry
288f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastryimport android.app.AppOpsManager;
2928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.content.ContentResolver;
3028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.content.ContentUris;
3128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.content.ContentValues;
329818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport android.content.pm.PackageManager;
3335676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastryimport android.database.ContentObserver;
3428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.database.Cursor;
3528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.database.sqlite.SQLiteException;
368f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastryimport android.location.Country;
3728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.net.Uri;
389818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport android.os.PersistableBundle;
396fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastryimport android.os.SystemProperties;
4028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.provider.BlockedNumberContract;
4128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.provider.BlockedNumberContract.BlockedNumbers;
429818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport android.provider.BlockedNumberContract.SystemContract;
439818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport android.telephony.CarrierConfigManager;
449818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastryimport android.telephony.TelephonyManager;
4528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.test.AndroidTestCase;
4628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport android.test.MoreAsserts;
47e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastryimport android.test.suitebuilder.annotation.MediumTest;
488f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry
4928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukiimport junit.framework.Assert;
5028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
5135676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastryimport java.util.concurrent.CountDownLatch;
5235676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastryimport java.util.concurrent.TimeUnit;
5335676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry
5428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki/**
559818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry * runtest --path packages/providers/BlockedNumberProvider/tests
5628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki */
576fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry@MediumTest
5828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onukipublic class BlockedNumberProviderTest extends AndroidTestCase {
5928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    private MyMockContext mMockContext;
6028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    private ContentResolver mResolver;
6128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
6228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    @Override
6328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    protected void setUp() throws Exception {
6428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        super.setUp();
65a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry        BlockedNumberProvider.ALLOW_SELF_CALL = false;
6628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
679818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        mMockContext = spy(new MyMockContext(getContext()));
689818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        mMockContext.initializeContext();
6928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        mResolver = mMockContext.getContentResolver();
708f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry
718f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry        when(mMockContext.mUserManager.isPrimaryUser()).thenReturn(true);
728f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry        when(mMockContext.mCountryDetector.detectCountry())
738f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry                .thenReturn(new Country("US", Country.COUNTRY_SOURCE_LOCATION));
748f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry        when(mMockContext.mAppOpsManager.noteOp(
758f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry                eq(AppOpsManager.OP_WRITE_SMS), anyInt(), anyString()))
768f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry                .thenReturn(AppOpsManager.MODE_ERRORED);
7728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
7828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
7928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    @Override
8028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    protected void tearDown() throws Exception {
8128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        mMockContext.shutdown();
8228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
8328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        super.tearDown();
8428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
8528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
8628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    private static ContentValues cv(Object... namesAndValues) {
8728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        Assert.assertTrue((namesAndValues.length % 2) == 0);
8828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
8928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        final ContentValues ret = new ContentValues();
9028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        for (int i = 1; i < namesAndValues.length; i += 2) {
9128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            final String name = namesAndValues[i - 1].toString();
9235676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            final Object value = namesAndValues[i];
9328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            if (value == null) {
9428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                ret.putNull(name);
9528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            } else if (value instanceof String) {
9628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                ret.put(name, (String) value);
9728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            } else if (value instanceof Integer) {
9828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                ret.put(name, (Integer) value);
9928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            } else if (value instanceof Long) {
10028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                ret.put(name, (Long) value);
10128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            } else {
10228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                Assert.fail("Unsupported type: " + value.getClass().getSimpleName());
10328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            }
10428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        }
10528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        return ret;
10628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
10728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
10828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    private void assertRowCount(int count, Uri uri) {
10928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        try (Cursor c = mResolver.query(uri, null, null, null, null)) {
11028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            assertEquals(count, c.getCount());
11128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        }
11228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
11328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
11428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    public void testGetType() {
11528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertEquals(BlockedNumbers.CONTENT_TYPE, mResolver.getType(
11628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                BlockedNumbers.CONTENT_URI));
11728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
11828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertEquals(BlockedNumbers.CONTENT_ITEM_TYPE, mResolver.getType(
11928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                ContentUris.withAppendedId(BlockedNumbers.CONTENT_URI, 1)));
12028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
12128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertNull(mResolver.getType(
12228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                Uri.withAppendedPath(BlockedNumberContract.AUTHORITY_URI, "invalid")));
12328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
12428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
12528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    public void testInsert() {
12628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insertExpectingFailure(cv());
12728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insertExpectingFailure(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, null));
12828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insertExpectingFailure(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, ""));
12928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insertExpectingFailure(cv(BlockedNumbers.COLUMN_ID, 1));
13028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insertExpectingFailure(cv(BlockedNumbers.COLUMN_E164_NUMBER, "1"));
13128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
13228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
13328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1-2-3"));
13428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1-408-454-1111"));
13528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1-408-454-2222"));
1360e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry        // Re-inserting the same number should be ok, but the E164 number is replaced.
1370e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1-408-454-2222",
1380e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry                BlockedNumbers.COLUMN_E164_NUMBER, "+814084542222"));
13928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
14028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1-408-4542222"));
14128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
14228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "045-381-1111",
14328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                BlockedNumbers.COLUMN_E164_NUMBER, "+81453811111"));
14428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
145e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "12345"));
146e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry
1470e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry
1480e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry
149e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry        assertRowCount(7, BlockedNumbers.CONTENT_URI);
15028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
151e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry        assertContents(1, "123", "");
152e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry        assertContents(2, "+1-2-3", "");
153e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry        assertContents(3, "+1-408-454-1111", "+14084541111");
1540e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry        // Missing 4 due to re-insertion of the same number.
1550e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry        assertContents(5, "1-408-454-2222", "+814084542222");
1560e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry        assertContents(6, "1-408-4542222", "+14084542222");
1570e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry        assertContents(7, "045-381-1111", "+81453811111");
1580e7df00b196c4d281da0c7f65cd04ce643489ba2Abhijith Shastry        assertContents(8, "12345", "");
15928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
16028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
16135676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry    public void testChangesNotified() throws Exception {
16235676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        Cursor c = mResolver.query(BlockedNumbers.CONTENT_URI, null, null, null, null);
16335676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry
16435676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        final CountDownLatch latch = new CountDownLatch(2);
16535676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        ContentObserver contentObserver = new ContentObserver(null) {
16635676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            @Override
16735676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            public void onChange(boolean selfChange) {
16835676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry                Assert.assertFalse(selfChange);
16935676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry                latch.notify();
17035676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            }
17135676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        };
17235676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        c.registerContentObserver(contentObserver);
17335676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry
17435676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        try {
17535676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            Uri uri = insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "14506507000"));
17635676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            mResolver.delete(uri, null, null);
17735676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            latch.await(10, TimeUnit.SECONDS);
178a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry            verify(mMockContext.mBackupManager, times(2)).dataChanged();
17935676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        } catch (Exception e) {
18035676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            fail(e.toString());
18135676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        } finally {
18235676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry            c.unregisterContentObserver(contentObserver);
18335676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        }
18435676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry    }
18535676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry
18628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    private Uri insert(ContentValues cv) {
18728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        final Uri uri = mResolver.insert(BlockedNumbers.CONTENT_URI, cv);
18828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertNotNull(uri);
18928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
19028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        // Make sure the URI exists.
19128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        try (Cursor c = mResolver.query(uri, null, null, null, null)) {
19228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            assertEquals(1, c.getCount());
19328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        }
19428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        return uri;
19528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
19628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
19728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    private void insertExpectingFailure(ContentValues cv) {
19828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        try {
19928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            mResolver.insert(
2009f7cfe71be8d9b844b0423c283a923a090bc5d7cAbhijith Shastry                    BlockedNumbers.CONTENT_URI, cv);
20128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            fail();
20228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        } catch (IllegalArgumentException expected) {
20328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        }
20428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
20528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
20628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    public void testDelete() {
20728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        // Prepare test data
20828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        Uri u1 = insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
20928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        Uri u2 = insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1-2-3"));
21028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1-408-454-1111"));
21128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1-408-454-2222"));
21228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
21328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "045-381-1111",
21428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                BlockedNumbers.COLUMN_E164_NUMBER, "12345"));
21528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
21628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertRowCount(5, BlockedNumbers.CONTENT_URI);
21728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
21828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        // Delete and check the # of remaining rows.
21928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
22028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        mResolver.delete(u1, null, null);
22128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertRowCount(4, BlockedNumbers.CONTENT_URI);
22228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
22328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        try {
22428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            mResolver.delete(u2, "1=1", null);
22528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            fail();
22628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        } catch (IllegalArgumentException expected) {
22728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            MoreAsserts.assertContainsRegex("selection must be null", expected.getMessage());
22828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        }
22928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
23028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        mResolver.delete(u2, null, null);
23128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertRowCount(3, BlockedNumbers.CONTENT_URI);
23228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
23328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        mResolver.delete(BlockedNumbers.CONTENT_URI,
23428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                BlockedNumbers.COLUMN_E164_NUMBER + "=?",
23528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                new String[]{"12345"});
23628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertRowCount(2, BlockedNumbers.CONTENT_URI);
23728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
23828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        // SQL injection should be detected.
23928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        try {
24028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            mResolver.delete(BlockedNumbers.CONTENT_URI, "; DROP TABLE blocked; ", null);
24128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            fail();
24228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        } catch (SQLiteException expected) {
24328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        }
24428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertRowCount(2, BlockedNumbers.CONTENT_URI);
24528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
24628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        mResolver.delete(BlockedNumbers.CONTENT_URI, null, null);
24728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertRowCount(0, BlockedNumbers.CONTENT_URI);
24828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
24928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
25028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    public void testUpdate() {
25128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        try {
25228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            mResolver.update(BlockedNumbers.CONTENT_URI, cv(),
25328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki                    /* selection =*/ null, /* args =*/ null);
25428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            fail();
25528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        } catch (UnsupportedOperationException expected) {
25628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki            MoreAsserts.assertContainsRegex("Update is not supported", expected.getMessage());
25728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        }
25828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
25928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
2609818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    public void testBlockSuppressionAfterEmergencyContact() {
2619818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        int blockSuppressionSeconds = 1000;
2629818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        when(mMockContext.mCarrierConfigManager.getConfig())
2639818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .thenReturn(getBundleWithInt(blockSuppressionSeconds));
2649818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
2659818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        String phoneNumber = "5004541111";
2669818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, phoneNumber));
2679818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
2689818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        // No emergency contact: Blocks should not be suppressed.
2699818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertIsBlocked(true, phoneNumber);
2709818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertShouldSystemBlock(true, phoneNumber);
2719818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        verifyBlocksNotSuppressed();
2729818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertTrue(mMockContext.mIntentsBroadcasted.isEmpty());
2739818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
2749818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        // No emergency contact yet: Ending block suppression should be a no-op.
2759818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        SystemContract.endBlockSuppression(mMockContext);
2769818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertIsBlocked(true, phoneNumber);
2779818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertShouldSystemBlock(true, phoneNumber);
2789818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        verifyBlocksNotSuppressed();
2799818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertTrue(mMockContext.mIntentsBroadcasted.isEmpty());
2809818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
2819818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        // After emergency contact blocks should be suppressed.
2829818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        long timestampMillisBeforeEmergencyContact = System.currentTimeMillis();
2839818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        SystemContract.notifyEmergencyContact(mMockContext);
2849818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertIsBlocked(true, phoneNumber);
2859818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertShouldSystemBlock(false, phoneNumber);
2869818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        SystemContract.BlockSuppressionStatus status =
2879818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                SystemContract.getBlockSuppressionStatus(mMockContext);
2889818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertTrue(status.isSuppressed);
2899818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertValidBlockSuppressionExpiration(timestampMillisBeforeEmergencyContact,
2909818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                blockSuppressionSeconds, status.untilTimestampMillis);
2919818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertEquals(1, mMockContext.mIntentsBroadcasted.size());
2929818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertEquals(SystemContract.ACTION_BLOCK_SUPPRESSION_STATE_CHANGED,
2939818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                mMockContext.mIntentsBroadcasted.get(0));
2949818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        mMockContext.mIntentsBroadcasted.clear();
2959818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
2969818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        // Ending block suppression should work.
2979818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        SystemContract.endBlockSuppression(mMockContext);
2989818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertIsBlocked(true, phoneNumber);
2999818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertShouldSystemBlock(true, phoneNumber);
3009818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        verifyBlocksNotSuppressed();
3019818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertEquals(1, mMockContext.mIntentsBroadcasted.size());
3029818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertEquals(SystemContract.ACTION_BLOCK_SUPPRESSION_STATE_CHANGED,
3039818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                mMockContext.mIntentsBroadcasted.get(0));
3049818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
3059818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3069818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    public void testBlockSuppressionAfterEmergencyContact_invalidCarrierConfigDefaultValueUsed() {
3079818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        int invalidBlockSuppressionSeconds = 700000; // > 1 week
3089818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        when(mMockContext.mCarrierConfigManager.getConfig())
3099818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .thenReturn(getBundleWithInt(invalidBlockSuppressionSeconds));
3109818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3119818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        String phoneNumber = "5004541111";
3129818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, phoneNumber));
3139818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3149818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        long timestampMillisBeforeEmergencyContact = System.currentTimeMillis();
3159818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        SystemContract.notifyEmergencyContact(mMockContext);
3169818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertIsBlocked(true, phoneNumber);
3179818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertShouldSystemBlock(false, phoneNumber);
3189818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        SystemContract.BlockSuppressionStatus status =
3199818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                SystemContract.getBlockSuppressionStatus(mMockContext);
3209818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertTrue(status.isSuppressed);
3219818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertValidBlockSuppressionExpiration(timestampMillisBeforeEmergencyContact,
3229818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                7200 /* Default value of 2 hours */, status.untilTimestampMillis);
3239818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertEquals(1, mMockContext.mIntentsBroadcasted.size());
3249818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertEquals(SystemContract.ACTION_BLOCK_SUPPRESSION_STATE_CHANGED,
3259818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                mMockContext.mIntentsBroadcasted.get(0));
3269818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
3279818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3289818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    public void testRegularAppCannotAccessApis() {
3299818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        doReturn(PackageManager.PERMISSION_DENIED)
3309818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .when(mMockContext).checkCallingPermission(anyString());
3319818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3329818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
3339818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
3349818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
3359818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
3369818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
3379818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3389818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
3399818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            mResolver.query(BlockedNumbers.CONTENT_URI, null, null, null, null);
3409818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
3419818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
3429818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
3439818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3449818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
3459818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            mResolver.delete(BlockedNumbers.CONTENT_URI, null, null);
3469818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
3479818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
3489818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
3499818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3509818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
3519818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            BlockedNumberContract.isBlocked(mMockContext, "123");
3529818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
3539818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
3549818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
3559818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3569818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
35775718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry            BlockedNumberContract.unblock(mMockContext, "123");
35875718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry            fail("SecurityException expected");
35975718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        } catch (SecurityException expected) {
36075718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        }
36175718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry
36275718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        try {
3639818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            SystemContract.notifyEmergencyContact(mMockContext);
3649818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
3659818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
3669818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
3679818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3689818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
3699818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            SystemContract.endBlockSuppression(mMockContext);
3709818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
3719818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
3729818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
3739818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3749818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
3759818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            SystemContract.shouldSystemBlockNumber(mMockContext, "123");
3769818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
3779818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
3789818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
3799818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3809818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
3819818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            SystemContract.getBlockSuppressionStatus(mMockContext);
3829818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
3839818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
3849818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
3859818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
3869818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3879818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    public void testCarrierAppCanAccessApis() {
3889818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        doReturn(PackageManager.PERMISSION_DENIED)
3899818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .when(mMockContext).checkCallingPermission(anyString());
3909818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        when(mMockContext.mTelephonyManager.checkCarrierPrivilegesForPackage(anyString()))
3919818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .thenReturn(TelephonyManager.CARRIER_PRIVILEGE_STATUS_HAS_ACCESS);
3929818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3939818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        mResolver.insert(
3949818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                BlockedNumbers.CONTENT_URI, cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
3959818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertIsBlocked(true, "123");
3969818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3979818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
3989818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        // Dialer check is executed twice: once for insert, and once for isBlocked.
3999818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        verify(mMockContext.mTelephonyManager, times(2))
4009818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .checkCarrierPrivilegesForPackage(anyString());
4019818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
4029818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
403a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry    public void testSelfCanAccessApis() {
404a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry        BlockedNumberProvider.ALLOW_SELF_CALL = true;
405a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry        doReturn(PackageManager.PERMISSION_DENIED)
406a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry                .when(mMockContext).checkCallingPermission(anyString());
407a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry
408a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry        mResolver.insert(
409a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry                BlockedNumbers.CONTENT_URI, cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
410a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry        assertIsBlocked(true, "123");
411a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry    }
412a227395c0b0d852f4a51629c85f9f35edf140496Abhijith Shastry
4139818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    public void testDefaultDialerCanAccessApis() {
4149818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        doReturn(PackageManager.PERMISSION_DENIED)
4159818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .when(mMockContext).checkCallingPermission(anyString());
4169818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        when(mMockContext.mTelecomManager.getDefaultDialerPackage())
4179818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .thenReturn(getContext().getPackageName());
4189818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4199818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        mResolver.insert(
4209818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                BlockedNumbers.CONTENT_URI, cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
4219818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertIsBlocked(true, "123");
4229818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4239818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        // Dialer check is executed twice: once for insert, and once for isBlocked.
4249818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        verify(mMockContext.mTelecomManager, times(2)).getDefaultDialerPackage();
4259818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
4269818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4279818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    public void testPrivilegedAppCannotUseSystemApis() {
4289818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        reset(mMockContext.mAppOpsManager);
4299818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        doReturn(PackageManager.PERMISSION_DENIED)
4309818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .when(mMockContext).checkCallingPermission(anyString());
4319818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4329818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        // Pretend to be the Default SMS app.
4339818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        when(mMockContext.mAppOpsManager.noteOp(
4349818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                eq(AppOpsManager.OP_WRITE_SMS), anyInt(), anyString()))
4359818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                .thenReturn(AppOpsManager.MODE_ALLOWED);
4369818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4379818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        // Public APIs should work.
4389818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
4399818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertIsBlocked(true, "123");
4409818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4419818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
4429818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            SystemContract.notifyEmergencyContact(mMockContext);
4439818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
4449818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
4459818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
4469818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4479818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
4489818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            SystemContract.endBlockSuppression(mMockContext);
4499818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
4509818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
4519818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
4529818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4539818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
4549818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            SystemContract.shouldSystemBlockNumber(mMockContext, "123");
4559818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
4569818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
4579818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
4589818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
4599818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        try {
4609818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            SystemContract.getBlockSuppressionStatus(mMockContext);
4619818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry            fail("SecurityException expected");
4629818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        } catch (SecurityException expected) {
4639818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        }
4649818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
4659818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
46628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    public void testIsBlocked() {
467a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        assertTrue(BlockedNumberContract.canCurrentUserBlockNumbers(mMockContext));
468a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
46928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        // Prepare test data
4709f7cfe71be8d9b844b0423c283a923a090bc5d7cAbhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
4719f7cfe71be8d9b844b0423c283a923a090bc5d7cAbhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1.2-3"));
47228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1-500-454-1111"));
47328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1-500-454-2222"));
47428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
47528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "045-111-2222",
47635676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry                BlockedNumbers.COLUMN_E164_NUMBER, "+81451112222"));
47728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
47828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "abc.def@gmail.com"));
47928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
48028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        // Check
48135676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        assertIsBlocked(false, "");
48235676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        assertIsBlocked(false, null);
48328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(true, "123");
48428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(false, "1234");
48528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(true, "+81451112222");
48628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(true, "+81 45 111 2222");
48735676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        assertIsBlocked(true, "045-111-2222");
48835676f9095853d4a5ac15875a9ddb1aea6b0b809Abhijith Shastry        assertIsBlocked(false, "045 111 2222");
48928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
4908f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry        assertIsBlocked(true, "500-454 1111");
4918f2944bd39ce4eccb98f245bbe114e042debdb62Abhijith Shastry        assertIsBlocked(true, "500-454 2222");
49228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(true, "+1 500-454 1111");
49328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(true, "1 500-454 1111");
49428b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
49528b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(true, "abc.def@gmail.com");
49628b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(false, "abc.def@gmail.co");
49728b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(false, "bc.def@gmail.com");
49828b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertIsBlocked(false, "abcdef@gmail.com");
49928b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
50028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki
50175718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry    public void testUnblock() {
50275718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "+1-500-454-1111"));
50375718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "1500-454-1111"));
50475718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "abc.def@gmail.com"));
50575718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry
50675718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        // Unblocking non-existent number is a no-op.
50775718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        assertEquals(0, BlockedNumberContract.unblock(mMockContext, "12345"));
50875718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry
50975718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        // Both rows which map to the same E164 number are deleted.
51075718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        assertEquals(2, BlockedNumberContract.unblock(mMockContext, "5004541111"));
51175718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        assertIsBlocked(false, "1-500-454-1111");
51275718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry
51375718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        assertEquals(1, BlockedNumberContract.unblock(mMockContext, "abc.def@gmail.com"));
51475718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        assertIsBlocked(false, "abc.def@gmail.com");
51575718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry    }
51675718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry
5176fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry    public void testEmergencyNumbersAreNotBlockedBySystem() {
5186fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry        String emergencyNumber = getEmergencyNumberFromSystemPropertiesOrDefault();
5196fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry        insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, emergencyNumber));
5206fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry
5216fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry        assertIsBlocked(true, emergencyNumber);
5226fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry        assertFalse(SystemContract.shouldSystemBlockNumber(mMockContext, emergencyNumber));
5236fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry    }
5246fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry
525a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry    public void testPrivilegedAppAccessingApisAsSecondaryUser() {
526a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        when(mMockContext.mUserManager.isPrimaryUser()).thenReturn(false);
527a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
528a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        assertFalse(BlockedNumberContract.canCurrentUserBlockNumbers(mMockContext));
529a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
530a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        try {
531a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
53291df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry            fail("SecurityException expected");
53391df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry        } catch (SecurityException expected) {
53491df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry            assertTrue(expected.getMessage().contains("current user"));
535a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        }
536a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
537a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        try {
538a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            mResolver.query(BlockedNumbers.CONTENT_URI, null, null, null, null);
53991df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry            fail("SecurityException expected");
54091df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry        } catch (SecurityException expected) {
541a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        }
542a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
543a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        try {
544a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            mResolver.delete(BlockedNumbers.CONTENT_URI, null, null);
54591df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry            fail("SecurityException expected");
54691df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry        } catch (SecurityException expected) {
547a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        }
548a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
549a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        try {
550a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            BlockedNumberContract.isBlocked(mMockContext, "123");
55191df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry            fail("SecurityException expected");
55291df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry        } catch (SecurityException expected) {
553a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        }
55475718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry
55575718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        try {
55675718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry            BlockedNumberContract.unblock(mMockContext, "123");
55791df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry            fail("SecurityException expected");
55891df11043f3f1988dab45e4b33924c4cb642e22bAbhijith Shastry        } catch (SecurityException expected) {
55975718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        }
560a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry    }
561a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
562a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry    public void testRegularAppAccessingApisAsSecondaryUser() {
563a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        when(mMockContext.mUserManager.isPrimaryUser()).thenReturn(false);
564a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        doReturn(PackageManager.PERMISSION_DENIED)
565a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry                .when(mMockContext).checkCallingPermission(anyString());
566a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
5670b78245b351a8bbd1ed34c14cb9a47c0f9dc5abfAbhijith Shastry        assertFalse(BlockedNumberContract.canCurrentUserBlockNumbers(mMockContext));
568a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
569a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        try {
570a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            insert(cv(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, "123"));
571a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            fail("SecurityException expected");
572a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        } catch (SecurityException expected) {
573a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        }
574a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
575a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        try {
576a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            mResolver.query(BlockedNumbers.CONTENT_URI, null, null, null, null);
577a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            fail("SecurityException expected");
578a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        } catch (SecurityException expected) {
579a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        }
580a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
581a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        try {
582a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            mResolver.delete(BlockedNumbers.CONTENT_URI, null, null);
583a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            fail("SecurityException expected");
584a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        } catch (SecurityException expected) {
585a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        }
586a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
587a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        try {
588a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            BlockedNumberContract.isBlocked(mMockContext, "123");
589a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry            fail("SecurityException expected");
590a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        } catch (SecurityException expected) {
591a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry        }
59275718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry
59375718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        try {
59475718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry            BlockedNumberContract.unblock(mMockContext, "123");
59575718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry            fail("SecurityException expected");
59675718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        } catch (SecurityException expected) {
59775718f1c00e7ce33369c1bc9418496ccfd49bdb9Abhijith Shastry        }
598a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry    }
599a42ead888255f167b2d5dc405974bddd12d7695bAbhijith Shastry
60028b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    private void assertIsBlocked(boolean expected, String phoneNumber) {
60128b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki        assertEquals(expected, BlockedNumberContract.isBlocked(mMockContext, phoneNumber));
60228b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki    }
6039818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
6049818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    private void assertShouldSystemBlock(boolean expected, String phoneNumber) {
6059818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertEquals(expected, SystemContract.shouldSystemBlockNumber(mMockContext, phoneNumber));
6069818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
6079818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
6089818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    private PersistableBundle getBundleWithInt(int value) {
6099818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        PersistableBundle bundle = new PersistableBundle();
6109818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        bundle.putInt(
6119818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                CarrierConfigManager.KEY_DURATION_BLOCKING_DISABLED_AFTER_EMERGENCY_INT, value);
6129818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        return bundle;
6139818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
6149818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
6159818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    private void verifyBlocksNotSuppressed() {
6169818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        SystemContract.BlockSuppressionStatus status =
6179818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                SystemContract.getBlockSuppressionStatus(mMockContext);
6189818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertFalse(status.isSuppressed);
6199818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertEquals(0, status.untilTimestampMillis);
6209818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
6219818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry
6229818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    private void assertValidBlockSuppressionExpiration(long timestampMillisBeforeEmergencyContact,
6239818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                                                       int blockSuppressionSeconds,
6249818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                                                       long actualExpirationMillis) {
6259818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertTrue(actualExpirationMillis
6269818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                >= timestampMillisBeforeEmergencyContact + blockSuppressionSeconds * 1000);
6279818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry        assertTrue(actualExpirationMillis < timestampMillisBeforeEmergencyContact +
6289818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry                2 * blockSuppressionSeconds * 1000);
6299818f71b95dc59d910881c519041b571eeb7b98fAbhijith Shastry    }
630e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry
631e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry    private void assertContents(int rowId, String originalNumber, String e164Number) {
632e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry        Uri uri = ContentUris.withAppendedId(BlockedNumbers.CONTENT_URI, rowId);
633e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry        try (Cursor c = mResolver.query(uri, null, null, null, null)) {
634e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry            assertEquals(1, c.getCount());
635e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry            c.moveToNext();
636e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry            assertEquals(3, c.getColumnCount());
637e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry            assertEquals(rowId, c.getInt(c.getColumnIndex(BlockedNumbers.COLUMN_ID)));
638e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry            assertEquals(originalNumber,
639e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry                    c.getString(c.getColumnIndex(BlockedNumbers.COLUMN_ORIGINAL_NUMBER)));
640e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry            assertEquals(e164Number,
641e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry                    c.getString(c.getColumnIndex(BlockedNumbers.COLUMN_E164_NUMBER)));
642e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry        }
643e8fb491bdf78294024d2013a4177d42b4358a859Abhijith Shastry    }
6446fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry
6456fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry    private String getEmergencyNumberFromSystemPropertiesOrDefault() {
6466fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry        String systemEmergencyNumbers = SystemProperties.get("ril.ecclist");
6476fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry        if (systemEmergencyNumbers == null) {
6486fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry            return "911";
6496fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry        } else {
6506fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry            return systemEmergencyNumbers.split(",")[0];
6516fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry        }
6526fe02e3a7b76dc8769b23012d044346f89dea567Abhijith Shastry    }
65328b6a0f277a997f5c117c3c5be3de604c7a38d12Makoto Onuki}
654