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