1 package org.robolectric.shadows; 2 3 import static android.os.Build.VERSION_CODES.Q; 4 import static android.os.Build.VERSION_CODES.P; 5 import static android.os.Build.VERSION_CODES.M; 6 import static android.os.Build.VERSION_CODES.N; 7 import static android.os.Build.VERSION_CODES.N_MR1; 8 import static com.google.common.truth.Truth.assertThat; 9 import static org.mockito.Mockito.when; 10 import static org.robolectric.Shadows.shadowOf; 11 import static org.robolectric.util.ReflectionHelpers.callInstanceMethod; 12 13 import android.content.Context; 14 import android.hardware.usb.UsbAccessory; 15 import android.hardware.usb.UsbDevice; 16 import android.hardware.usb.UsbManager; 17 import android.hardware.usb.UsbPort; 18 import android.hardware.usb.UsbPortStatus; 19 import androidx.test.core.app.ApplicationProvider; 20 import androidx.test.ext.junit.runners.AndroidJUnit4; 21 22 import java.lang.reflect.Method; 23 import java.util.Arrays; 24 import java.util.List; 25 import java.util.stream.Collectors; 26 import org.junit.Before; 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 import org.mockito.Mock; 30 import org.mockito.MockitoAnnotations; 31 import org.robolectric.annotation.Config; 32 33 /** Unit tests for {@link ShadowUsbManager}. */ 34 @RunWith(AndroidJUnit4.class) 35 public class ShadowUsbManagerTest { 36 private static final String DEVICE_NAME_1 = "usb1"; 37 private static final String DEVICE_NAME_2 = "usb2"; 38 private UsbManager usbManager; 39 private ShadowUsbManager shadowUsbManager; 40 41 @Mock UsbDevice usbDevice1; 42 @Mock UsbDevice usbDevice2; 43 @Mock UsbAccessory usbAccessory; 44 45 @Before 46 public void setUp() { 47 MockitoAnnotations.initMocks(this); 48 usbManager = 49 (UsbManager) 50 ApplicationProvider.getApplicationContext().getSystemService(Context.USB_SERVICE); 51 shadowUsbManager = shadowOf(usbManager); 52 53 when(usbDevice1.getDeviceName()).thenReturn(DEVICE_NAME_1); 54 when(usbDevice2.getDeviceName()).thenReturn(DEVICE_NAME_2); 55 } 56 57 @Test 58 public void getDeviceList() { 59 assertThat(usbManager.getDeviceList()).isEmpty(); 60 shadowUsbManager.addOrUpdateUsbDevice(usbDevice1, true); 61 shadowUsbManager.addOrUpdateUsbDevice(usbDevice2, true); 62 assertThat(usbManager.getDeviceList().values()) 63 .containsExactly(usbDevice1, usbDevice2); 64 } 65 66 @Test 67 public void hasPermission() { 68 assertThat(usbManager.hasPermission(usbDevice1)).isFalse(); 69 70 shadowUsbManager.addOrUpdateUsbDevice(usbDevice1, false); 71 shadowUsbManager.addOrUpdateUsbDevice(usbDevice2, false); 72 73 assertThat(usbManager.hasPermission(usbDevice1)).isFalse(); 74 assertThat(usbManager.hasPermission(usbDevice2)).isFalse(); 75 76 shadowUsbManager.addOrUpdateUsbDevice(usbDevice1, true); 77 78 assertThat(usbManager.hasPermission(usbDevice1)).isTrue(); 79 assertThat(usbManager.hasPermission(usbDevice2)).isFalse(); 80 } 81 82 @Test 83 @Config(minSdk = N) 84 public void grantPermission_selfPackage_shouldHavePermission() { 85 usbManager.grantPermission(usbDevice1); 86 87 assertThat(usbManager.hasPermission(usbDevice1)).isTrue(); 88 } 89 90 @Test 91 @Config(minSdk = N_MR1) 92 public void grantPermission_differentPackage_shouldHavePermission() { 93 usbManager.grantPermission(usbDevice1, "foo.bar"); 94 95 assertThat(shadowUsbManager.hasPermissionForPackage(usbDevice1, "foo.bar")).isTrue(); 96 } 97 98 @Test 99 @Config(minSdk = N_MR1) 100 public void revokePermission_shouldNotHavePermission() { 101 usbManager.grantPermission(usbDevice1, "foo.bar"); 102 assertThat(shadowUsbManager.hasPermissionForPackage(usbDevice1, "foo.bar")).isTrue(); 103 104 shadowUsbManager.revokePermission(usbDevice1, "foo.bar"); 105 106 assertThat(shadowUsbManager.hasPermissionForPackage(usbDevice1, "foo.bar")).isFalse(); 107 } 108 109 @Test 110 @Config(minSdk = M, maxSdk = P) 111 public void getPorts_shouldReturnAddedPortsMtoP() { 112 shadowUsbManager.addPort("port1"); 113 shadowUsbManager.addPort("port2"); 114 shadowUsbManager.addPort("port3"); 115 116 UsbPort[] usbPorts = callInstanceMethod(usbManager, "getPorts"); 117 assertThat(usbPorts).hasLength(3); 118 assertThat(Arrays.stream(usbPorts).map(UsbPort::getId).collect(Collectors.toList())) 119 .containsExactly("port1", "port2", "port3"); 120 } 121 122 @Test 123 @Config(minSdk = Q) 124 public void getPorts_shouldReturnAddedPorts() { 125 shadowUsbManager.addPort("port1"); 126 shadowUsbManager.addPort("port2"); 127 shadowUsbManager.addPort("port3"); 128 129 List<UsbPort> usbPorts = usbManager.getPorts(); 130 assertThat(usbPorts).hasSize(3); 131 assertThat(usbPorts.stream().map(UsbPort::getId).collect(Collectors.toList())) 132 .containsExactly("port1", "port2", "port3"); 133 } 134 135 @Test 136 @Config(minSdk = Q) 137 public void clearPorts_shouldRemoveAllPorts() { 138 shadowUsbManager.addPort("port1"); 139 shadowUsbManager.clearPorts(); 140 141 List<UsbPort> usbPorts = usbManager.getPorts(); 142 assertThat(usbPorts).isEmpty(); 143 } 144 145 @Test 146 @Config(minSdk = Q) 147 public void setPortRoles_sinkHost_shouldSetPortStatus() { 148 shadowUsbManager.addPort("port1"); 149 150 List<UsbPort> usbPorts = usbManager.getPorts(); 151 usbPorts.get(0).setRoles(UsbPortStatus.POWER_ROLE_SINK, UsbPortStatus.DATA_ROLE_HOST); 152 153 UsbPortStatus usbPortStatus = usbPorts.get(0).getStatus(); 154 assertThat(usbPortStatus.getCurrentPowerRole()).isEqualTo(UsbPortStatus.POWER_ROLE_SINK); 155 assertThat(usbPortStatus.getCurrentDataRole()).isEqualTo(UsbPortStatus.DATA_ROLE_HOST); 156 } 157 158 @Test 159 public void removeDevice() { 160 assertThat(usbManager.getDeviceList()).isEmpty(); 161 shadowUsbManager.addOrUpdateUsbDevice(usbDevice1, false); 162 shadowUsbManager.addOrUpdateUsbDevice(usbDevice2, false); 163 164 assertThat(usbManager.getDeviceList().values()) 165 .containsExactly(usbDevice1, usbDevice2); 166 167 shadowUsbManager.removeUsbDevice(usbDevice1); 168 assertThat(usbManager.getDeviceList().values()).containsExactly(usbDevice2); 169 } 170 171 @Test 172 public void openAccessory() { 173 assertThat(usbManager.openAccessory(usbAccessory)).isNotNull(); 174 } 175 176 @Test 177 public void setAccessory() { 178 assertThat(usbManager.getAccessoryList()).isNull(); 179 shadowUsbManager.setAttachedUsbAccessory(usbAccessory); 180 assertThat(usbManager.getAccessoryList()).hasLength(1); 181 assertThat(usbManager.getAccessoryList()[0]).isEqualTo(usbAccessory); 182 } 183 } 184