Home | History | Annotate | Download | only in shadows
      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