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.connecteddevice.usb; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import static org.mockito.ArgumentMatchers.anyLong; 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.app.Activity; 27 import android.content.Context; 28 import android.hardware.usb.UsbManager; 29 import android.hardware.usb.UsbPort; 30 import android.os.Handler; 31 import android.support.v14.preference.SwitchPreference; 32 import android.support.v7.preference.PreferenceCategory; 33 import android.support.v7.preference.PreferenceManager; 34 import android.support.v7.preference.PreferenceScreen; 35 36 import com.android.settings.R; 37 import com.android.settings.testutils.SettingsRobolectricTestRunner; 38 import com.android.settingslib.core.lifecycle.Lifecycle; 39 40 import org.junit.Before; 41 import org.junit.Test; 42 import org.junit.runner.RunWith; 43 import org.mockito.ArgumentCaptor; 44 import org.mockito.Mock; 45 import org.mockito.MockitoAnnotations; 46 import org.robolectric.RuntimeEnvironment; 47 import org.robolectric.annotation.Config; 48 49 @RunWith(SettingsRobolectricTestRunner.class) 50 public class UsbDetailsPowerRoleControllerTest { 51 52 private UsbDetailsPowerRoleController mDetailsPowerRoleController; 53 private Context mContext; 54 private Lifecycle mLifecycle; 55 private PreferenceCategory mPreference; 56 private PreferenceManager mPreferenceManager; 57 private PreferenceScreen mScreen; 58 59 @Mock 60 private UsbBackend mUsbBackend; 61 @Mock 62 private UsbDetailsFragment mFragment; 63 @Mock 64 private Activity mActivity; 65 @Mock 66 private Handler mHandler; 67 68 @Before 69 public void setUp() { 70 MockitoAnnotations.initMocks(this); 71 72 mContext = RuntimeEnvironment.application; 73 mLifecycle = new Lifecycle(() -> mLifecycle); 74 mPreferenceManager = new PreferenceManager(mContext); 75 mScreen = mPreferenceManager.createPreferenceScreen(mContext); 76 77 when(mFragment.getActivity()).thenReturn(mActivity); 78 when(mActivity.getApplicationContext()).thenReturn(mContext); 79 when(mFragment.getContext()).thenReturn(mContext); 80 when(mFragment.getPreferenceManager()).thenReturn(mPreferenceManager); 81 when(mFragment.getPreferenceScreen()).thenReturn(mScreen); 82 83 mDetailsPowerRoleController = new UsbDetailsPowerRoleController(mContext, mFragment, 84 mUsbBackend); 85 mPreference = new PreferenceCategory(mContext); 86 mPreference.setKey(mDetailsPowerRoleController.getPreferenceKey()); 87 mScreen.addPreference(mPreference); 88 89 mDetailsPowerRoleController.mHandler = mHandler; 90 } 91 92 @Test 93 public void displayRefresh_sink_shouldUncheck() { 94 mDetailsPowerRoleController.displayPreference(mScreen); 95 when(mUsbBackend.areAllRolesSupported()).thenReturn(true); 96 97 mDetailsPowerRoleController.refresh(true, UsbManager.FUNCTION_NONE, UsbPort.POWER_ROLE_SINK, 98 UsbPort.DATA_ROLE_DEVICE); 99 100 SwitchPreference pref = getPreference(); 101 assertThat(pref.isChecked()).isFalse(); 102 } 103 104 @Test 105 public void displayRefresh_source_shouldCheck() { 106 mDetailsPowerRoleController.displayPreference(mScreen); 107 when(mUsbBackend.areAllRolesSupported()).thenReturn(true); 108 109 mDetailsPowerRoleController.refresh(true, UsbManager.FUNCTION_NONE, 110 UsbPort.POWER_ROLE_SOURCE, UsbPort.DATA_ROLE_HOST); 111 112 SwitchPreference pref = getPreference(); 113 assertThat(pref.isChecked()).isTrue(); 114 } 115 116 @Test 117 public void displayRefresh_disconnected_shouldDisable() { 118 mDetailsPowerRoleController.displayPreference(mScreen); 119 when(mUsbBackend.areAllRolesSupported()).thenReturn(true); 120 121 mDetailsPowerRoleController.refresh(false, UsbManager.FUNCTION_NONE, 122 UsbPort.POWER_ROLE_SINK, UsbPort.DATA_ROLE_DEVICE); 123 124 assertThat(mPreference.isEnabled()).isFalse(); 125 assertThat(mScreen.findPreference(mDetailsPowerRoleController.getPreferenceKey())) 126 .isEqualTo(mPreference); 127 } 128 129 @Test 130 public void displayRefresh_notSupported_shouldRemove() { 131 mDetailsPowerRoleController.displayPreference(mScreen); 132 when(mUsbBackend.areAllRolesSupported()).thenReturn(false); 133 134 mDetailsPowerRoleController.refresh(true, UsbManager.FUNCTION_NONE, UsbPort.POWER_ROLE_SINK, 135 UsbPort.DATA_ROLE_DEVICE); 136 137 assertThat(mScreen.findPreference(mDetailsPowerRoleController.getPreferenceKey())).isNull(); 138 } 139 140 @Test 141 public void onClick_sink_shouldSetSource() { 142 mDetailsPowerRoleController.displayPreference(mScreen); 143 when(mUsbBackend.getPowerRole()).thenReturn(UsbPort.POWER_ROLE_SINK); 144 145 SwitchPreference pref = getPreference(); 146 pref.performClick(); 147 148 verify(mUsbBackend).setPowerRole(UsbPort.POWER_ROLE_SOURCE); 149 assertThat(pref.getSummary()) 150 .isEqualTo(mContext.getString(R.string.usb_switching)); 151 } 152 153 @Test 154 public void onClickTwice_sink_shouldSetSourceOnce() { 155 mDetailsPowerRoleController.displayPreference(mScreen); 156 when(mUsbBackend.getPowerRole()).thenReturn(UsbPort.POWER_ROLE_SINK); 157 158 SwitchPreference pref = getPreference(); 159 pref.performClick(); 160 161 assertThat(pref.getSummary()) 162 .isEqualTo(mContext.getString(R.string.usb_switching)); 163 pref.performClick(); 164 verify(mUsbBackend, times(1)).setPowerRole(UsbPort.POWER_ROLE_SOURCE); 165 } 166 167 @Test 168 public void onClickDeviceAndRefresh_success_shouldClearSubtext() { 169 mDetailsPowerRoleController.displayPreference(mScreen); 170 when(mUsbBackend.getPowerRole()).thenReturn(UsbPort.POWER_ROLE_SINK); 171 172 SwitchPreference pref = getPreference(); 173 pref.performClick(); 174 175 verify(mUsbBackend).setPowerRole(UsbPort.POWER_ROLE_SOURCE); 176 assertThat(pref.getSummary()) 177 .isEqualTo(mContext.getString(R.string.usb_switching)); 178 mDetailsPowerRoleController.refresh(false /* connected */, UsbManager.FUNCTION_NONE, 179 UsbPort.POWER_ROLE_NONE, UsbPort.DATA_ROLE_NONE); 180 mDetailsPowerRoleController.refresh(true /* connected */, UsbManager.FUNCTION_NONE, 181 UsbPort.POWER_ROLE_SOURCE, UsbPort.DATA_ROLE_DEVICE); 182 assertThat(pref.getSummary()).isEqualTo(""); 183 } 184 185 @Test 186 public void onClickDeviceAndRefresh_failed_shouldShowFailureText() { 187 mDetailsPowerRoleController.displayPreference(mScreen); 188 when(mUsbBackend.getPowerRole()).thenReturn(UsbPort.POWER_ROLE_SINK); 189 190 SwitchPreference pref = getPreference(); 191 pref.performClick(); 192 193 verify(mUsbBackend).setPowerRole(UsbPort.POWER_ROLE_SOURCE); 194 assertThat(pref.getSummary()) 195 .isEqualTo(mContext.getString(R.string.usb_switching)); 196 mDetailsPowerRoleController.refresh(false /* connected */, UsbManager.FUNCTION_NONE, 197 UsbPort.POWER_ROLE_NONE, UsbPort.DATA_ROLE_NONE); 198 mDetailsPowerRoleController.refresh(true /* connected */, UsbManager.FUNCTION_NONE, 199 UsbPort.POWER_ROLE_SINK, UsbPort.DATA_ROLE_DEVICE); 200 assertThat(pref.getSummary()) 201 .isEqualTo(mContext.getString(R.string.usb_switching_failed)); 202 } 203 204 205 @Test 206 public void onClickDevice_timedOut_shouldShowFailureText() { 207 mDetailsPowerRoleController.displayPreference(mScreen); 208 when(mUsbBackend.getPowerRole()).thenReturn(UsbPort.POWER_ROLE_SINK); 209 210 SwitchPreference pref = getPreference(); 211 pref.performClick(); 212 213 verify(mUsbBackend).setPowerRole(UsbPort.POWER_ROLE_SOURCE); 214 ArgumentCaptor<Runnable> captor = ArgumentCaptor.forClass(Runnable.class); 215 verify(mHandler).postDelayed(captor.capture(), anyLong()); 216 assertThat(pref.getSummary()) 217 .isEqualTo(mContext.getString(R.string.usb_switching)); 218 mDetailsPowerRoleController.refresh(false /* connected */, UsbManager.FUNCTION_NONE, 219 UsbPort.POWER_ROLE_NONE, UsbPort.DATA_ROLE_NONE); 220 captor.getValue().run(); 221 assertThat(pref.getSummary()) 222 .isEqualTo(mContext.getString(R.string.usb_switching_failed)); 223 } 224 225 226 private SwitchPreference getPreference() { 227 return (SwitchPreference) mPreference.getPreference(0); 228 } 229 } 230