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