• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.settings.nfc;
18 
19 import static com.google.common.truth.Truth.assertThat;
20 
21 import static org.mockito.Mockito.spy;
22 import static org.mockito.Mockito.times;
23 import static org.mockito.Mockito.verify;
24 import static org.mockito.Mockito.when;
25 
26 import android.content.Context;
27 import android.content.Intent;
28 import android.nfc.NfcAdapter;
29 import android.nfc.NfcManager;
30 import android.os.UserManager;
31 
32 import androidx.preference.PreferenceScreen;
33 
34 import com.android.settings.nfc.NfcPreferenceController.NfcSliceWorker;
35 import com.android.settings.nfc.NfcPreferenceController.NfcSliceWorker.NfcUpdateReceiver;
36 import com.android.settings.testutils.shadow.ShadowNfcAdapter;
37 import com.android.settingslib.widget.MainSwitchPreference;
38 
39 import org.junit.Before;
40 import org.junit.Test;
41 import org.junit.runner.RunWith;
42 import org.mockito.Mock;
43 import org.mockito.MockitoAnnotations;
44 import org.robolectric.RobolectricTestRunner;
45 import org.robolectric.RuntimeEnvironment;
46 import org.robolectric.annotation.Config;
47 import org.robolectric.shadow.api.Shadow;
48 import org.robolectric.util.ReflectionHelpers;
49 
50 import java.util.ArrayList;
51 import java.util.List;
52 
53 @RunWith(RobolectricTestRunner.class)
54 @Config(shadows = ShadowNfcAdapter.class)
55 public class NfcPreferenceControllerTest {
56 
57     @Mock
58     NfcManager mManager;
59     @Mock
60     private UserManager mUserManager;
61     @Mock
62     private PreferenceScreen mScreen;
63 
64     private Context mContext;
65     private MainSwitchPreference mNfcPreference;
66     private NfcPreferenceController mNfcController;
67     private ShadowNfcAdapter mShadowNfcAdapter;
68     private NfcAdapter mNfcAdapter;
69 
70     @Before
setUp()71     public void setUp() {
72         MockitoAnnotations.initMocks(this);
73         mContext = spy(RuntimeEnvironment.application);
74         mShadowNfcAdapter = Shadow.extract(NfcAdapter.getDefaultAdapter(mContext));
75         mNfcAdapter = NfcAdapter.getDefaultAdapter(mContext);
76 
77         when(mContext.getApplicationContext()).thenReturn(mContext);
78         when(mContext.getSystemService(Context.USER_SERVICE)).thenReturn(mUserManager);
79         when(mContext.getSystemService(Context.NFC_SERVICE)).thenReturn(mManager);
80 
81         mNfcController = new NfcPreferenceController(mContext,
82                 NfcPreferenceController.KEY_TOGGLE_NFC);
83         mNfcPreference = new MainSwitchPreference(RuntimeEnvironment.application);
84 
85         when(mScreen.findPreference(mNfcController.getPreferenceKey())).thenReturn(mNfcPreference);
86     }
87 
88     @Test
getAvailabilityStatus_hasNfc_shouldReturnAvailable()89     public void getAvailabilityStatus_hasNfc_shouldReturnAvailable() {
90         mShadowNfcAdapter.setEnabled(true);
91         assertThat(mNfcController.getAvailabilityStatus())
92                 .isEqualTo(NfcPreferenceController.AVAILABLE);
93     }
94 
95     @Test
getAvailabilityStatus_noNfcAdapter_shouldReturnDisabledUnsupported()96     public void getAvailabilityStatus_noNfcAdapter_shouldReturnDisabledUnsupported() {
97         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
98         assertThat(mNfcController.getAvailabilityStatus())
99                 .isEqualTo(NfcPreferenceController.UNSUPPORTED_ON_DEVICE);
100     }
101 
102     @Test
isNfcEnable_nfcStateNotTurning_shouldReturnTrue()103     public void isNfcEnable_nfcStateNotTurning_shouldReturnTrue() {
104         mNfcController.displayPreference(mScreen);
105         mShadowNfcAdapter.setAdapterState(NfcAdapter.STATE_ON);
106         mNfcController.onResume();
107         assertThat(mNfcPreference.isEnabled()).isTrue();
108 
109         mShadowNfcAdapter.setAdapterState(NfcAdapter.STATE_OFF);
110         mNfcController.onResume();
111         assertThat(mNfcPreference.isEnabled()).isTrue();
112     }
113 
114     @Test
isNfcEnable_nfcStateTurning_shouldReturnFalse()115     public void isNfcEnable_nfcStateTurning_shouldReturnFalse() {
116         mNfcController.displayPreference(mScreen);
117         mShadowNfcAdapter.setAdapterState(NfcAdapter.STATE_TURNING_ON);
118         mNfcController.onResume();
119         assertThat(mNfcPreference.isEnabled()).isFalse();
120 
121         mShadowNfcAdapter.setAdapterState(NfcAdapter.STATE_TURNING_OFF);
122         mNfcController.onResume();
123         assertThat(mNfcPreference.isEnabled()).isFalse();
124     }
125 
126     @Test
isNfcChecked_nfcStateOn_shouldReturnTrue()127     public void isNfcChecked_nfcStateOn_shouldReturnTrue() {
128         mNfcController.displayPreference(mScreen);
129         mShadowNfcAdapter.setAdapterState(NfcAdapter.STATE_ON);
130         mNfcController.onResume();
131         assertThat(mNfcPreference.isChecked()).isTrue();
132 
133         mShadowNfcAdapter.setAdapterState(NfcAdapter.STATE_TURNING_ON);
134         mNfcController.onResume();
135         assertThat(mNfcPreference.isChecked()).isTrue();
136     }
137 
138     @Test
isNfcChecked_nfcStateOff_shouldReturnFalse()139     public void isNfcChecked_nfcStateOff_shouldReturnFalse() {
140         mShadowNfcAdapter.setAdapterState(NfcAdapter.STATE_OFF);
141         mNfcController.onResume();
142         assertThat(mNfcPreference.isChecked()).isFalse();
143 
144         mShadowNfcAdapter.setAdapterState(NfcAdapter.STATE_TURNING_OFF);
145         mNfcController.onResume();
146         assertThat(mNfcPreference.isChecked()).isFalse();
147     }
148 
149     @Test
updateNonIndexableKeys_available_shouldNotUpdate()150     public void updateNonIndexableKeys_available_shouldNotUpdate() {
151         mShadowNfcAdapter.setEnabled(true);
152         final List<String> keys = new ArrayList<>();
153 
154         mNfcController.updateNonIndexableKeys(keys);
155 
156         assertThat(keys).isEmpty();
157     }
158 
159     @Test
updateNonIndexableKeys_notAvailable_shouldUpdate()160     public void updateNonIndexableKeys_notAvailable_shouldUpdate() {
161         ReflectionHelpers.setField(mNfcController, "mNfcAdapter", null);
162         final List<String> keys = new ArrayList<>();
163 
164         mNfcController.updateNonIndexableKeys(keys);
165 
166         assertThat(keys).hasSize(1);
167     }
168 
169     @Test
setChecked_True_nfcShouldEnable()170     public void setChecked_True_nfcShouldEnable() {
171         mNfcController.setChecked(true);
172         mNfcController.onResume();
173 
174         assertThat(mNfcAdapter.isEnabled()).isTrue();
175     }
176 
177     @Test
setChecked_False_nfcShouldDisable()178     public void setChecked_False_nfcShouldDisable() {
179         mNfcController.setChecked(false);
180         mNfcController.onResume();
181 
182         assertThat(mNfcAdapter.isEnabled()).isFalse();
183     }
184 
185     @Test
hasAsyncUpdate_shouldReturnTrue()186     public void hasAsyncUpdate_shouldReturnTrue() {
187         assertThat(mNfcController.hasAsyncUpdate()).isTrue();
188     }
189 
190     @Test
ncfSliceWorker_nfcBroadcast_noExtra_sliceDoesntUpdate()191     public void ncfSliceWorker_nfcBroadcast_noExtra_sliceDoesntUpdate() {
192         final NfcSliceWorker worker = spy(
193                 new NfcSliceWorker(mContext, mNfcController.getSliceUri()));
194         final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker);
195         final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
196 
197         receiver.onReceive(mContext, triggerIntent);
198 
199         verify(worker, times(0)).updateSlice();
200     }
201 
202     @Test
ncfSliceWorker_nfcBroadcast_turningOn_sliceDoesntUpdate()203     public void ncfSliceWorker_nfcBroadcast_turningOn_sliceDoesntUpdate() {
204         final NfcSliceWorker worker = spy(
205                 new NfcSliceWorker(mContext, mNfcController.getSliceUri()));
206         final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker);
207         final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
208         triggerIntent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_TURNING_ON);
209 
210         receiver.onReceive(mContext, triggerIntent);
211 
212         verify(worker, times(0)).updateSlice();
213     }
214 
215     @Test
ncfSliceWorker_nfcBroadcast_turningOff_sliceDoesntUpdate()216     public void ncfSliceWorker_nfcBroadcast_turningOff_sliceDoesntUpdate() {
217         final NfcSliceWorker worker = spy(
218                 new NfcSliceWorker(mContext, mNfcController.getSliceUri()));
219         final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker);
220         final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
221         triggerIntent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_TURNING_OFF);
222 
223         receiver.onReceive(mContext, triggerIntent);
224 
225         verify(worker, times(0)).updateSlice();
226     }
227 
228     @Test
ncfSliceWorker_nfcBroadcast_nfcOn_sliceUpdates()229     public void ncfSliceWorker_nfcBroadcast_nfcOn_sliceUpdates() {
230         final NfcSliceWorker worker = spy(
231                 new NfcSliceWorker(mContext, mNfcController.getSliceUri()));
232         final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker);
233         final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
234         triggerIntent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_ON);
235 
236         receiver.onReceive(mContext, triggerIntent);
237 
238         verify(worker).updateSlice();
239     }
240 
241     @Test
ncfSliceWorker_nfcBroadcast_nfcOff_sliceUpdates()242     public void ncfSliceWorker_nfcBroadcast_nfcOff_sliceUpdates() {
243         final NfcSliceWorker worker = spy(
244                 new NfcSliceWorker(mContext, mNfcController.getSliceUri()));
245         final NfcUpdateReceiver receiver = worker.new NfcUpdateReceiver(worker);
246         final Intent triggerIntent = new Intent(NfcAdapter.ACTION_ADAPTER_STATE_CHANGED);
247         triggerIntent.putExtra(NfcAdapter.EXTRA_ADAPTER_STATE, NfcAdapter.STATE_OFF);
248 
249         receiver.onReceive(mContext, triggerIntent);
250 
251         verify(worker).updateSlice();
252     }
253 
254     @Test
isPublicSlice_returnsTrue()255     public void isPublicSlice_returnsTrue() {
256         assertThat(mNfcController.isPublicSlice()).isTrue();
257     }
258 }
259