@Test public void verifyObserverDelegate() { final AtomicReference<CompletableObserver> atomicObserver = new AtomicReference<>(); final AtomicReference<CompletableObserver> atomicAutoDisposingObserver = new AtomicReference<>(); try { RxJavaPlugins.setOnCompletableSubscribe((source, observer) -> { if (atomicObserver.get() == null) { atomicObserver.set(observer); } else if (atomicAutoDisposingObserver.get() == null) { atomicAutoDisposingObserver.set(observer); RxJavaPlugins.setOnObservableSubscribe(null); } return observer; }); Completable.complete() .as(autoDisposable(ScopeProvider.UNBOUND)) .subscribe(); assertThat(atomicAutoDisposingObserver.get()).isNotNull(); assertThat(atomicAutoDisposingObserver.get()).isInstanceOf(AutoDisposingCompletableObserver.class); assertThat(((AutoDisposingCompletableObserver) atomicAutoDisposingObserver.get()).delegateObserver()).isNotNull(); assertThat(((AutoDisposingCompletableObserver) atomicAutoDisposingObserver.get()).delegateObserver()).isSameAs( atomicObserver.get()); } finally { RxJavaPlugins.reset(); } }
@Test public void verifyCancellation() { final AtomicInteger i = new AtomicInteger(); //noinspection unchecked because Java Completable source = Completable.create(e -> e.setCancellable(i::incrementAndGet)); CompletableSubject scope = CompletableSubject.create(); source.as(autoDisposable(scope)) .subscribe(); assertThat(i.get()).isEqualTo(0); assertThat(scope.hasObservers()).isTrue(); scope.onComplete(); // Verify cancellation was called assertThat(i.get()).isEqualTo(1); assertThat(scope.hasObservers()).isFalse(); }
@Test public void autoDispose_withLifecycleProvider_withoutStartingLifecycle_shouldFail() { BehaviorSubject<Integer> lifecycle = BehaviorSubject.create(); RecordingObserver<Integer> o = new RecordingObserver<>(LOGGER); LifecycleScopeProvider<Integer> provider = makeLifecycleProvider(lifecycle); Completable.complete() .as(autoDisposable(provider)) .subscribe(o); o.takeSubscribe(); assertThat(o.takeError()).isInstanceOf(LifecycleNotStartedException.class); }
@Test public void autoDispose_withMaybe_interrupted() { RecordingObserver<Integer> o = new RecordingObserver<>(LOGGER); CompletableSubject source = CompletableSubject.create(); CompletableSubject scope = CompletableSubject.create(); source.as(autoDisposable(scope)) .subscribe(o); o.takeSubscribe(); assertThat(source.hasObservers()).isTrue(); assertThat(scope.hasObservers()).isTrue(); // Lifecycle ends scope.onComplete(); assertThat(source.hasObservers()).isFalse(); assertThat(scope.hasObservers()).isFalse(); // Event if upstream emits, no one is listening source.onComplete(); o.assertNoMoreEvents(); }
@Test public void autoDispose_withProvider_completion() { RecordingObserver<Integer> o = new RecordingObserver<>(LOGGER); CompletableSubject source = CompletableSubject.create(); CompletableSubject scope = CompletableSubject.create(); ScopeProvider provider = makeProvider(scope); source.as(autoDisposable(provider)) .subscribe(o); o.takeSubscribe(); assertThat(source.hasObservers()).isTrue(); assertThat(scope.hasObservers()).isTrue(); source.onComplete(); o.assertOnComplete(); o.assertNoMoreEvents(); assertThat(source.hasObservers()).isFalse(); assertThat(scope.hasObservers()).isFalse(); }
@Test public void autoDispose_withMaybe_normal() { RecordingObserver<Integer> o = new RecordingObserver<>(LOGGER); CompletableSubject source = CompletableSubject.create(); CompletableSubject scope = CompletableSubject.create(); source.as(autoDisposable(scope)) .subscribe(o); o.takeSubscribe(); assertThat(source.hasObservers()).isTrue(); assertThat(scope.hasObservers()).isTrue(); // Got the event source.onComplete(); o.assertOnComplete(); // Nothing more, scope disposed too o.assertNoMoreEvents(); assertThat(source.hasObservers()).isFalse(); assertThat(scope.hasObservers()).isFalse(); }
@Test public void autoDispose_withLifecycleProvider_completion() { RecordingObserver<Integer> o = new RecordingObserver<>(LOGGER); CompletableSubject source = CompletableSubject.create(); BehaviorSubject<Integer> lifecycle = BehaviorSubject.createDefault(0); LifecycleScopeProvider<Integer> provider = makeLifecycleProvider(lifecycle); source.as(autoDisposable(provider)) .subscribe(o); o.takeSubscribe(); assertThat(source.hasObservers()).isTrue(); assertThat(lifecycle.hasObservers()).isTrue(); lifecycle.onNext(1); assertThat(source.hasObservers()).isTrue(); assertThat(lifecycle.hasObservers()).isTrue(); source.onComplete(); o.assertOnComplete(); o.assertNoMoreEvents(); assertThat(source.hasObservers()).isFalse(); assertThat(lifecycle.hasObservers()).isFalse(); }
@Test public void autoDispose_withLifecycleProvider_interrupted() { RecordingObserver<Integer> o = new RecordingObserver<>(LOGGER); CompletableSubject source = CompletableSubject.create(); BehaviorSubject<Integer> lifecycle = BehaviorSubject.createDefault(0); LifecycleScopeProvider<Integer> provider = makeLifecycleProvider(lifecycle); source.as(autoDisposable(provider)) .subscribe(o); o.takeSubscribe(); assertThat(source.hasObservers()).isTrue(); assertThat(lifecycle.hasObservers()).isTrue(); lifecycle.onNext(1); assertThat(source.hasObservers()).isTrue(); assertThat(lifecycle.hasObservers()).isTrue(); lifecycle.onNext(3); // All disposed assertThat(source.hasObservers()).isFalse(); assertThat(lifecycle.hasObservers()).isFalse(); // No one is listening source.onComplete(); o.assertNoMoreEvents(); }
@Test public void autoDispose_withProvider_interrupted() { RecordingObserver<Integer> o = new RecordingObserver<>(LOGGER); CompletableSubject source = CompletableSubject.create(); CompletableSubject scope = CompletableSubject.create(); ScopeProvider provider = makeProvider(scope); source.as(autoDisposable(provider)) .subscribe(o); o.takeSubscribe(); assertThat(source.hasObservers()).isTrue(); assertThat(scope.hasObservers()).isTrue(); scope.onComplete(); // All disposed assertThat(source.hasObservers()).isFalse(); assertThat(scope.hasObservers()).isFalse(); // No one is listening source.onComplete(); o.assertNoMoreEvents(); }
@Test public void autoDispose_withLifecycleProvider_afterLifecycle_shouldFail() { BehaviorSubject<Integer> lifecycle = BehaviorSubject.createDefault(0); lifecycle.onNext(1); lifecycle.onNext(2); lifecycle.onNext(3); RecordingObserver<Integer> o = new RecordingObserver<>(LOGGER); LifecycleScopeProvider<Integer> provider = makeLifecycleProvider(lifecycle); Completable.complete() .as(autoDisposable(provider)) .subscribe(o); o.takeSubscribe(); assertThat(o.takeError()).isInstanceOf(LifecycleEndedException.class); }