169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell/* 269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * Copyright (C) 2016 The Android Open Source Project 369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * 469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * Licensed under the Apache License, Version 2.0 (the "License"); 569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * you may not use this file except in compliance with the License. 669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * You may obtain a copy of the License at 769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * 869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * http://www.apache.org/licenses/LICENSE-2.0 969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * 1069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * Unless required by applicable law or agreed to in writing, software 1169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * distributed under the License is distributed on an "AS IS" BASIS, 1269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * See the License for the specific language governing permissions and 1469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell * limitations under the License. 1569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell */ 1669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 1769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellpackage com.android.dialer.filterednumber; 1869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 1969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport android.content.ContentUris; 2069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport android.content.ContentValues; 2169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport android.provider.BlockedNumberContract; 2269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport android.provider.BlockedNumberContract.BlockedNumbers; 2369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport android.test.AndroidTestCase; 2469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport android.test.mock.MockContentResolver; 2569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 2669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport com.android.contacts.common.compat.CompatUtils; 2769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport com.android.contacts.common.test.mocks.MockContentProvider; 2869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport com.android.dialer.compat.FilteredNumberCompat; 2969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport com.android.dialer.database.FilteredNumberContract; 3069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport com.android.dialer.database.FilteredNumberContract.FilteredNumber; 3169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport com.android.dialer.database.FilteredNumberContract.FilteredNumberColumns; 3269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 3369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport org.mockito.Mock; 3469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport org.mockito.MockitoAnnotations; 3569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 3669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport java.util.concurrent.CountDownLatch; 3769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellimport java.util.concurrent.TimeUnit; 3869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 3969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwellpublic class BlockedNumbersMigratorTest extends AndroidTestCase { 4069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 4169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private static final String NUMBER = "6502530000"; 4269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private static final String NUMBER1 = "6502530001"; 4369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private static final String NUMBER2 = "6502530002"; 4469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 4569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell @Mock private BlockedNumbersMigrator.Listener mListener; 4669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private final MockContentResolver mContentResolver = new MockContentResolver(); 4769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private final MockContentProvider mContentProvider = new MockContentProvider(); 4869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private BlockedNumbersMigrator mMigrator; 4969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 5069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell @Override 5169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void setUp() throws Exception { 5269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell super.setUp(); 5369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell MockitoAnnotations.initMocks(this); 5469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell FilteredNumberCompat.setIsEnabledForTest(true); 5569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mContentResolver.addProvider(FilteredNumberContract.AUTHORITY, mContentProvider); 5669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mContentResolver.addProvider(BlockedNumberContract.AUTHORITY, mContentProvider); 5769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mMigrator = new BlockedNumbersMigrator(mContentResolver); 5869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 5969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 6069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void testConstructor_NullContentResolver() { 6169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell try { 6269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell new BlockedNumbersMigrator(null); 6369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell fail(); 6469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } catch (NullPointerException e) {} 6569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 6669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 6769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void testMigrate_M() { 6869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell if (CompatUtils.isNCompatible()) { 6969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell return; 7069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 7169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell assertFalse(mMigrator.migrate(mListener)); 7269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 7369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 7469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void testMigrate_N_Disabled() { 7569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell if (!CompatUtils.isNCompatible()) { 7669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell return; 7769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 7869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell FilteredNumberCompat.setIsEnabledForTest(false); 7969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell assertFalse(mMigrator.migrate(mListener)); 8069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 8169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 8269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void testMigrate_N_NullListener() { 8369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell if (!CompatUtils.isNCompatible()) { 8469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell return; 8569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 8669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell try { 8769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mMigrator.migrate(null); 8869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell fail(); 8969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } catch (NullPointerException e) {} 9069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 9169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 9269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void testMigrate_N() throws InterruptedException { 9369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell if (!CompatUtils.isNCompatible()) { 9469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell return; 9569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 9669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mContentProvider.expectQuery(FilteredNumber.CONTENT_URI) 9769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell .withProjection(FilteredNumberColumns.NUMBER).returnRow(NUMBER).returnRow(NUMBER1) 9869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell .returnRow(NUMBER2); 9969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 10069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell setUpNewBlockedNumberExpectations(mContentProvider, NUMBER, 0); 10169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell setUpNewBlockedNumberExpectations(mContentProvider, NUMBER1, 1); 10269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell setUpNewBlockedNumberExpectations(mContentProvider, NUMBER2, 2); 10369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 10469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell MigrationListener listener = new MigrationListener(); 10569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell assertTrue(mMigrator.migrate(listener)); 10669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell listener.waitForCallback(); 10769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking()); 10869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mContentProvider.verify(); 10969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 11069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 11169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void testMigrate_N_AlreadyBlocked() throws InterruptedException { 11269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell if (!CompatUtils.isNCompatible()) { 11369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell return; 11469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 11569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mContentProvider.expectQuery(FilteredNumber.CONTENT_URI) 11669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell .withProjection(FilteredNumberColumns.NUMBER).returnRow(NUMBER); 11769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mContentProvider.expectQuery(BlockedNumbers.CONTENT_URI) 11869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell .withProjection(BlockedNumbers.COLUMN_ID) 11969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell .withSelection(BlockedNumbers.COLUMN_ORIGINAL_NUMBER + " = ?", NUMBER).returnRow(0); 12069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell // No expectation for insert into BlockedNumbers.CONTENT_URI because it's already there 12169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 12269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell MigrationListener listener = new MigrationListener(); 12369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell assertTrue(mMigrator.migrate(listener)); 12469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell listener.waitForCallback(); 12569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking()); 12669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mContentProvider.verify(); 12769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 12869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 12969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private void setUpNewBlockedNumberExpectations(MockContentProvider contentProvider, 13069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell String number, int returnId) { 13169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell contentProvider.expectQuery(BlockedNumbers.CONTENT_URI) 13269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell .withProjection(BlockedNumbers.COLUMN_ID) 13369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell .withSelection(BlockedNumbers.COLUMN_ORIGINAL_NUMBER + " = ?", number).returnEmptyCursor(); 13469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell contentProvider.expectInsert(BlockedNumbers.CONTENT_URI, 13569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell createBlockedNumberInsertValues(number), 13669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell ContentUris.withAppendedId(BlockedNumbers.CONTENT_URI, returnId)); 13769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 13869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 13969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private ContentValues createBlockedNumberInsertValues(String number) { 14069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell ContentValues values = new ContentValues(); 14169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell values.put(BlockedNumbers.COLUMN_ORIGINAL_NUMBER, number); 14269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell return values; 14369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 14469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 14569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private static class MigrationListener implements BlockedNumbersMigrator.Listener { 14669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 14769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell private final CountDownLatch mOnCompleteCalled = new CountDownLatch(1); 14869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 14969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell @Override 15069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void onComplete() { 15169be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell mOnCompleteCalled.countDown(); 15269be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 15369be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell 15469be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell public void waitForCallback() throws InterruptedException { 15569be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell if (!mOnCompleteCalled.await(5000, TimeUnit.MILLISECONDS)) { 15669be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell throw new IllegalStateException("Waiting on callback timed out."); 15769be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 15869be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 15969be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell } 16069be29f2251e28a2685ed5b44bfb438ddea38ff8Brandon Maxwell} 161