protected <T> void setupBaseObservableResolution(final BaseObservable<T> baseObservable, final GoogleApiClient apiClient) { doAnswer(invocation -> { doAnswer(invocation1 -> { try { final Field observableSetField = BaseRx.class.getDeclaredField("observableSet"); observableSetField.setAccessible(true); ((Set<BaseRx>)observableSetField.get(baseObservable)).add(baseObservable); } catch(Exception e) { } return null; }).when(apiClient).connect(); return apiClient; }).when(baseObservable).createApiClient(Matchers.any(BaseRx.ApiClientConnectionCallbacks.class)); }
protected <T> void setupBaseObservableSuccess(final BaseObservable<T> baseObservable, final GoogleApiClient apiClient) { doAnswer(invocation -> { final ObservableEmitter<T> subscriber = ((BaseObservable.ApiClientConnectionCallbacks)invocation.getArguments()[0]).subscriber; doAnswer(invocation1 -> { baseObservable.onGoogleApiClientReady(apiClient, subscriber); return null; }).when(apiClient).connect(); return apiClient; }).when(baseObservable).createApiClient(Matchers.any(BaseRx.ApiClientConnectionCallbacks.class)); }
@Override public final void subscribe(ObservableEmitter<T> subscriber) throws Exception { final GoogleApiClient apiClient = createApiClient(new ApiClientConnectionCallbacks(subscriber)); subscriptionInfoMap.put(apiClient, subscriber); try { apiClient.connect(); } catch (Throwable ex) { subscriber.onError(ex); } subscriber.setCancellable(() -> { if (apiClient.isConnected() || apiClient.isConnecting()) { onUnsubscribed(apiClient); apiClient.disconnect(); } subscriptionInfoMap.remove(apiClient); }); }
@Test public void CheckConnectionCompletable_Resolution_Success_ResumeNext_Error() { ConnectionResult connectionResult = Mockito.mock(ConnectionResult.class); final CheckConnectionObservable observable = PowerMockito.spy(new CheckConnectionObservable(rxFit)); setupBaseObservableResolution(observable, apiClient); TestObserver<Void> sub = Completable.fromObservable(Observable.create(observable).compose(RxFitOnExceptionResumeNext.with(Observable.empty()))).test(); doAnswer(invocation -> { observable.onGoogleApiClientReady(apiClient, getSubscriber(observable, apiClient)); return null; }).when(apiClient).connect(); Error error = new Error("Generic error"); doThrow(error).when(observable).onGoogleApiClientReady(Matchers.any(GoogleApiClient.class), Matchers.any(ObservableEmitter.class)); BaseObservable.onResolutionResult(Activity.RESULT_OK, connectionResult); sub.assertError(throwable -> ((CompositeException)throwable).getExceptions().get(0) == error); sub.assertNoValues(); }
@Test public void CheckConnectionCompletable_Resolution_Error_ResumeNext_Resolution_Success() { ConnectionResult connectionResult = Mockito.mock(ConnectionResult.class); final CheckConnectionObservable observable = PowerMockito.spy(new CheckConnectionObservable(rxFit)); setupBaseObservableResolution(observable, apiClient); TestObserver<Void> sub = Completable.fromObservable(Observable.create(observable).compose(RxFitOnExceptionResumeNext.with(Observable.empty()))).test(); when(connectionResult.hasResolution()).thenReturn(true); BaseObservable.onResolutionResult(Activity.RESULT_CANCELED, connectionResult); sub.assertError(throwable -> ((CompositeException)throwable).getExceptions().get(0) instanceof GoogleAPIConnectionException); sub.assertNoValues(); }
protected <T> void setupBaseObservableError(final BaseObservable<T> baseObservable) { doAnswer(invocation -> { final ObservableEmitter<T> subscriber = ((BaseObservable.ApiClientConnectionCallbacks)invocation.getArguments()[0]).subscriber; doAnswer(invocation1 -> { subscriber.onError(new GoogleAPIConnectionException("Error connecting to GoogleApiClient.", connectionResult)); return null; }).when(apiClient).connect(); return apiClient; }).when(baseObservable).createApiClient(Matchers.any(BaseRx.ApiClientConnectionCallbacks.class)); }
@Test public void CheckConnectionCompletable_Resolution_Error_ResumeNext_NoResolution_Success() { ConnectionResult connectionResult = Mockito.mock(ConnectionResult.class); final CheckConnectionObservable observable = PowerMockito.spy(new CheckConnectionObservable(rxFit)); setupBaseObservableResolution(observable, apiClient); TestObserver<Void> sub = Completable.fromObservable(Observable.create(observable).compose(RxFitOnExceptionResumeNext.with(Observable.empty()))).test(); when(connectionResult.hasResolution()).thenReturn(false); BaseObservable.onResolutionResult(Activity.RESULT_CANCELED, connectionResult); sub.assertComplete(); sub.assertNoValues(); }
@Test public void BaseObservable_ApiClient_ConnectionSuspended() { final Object object = new Object(); BaseObservable<Object> observable = spy(new BaseObservable<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, ObservableEmitter<? super Object> subscriber) { subscriber.onNext(object); subscriber.onComplete(); } }); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { BaseRx.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, BaseRx.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnectionSuspended(0); return apiClient; } }).when(observable).createApiClient(Matchers.any(BaseRx.ApiClientConnectionCallbacks.class)); TestObserver<Object> sub = Observable.create(observable).test(); sub.assertNoValues(); sub.assertError(GoogleAPIConnectionSuspendedException.class); }
@Test public void CheckConnectionCompletable_Resolution_Error() { final GoogleApiClient apiClient2 = Mockito.mock(GoogleApiClient.class); final CheckConnectionObservable observable = PowerMockito.spy(new CheckConnectionObservable(rxFit)); Completable completable = Completable.fromObservable(Observable.create(observable)); setupBaseObservableResolution(observable, apiClient); TestObserver<Void> sub1 = completable.test(); setupBaseObservableResolution(observable, apiClient2); TestObserver<Void> sub2 = completable.test(); BaseObservable.onResolutionResult(Activity.RESULT_CANCELED, Mockito.mock(ConnectionResult.class)); sub1.assertError(GoogleAPIConnectionException.class); sub1.assertNoValues(); sub2.assertError(GoogleAPIConnectionException.class); sub2.assertNoValues(); }
@Test public void BaseObservable_ApiClient_Connected() { final Object object = new Object(); BaseObservable<Object> observable = spy(new BaseObservable<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, ObservableEmitter<? super Object> subscriber) { subscriber.onNext(object); subscriber.onComplete(); } }); doAnswer(new Answer() { @Override public Object answer(InvocationOnMock invocation) throws Throwable { BaseRx.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, BaseRx.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnected(null); return apiClient; } }).when(observable).createApiClient(Matchers.any(BaseRx.ApiClientConnectionCallbacks.class)); TestObserver<Object> sub = Observable.create(observable).test(); sub.assertValue(object); sub.assertComplete(); }
@Test public void BaseObservable_ApiClient_ConnectionFailed_Resolution() { final Object object = new Object(); BaseObservable<Object> observable = spy(new BaseObservable<Object>(rxFit, null, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, ObservableEmitter<? super Object> subscriber) { subscriber.onNext(object); subscriber.onComplete(); } }); doReturn(true).when(connectionResult).hasResolution(); doAnswer(invocation -> { BaseRx.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, BaseRx.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnectionFailed(connectionResult); return apiClient; }).when(observable).createApiClient(Matchers.any(BaseRx.ApiClientConnectionCallbacks.class)); TestObserver<Object> sub = Observable.create(observable).test(); sub.assertNoValues(); sub.assertNotTerminated(); verify(ctx).startActivity(Matchers.any(Intent.class)); }
@Test public void BaseObservable_ApiClient_ConnectionFailed_NoResulution() { final Object object = new Object(); BaseObservable<Object> observable = spy(new BaseObservable<Object>(ctx, new Api[] {}, null) { @Override protected void onGoogleApiClientReady(GoogleApiClient apiClient, ObservableEmitter<? super Object> subscriber) { subscriber.onNext(object); subscriber.onComplete(); } }); doReturn(false).when(connectionResult).hasResolution(); doAnswer(invocation -> { BaseRx.ApiClientConnectionCallbacks callbacks = invocation.getArgumentAt(0, BaseRx.ApiClientConnectionCallbacks.class); callbacks.setClient(apiClient); callbacks.onConnectionFailed(connectionResult); return apiClient; }).when(observable).createApiClient(Matchers.any(BaseRx.ApiClientConnectionCallbacks.class)); TestObserver<Object> sub = Observable.create(observable).test(); sub.assertNoValues(); sub.assertError(GoogleAPIConnectionException.class); }