@@ -158,6 +158,44 @@ class PeripheralCharacteristicsDiscoverTest: BasePeripheralTest {
158158 XCTAssertError ( obs. events [ 0 ] . value, _BluetoothError. peripheralDisconnected ( peripheral, nil ) , " should receive peripheral disconnected error " )
159159 }
160160
161+ func testDiscoverCharacteristicsForConnectedPeripheralAfterADisconnection( ) {
162+ let mockCharacteristics = [
163+ createCharacteristic ( uuid: " 0x0000 " ) ,
164+ createCharacteristic ( uuid: " 0x0001 " )
165+ ]
166+
167+ let obs : ScheduledObservable < [ _Characteristic ] > = testScheduler. scheduleObservable {
168+ self . peripheral. discoverCharacteristics ( nil , for: self . service) . asObservable ( )
169+ }
170+
171+ testScheduler. scheduleAt ( subscribeTime + 100 ) {
172+ self . centralManagerMock. delegateWrapper. didDisconnectPeripheral. onNext ( ( self . peripheral. peripheral, nil ) )
173+ }
174+
175+ testScheduler. advanceTo ( subscribeTime + 100 )
176+
177+ XCTAssertEqual ( obs. events. count, 1 , " should receive one event " )
178+ XCTAssertError ( obs. events [ 0 ] . value, _BluetoothError. peripheralDisconnected ( peripheral, nil ) , " should receive peripheral disconnected error " )
179+
180+ // Check that after reconnection the service discovery still works
181+ let time = ObservableScheduleTimes ( createTime: subscribeTime + 200 , subscribeTime: subscribeTime + 300 , disposeTime: subscribeTime + 1000 )
182+ let obs1 : ScheduledObservable < [ _Characteristic ] > = testScheduler. scheduleObservable ( time: time) {
183+ self . peripheral. discoverCharacteristics ( nil , for: self . service) . asObservable ( )
184+ }
185+
186+ testScheduler. advanceTo ( subscribeTime + 400 )
187+
188+ testScheduler. scheduleAt ( subscribeTime + 500 ) {
189+ self . service. service. characteristics = mockCharacteristics
190+ self . peripheral. delegateWrapper. peripheralDidDiscoverCharacteristicsForService. asObserver ( ) . onNext ( ( self . service. service, nil ) )
191+ }
192+
193+ testScheduler. advanceTo ( subscribeTime + 600 )
194+
195+ XCTAssertEqual ( peripheral. peripheral. discoverCharacteristicsParams. count, 2 , " should call discover characteristics twice " )
196+ XCTAssertCharacteristicsList ( observable: obs1, uuids: mockCharacteristics. map { $0. uuid } )
197+ }
198+
161199 func testDiscoverCharacteristicsForDisabledBluetooth( ) {
162200 let obs : ScheduledObservable < [ _Characteristic ] > = testScheduler. scheduleObservable {
163201 self . peripheral. discoverCharacteristics ( nil , for: self . service) . asObservable ( )
0 commit comments