Single connection concurrency test on ratpack (#3151)

This commit is contained in:
Lauri Tulmin 2021-06-01 08:55:40 +03:00 committed by GitHub
parent 4ce2cac645
commit a746c94b1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 58 additions and 16 deletions

View File

@ -6,11 +6,12 @@
package client package client
import ratpack.exec.Promise import ratpack.exec.Promise
import ratpack.http.client.HttpClient
class RatpackForkedHttpClientTest extends RatpackHttpClientTest { class RatpackForkedHttpClientTest extends RatpackHttpClientTest {
@Override @Override
Promise<Integer> internalSendRequest(String method, URI uri, Map<String, String> headers) { Promise<Integer> internalSendRequest(HttpClient client, String method, URI uri, Map<String, String> headers) {
def resp = client.request(uri) { spec -> def resp = client.request(uri) { spec ->
spec.method(method) spec.method(method)
spec.headers { headersSpec -> spec.headers { headersSpec ->

View File

@ -9,9 +9,13 @@ import io.netty.channel.ConnectTimeoutException
import io.opentelemetry.instrumentation.test.AgentTestTrait import io.opentelemetry.instrumentation.test.AgentTestTrait
import io.opentelemetry.instrumentation.test.asserts.SpanAssert import io.opentelemetry.instrumentation.test.asserts.SpanAssert
import io.opentelemetry.instrumentation.test.base.HttpClientTest import io.opentelemetry.instrumentation.test.base.HttpClientTest
import io.opentelemetry.instrumentation.test.base.SingleConnection
import java.time.Duration import java.time.Duration
import java.util.concurrent.ExecutionException
import java.util.concurrent.TimeoutException
import ratpack.exec.Operation import ratpack.exec.Operation
import ratpack.exec.Promise import ratpack.exec.Promise
import ratpack.func.Action
import ratpack.http.client.HttpClient import ratpack.http.client.HttpClient
import ratpack.http.client.HttpClientSpec import ratpack.http.client.HttpClientSpec
import ratpack.test.exec.ExecHarness import ratpack.test.exec.ExecHarness
@ -24,18 +28,32 @@ class RatpackHttpClientTest extends HttpClientTest<Void> implements AgentTestTra
@Shared @Shared
ExecHarness exec = ExecHarness.harness() ExecHarness exec = ExecHarness.harness()
@AutoCleanup
@Shared @Shared
def client = HttpClient.of { def client = buildHttpClient()
it.readTimeout(Duration.ofSeconds(2))
// Connect timeout added in 1.5 @AutoCleanup
// execController method added in 1.9 @Shared
if (HttpClientSpec.metaClass.getMetaMethod("execController") != null) { def singleConnectionClient = buildHttpClient({spec ->
it.execController(exec.getController()) spec.poolSize(1)
} })
configureClient(it)
HttpClient buildHttpClient() {
return buildHttpClient(null)
} }
void configureClient(HttpClientSpec spec) { HttpClient buildHttpClient(Action<? super HttpClientSpec> action) {
HttpClient.of {
it.readTimeout(Duration.ofSeconds(2))
// Connect timeout added in 1.5
// execController method added in 1.9
if (HttpClientSpec.metaClass.getMetaMethod("execController") != null) {
it.execController(exec.getController())
}
if (action != null) {
action.execute(it)
}
}
} }
@Override @Override
@ -46,21 +64,21 @@ class RatpackHttpClientTest extends HttpClientTest<Void> implements AgentTestTra
@Override @Override
int sendRequest(Void request, String method, URI uri, Map<String, String> headers) { int sendRequest(Void request, String method, URI uri, Map<String, String> headers) {
return exec.yield { return exec.yield {
internalSendRequest(method, uri, headers) internalSendRequest(client, method, uri, headers)
}.valueOrThrow }.valueOrThrow
} }
@Override @Override
void sendRequestWithCallback(Void request, String method, URI uri, Map<String, String> headers, RequestResult requestResult) { void sendRequestWithCallback(Void request, String method, URI uri, Map<String, String> headers, RequestResult requestResult) {
exec.execute(Operation.of { exec.execute(Operation.of {
internalSendRequest(method, uri, headers).result {result -> internalSendRequest(client, method, uri, headers).result {result ->
requestResult.complete({ result.value }, result.throwable) requestResult.complete({ result.value }, result.throwable)
} }
}) })
} }
// overridden in RatpackForkedHttpClientTest // overridden in RatpackForkedHttpClientTest
Promise<Integer> internalSendRequest(String method, URI uri, Map<String, String> headers) { Promise<Integer> internalSendRequest(HttpClient client, String method, URI uri, Map<String, String> headers) {
def resp = client.request(uri) { spec -> def resp = client.request(uri) { spec ->
spec.connectTimeout(Duration.ofSeconds(2)) spec.connectTimeout(Duration.ofSeconds(2))
spec.method(method) spec.method(method)
@ -75,6 +93,19 @@ class RatpackHttpClientTest extends HttpClientTest<Void> implements AgentTestTra
} }
} }
@Override
SingleConnection createSingleConnection(String host, int port) {
return new SingleConnection() {
@Override
int doRequest(String path, Map<String, String> headers) throws ExecutionException, InterruptedException, TimeoutException {
def uri = server.address.resolve(path)
return exec.yield {
internalSendRequest(singleConnectionClient, "GET", uri, headers)
}.valueOrThrow
}
}
}
@Override @Override
String expectedClientSpanName(URI uri, String method) { String expectedClientSpanName(URI uri, String method) {
switch (uri.toString()) { switch (uri.toString()) {

View File

@ -5,12 +5,22 @@
package client package client
import ratpack.http.client.HttpClientSpec import io.opentelemetry.instrumentation.test.base.SingleConnection
import ratpack.http.client.HttpClient
class RatpackPooledHttpClientTest extends RatpackHttpClientTest { class RatpackPooledHttpClientTest extends RatpackHttpClientTest {
@Override @Override
void configureClient(HttpClientSpec spec) { HttpClient buildHttpClient() {
spec.poolSize(5) return buildHttpClient({spec ->
spec.poolSize(5)
})
}
@Override
SingleConnection createSingleConnection(String host, int port) {
// this test is already run for RatpackHttpClientTest
// returning null here to avoid running the same test twice
return null
} }
} }