package com.android.settings.survey; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.IntentFilter; import android.support.v4.content.LocalBroadcastManager; import com.android.settings.testutils.SettingsRobolectricTestRunner; import com.android.settings.TestConfig; import com.android.settings.core.InstrumentedPreferenceFragment; import com.android.settings.overlay.SurveyFeatureProvider; import com.android.settings.testutils.FakeFeatureFactory; import java.util.ArrayList; import java.util.HashMap; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; import org.robolectric.RuntimeEnvironment; import org.robolectric.annotation.Config; import org.robolectric.util.ReflectionHelpers; @RunWith(SettingsRobolectricTestRunner.class) @Config(manifest = TestConfig.MANIFEST_PATH, sdk = TestConfig.SDK_VERSION) public class SurveyMixinTest { private static final String FAKE_KEY = "fake_key"; private static final String FAKE_SURVEY_ID = "fake_id"; private FakeFeatureFactory mFactory; private Context mContext; private SurveyFeatureProvider mProvider; @Mock private BroadcastReceiver mReceiver; @Mock private InstrumentedPreferenceFragment mFragment; @Before public void setUp() { // set up the fakefeature factory to mock out the survey provider MockitoAnnotations.initMocks(this); mContext = spy(RuntimeEnvironment.application.getApplicationContext()); FakeFeatureFactory.setupForTest(mContext); mFactory = (FakeFeatureFactory) FakeFeatureFactory.getFactory(mContext); mProvider = mFactory.getSurveyFeatureProvider(mContext); when(mProvider.getSurveyId(any(), eq(FAKE_KEY))).thenReturn(FAKE_SURVEY_ID); } @Test public void onResume_triesRegisteringReceiverAndDownloadingWhenNoSurveyDetected() { // Pretend there is no survey in memory when(mProvider.getSurveyExpirationDate(any(), any())).thenReturn(-1L); // Pretend we are an activity that is starting up Activity temp = Robolectric.setupActivity(Activity.class); when(mFragment.getActivity()).thenReturn(temp); SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); mixin.onResume(); // Verify that a download was attempted verify(mProvider, times(1)).downloadSurvey(any(), any(), any()); // Verify that we registered a receiver for download completion broadcasts verify(mProvider, times(1)).createAndRegisterReceiver(any()); // Verify we did not try to show a survey verify(mProvider, never()).showSurveyIfAvailable(any(), any()); } @Test public void onResume_triesShowingSurveyWhenOneIsPresent() { // Pretend there is a survey in memory when(mProvider.getSurveyExpirationDate(any(), any())).thenReturn(0L); // Pretend we are an activity that is starting up Activity temp = Robolectric.setupActivity(Activity.class); when(mFragment.getActivity()).thenReturn(temp); SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); mixin.onResume(); // Verify that a download was not attempted verify(mProvider, never()).downloadSurvey(any(), any(), any()); // Verify that we did not register a receiver verify(mProvider, never()).createAndRegisterReceiver(any()); // Verify we tried to show a survey verify(mProvider, times(1)).showSurveyIfAvailable(any(), any()); } @Test public void onResume_doesNothingWhenActivityIsNull() { // Pretend the activity died somewhere in the process when(mFragment.getActivity()).thenReturn(null); SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); mixin.onResume(); // Verify we don't try showing or downloading a survey verify(mProvider, never()).showSurveyIfAvailable(any(), any()); verify(mProvider, never()).downloadSurvey(any(), any(), any()); } @Test public void onPause_removesReceiverIfPreviouslySet() { // Pretend there is a survey in memory when(mProvider.getSurveyExpirationDate(any(), any())).thenReturn(-1L); // Pretend we are an activity that starts and stops Activity temp = Robolectric.setupActivity(Activity.class); when(mFragment.getActivity()).thenReturn(temp); when(mProvider.createAndRegisterReceiver(any())).thenReturn(mReceiver); LocalBroadcastManager manager = LocalBroadcastManager.getInstance(temp); SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); mixin.onResume(); manager.registerReceiver(mReceiver, new IntentFilter()); mixin.onPause(); // Verify we remove the receiver HashMap> map = ReflectionHelpers.getField(manager, "mReceivers"); assertThat(map.containsKey(mReceiver)).isFalse(); } @Test public void onPause_doesNothingWhenActivityOrReceiverNull() { // Pretend there is a survey in memory when(mProvider.getSurveyExpirationDate(any(), any())).thenReturn(-1L); // Pretend we are an activity that fails to create a receiver properly Activity temp = Robolectric.setupActivity(Activity.class); when(mFragment.getActivity()).thenReturn(temp); SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); mixin.onPause(); // Verify we do nothing; verify(mProvider, never()).showSurveyIfAvailable(any(), any()); // pretend the activity died before onPause when(mFragment.getActivity()).thenReturn(null); mixin.onPause(); // Verify we do nothing verify(mProvider, never()).showSurveyIfAvailable(any(), any()); } }