/* * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.dialer.filterednumber; import static org.mockito.Matchers.any; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.never; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.content.SharedPreferences; import android.preference.PreferenceManager; import android.test.AndroidTestCase; import com.android.contacts.common.compat.CompatUtils; import com.android.dialer.compat.FilteredNumberCompat; import com.android.dialer.database.FilteredNumberAsyncQueryHandler; import com.android.dialer.database.FilteredNumberAsyncQueryHandler.OnHasBlockedNumbersListener; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.mockito.invocation.InvocationOnMock; import org.mockito.stubbing.Answer; public class BlockedNumbersAutoMigratorTest extends AndroidTestCase { private static final String HAS_CHECKED_AUTO_MIGRATE_KEY_FOR_TEST = "checkedAutoMigrateForTest"; @Mock private FilteredNumberAsyncQueryHandler mockQueryHandler; private SharedPreferences sharedPreferences; private BlockedNumbersAutoMigrator blockedNumbersAutoMigrator; @Override public void setUp() throws Exception { super.setUp(); MockitoAnnotations.initMocks(this); FilteredNumberCompat.setContextForTest(getContext()); FilteredNumberCompat.setHasMigratedToNewBlocking(false); sharedPreferences = PreferenceManager.getDefaultSharedPreferences(getContext()); // SharedPreference state isn't cleaned up between each test automatically, clear it now sharedPreferences.edit().clear().apply(); blockedNumbersAutoMigrator = new BlockedNumbersAutoMigrator(sharedPreferences, mockQueryHandler); } public void testConstructor_NullSharedPreferences() { try { new BlockedNumbersAutoMigrator(null, mockQueryHandler); fail(); } catch (NullPointerException e) { } } public void testConstructor_NullQueryHandler() { try { new BlockedNumbersAutoMigrator(sharedPreferences, null); fail(); } catch (NullPointerException e) { } } public void testAutoMigrate_M() { if (CompatUtils.isNCompatible()) { return; } blockedNumbersAutoMigrator.autoMigrate(); verify(mockQueryHandler, never()).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); } public void testAutoMigrate_AlreadyMigrated() { if (!CompatUtils.isNCompatible()) { return; } FilteredNumberCompat.setHasMigratedToNewBlocking(true); blockedNumbersAutoMigrator.autoMigrate(); verify(mockQueryHandler, never()).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); } public void testAutoMigrate_AlreadyChecked() { if (!CompatUtils.isNCompatible()) { return; } sharedPreferences.edit() .putBoolean(HAS_CHECKED_AUTO_MIGRATE_KEY_FOR_TEST, true) .apply(); blockedNumbersAutoMigrator.autoMigrate(); verify(mockQueryHandler, never()).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); } public void testAutoMigrate_HasNumbers() { if (!CompatUtils.isNCompatible()) { return; } setupFilteredNumberHasBlockedNumbersExpectation(true); blockedNumbersAutoMigrator.autoMigrate(); verify(mockQueryHandler).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); assertFalse(FilteredNumberCompat.hasMigratedToNewBlocking()); } public void testAutoMigrate_HasNumbers_MultipleCalls() { if (!CompatUtils.isNCompatible()) { return; } setupFilteredNumberHasBlockedNumbersExpectation(true); blockedNumbersAutoMigrator.autoMigrate(); blockedNumbersAutoMigrator.autoMigrate(); verify(mockQueryHandler, times(1)) .hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); assertFalse(FilteredNumberCompat.hasMigratedToNewBlocking()); } public void testAutoMigrate_NoNumbers() { if (!CompatUtils.isNCompatible()) { return; } setupFilteredNumberHasBlockedNumbersExpectation(false); blockedNumbersAutoMigrator.autoMigrate(); verify(mockQueryHandler).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking()); } public void testAutoMigrate_NoNumbers_MultipleCalls() { if (!CompatUtils.isNCompatible()) { return; } setupFilteredNumberHasBlockedNumbersExpectation(false); blockedNumbersAutoMigrator.autoMigrate(); blockedNumbersAutoMigrator.autoMigrate(); verify(mockQueryHandler, times(1)) .hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking()); } public void testAutoMigrate_SimulateClearingAppData() { if (!CompatUtils.isNCompatible()) { return; } setupFilteredNumberHasBlockedNumbersExpectation(true); blockedNumbersAutoMigrator.autoMigrate(); // Clearing app data removes the sharedPreferences and all of the blocked numbers sharedPreferences.edit().clear().apply(); setupFilteredNumberHasBlockedNumbersExpectation(false); blockedNumbersAutoMigrator.autoMigrate(); verify(mockQueryHandler, times(2)) .hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); assertTrue(FilteredNumberCompat.hasMigratedToNewBlocking()); } /* * Sets up the {@link #mockQueryHandler} to call the {@link OnHasBlockedNumbersListener} with * the given hasBlockedNumbers value as the parameter, when * {@link FilteredNumberAsyncQueryHandler#hasBlockedNumbers} is called. */ private void setupFilteredNumberHasBlockedNumbersExpectation(final boolean hasBlockedNumbers) { doAnswer(new Answer() { @Override public Void answer(InvocationOnMock invocation) throws Throwable { ((OnHasBlockedNumbersListener) invocation.getArguments()[0]) .onHasBlockedNumbers(hasBlockedNumbers); return null; } }).when(mockQueryHandler).hasBlockedNumbers(any(OnHasBlockedNumbersListener.class)); } }