1+ package com.vincentmasselis.devapp
2+
3+ import android.bluetooth.BluetoothManager
4+ import android.content.Context
5+ import androidx.test.ext.junit.runners.AndroidJUnit4
6+ import androidx.test.rule.ActivityTestRule
7+ import androidx.test.rule.GrantPermissionRule
8+ import com.vincentmasselis.rxbluetoothkotlin.*
9+ import com.vincentmasselis.rxuikotlin.postForUI
10+ import org.junit.Rule
11+ import org.junit.Test
12+ import org.junit.runner.RunWith
13+ import java.util.concurrent.TimeUnit
14+
15+ @RunWith(AndroidJUnit4 ::class )
16+ class DisconnectionTests {
17+
18+ @Rule
19+ @JvmField
20+ val permissionRule: GrantPermissionRule = GrantPermissionRule .grant(android.Manifest .permission.ACCESS_COARSE_LOCATION , android.Manifest .permission.BLUETOOTH_ADMIN )
21+
22+ @Rule
23+ @JvmField
24+ val mainActivityRule = ActivityTestRule (TestActivity ::class .java, true , false )
25+
26+ /* * Disconnects right after a connection is done */
27+ @Test
28+ fun disconnectionImmediatelyTest () {
29+ val activity = mainActivityRule.launchActivity(null )
30+ val gatt = (activity.getSystemService(Context .BLUETOOTH_SERVICE ) as BluetoothManager )
31+ .rxScan()
32+ .doOnSubscribe { activity.setMessage(" Please wakeup your device" ) }
33+ .filter { it.device.address == " E9:98:86:03:D5:9F" } // Write the mac address for your own device here
34+ .firstElement()
35+ .doOnSuccess { activity.setMessage(" Connecting" ) }
36+ .flatMapSingleElement { it.device.connectRxGatt(logger = Logger ) }
37+ .flatMap { gatt ->
38+ gatt.disconnect()
39+ gatt.whenConnectionIsReady().map { gatt }
40+ }
41+ .doOnSuccess { activity.setMessage(" Discovering services" ) }
42+ .flatMap { gatt -> gatt.discoverServices().doOnSubscribe { Logger .v(TAG , " Subscribing to fetch services" ) }.map { gatt } }
43+ .timeout(20 , TimeUnit .SECONDS )
44+ .doOnError { Logger .e(TAG , " Failed, reason :$it " ) }
45+ .blockingGet()
46+ check(gatt == null )
47+
48+ Thread .sleep(5000 )
49+
50+ mainActivityRule.finishActivity()
51+ }
52+
53+ /* * Disconnects 10 millis after a connection */
54+ @Test
55+ fun disconnection10msTest () {
56+ val activity = mainActivityRule.launchActivity(null )
57+ val gatt = (activity.getSystemService(Context .BLUETOOTH_SERVICE ) as BluetoothManager )
58+ .rxScan()
59+ .doOnSubscribe { activity.setMessage(" Please wakeup your device" ) }
60+ .filter { it.device.address == " E9:98:86:03:D5:9F" } // Write the mac address for your own device here
61+ .firstElement()
62+ .doOnSuccess { activity.setMessage(" Connecting" ) }
63+ .flatMapSingleElement { it.device.connectRxGatt(logger = Logger ) }
64+ .flatMap { gatt ->
65+ activity.postForUI(10L to TimeUnit .MILLISECONDS ) { gatt.disconnect() }
66+ gatt.whenConnectionIsReady().map { gatt }
67+ }
68+ .doOnSuccess { activity.setMessage(" Discovering services" ) }
69+ .flatMap { gatt -> gatt.discoverServices().doOnSubscribe { Logger .v(TAG , " Subscribing to fetch services" ) }.map { gatt } }
70+ .timeout(20 , TimeUnit .SECONDS )
71+ .doOnError { Logger .e(TAG , " Failed, reason :$it " ) }
72+ .blockingGet()
73+ check(gatt == null )
74+
75+ Thread .sleep(5000 )
76+
77+ mainActivityRule.finishActivity()
78+ }
79+
80+ /* * Disconnects 100 millis after a connection */
81+ @Test
82+ fun disconnection100msTest () {
83+ val activity = mainActivityRule.launchActivity(null )
84+ val gatt = (activity.getSystemService(Context .BLUETOOTH_SERVICE ) as BluetoothManager )
85+ .rxScan()
86+ .doOnSubscribe { activity.setMessage(" Please wakeup your device" ) }
87+ .filter { it.device.address == " E9:98:86:03:D5:9F" } // Write the mac address for your own device here
88+ .firstElement()
89+ .doOnSuccess { activity.setMessage(" Connecting" ) }
90+ .flatMapSingleElement { it.device.connectRxGatt(logger = Logger ) }
91+ .flatMap { gatt ->
92+ activity.postForUI(100L to TimeUnit .MILLISECONDS ) { gatt.disconnect() }
93+ gatt.whenConnectionIsReady().map { gatt }
94+ }
95+ .doOnSuccess { activity.setMessage(" Discovering services" ) }
96+ .flatMap { gatt -> gatt.discoverServices().doOnSubscribe { Logger .v(TAG , " Subscribing to fetch services" ) }.map { gatt } }
97+ .flatMap { it.listenDisconnection().toMaybe<RxBluetoothGatt >() }
98+ .timeout(20 , TimeUnit .SECONDS )
99+ .doOnError { Logger .e(TAG , " Failed, reason :$it " ) }
100+ .blockingGet()
101+ check(gatt == null )
102+
103+ Thread .sleep(5000 )
104+
105+ mainActivityRule.finishActivity()
106+ }
107+
108+ /* * Disconnects 5 second after a connection */
109+ @Test
110+ fun disconnection5sTest () {
111+ val activity = mainActivityRule.launchActivity(null )
112+ val gatt = (activity.getSystemService(Context .BLUETOOTH_SERVICE ) as BluetoothManager )
113+ .rxScan()
114+ .doOnSubscribe { activity.setMessage(" Please wakeup your device" ) }
115+ .filter { it.device.address == " E9:98:86:03:D5:9F" } // Write the mac address for your own device here
116+ .firstElement()
117+ .doOnSuccess { activity.setMessage(" Connecting" ) }
118+ .flatMapSingleElement { it.device.connectRxGatt(logger = Logger ) }
119+ .flatMap { gatt ->
120+ activity.postForUI(5L to TimeUnit .SECONDS ) { gatt.disconnect() }
121+ gatt.whenConnectionIsReady().map { gatt }
122+ }
123+ .doOnSuccess { activity.setMessage(" Discovering services" ) }
124+ .flatMap { gatt -> gatt.discoverServices().doOnSubscribe { Logger .v(TAG , " Subscribing to fetch services" ) }.map { gatt } }
125+ .flatMapCompletable { it.listenDisconnection().doOnSubscribe { Logger .v(TAG , " Listening for disconnection" ) } }
126+ .timeout(20 , TimeUnit .SECONDS )
127+ .doOnError { Logger .e(TAG , " Failed, reason :$it " ) }
128+ .blockingGet()
129+
130+ check(gatt == null )
131+
132+ Thread .sleep(5000 )
133+
134+ mainActivityRule.finishActivity()
135+ }
136+
137+ /* * Disconnects when reading the services */
138+ @Test
139+ fun disconnectionDiscoverServicesTest () {
140+ val activity = mainActivityRule.launchActivity(null )
141+ val gatt = (activity.getSystemService(Context .BLUETOOTH_SERVICE ) as BluetoothManager )
142+ .rxScan()
143+ .doOnSubscribe { activity.setMessage(" Please wakeup your device" ) }
144+ .filter { it.device.address == " E9:98:86:03:D5:9F" } // Write the mac address for your own device here
145+ .firstElement()
146+ .doOnSuccess { activity.setMessage(" Connecting" ) }
147+ .flatMapSingleElement { it.device.connectRxGatt(logger = Logger ) }
148+ .flatMap { gatt -> gatt.whenConnectionIsReady().map { gatt } }
149+ .doOnSuccess { activity.setMessage(" Discovering services" ) }
150+ .flatMap { gatt -> gatt.discoverServices().doOnSubscribe { Logger .v(TAG , " Subscribing to fetch services" ); gatt.disconnect() }.map { gatt } }
151+ .timeout(20 , TimeUnit .SECONDS )
152+ .doOnError { Logger .e(TAG , " Failed, reason :$it " ) }
153+ .blockingGet()
154+ check(gatt == null )
155+
156+ Thread .sleep(5000 )
157+
158+ mainActivityRule.finishActivity()
159+ }
160+
161+ companion object {
162+ const val TAG = " DisconnectionTests"
163+ }
164+ }
0 commit comments