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