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