1 /* 2 * Copyright (C) 2021 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.car.settings.security; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.Mockito.doNothing; 22 import static org.mockito.Mockito.never; 23 import static org.mockito.Mockito.spy; 24 import static org.mockito.Mockito.verify; 25 import static org.mockito.Mockito.when; 26 27 import android.content.Context; 28 29 import androidx.fragment.app.FragmentManager; 30 import androidx.test.annotation.UiThreadTest; 31 import androidx.test.core.app.ApplicationProvider; 32 import androidx.test.ext.junit.runners.AndroidJUnit4; 33 import androidx.test.rule.ActivityTestRule; 34 35 import com.android.car.settings.R; 36 import com.android.car.settings.testutils.SinglePaneTestActivity; 37 38 import org.junit.Before; 39 import org.junit.Rule; 40 import org.junit.Test; 41 import org.junit.runner.RunWith; 42 import org.mockito.Mock; 43 import org.mockito.junit.MockitoJUnit; 44 import org.mockito.junit.MockitoRule; 45 46 /** 47 * Tests for ChooseLockPinPasswordFragment class. 48 */ 49 @RunWith(AndroidJUnit4.class) 50 public class ChooseLockPinPasswordFragmentTest { 51 private final Context mContext = ApplicationProvider.getApplicationContext(); 52 private ChooseLockPinPasswordFragment mFragment; 53 private FragmentManager mFragmentManager; 54 55 @Mock 56 PasswordHelper mMockPasswordHelper; 57 58 @Rule 59 public final MockitoRule rule = MockitoJUnit.rule(); 60 @Rule 61 public ActivityTestRule<SinglePaneTestActivity> mActivityTestRule = 62 new ActivityTestRule<>(SinglePaneTestActivity.class); 63 64 @Before setUp()65 public void setUp() { 66 mFragmentManager = mActivityTestRule.getActivity().getSupportFragmentManager(); 67 when(mMockPasswordHelper.getCredentialValidationErrorMessages()).thenReturn(""); 68 } 69 70 /** 71 * A test to verify that onComplete is called is finished when save worker succeeds 72 */ 73 @Test testOnCompleteIsCalledWhenSaveWorkerSucceeds()74 public void testOnCompleteIsCalledWhenSaveWorkerSucceeds() throws Throwable { 75 setUpFragment(/* isPin= */ true); 76 ChooseLockPinPasswordFragment spyFragment = spy(mFragment); 77 doNothing().when(spyFragment).onComplete(); 78 79 spyFragment.onChosenLockSaveFinished(true); 80 81 verify(spyFragment).onComplete(); 82 } 83 84 /** 85 * A test to verify that the UI stage is updated when save worker fails 86 */ 87 @Test testStageIsUpdatedWhenSaveWorkerFails()88 public void testStageIsUpdatedWhenSaveWorkerFails() throws Throwable { 89 setUpFragment(/* isPin= */ true); 90 ChooseLockPinPasswordFragment spyFragment = spy(mFragment); 91 doNothing().when(spyFragment).updateStage(ChooseLockPinPasswordFragment.Stage.SaveFailure); 92 93 spyFragment.onChosenLockSaveFinished(false); 94 95 verify(spyFragment, never()).onComplete(); 96 verify(spyFragment).updateStage(ChooseLockPinPasswordFragment.Stage.SaveFailure); 97 } 98 99 @Test 100 @UiThreadTest pin_saveFailure_hintSet()101 public void pin_saveFailure_hintSet() throws Throwable { 102 setUpFragment(/* isPin= */ true); 103 ChooseLockPinPasswordFragment spyFragment = spy(mFragment); 104 105 spyFragment.updateStage(ChooseLockPinPasswordFragment.Stage.SaveFailure); 106 107 assertThat(spyFragment.getHintText()).isEqualTo( 108 mContext.getString(R.string.error_saving_lockpin)); 109 } 110 111 @Test 112 @UiThreadTest pin_confirmWrong_hintSet()113 public void pin_confirmWrong_hintSet() throws Throwable { 114 setUpFragment(/* isPin= */ true); 115 ChooseLockPinPasswordFragment spyFragment = spy(mFragment); 116 117 spyFragment.updateStage(ChooseLockPinPasswordFragment.Stage.ConfirmWrong); 118 119 assertThat(spyFragment.getHintText()).isEqualTo( 120 mContext.getString(R.string.confirm_pins_dont_match)); 121 } 122 123 @Test 124 @UiThreadTest password_saveFailure_hintSet()125 public void password_saveFailure_hintSet() throws Throwable { 126 setUpFragment(/* isPin= */ false); 127 ChooseLockPinPasswordFragment spyFragment = spy(mFragment); 128 129 spyFragment.updateStage(ChooseLockPinPasswordFragment.Stage.SaveFailure); 130 131 assertThat(spyFragment.getHintText()).isEqualTo( 132 mContext.getString(R.string.error_saving_password)); 133 } 134 135 @Test 136 @UiThreadTest password_confirmWrong_hintSet()137 public void password_confirmWrong_hintSet() throws Throwable { 138 setUpFragment(/* isPin= */ false); 139 ChooseLockPinPasswordFragment spyFragment = spy(mFragment); 140 141 spyFragment.updateStage(ChooseLockPinPasswordFragment.Stage.ConfirmWrong); 142 143 assertThat(spyFragment.getHintText()).isEqualTo( 144 mContext.getString(R.string.confirm_passwords_dont_match)); 145 } 146 setUpFragment(boolean isPin)147 private void setUpFragment(boolean isPin) throws Throwable { 148 String chooseLockPinPasswordFragmentTag = "choose_lock_pin_password_fragment"; 149 mActivityTestRule.runOnUiThread(() -> { 150 mFragmentManager.beginTransaction() 151 .replace( 152 R.id.fragment_container, isPin 153 ? ChooseLockPinPasswordFragment.newPinInstance() 154 : ChooseLockPinPasswordFragment.newPasswordInstance(), 155 chooseLockPinPasswordFragmentTag) 156 .commitNow(); 157 }); 158 mFragment = (ChooseLockPinPasswordFragment) mFragmentManager 159 .findFragmentByTag(chooseLockPinPasswordFragmentTag); 160 mFragment.setPasswordHelper(mMockPasswordHelper); 161 } 162 } 163