|
61 | 61 | import io.grpc.internal.StreamListener.MessageProducer;
|
62 | 62 | import java.io.InputStream;
|
63 | 63 | import java.util.ArrayList;
|
| 64 | +import java.util.Arrays; |
| 65 | +import java.util.Iterator; |
64 | 66 | import java.util.List;
|
65 | 67 | import java.util.Random;
|
66 | 68 | import java.util.concurrent.Executor;
|
@@ -998,6 +1000,27 @@ public void messageAvailable() {
|
998 | 1000 | verify(masterListener).messagesAvailable(messageProducer);
|
999 | 1001 | }
|
1000 | 1002 |
|
| 1003 | + @Test |
| 1004 | + public void inboundMessagesClosedOnCancel() throws Exception { |
| 1005 | + ClientStream mockStream1 = mock(ClientStream.class); |
| 1006 | + doReturn(mockStream1).when(retriableStreamRecorder).newSubstream(0); |
| 1007 | + |
| 1008 | + retriableStream.start(masterListener); |
| 1009 | + retriableStream.request(1); |
| 1010 | + retriableStream.cancel(Status.CANCELLED.withDescription("on purpose")); |
| 1011 | + |
| 1012 | + ArgumentCaptor<ClientStreamListener> sublistenerCaptor1 = |
| 1013 | + ArgumentCaptor.forClass(ClientStreamListener.class); |
| 1014 | + verify(mockStream1).start(sublistenerCaptor1.capture()); |
| 1015 | + |
| 1016 | + ClientStreamListener listener = sublistenerCaptor1.getValue(); |
| 1017 | + listener.headersRead(new Metadata()); |
| 1018 | + InputStream is = mock(InputStream.class); |
| 1019 | + listener.messagesAvailable(new FakeMessageProducer(is)); |
| 1020 | + verify(masterListener, never()).messagesAvailable(any(MessageProducer.class)); |
| 1021 | + verify(is).close(); |
| 1022 | + } |
| 1023 | + |
1001 | 1024 | @Test
|
1002 | 1025 | public void notAdd0PrevRetryAttemptsToRespHeaders() {
|
1003 | 1026 | ClientStream mockStream1 = mock(ClientStream.class);
|
@@ -2786,4 +2809,22 @@ private interface RetriableStreamRecorder {
|
2786 | 2809 |
|
2787 | 2810 | Status prestart();
|
2788 | 2811 | }
|
| 2812 | + |
| 2813 | + private static final class FakeMessageProducer implements MessageProducer { |
| 2814 | + private final Iterator<InputStream> iterator; |
| 2815 | + |
| 2816 | + public FakeMessageProducer(InputStream... iss) { |
| 2817 | + this.iterator = Arrays.asList(iss).iterator(); |
| 2818 | + } |
| 2819 | + |
| 2820 | + @Override |
| 2821 | + @Nullable |
| 2822 | + public InputStream next() { |
| 2823 | + if (iterator.hasNext()) { |
| 2824 | + return iterator.next(); |
| 2825 | + } else { |
| 2826 | + return null; |
| 2827 | + } |
| 2828 | + } |
| 2829 | + } |
2789 | 2830 | }
|
0 commit comments