Skip to content

Commit 9de87e3

Browse files
committed
Add tests for call.cancel() from within messageRead.
1 parent f56fdf0 commit 9de87e3

File tree

2 files changed

+86
-0
lines changed

2 files changed

+86
-0
lines changed

core/src/test/java/io/grpc/internal/ClientCallImplTest.java

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,6 +541,39 @@ public void timeoutShouldNotBeSet() {
541541
assertFalse(headers.containsKey(GrpcUtil.TIMEOUT_KEY));
542542
}
543543

544+
@Test
545+
public void cancelInOnMessageShouldInvokeStreamCancel() throws Exception {
546+
final ClientCallImpl<Void, Void> call = new ClientCallImpl<Void, Void>(
547+
DESCRIPTOR,
548+
MoreExecutors.directExecutor(),
549+
CallOptions.DEFAULT,
550+
provider,
551+
deadlineCancellationExecutor);
552+
final Exception cause = new Exception();
553+
ClientCall.Listener<Void> callListener =
554+
new ClientCall.Listener<Void>() {
555+
@Override
556+
public void onMessage(Void message) {
557+
call.cancel("foo", cause);
558+
}
559+
};
560+
561+
call.start(callListener, new Metadata());
562+
call.halfClose();
563+
call.request(1);
564+
565+
verify(stream).start(listenerArgumentCaptor.capture());
566+
ClientStreamListener streamListener = listenerArgumentCaptor.getValue();
567+
streamListener.onReady();
568+
streamListener.headersRead(new Metadata());
569+
streamListener.messageRead(new ByteArrayInputStream(new byte[0]));
570+
verify(stream).cancel(statusCaptor.capture());
571+
Status status = statusCaptor.getValue();
572+
assertEquals(Status.CANCELLED.getCode(), status.getCode());
573+
assertEquals("foo", status.getDescription());
574+
assertSame(cause, status.getCause());
575+
}
576+
544577
private static class TestMarshaller<T> implements Marshaller<T> {
545578
@Override
546579
public InputStream stream(T value) {

testing/src/main/java/io/grpc/internal/testing/AbstractTransportTest.java

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -587,6 +587,59 @@ public void clientCancel() throws Exception {
587587
verify(mockClientStreamListener, never()).closed(any(Status.class), any(Metadata.class));
588588
}
589589

590+
@Test(timeout = 5000)
591+
public void clientCancelFromWithinMessageRead() throws Exception {
592+
server.start(serverListener);
593+
client.start(mockClientTransportListener);
594+
MockServerTransportListener serverTransportListener
595+
= serverListener.takeListenerOrFail(TIMEOUT_MS, TimeUnit.MILLISECONDS);
596+
serverTransport = serverTransportListener.transport;
597+
598+
final SettableFuture<Boolean> closedCalled = SettableFuture.create();
599+
final ClientStream clientStream = client.newStream(methodDescriptor, new Metadata());
600+
clientStream.start(new ClientStreamListener() {
601+
@Override
602+
public void headersRead(Metadata headers) {
603+
}
604+
605+
@Override
606+
public void closed(Status status, Metadata trailers) {
607+
assertEquals(Status.CANCELLED.getCode(), status.getCode());
608+
assertEquals("nevermind", status.getDescription());
609+
closedCalled.set(true);
610+
}
611+
612+
@Override
613+
public void messageRead(InputStream message) {
614+
assertEquals("foo", methodDescriptor.parseResponse(message));
615+
clientStream.cancel(Status.CANCELLED.withDescription("nevermind"));
616+
}
617+
618+
@Override
619+
public void onReady() {
620+
}
621+
});
622+
clientStream.halfClose();
623+
clientStream.request(1);
624+
625+
StreamCreation serverStreamCreation
626+
= serverTransportListener.takeStreamOrFail(TIMEOUT_MS, TimeUnit.MILLISECONDS);
627+
assertEquals(methodDescriptor.getFullMethodName(), serverStreamCreation.method);
628+
ServerStream serverStream = serverStreamCreation.stream;
629+
ServerStreamListener mockServerStreamListener = serverStreamCreation.listener;
630+
verify(mockServerStreamListener, timeout(TIMEOUT_MS)).onReady();
631+
632+
assertTrue(serverStream.isReady());
633+
serverStream.writeHeaders(new Metadata());
634+
serverStream.writeMessage(methodDescriptor.streamRequest("foo"));
635+
serverStream.flush();
636+
637+
// Block until closedCalled was set.
638+
closedCalled.get();
639+
640+
serverStream.close(Status.OK, new Metadata());
641+
}
642+
590643
@Test
591644
public void serverCancel() throws Exception {
592645
server.start(serverListener);

0 commit comments

Comments
 (0)