@@ -765,15 +765,17 @@ public void replayIsUnsubscribed() {
765
765
ConnectableObservable <Integer > co = Observable .just (1 ).concatWith (Observable .<Integer >never ())
766
766
.replay ();
767
767
768
- assertTrue (((Disposable )co ).isDisposed ());
768
+ if (co instanceof Disposable ) {
769
+ assertTrue (((Disposable )co ).isDisposed ());
769
770
770
- Disposable connection = co .connect ();
771
+ Disposable connection = co .connect ();
771
772
772
- assertFalse (((Disposable )co ).isDisposed ());
773
+ assertFalse (((Disposable )co ).isDisposed ());
773
774
774
- connection .dispose ();
775
+ connection .dispose ();
775
776
776
- assertTrue (((Disposable )co ).isDisposed ());
777
+ assertTrue (((Disposable )co ).isDisposed ());
778
+ }
777
779
}
778
780
779
781
static final class BadObservableSubscribe extends ConnectableObservable <Object > {
@@ -1239,6 +1241,8 @@ public void cancelTerminateStateExclusion() {
1239
1241
1240
1242
o .cancel (null );
1241
1243
1244
+ o .cancel (new RefConnection (o ));
1245
+
1242
1246
RefConnection rc = new RefConnection (o );
1243
1247
o .connection = null ;
1244
1248
rc .subscriberCount = 0 ;
@@ -1274,5 +1278,71 @@ public void cancelTerminateStateExclusion() {
1274
1278
rc .connected = true ;
1275
1279
o .connection = rc ;
1276
1280
o .cancel (rc );
1281
+
1282
+ o .connection = rc ;
1283
+ o .cancel (new RefConnection (o ));
1284
+ }
1285
+
1286
+ @ Test
1287
+ public void replayRefCountShallBeThreadSafe () {
1288
+ for (int i = 0 ; i < TestHelper .RACE_LONG_LOOPS ; i ++) {
1289
+ Observable <Integer > observable = Observable .just (1 ).replay (1 ).refCount ();
1290
+
1291
+ TestObserver <Integer > observer1 = observable
1292
+ .subscribeOn (Schedulers .io ())
1293
+ .test ();
1294
+
1295
+ TestObserver <Integer > observer2 = observable
1296
+ .subscribeOn (Schedulers .io ())
1297
+ .test ();
1298
+
1299
+ observer1
1300
+ .withTag ("" + i )
1301
+ .awaitDone (5 , TimeUnit .SECONDS )
1302
+ .assertResult (1 );
1303
+
1304
+ observer2
1305
+ .withTag ("" + i )
1306
+ .awaitDone (5 , TimeUnit .SECONDS )
1307
+ .assertResult (1 );
1308
+ }
1309
+ }
1310
+
1311
+ static final class TestConnectableObservable <T > extends ConnectableObservable <T >
1312
+ implements Disposable {
1313
+
1314
+ volatile boolean disposed ;
1315
+
1316
+ @ Override
1317
+ public void dispose () {
1318
+ disposed = true ;
1319
+ }
1320
+
1321
+ @ Override
1322
+ public boolean isDisposed () {
1323
+ return disposed ;
1324
+ }
1325
+
1326
+ @ Override
1327
+ public void connect (Consumer <? super Disposable > connection ) {
1328
+ // not relevant
1329
+ }
1330
+
1331
+ @ Override
1332
+ protected void subscribeActual (Observer <? super T > observer ) {
1333
+ // not relevant
1334
+ }
1335
+ }
1336
+
1337
+ @ Test
1338
+ public void timeoutDisposesSource () {
1339
+ ObservableRefCount <Object > o = (ObservableRefCount <Object >)new TestConnectableObservable <Object >().refCount ();
1340
+
1341
+ RefConnection rc = new RefConnection (o );
1342
+ o .connection = rc ;
1343
+
1344
+ o .timeout (rc );
1345
+
1346
+ assertTrue (((Disposable )o .source ).isDisposed ());
1277
1347
}
1278
1348
}
0 commit comments