1 package com.android.settings.survey; 2 3 import static com.google.common.truth.Truth.assertThat; 4 import static org.mockito.Matchers.any; 5 import static org.mockito.Matchers.eq; 6 import static org.mockito.Mockito.never; 7 import static org.mockito.Mockito.times; 8 import static org.mockito.Mockito.verify; 9 import static org.mockito.Mockito.when; 10 11 import android.app.Activity; 12 import android.content.BroadcastReceiver; 13 import android.content.Context; 14 import android.content.IntentFilter; 15 import android.support.v4.content.LocalBroadcastManager; 16 17 import com.android.settings.core.InstrumentedPreferenceFragment; 18 import com.android.settings.overlay.SurveyFeatureProvider; 19 import com.android.settings.testutils.FakeFeatureFactory; 20 import com.android.settings.testutils.SettingsRobolectricTestRunner; 21 22 import org.junit.Before; 23 import org.junit.Test; 24 import org.junit.runner.RunWith; 25 import org.mockito.Mock; 26 import org.mockito.MockitoAnnotations; 27 import org.robolectric.Robolectric; 28 import org.robolectric.RuntimeEnvironment; 29 import org.robolectric.util.ReflectionHelpers; 30 31 import java.util.ArrayList; 32 import java.util.HashMap; 33 34 @RunWith(SettingsRobolectricTestRunner.class) 35 public class SurveyMixinTest { 36 37 private static final String FAKE_KEY = "fake_key"; 38 private static final String FAKE_SURVEY_ID = "fake_id"; 39 40 private Context mContext; 41 private SurveyFeatureProvider mProvider; 42 @Mock 43 private BroadcastReceiver mReceiver; 44 @Mock 45 private InstrumentedPreferenceFragment mFragment; 46 47 @Before 48 public void setUp() { 49 // set up the fakefeature factory to mock out the survey provider 50 MockitoAnnotations.initMocks(this); 51 mContext = RuntimeEnvironment.application; 52 mProvider = FakeFeatureFactory.setupForTest().getSurveyFeatureProvider(mContext); 53 when(mProvider.getSurveyId(any(), eq(FAKE_KEY))).thenReturn(FAKE_SURVEY_ID); 54 } 55 56 @Test 57 public void onResume_triesRegisteringReceiverAndDownloadingWhenNoSurveyDetected() { 58 // Pretend there is no survey in memory 59 when(mProvider.getSurveyExpirationDate(any(), any())).thenReturn(-1L); 60 61 // Pretend we are an activity that is starting up 62 Activity temp = Robolectric.setupActivity(Activity.class); 63 when(mFragment.getActivity()).thenReturn(temp); 64 SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); 65 mixin.onResume(); 66 67 // Verify that a download was attempted 68 verify(mProvider, times(1)).downloadSurvey(any(), any(), any()); 69 // Verify that we registered a receiver for download completion broadcasts 70 verify(mProvider, times(1)).createAndRegisterReceiver(any()); 71 // Verify we did not try to show a survey 72 verify(mProvider, never()).showSurveyIfAvailable(any(), any()); 73 } 74 75 @Test 76 public void onResume_triesShowingSurveyWhenOneIsPresent() { 77 // Pretend there is a survey in memory 78 when(mProvider.getSurveyExpirationDate(any(), any())).thenReturn(0L); 79 80 // Pretend we are an activity that is starting up 81 Activity temp = Robolectric.setupActivity(Activity.class); 82 when(mFragment.getActivity()).thenReturn(temp); 83 SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); 84 mixin.onResume(); 85 86 // Verify that a download was not attempted 87 verify(mProvider, never()).downloadSurvey(any(), any(), any()); 88 // Verify that we did not register a receiver 89 verify(mProvider, never()).createAndRegisterReceiver(any()); 90 // Verify we tried to show a survey 91 verify(mProvider, times(1)).showSurveyIfAvailable(any(), any()); 92 } 93 94 @Test 95 public void onResume_doesNothingWhenActivityIsNull() { 96 // Pretend the activity died somewhere in the process 97 when(mFragment.getActivity()).thenReturn(null); 98 SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); 99 mixin.onResume(); 100 101 // Verify we don't try showing or downloading a survey 102 verify(mProvider, never()).showSurveyIfAvailable(any(), any()); 103 verify(mProvider, never()).downloadSurvey(any(), any(), any()); 104 } 105 106 @Test 107 public void onPause_removesReceiverIfPreviouslySet() { 108 // Pretend there is a survey in memory 109 when(mProvider.getSurveyExpirationDate(any(), any())).thenReturn(-1L); 110 111 // Pretend we are an activity that starts and stops 112 Activity temp = Robolectric.setupActivity(Activity.class); 113 when(mFragment.getActivity()).thenReturn(temp); 114 when(mProvider.createAndRegisterReceiver(any())).thenReturn(mReceiver); 115 LocalBroadcastManager manager = LocalBroadcastManager.getInstance(temp); 116 SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); 117 mixin.onResume(); 118 manager.registerReceiver(mReceiver, new IntentFilter()); 119 mixin.onPause(); 120 121 // Verify we remove the receiver 122 HashMap<BroadcastReceiver, ArrayList<IntentFilter>> map = 123 ReflectionHelpers.getField(manager, "mReceivers"); 124 assertThat(map.containsKey(mReceiver)).isFalse(); 125 } 126 127 @Test 128 public void onPause_doesNothingWhenActivityOrReceiverNull() { 129 // Pretend there is a survey in memory 130 when(mProvider.getSurveyExpirationDate(any(), any())).thenReturn(-1L); 131 132 // Pretend we are an activity that fails to create a receiver properly 133 Activity temp = Robolectric.setupActivity(Activity.class); 134 when(mFragment.getActivity()).thenReturn(temp); 135 SurveyMixin mixin = new SurveyMixin(mFragment, FAKE_KEY); 136 mixin.onPause(); 137 138 // Verify we do nothing; 139 verify(mProvider, never()).showSurveyIfAvailable(any(), any()); 140 141 // pretend the activity died before onPause 142 when(mFragment.getActivity()).thenReturn(null); 143 mixin.onPause(); 144 145 // Verify we do nothing 146 verify(mProvider, never()).showSurveyIfAvailable(any(), any()); 147 } 148 } 149