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