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