mirror of
https://github.com/square/okhttp.git
synced 2025-11-27 18:21:14 +03:00
Rewrite Http2 connectionNotReusedAfterShutdown test to be less flaky (#6819)
This commit is contained in:
@@ -21,6 +21,7 @@ import java.io.InputStream;
|
|||||||
import java.io.InterruptedIOException;
|
import java.io.InterruptedIOException;
|
||||||
import java.net.Authenticator;
|
import java.net.Authenticator;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
|
import java.net.Socket;
|
||||||
import java.net.SocketTimeoutException;
|
import java.net.SocketTimeoutException;
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -33,8 +34,10 @@ import java.util.concurrent.Executors;
|
|||||||
import java.util.concurrent.LinkedBlockingQueue;
|
import java.util.concurrent.LinkedBlockingQueue;
|
||||||
import java.util.concurrent.SynchronousQueue;
|
import java.util.concurrent.SynchronousQueue;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import java.util.concurrent.TimeoutException;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import javax.annotation.Nullable;
|
import javax.annotation.Nullable;
|
||||||
|
import javax.net.SocketFactory;
|
||||||
import javax.net.ssl.SSLException;
|
import javax.net.ssl.SSLException;
|
||||||
import mockwebserver3.Dispatcher;
|
import mockwebserver3.Dispatcher;
|
||||||
import mockwebserver3.MockResponse;
|
import mockwebserver3.MockResponse;
|
||||||
@@ -49,6 +52,7 @@ import okhttp3.Callback;
|
|||||||
import okhttp3.Connection;
|
import okhttp3.Connection;
|
||||||
import okhttp3.Cookie;
|
import okhttp3.Cookie;
|
||||||
import okhttp3.Credentials;
|
import okhttp3.Credentials;
|
||||||
|
import okhttp3.DelegatingSocketFactory;
|
||||||
import okhttp3.EventListener;
|
import okhttp3.EventListener;
|
||||||
import okhttp3.Headers;
|
import okhttp3.Headers;
|
||||||
import okhttp3.Interceptor;
|
import okhttp3.Interceptor;
|
||||||
@@ -446,6 +450,9 @@ public final class HttpOverHttp2Test {
|
|||||||
.setBody(new Buffer().write(new byte[Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE + 1])));
|
.setBody(new Buffer().write(new byte[Http2Connection.OKHTTP_CLIENT_WINDOW_SIZE + 1])));
|
||||||
server.enqueue(new MockResponse()
|
server.enqueue(new MockResponse()
|
||||||
.setBody("abc"));
|
.setBody("abc"));
|
||||||
|
// Enqueue an additional response that show if we burnt a good prior response.
|
||||||
|
server.enqueue(new MockResponse()
|
||||||
|
.setBody("XXX"));
|
||||||
|
|
||||||
Call call1 = client.newCall(new Request.Builder()
|
Call call1 = client.newCall(new Request.Builder()
|
||||||
.url(server.url("/"))
|
.url(server.url("/"))
|
||||||
@@ -1723,14 +1730,29 @@ public final class HttpOverHttp2Test {
|
|||||||
.setBody("ABC"));
|
.setBody("ABC"));
|
||||||
server.enqueue(new MockResponse()
|
server.enqueue(new MockResponse()
|
||||||
.setBody("DEF"));
|
.setBody("DEF"));
|
||||||
|
// Enqueue an additional response that show if we burnt a good prior response.
|
||||||
|
server.enqueue(new MockResponse()
|
||||||
|
.setBody("XXX"));
|
||||||
|
|
||||||
Call call1 = client.newCall(new Request.Builder()
|
List<RealConnection> connections = new ArrayList<>();
|
||||||
|
|
||||||
|
OkHttpClient localClient = client.newBuilder().eventListener(new EventListener() {
|
||||||
|
@Override
|
||||||
|
public void connectionAcquired(@NotNull Call call, @NotNull Connection connection) {
|
||||||
|
connections.add((RealConnection) connection);
|
||||||
|
}
|
||||||
|
}).build();
|
||||||
|
|
||||||
|
Call call1 = localClient.newCall(new Request.Builder()
|
||||||
.url(server.url("/"))
|
.url(server.url("/"))
|
||||||
.build());
|
.build());
|
||||||
Response response1 = call1.execute();
|
Response response1 = call1.execute();
|
||||||
assertThat(response1.body().string()).isEqualTo("ABC");
|
assertThat(response1.body().string()).isEqualTo("ABC");
|
||||||
|
|
||||||
Call call2 = client.newCall(new Request.Builder()
|
// Add delays for DISCONNECT_AT_END to propogate
|
||||||
|
waitForConnectionShutdown(connections.get(0));
|
||||||
|
|
||||||
|
Call call2 = localClient.newCall(new Request.Builder()
|
||||||
.url(server.url("/"))
|
.url(server.url("/"))
|
||||||
.build());
|
.build());
|
||||||
Response response2 = call2.execute();
|
Response response2 = call2.execute();
|
||||||
@@ -1739,6 +1761,19 @@ public final class HttpOverHttp2Test {
|
|||||||
assertThat(server.takeRequest().getSequenceNumber()).isEqualTo(0);
|
assertThat(server.takeRequest().getSequenceNumber()).isEqualTo(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void waitForConnectionShutdown(RealConnection connection)
|
||||||
|
throws InterruptedException, TimeoutException {
|
||||||
|
if (connection.isHealthy(false)) {
|
||||||
|
Thread.sleep(100L);
|
||||||
|
}
|
||||||
|
if (connection.isHealthy(false)) {
|
||||||
|
Thread.sleep(2000L);
|
||||||
|
}
|
||||||
|
if (connection.isHealthy(false)) {
|
||||||
|
throw new TimeoutException("connection didn't shutdown within timeout");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This simulates a race condition where we receive a healthy HTTP/2 connection and just prior to
|
* This simulates a race condition where we receive a healthy HTTP/2 connection and just prior to
|
||||||
* writing our request, we get a GOAWAY frame from the server.
|
* writing our request, we get a GOAWAY frame from the server.
|
||||||
|
|||||||
Reference in New Issue
Block a user