Update test to demonstrate that pending streams will not be started if the transport is in goAway status.

This commit is contained in:
Xudong Ma 2015-08-10 15:06:52 -07:00
parent d2929cd1a3
commit b42122b035
2 changed files with 18 additions and 11 deletions

View File

@ -284,6 +284,8 @@ class OkHttpClientTransport implements ClientTransport {
private boolean startPendingStreams() { private boolean startPendingStreams() {
boolean hasStreamStarted = false; boolean hasStreamStarted = false;
synchronized (lock) { synchronized (lock) {
// No need to check goAway since the pendingStreams will be cleared when goAway
// becomes true.
while (!pendingStreams.isEmpty() && streams.size() < maxConcurrentStreams) { while (!pendingStreams.isEmpty() && streams.size() < maxConcurrentStreams) {
OkHttpClientStream stream = pendingStreams.poll(); OkHttpClientStream stream = pendingStreams.poll();
startStream(stream); startStream(stream);

View File

@ -660,19 +660,26 @@ public class OkHttpClientTransportTest {
@Test @Test
public void pendingStreamFailedByGoAway() throws Exception { public void pendingStreamFailedByGoAway() throws Exception {
initTransport(); initTransport();
setMaxConcurrentStreams(0); setMaxConcurrentStreams(1);
final MockStreamListener listener = new MockStreamListener(); final MockStreamListener listener1 = new MockStreamListener();
final CountDownLatch newStreamReturn = new CountDownLatch(1); final MockStreamListener listener2 = new MockStreamListener();
// The stream should be pending. clientTransport.newStream(method, new Metadata.Headers(), listener1);
clientTransport.newStream(method, new Metadata.Headers(), listener); // The second stream should be pending.
newStreamReturn.countDown(); clientTransport.newStream(method, new Metadata.Headers(), listener2);
waitForStreamPending(1); waitForStreamPending(1);
assertEquals(1, activeStreamCount());
frameHandler().goAway(0, ErrorCode.CANCEL, null); // Receives GO_AWAY.
frameHandler().goAway(99, ErrorCode.CANCEL, null);
listener.waitUntilStreamClosed(); listener2.waitUntilStreamClosed();
assertEquals(Status.CANCELLED.getCode(), listener.status.getCode()); assertEquals(Status.CANCELLED.getCode(), listener2.status.getCode());
assertEquals(0, clientTransport.getPendingStreamSize()); assertEquals(0, clientTransport.getPendingStreamSize());
// active stream should not be affected.
assertEquals(1, activeStreamCount());
getStream(3).sendCancel(Status.CANCELLED);
} }
@Test @Test
@ -680,10 +687,8 @@ public class OkHttpClientTransportTest {
initTransport(); initTransport();
setMaxConcurrentStreams(0); setMaxConcurrentStreams(0);
final MockStreamListener listener = new MockStreamListener(); final MockStreamListener listener = new MockStreamListener();
final CountDownLatch newStreamReturn = new CountDownLatch(1);
// The second stream should be pending. // The second stream should be pending.
clientTransport.newStream(method, new Metadata.Headers(), listener); clientTransport.newStream(method, new Metadata.Headers(), listener);
newStreamReturn.countDown();
waitForStreamPending(1); waitForStreamPending(1);
clientTransport.shutdown(); clientTransport.shutdown();