1 package org.robolectric.shadows;
2 
3 import static android.bluetooth.BluetoothDevice.BOND_BONDED;
4 import static android.bluetooth.BluetoothDevice.BOND_NONE;
5 import static android.os.Build.VERSION_CODES.JELLY_BEAN_MR2;
6 import static com.google.common.truth.Truth.assertThat;
7 import static org.robolectric.Shadows.shadowOf;
8 
9 import android.bluetooth.BluetoothAdapter;
10 import android.bluetooth.BluetoothDevice;
11 import android.bluetooth.BluetoothGattCallback;
12 import android.os.ParcelUuid;
13 import androidx.test.core.app.ApplicationProvider;
14 import androidx.test.ext.junit.runners.AndroidJUnit4;
15 import org.junit.Test;
16 import org.junit.runner.RunWith;
17 import org.robolectric.annotation.Config;
18 
19 @RunWith(AndroidJUnit4.class)
20 public class ShadowBluetoothDeviceTest {
21 
22   private static final String MOCK_MAC_ADDRESS = "00:11:22:33:AA:BB";
23 
24   @Test
canCreateBluetoothDeviceViaNewInstance()25   public void canCreateBluetoothDeviceViaNewInstance() throws Exception {
26     // This test passes as long as no Exception is thrown. It tests if the constructor can be
27     // executed without throwing an Exception when getService() is called inside.
28     BluetoothDevice bluetoothDevice = ShadowBluetoothDevice.newInstance(MOCK_MAC_ADDRESS);
29     assertThat(bluetoothDevice).isNotNull();
30   }
31 
32   @Test
canSetAndGetUuids()33   public void canSetAndGetUuids() throws Exception {
34     BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(MOCK_MAC_ADDRESS);
35     ParcelUuid[] uuids =
36         new ParcelUuid[] {
37           ParcelUuid.fromString("00000000-1111-2222-3333-000000000011"),
38           ParcelUuid.fromString("00000000-1111-2222-3333-0000000000aa")
39         };
40 
41     shadowOf(device).setUuids(uuids);
42     assertThat(device.getUuids()).isEqualTo(uuids);
43   }
44 
45   @Test
getUuids_setUuidsNotCalled_shouldReturnNull()46   public void getUuids_setUuidsNotCalled_shouldReturnNull() throws Exception {
47     BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(MOCK_MAC_ADDRESS);
48     assertThat(device.getUuids()).isNull();
49   }
50 
51   @Test
canSetAndGetBondState()52   public void canSetAndGetBondState() throws Exception {
53     BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(MOCK_MAC_ADDRESS);
54 
55     assertThat(device.getBondState()).isEqualTo(BOND_NONE);
56 
57     shadowOf(device).setBondState(BOND_BONDED);
58     assertThat(device.getBondState()).isEqualTo(BOND_BONDED);
59   }
60 
61   @Test
canSetAndGetCreatedBond()62   public void canSetAndGetCreatedBond() {
63     BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(MOCK_MAC_ADDRESS);
64 
65     assertThat(device.createBond()).isFalse();
66 
67     shadowOf(device).setCreatedBond(true);
68     assertThat(device.createBond()).isTrue();
69   }
70 
71   @Test
canSetAndGetFetchUuidsWithSdpResult()72   public void canSetAndGetFetchUuidsWithSdpResult() throws Exception {
73     BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(MOCK_MAC_ADDRESS);
74     assertThat(device.fetchUuidsWithSdp()).isFalse();
75 
76     shadowOf(device).setFetchUuidsWithSdpResult(true);
77     assertThat(device.fetchUuidsWithSdp()).isTrue();
78   }
79 
80   @Test
getCorrectFetchUuidsWithSdpCount()81   public void getCorrectFetchUuidsWithSdpCount() throws Exception {
82     BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(MOCK_MAC_ADDRESS);
83     assertThat(shadowOf(device).getFetchUuidsWithSdpCount()).isEqualTo(0);
84 
85     device.fetchUuidsWithSdp();
86     assertThat(shadowOf(device).getFetchUuidsWithSdpCount()).isEqualTo(1);
87 
88     device.fetchUuidsWithSdp();
89     assertThat(shadowOf(device).getFetchUuidsWithSdpCount()).isEqualTo(2);
90   }
91 
92   @Test
93   @Config(minSdk = JELLY_BEAN_MR2)
connectGatt_doesntCrash()94   public void connectGatt_doesntCrash() throws Exception {
95     BluetoothDevice bluetoothDevice = ShadowBluetoothDevice.newInstance(MOCK_MAC_ADDRESS);
96     assertThat(
97             bluetoothDevice.connectGatt(
98                 ApplicationProvider.getApplicationContext(), false, new BluetoothGattCallback() {}))
99         .isNotNull();
100   }
101 }
102