/** * Checks send after stream is ready. */ @Test public void sendAfterStreamReady() throws Exception { when(mRequestObserver.isReady()).thenReturn(false); doAnswer((args) -> { mOnReadyHandler = args.getArgumentAt(0, Runnable.class); return null; }).when(mRequestObserver).setOnReadyHandler(any(Runnable.class)); mResponseObserver.beforeStart(mRequestObserver); EXECUTOR.submit(() -> { try { // notify ready after a short period of time Thread.sleep(SHORT_TIMEOUT); when(mRequestObserver.isReady()).thenReturn(true); mOnReadyHandler.run(); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); WriteRequest request = WriteRequest.newBuilder().build(); mStream.send(request, TIMEOUT); verify(mRequestObserver).onNext(request); }
/** * Checks waitForComplete fails after times out. */ @Test public void waitForCompleteTimeout() throws Exception { WriteResponse[] responses = Stream.generate(() -> WriteResponse.newBuilder().build()) .limit(BUFFER_SIZE * 2).toArray(WriteResponse[]::new); EXECUTOR.submit(() -> { for (WriteResponse response : responses) { mResponseObserver.onNext(response); } try { Thread.sleep(TIMEOUT); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } mResponseObserver.onCompleted(); }); WriteResponse actualResponse = mStream.receive(SHORT_TIMEOUT); Assert.assertEquals(responses[0], actualResponse); mThrown.expect(DeadlineExceededException.class); mThrown.expectMessage(containsString(TEST_MESSAGE)); mStream.waitForComplete(SHORT_TIMEOUT); } }
/** * Checks receive fails immediately upon error even if buffer is full. */ @Test public void receiveErrorWhenBufferFull() throws Exception { mThrown.expect(UnauthenticatedException.class); mThrown.expectMessage(containsString(TEST_MESSAGE)); WriteResponse[] responses = Stream.generate(() -> WriteResponse.newBuilder().build()) .limit(BUFFER_SIZE).toArray(WriteResponse[]::new); for (WriteResponse response : responses) { mResponseObserver.onNext(response); } mResponseObserver.onError(Status.UNAUTHENTICATED.asRuntimeException()); for (WriteResponse response : responses) { WriteResponse actualResponse = mStream.receive(TIMEOUT); Assert.assertEquals(response, actualResponse); } }
/** * Checks receive after response arrives. */ @Test public void receiveAfterResponseArrives() throws Exception { WriteResponse response = WriteResponse.newBuilder().build(); EXECUTOR.submit(() -> { try { // push response after a short period of time Thread.sleep(SHORT_TIMEOUT); mResponseObserver.onNext(response); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } }); WriteResponse actualResponse = mStream.receive(TIMEOUT); Assert.assertEquals(response, actualResponse); }
/** * Checks expected error during receive. */ @Test public void receiveError() throws Exception { mThrown.expect(UnauthenticatedException.class); mThrown.expectMessage(containsString(TEST_MESSAGE)); mResponseObserver.onError(Status.UNAUTHENTICATED.asRuntimeException()); mStream.receive(TIMEOUT); }
/** * Checks onCompleted posted on the response observer is received. */ @Test public void onCompleted() throws Exception { mResponseObserver.onCompleted(); WriteResponse actualResponse = mStream.receive(TIMEOUT); Assert.assertNull(actualResponse); }
/** * Checks receive responses more than buffer size in order. */ @Test public void receiveMoreThanBufferSize() throws Exception { WriteResponse[] responses = Stream.generate(() -> WriteResponse.newBuilder().build()) .limit(BUFFER_SIZE * 2).toArray(WriteResponse[]::new); EXECUTOR.submit(() -> { for (WriteResponse response : responses) { mResponseObserver.onNext(response); } }); Thread.sleep(SHORT_TIMEOUT); for (WriteResponse response : responses) { WriteResponse actualResponse = mStream.receive(TIMEOUT); Assert.assertEquals(response, actualResponse); } }
/** * Checks expected error during send. */ @Test public void sendError() throws Exception { mThrown.expect(UnauthenticatedException.class); mThrown.expectMessage(containsString(TEST_MESSAGE)); mResponseObserver.onError(Status.UNAUTHENTICATED.asRuntimeException()); mStream.send(WriteRequest.newBuilder().build(), TIMEOUT); }
StreamObserverToCallListenerAdapter( StreamObserver<RespT> observer, CallToStreamObserverAdapter<ReqT> adapter, boolean streamingResponse) { this.observer = observer; this.streamingResponse = streamingResponse; this.adapter = adapter; if (observer instanceof ClientResponseObserver) { @SuppressWarnings("unchecked") ClientResponseObserver<ReqT, RespT> clientResponseObserver = (ClientResponseObserver<ReqT, RespT>) observer; clientResponseObserver.beforeStart(adapter); } adapter.freeze(); }
/** * Checks waitForComplete succeed after onCompleted is triggered on response stream. */ @Test public void waitForComplete() throws Exception { WriteResponse[] responses = Stream.generate(() -> WriteResponse.newBuilder().build()) .limit(BUFFER_SIZE * 2).toArray(WriteResponse[]::new); EXECUTOR.submit(() -> { for (WriteResponse response : responses) { mResponseObserver.onNext(response); } try { Thread.sleep(SHORT_TIMEOUT); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } mResponseObserver.onCompleted(); }); WriteResponse actualResponse = mStream.receive(TIMEOUT); Assert.assertEquals(responses[0], actualResponse); mStream.waitForComplete(TIMEOUT); actualResponse = mStream.receive(TIMEOUT); Assert.assertEquals(null, actualResponse); }
/** * Checks response posted on the response observer is received. */ @Test public void receive() throws Exception { WriteResponse response = WriteResponse.newBuilder().build(); mResponseObserver.onNext(response); WriteResponse actualResponse = mStream.receive(TIMEOUT); Assert.assertEquals(response, actualResponse); }
StreamObserverToCallListenerAdapter(StreamObserver<Response> observer, CallToStreamObserverAdapter<Request, Response> adapter, boolean streamingResponse) { this.observer = observer; this.streamingResponse = streamingResponse; this.adapter = adapter; if (observer instanceof ClientResponseObserver) { @SuppressWarnings("unchecked") ClientResponseObserver<Request, Response> clientResponseObserver = (ClientResponseObserver<Request, Response>) observer; clientResponseObserver.beforeStart(adapter); } adapter.freeze(); }
@SuppressWarnings("unchecked") @Override public void run() { try { // restart the clock. super.run(); // pre-fetch one more result, for performance reasons. callWrapper.request(1); if (rowObserver instanceof ClientResponseObserver) { ((ClientResponseObserver<ReadRowsRequest, FlatRow>) rowObserver).beforeStart(callWrapper); } } catch (Exception e) { setException(e); } }