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