Don't use HttpServerTest.controller in java tests (#12347)

This commit is contained in:
Lauri Tulmin 2024-09-30 03:09:25 +03:00 committed by GitHub
parent f0115c6bdc
commit 7f881d07a3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
37 changed files with 265 additions and 320 deletions

View File

@ -16,8 +16,8 @@ import io.opentelemetry.instrumentation.testing.junit.http.{
ServerEndpoint ServerEndpoint
} }
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
import java.util.function.Supplier
import scala.concurrent.{Await, ExecutionContextExecutor, Future} import scala.concurrent.{Await, ExecutionContextExecutor, Future}
object AkkaHttpTestAsyncWebServer { object AkkaHttpTestAsyncWebServer {
@ -31,7 +31,7 @@ object AkkaHttpTestAsyncWebServer {
val endpoint = ServerEndpoint.forPath(uri.path.toString()) val endpoint = ServerEndpoint.forPath(uri.path.toString())
AbstractHttpServerTest.controller( AbstractHttpServerTest.controller(
endpoint, endpoint,
new Supplier[HttpResponse] { new ThrowingSupplier[HttpResponse, Exception] {
def get(): HttpResponse = { def get(): HttpResponse = {
val resp = HttpResponse(status = val resp = HttpResponse(status =
endpoint.getStatus endpoint.getStatus

View File

@ -14,8 +14,8 @@ import akka.stream.ActorMaterializer
import akka.stream.scaladsl.Sink import akka.stream.scaladsl.Sink
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
import java.util.function.Supplier
import scala.concurrent.Await import scala.concurrent.Await
object AkkaHttpTestServerSourceWebServer { object AkkaHttpTestServerSourceWebServer {
@ -33,7 +33,7 @@ object AkkaHttpTestServerSourceWebServer {
}, },
path(INDEXED_CHILD.rawPath()) { path(INDEXED_CHILD.rawPath()) {
parameterMap { map => parameterMap { map =>
val supplier = new Supplier[String] { val supplier = new ThrowingSupplier[String, Exception] {
def get(): String = { def get(): String = {
INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider { INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider {
override def getParameter(name: String): String = override def getParameter(name: String): String =
@ -114,8 +114,8 @@ object AkkaHttpTestServerSourceWebServer {
} }
} }
def supplier(string: String): Supplier[String] = { def supplier(string: String): ThrowingSupplier[String, Exception] = {
new Supplier[String] { new ThrowingSupplier[String, Exception] {
def get(): String = { def get(): String = {
string string
} }

View File

@ -16,8 +16,8 @@ import io.opentelemetry.instrumentation.testing.junit.http.{
ServerEndpoint ServerEndpoint
} }
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
import java.util.function.Supplier
import scala.concurrent.Await import scala.concurrent.Await
object AkkaHttpTestSyncWebServer { object AkkaHttpTestSyncWebServer {
@ -30,7 +30,7 @@ object AkkaHttpTestSyncWebServer {
val endpoint = ServerEndpoint.forPath(uri.path.toString()) val endpoint = ServerEndpoint.forPath(uri.path.toString())
AbstractHttpServerTest.controller( AbstractHttpServerTest.controller(
endpoint, endpoint,
new Supplier[HttpResponse] { new ThrowingSupplier[HttpResponse, Exception] {
def get(): HttpResponse = { def get(): HttpResponse = {
val resp = HttpResponse(status = endpoint.getStatus) val resp = HttpResponse(status = endpoint.getStatus)
endpoint match { endpoint match {

View File

@ -13,8 +13,8 @@ import akka.http.scaladsl.server.Directives._
import akka.stream.ActorMaterializer import akka.stream.ActorMaterializer
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
import java.util.function.Supplier
import scala.concurrent.Await import scala.concurrent.Await
object AkkaHttpTestWebServer { object AkkaHttpTestWebServer {
@ -32,7 +32,7 @@ object AkkaHttpTestWebServer {
}, },
path(INDEXED_CHILD.rawPath()) { path(INDEXED_CHILD.rawPath()) {
parameterMap { map => parameterMap { map =>
val supplier = new Supplier[String] { val supplier = new ThrowingSupplier[String, Exception] {
def get(): String = { def get(): String = {
INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider { INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider {
override def getParameter(name: String): String = override def getParameter(name: String): String =
@ -107,8 +107,8 @@ object AkkaHttpTestWebServer {
} }
} }
def supplier(string: String): Supplier[String] = { def supplier(string: String): ThrowingSupplier[String, Exception] = {
new Supplier[String] { new ThrowingSupplier[String, Exception] {
def get(): String = { def get(): String = {
string string
} }

View File

@ -5,99 +5,74 @@
package io.opentelemetry.javaagent.instrumentation.finatra package io.opentelemetry.javaagent.instrumentation.finatra
import com.twitter.finagle.http.{Request, Response} import com.twitter.finagle.http.Request
import com.twitter.finatra.http.Controller import com.twitter.finatra.http.Controller
import com.twitter.util.Future
import groovy.lang.Closure
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest.controller import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest.controller
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
import java.util.function.Supplier
class FinatraController extends Controller { class FinatraController extends Controller {
any(SUCCESS.getPath) { request: Request => any(SUCCESS.getPath) { request: Request =>
controller( controller(SUCCESS, supplier(() => response.ok(SUCCESS.getBody)))
SUCCESS,
new Supplier[Response] {
override def get(): Response = {
response.ok(SUCCESS.getBody)
}
}
)
} }
any(ERROR.getPath) { request: Request => any(ERROR.getPath) { request: Request =>
controller( controller(
ERROR, ERROR,
new Supplier[Response] { supplier(() => response.internalServerError(ERROR.getBody))
override def get(): Response = {
response.internalServerError(ERROR.getBody)
}
}
) )
} }
any(QUERY_PARAM.getPath) { request: Request => any(QUERY_PARAM.getPath) { request: Request =>
controller( controller(
QUERY_PARAM, QUERY_PARAM,
new Supplier[Response] { supplier(() => response.ok(QUERY_PARAM.getBody))
override def get(): Response = {
response.ok(QUERY_PARAM.getBody)
}
}
) )
} }
any(EXCEPTION.getPath) { request: Request => any(EXCEPTION.getPath) { request: Request =>
controller( controller(
EXCEPTION, EXCEPTION,
new Supplier[Future[Response]] { supplier(() => throw new Exception(EXCEPTION.getBody))
override def get(): Future[Response] = {
throw new Exception(EXCEPTION.getBody)
}
}
) )
} }
any(REDIRECT.getPath) { request: Request => any(REDIRECT.getPath) { request: Request =>
controller( controller(
REDIRECT, REDIRECT,
new Supplier[Response] { supplier(() => response.found.location(REDIRECT.getBody))
override def get(): Response = {
response.found.location(REDIRECT.getBody)
}
}
) )
} }
any(CAPTURE_HEADERS.getPath) { request: Request => any(CAPTURE_HEADERS.getPath) { request: Request =>
controller( controller(
CAPTURE_HEADERS, CAPTURE_HEADERS,
new Supplier[Response] { supplier(() =>
override def get(): Response = {
response response
.ok(CAPTURE_HEADERS.getBody) .ok(CAPTURE_HEADERS.getBody)
.header( .header(
"X-Test-Response", "X-Test-Response",
request.headerMap.get("X-Test-Request").get request.headerMap.get("X-Test-Request").get
) )
} )
}
) )
} }
any(INDEXED_CHILD.getPath) { request: Request => any(INDEXED_CHILD.getPath) { request: Request =>
controller( controller(
INDEXED_CHILD, INDEXED_CHILD,
new Supplier[Response] { supplier(() => {
override def get(): Response = { INDEXED_CHILD.collectSpanAttributes((name: String) =>
INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider {
override def getParameter(name: String): String =
request.getParam(name) request.getParam(name)
}) )
response.ok(INDEXED_CHILD.getBody) response.ok(INDEXED_CHILD.getBody)
} })
}
) )
} }
def supplier[A](action: () => A): ThrowingSupplier[A, Exception] = { () =>
{
action.apply()
}
}
} }

View File

@ -5,108 +5,87 @@
package io.opentelemetry.javaagent.instrumentation.finatra package io.opentelemetry.javaagent.instrumentation.finatra
import com.twitter.finagle.http.{Request, Response} import com.twitter.finagle.http.Request
import com.twitter.finatra.http.Controller import com.twitter.finatra.http.Controller
import com.twitter.util.Future import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest.controller
import groovy.lang.Closure
import io.opentelemetry.instrumentation.test.base.HttpServerTest.controller
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
class FinatraController extends Controller { class FinatraController extends Controller {
any(SUCCESS.getPath) { request: Request => any(SUCCESS.getPath) { request: Request =>
controller( controller(
SUCCESS, SUCCESS,
new Closure[Response](null) { supplier(() => response.ok(SUCCESS.getBody))
override def call(): Response = {
response.ok(SUCCESS.getBody)
}
}
) )
} }
any(ERROR.getPath) { request: Request => any(ERROR.getPath) { request: Request =>
controller( controller(
ERROR, ERROR,
new Closure[Response](null) { supplier(() => response.internalServerError(ERROR.getBody))
override def call(): Response = {
response.internalServerError(ERROR.getBody)
}
}
) )
} }
any(QUERY_PARAM.getPath) { request: Request => any(QUERY_PARAM.getPath) { request: Request =>
controller( controller(
QUERY_PARAM, QUERY_PARAM,
new Closure[Response](null) { supplier(() => response.ok(QUERY_PARAM.getBody))
override def call(): Response = {
response.ok(QUERY_PARAM.getBody)
}
}
) )
} }
any(EXCEPTION.getPath) { request: Request => any(EXCEPTION.getPath) { request: Request =>
controller( controller(
EXCEPTION, EXCEPTION,
new Closure[Future[Response]](null) { supplier(() => throw new Exception(EXCEPTION.getBody))
override def call(): Future[Response] = {
throw new Exception(EXCEPTION.getBody)
}
}
) )
} }
any(REDIRECT.getPath) { request: Request => any(REDIRECT.getPath) { request: Request =>
controller( controller(
REDIRECT, REDIRECT,
new Closure[Response](null) { supplier(() => response.found.location(REDIRECT.getBody))
override def call(): Response = {
response.found.location(REDIRECT.getBody)
}
}
) )
} }
any(CAPTURE_HEADERS.getPath) { request: Request => any(CAPTURE_HEADERS.getPath) { request: Request =>
controller( controller(
CAPTURE_HEADERS, CAPTURE_HEADERS,
new Closure[Response](null) { supplier(() =>
override def call(): Response = {
response response
.ok(CAPTURE_HEADERS.getBody) .ok(CAPTURE_HEADERS.getBody)
.header( .header(
"X-Test-Response", "X-Test-Response",
request.headerMap.get("X-Test-Request").get request.headerMap.get("X-Test-Request").get
) )
} )
}
) )
} }
any(INDEXED_CHILD.getPath) { request: Request => any(INDEXED_CHILD.getPath) { request: Request =>
controller( controller(
INDEXED_CHILD, INDEXED_CHILD,
new Closure[Response](null) { supplier(() => {
override def call(): Response = {
INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider { INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider {
override def getParameter(name: String): String = override def getParameter(name: String): String =
request.getParam(name) request.getParam(name)
}) })
response.ok(INDEXED_CHILD.getBody) response.ok(INDEXED_CHILD.getBody)
} })
}
) )
} }
any("/path/:id/param") { request: Request => any("/path/:id/param") { request: Request =>
controller( controller(
PATH_PARAM, PATH_PARAM,
new Closure[Response](null) { supplier(() => response.ok(request.params("id")))
override def call(): Response = {
response.ok(request.params("id"))
}
}
) )
} }
def supplier[A](action: () => A): ThrowingSupplier[A, Exception] = {
new ThrowingSupplier[A, Exception] {
def get(): A = {
action.apply()
}
}
}
} }

View File

@ -7,8 +7,10 @@ package test
import grails.artefact.Controller import grails.artefact.Controller
import grails.web.Action import grails.web.Action
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint
import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable
import static io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest.controller
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION
@ -82,4 +84,8 @@ class TestController implements Controller {
render INDEXED_CHILD.body render INDEXED_CHILD.body
} }
} }
private static void controller(ServerEndpoint endpoint, ThrowingRunnable action) {
AbstractHttpServerTest.controller(endpoint, action)
}
} }

View File

@ -31,8 +31,7 @@ object PekkoHttpTestAsyncWebServer {
val endpoint = ServerEndpoint.forPath(uri.path.toString()) val endpoint = ServerEndpoint.forPath(uri.path.toString())
AbstractHttpServerTest.controller( AbstractHttpServerTest.controller(
endpoint, endpoint,
new Supplier[HttpResponse] { () => {
def get(): HttpResponse = {
val resp = HttpResponse(status = val resp = HttpResponse(status =
endpoint.getStatus endpoint.getStatus
) // .withHeaders(headers.Type)resp.contentType = "text/plain" ) // .withHeaders(headers.Type)resp.contentType = "text/plain"
@ -54,7 +53,6 @@ object PekkoHttpTestAsyncWebServer {
.withEntity(NOT_FOUND.getBody) .withEntity(NOT_FOUND.getBody)
} }
} }
}
) )
} }
} }

View File

@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.pekkohttp.v1_0
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
import org.apache.pekko.actor.ActorSystem import org.apache.pekko.actor.ActorSystem
import org.apache.pekko.http.scaladsl.Http import org.apache.pekko.http.scaladsl.Http
import org.apache.pekko.http.scaladsl.Http.ServerBinding import org.apache.pekko.http.scaladsl.Http.ServerBinding
@ -15,7 +16,6 @@ import org.apache.pekko.http.scaladsl.server.Directives._
import org.apache.pekko.stream.ActorMaterializer import org.apache.pekko.stream.ActorMaterializer
import org.apache.pekko.stream.scaladsl.Sink import org.apache.pekko.stream.scaladsl.Sink
import java.util.function.Supplier
import scala.concurrent.Await import scala.concurrent.Await
object PekkoHttpTestServerSourceWebServer { object PekkoHttpTestServerSourceWebServer {
@ -33,7 +33,7 @@ object PekkoHttpTestServerSourceWebServer {
}, },
path(INDEXED_CHILD.rawPath()) { path(INDEXED_CHILD.rawPath()) {
parameterMap { map => parameterMap { map =>
val supplier = new Supplier[String] { val supplier = new ThrowingSupplier[String, Exception] {
def get(): String = { def get(): String = {
INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider { INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider {
override def getParameter(name: String): String = override def getParameter(name: String): String =
@ -114,11 +114,9 @@ object PekkoHttpTestServerSourceWebServer {
} }
} }
def supplier(string: String): Supplier[String] = { def supplier(string: String): ThrowingSupplier[String, Exception] = { () =>
new Supplier[String] { {
def get(): String = {
string string
} }
} }
} }
}

View File

@ -30,8 +30,7 @@ object PekkoHttpTestSyncWebServer {
val endpoint = ServerEndpoint.forPath(uri.path.toString()) val endpoint = ServerEndpoint.forPath(uri.path.toString())
AbstractHttpServerTest.controller( AbstractHttpServerTest.controller(
endpoint, endpoint,
new Supplier[HttpResponse] { () => {
def get(): HttpResponse = {
val resp = HttpResponse(status = endpoint.getStatus) val resp = HttpResponse(status = endpoint.getStatus)
endpoint match { endpoint match {
case SUCCESS => resp.withEntity(endpoint.getBody) case SUCCESS => resp.withEntity(endpoint.getBody)
@ -51,7 +50,6 @@ object PekkoHttpTestSyncWebServer {
.withEntity(NOT_FOUND.getBody) .withEntity(NOT_FOUND.getBody)
} }
} }
}
) )
} }
} }

View File

@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.pekkohttp.v1_0
import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._ import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint._
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier
import org.apache.pekko.actor.ActorSystem import org.apache.pekko.actor.ActorSystem
import org.apache.pekko.http.scaladsl.Http import org.apache.pekko.http.scaladsl.Http
import org.apache.pekko.http.scaladsl.Http.ServerBinding import org.apache.pekko.http.scaladsl.Http.ServerBinding
@ -14,7 +15,6 @@ import org.apache.pekko.http.scaladsl.model.StatusCodes.Found
import org.apache.pekko.http.scaladsl.server.Directives._ import org.apache.pekko.http.scaladsl.server.Directives._
import org.apache.pekko.stream.ActorMaterializer import org.apache.pekko.stream.ActorMaterializer
import java.util.function.Supplier
import scala.concurrent.Await import scala.concurrent.Await
object PekkoHttpTestWebServer { object PekkoHttpTestWebServer {
@ -32,7 +32,7 @@ object PekkoHttpTestWebServer {
}, },
path(INDEXED_CHILD.rawPath()) { path(INDEXED_CHILD.rawPath()) {
parameterMap { map => parameterMap { map =>
val supplier = new Supplier[String] { val supplier = new ThrowingSupplier[String, Exception] {
def get(): String = { def get(): String = {
INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider { INDEXED_CHILD.collectSpanAttributes(new UrlParameterProvider {
override def getParameter(name: String): String = override def getParameter(name: String): String =
@ -107,11 +107,9 @@ object PekkoHttpTestWebServer {
} }
} }
def supplier(string: String): Supplier[String] = { def supplier(string: String): ThrowingSupplier[String, Exception] = { () =>
new Supplier[String] { {
def get(): String = {
string string
} }
} }
} }
}

View File

@ -93,6 +93,7 @@ class JettyServlet2Test extends AbstractHttpServerTest<Server> {
options.setTestCaptureHttpHeaders(false); options.setTestCaptureHttpHeaders(false);
options.setHasResponseSpan(e -> e.equals(REDIRECT) || e.equals(ERROR)); options.setHasResponseSpan(e -> e.equals(REDIRECT) || e.equals(ERROR));
options.setHasResponseCustomizer(e -> true); options.setHasResponseCustomizer(e -> true);
options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
} }
@Override @Override

View File

@ -12,8 +12,9 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS;
import io.opentelemetry.instrumentation.test.base.HttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import java.io.IOException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -24,10 +25,10 @@ public class TestServlet2 {
public static class Sync extends HttpServlet { public static class Sync extends HttpServlet {
@Override @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) { protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
req.getRequestDispatcher(null); req.getRequestDispatcher(null);
ServerEndpoint endpoint = ServerEndpoint.forPath(req.getServletPath()); ServerEndpoint endpoint = ServerEndpoint.forPath(req.getServletPath());
HttpServerTest.controller( AbstractHttpServerTest.controller(
endpoint, endpoint,
() -> { () -> {
resp.setContentType("text/plain"); resp.setContentType("text/plain");
@ -42,7 +43,7 @@ public class TestServlet2 {
} else if (ERROR.equals(endpoint)) { } else if (ERROR.equals(endpoint)) {
resp.sendError(endpoint.getStatus(), endpoint.getBody()); resp.sendError(endpoint.getStatus(), endpoint.getBody());
} else if (EXCEPTION.equals(endpoint)) { } else if (EXCEPTION.equals(endpoint)) {
throw new Exception(endpoint.getBody()); throw new IllegalStateException(endpoint.getBody());
} else if (INDEXED_CHILD.equals(endpoint)) { } else if (INDEXED_CHILD.equals(endpoint)) {
INDEXED_CHILD.collectSpanAttributes(req::getParameter); INDEXED_CHILD.collectSpanAttributes(req::getParameter);
resp.setStatus(endpoint.getStatus()); resp.setStatus(endpoint.getStatus());

View File

@ -69,6 +69,7 @@ public abstract class AbstractServlet3Test<SERVER, CONTEXT> extends AbstractHttp
options.setTestCaptureRequestParameters(true); options.setTestCaptureRequestParameters(true);
options.setHasResponseCustomizer(e -> true); options.setHasResponseCustomizer(e -> true);
options.setHasResponseSpan(this::hasResponseSpan); options.setHasResponseSpan(this::hasResponseSpan);
options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
} }
protected boolean hasResponseSpan(ServerEndpoint endpoint) { protected boolean hasResponseSpan(ServerEndpoint endpoint) {

View File

@ -20,7 +20,6 @@ import java.io.IOException;
import java.io.Writer; import java.io.Writer;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import javax.servlet.Servlet; import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.server.handler.ErrorHandler;
@ -47,7 +46,7 @@ public abstract class JettyServlet3Test
protected void configure(HttpServerTestOptions options) { protected void configure(HttpServerTestOptions options) {
super.configure(options); super.configure(options);
options.setTestNotFound(false); options.setTestNotFound(false);
options.setExpectedException(new ServletException(EXCEPTION.getBody())); options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
options.setContextPath("/jetty-context"); options.setContextPath("/jetty-context");
options.setVerifyServerSpanEndTime(!isAsyncTest()); options.setVerifyServerSpanEndTime(!isAsyncTest());
} }

View File

@ -24,7 +24,6 @@ import java.io.Writer;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import javax.servlet.Servlet; import javax.servlet.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.ErrorHandler; import org.eclipse.jetty.server.handler.ErrorHandler;
@ -42,7 +41,7 @@ public class JettyServletHandlerTest extends AbstractServlet3Test<Server, Servle
super.configure(options); super.configure(options);
options.setContextPath(""); options.setContextPath("");
options.setTestNotFound(false); options.setTestNotFound(false);
options.setExpectedException(new ServletException(EXCEPTION.getBody())); options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
options.setHttpAttributes( options.setHttpAttributes(
serverEndpoint -> { serverEndpoint -> {
Set<AttributeKey<?>> attributes = Set<AttributeKey<?>> attributes =

View File

@ -5,6 +5,7 @@
package io.opentelemetry.javaagent.instrumentation.servlet.v3_0.tomcat; package io.opentelemetry.javaagent.instrumentation.servlet.v3_0.tomcat;
import static io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest.controller;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_PARAMETERS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_PARAMETERS;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR;
@ -16,7 +17,6 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint
import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.AbstractServlet3Test.HTML_PRINT_WRITER; import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.AbstractServlet3Test.HTML_PRINT_WRITER;
import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.AbstractServlet3Test.HTML_SERVLET_OUTPUT_STREAM; import static io.opentelemetry.javaagent.instrumentation.servlet.v3_0.AbstractServlet3Test.HTML_SERVLET_OUTPUT_STREAM;
import io.opentelemetry.instrumentation.test.base.HttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import java.io.IOException; import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
@ -24,7 +24,6 @@ import java.nio.charset.StandardCharsets;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.RequestDispatcher; import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -37,14 +36,14 @@ public class TestServlet3 {
@WebServlet @WebServlet
public static class Sync extends HttpServlet { public static class Sync extends HttpServlet {
@Override @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) { protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
String servletPath = (String) req.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH); String servletPath = (String) req.getAttribute(RequestDispatcher.INCLUDE_SERVLET_PATH);
if (servletPath == null) { if (servletPath == null) {
servletPath = req.getServletPath(); servletPath = req.getServletPath();
} }
ServerEndpoint endpoint = ServerEndpoint.forPath(servletPath); ServerEndpoint endpoint = ServerEndpoint.forPath(servletPath);
HttpServerTest.controller( controller(
endpoint, endpoint,
() -> { () -> {
resp.setContentType("text/plain"); resp.setContentType("text/plain");
@ -67,7 +66,7 @@ public class TestServlet3 {
req.setCharacterEncoding("UTF8"); req.setCharacterEncoding("UTF8");
String value = req.getParameter("test-parameter"); String value = req.getParameter("test-parameter");
if (!value.equals("test value õäöü")) { if (!value.equals("test value õäöü")) {
throw new ServletException( throw new IllegalStateException(
"request parameter does not have expected value " + value); "request parameter does not have expected value " + value);
} }
@ -76,7 +75,7 @@ public class TestServlet3 {
} else if (ERROR.equals(endpoint)) { } else if (ERROR.equals(endpoint)) {
resp.sendError(endpoint.getStatus(), endpoint.getBody()); resp.sendError(endpoint.getStatus(), endpoint.getBody());
} else if (EXCEPTION.equals(endpoint)) { } else if (EXCEPTION.equals(endpoint)) {
throw new ServletException(endpoint.getBody()); throw new IllegalStateException(endpoint.getBody());
} else if (HTML_PRINT_WRITER.equals(endpoint)) { } else if (HTML_PRINT_WRITER.equals(endpoint)) {
resp.setContentType("text/html"); resp.setContentType("text/html");
resp.setStatus(endpoint.getStatus()); resp.setStatus(endpoint.getStatus());
@ -108,7 +107,7 @@ public class TestServlet3 {
context.start( context.start(
() -> { () -> {
try { try {
HttpServerTest.controller( controller(
endpoint, endpoint,
() -> { () -> {
resp.setContentType("text/plain"); resp.setContentType("text/plain");
@ -136,7 +135,7 @@ public class TestServlet3 {
req.setCharacterEncoding("UTF8"); req.setCharacterEncoding("UTF8");
String value = req.getParameter("test-parameter"); String value = req.getParameter("test-parameter");
if (!value.equals("test value õäöü")) { if (!value.equals("test value õäöü")) {
throw new ServletException( throw new IllegalStateException(
"request parameter does not have expected value " + value); "request parameter does not have expected value " + value);
} }
@ -157,7 +156,7 @@ public class TestServlet3 {
// response is sent // response is sent
writer.close(); writer.close();
} }
throw new ServletException(endpoint.getBody()); throw new IllegalStateException(endpoint.getBody());
} else if (HTML_PRINT_WRITER.equals(endpoint)) { } else if (HTML_PRINT_WRITER.equals(endpoint)) {
resp.setContentType("text/html"); resp.setContentType("text/html");
resp.setStatus(endpoint.getStatus()); resp.setStatus(endpoint.getStatus());
@ -172,6 +171,11 @@ public class TestServlet3 {
} }
return null; return null;
}); });
} catch (Exception exception) {
if (exception instanceof RuntimeException) {
throw (RuntimeException) exception;
}
throw new IllegalStateException(exception);
} finally { } finally {
latch.countDown(); latch.countDown();
} }
@ -187,12 +191,12 @@ public class TestServlet3 {
@WebServlet(asyncSupported = true) @WebServlet(asyncSupported = true)
public static class FakeAsync extends HttpServlet { public static class FakeAsync extends HttpServlet {
@Override @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) { protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
AsyncContext context = req.startAsync(); AsyncContext context = req.startAsync();
try { try {
ServerEndpoint endpoint = ServerEndpoint.forPath(req.getServletPath()); ServerEndpoint endpoint = ServerEndpoint.forPath(req.getServletPath());
HttpServerTest.controller( controller(
endpoint, endpoint,
() -> { () -> {
resp.setContentType("text/plain"); resp.setContentType("text/plain");
@ -215,7 +219,7 @@ public class TestServlet3 {
req.setCharacterEncoding("UTF8"); req.setCharacterEncoding("UTF8");
String value = req.getParameter("test-parameter"); String value = req.getParameter("test-parameter");
if (!value.equals("test value õäöü")) { if (!value.equals("test value õäöü")) {
throw new ServletException( throw new IllegalStateException(
"request parameter does not have expected value " + value); "request parameter does not have expected value " + value);
} }
@ -226,7 +230,7 @@ public class TestServlet3 {
} else if (EXCEPTION.equals(endpoint)) { } else if (EXCEPTION.equals(endpoint)) {
resp.setStatus(endpoint.getStatus()); resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody()); resp.getWriter().print(endpoint.getBody());
throw new ServletException(endpoint.getBody()); throw new IllegalStateException(endpoint.getBody());
} else if (HTML_PRINT_WRITER.equals(endpoint)) { } else if (HTML_PRINT_WRITER.equals(endpoint)) {
// intentionally testing setting status before contentType here to cover that case // intentionally testing setting status before contentType here to cover that case
// somewhere // somewhere

View File

@ -31,7 +31,6 @@ import java.util.function.Consumer;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
import javax.servlet.Servlet; import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.apache.catalina.Context; import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleException;
import org.apache.catalina.core.StandardHost; import org.apache.catalina.core.StandardHost;
@ -63,7 +62,7 @@ public abstract class TomcatServlet3Test extends AbstractServlet3Test<Tomcat, Co
@Override @Override
protected void configure(HttpServerTestOptions options) { protected void configure(HttpServerTestOptions options) {
super.configure(options); super.configure(options);
options.setExpectedException(new ServletException(EXCEPTION.getBody())); options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
options.setContextPath("/tomcat-context"); options.setContextPath("/tomcat-context");
options.setTestError(testError()); options.setTestError(testError());
} }

View File

@ -46,7 +46,7 @@ public class DelayedControllerSpringWebFluxServerTest extends ControllerSpringWe
protected <T> Mono<T> wrapControllerMethod(ServerEndpoint endpoint, Supplier<T> handler) { protected <T> Mono<T> wrapControllerMethod(ServerEndpoint endpoint, Supplier<T> handler) {
return Mono.just("") return Mono.just("")
.delayElement(Duration.ofMillis(10)) .delayElement(Duration.ofMillis(10))
.map(unused -> controller(endpoint, handler)); .map(unused -> controller(endpoint, handler::get));
} }
} }
} }

View File

@ -45,7 +45,7 @@ public class ImmediateControllerSpringWebFluxServerTest extends ControllerSpring
@Override @Override
protected <T> Mono<T> wrapControllerMethod( protected <T> Mono<T> wrapControllerMethod(
ServerEndpoint endpoint, Supplier<T> controllerMethod) { ServerEndpoint endpoint, Supplier<T> controllerMethod) {
return Mono.just(controller(endpoint, controllerMethod)); return Mono.just(controller(endpoint, controllerMethod::get));
} }
} }
} }

View File

@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v3_1.filter;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD;
import io.opentelemetry.instrumentation.test.base.HttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import java.io.IOException; import java.io.IOException;
import javax.servlet.Filter; import javax.servlet.Filter;
@ -29,7 +29,7 @@ class ServletFilterConfig {
return new Filter() { return new Filter() {
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException {} public void init(FilterConfig filterConfig) {}
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
@ -37,45 +37,35 @@ class ServletFilterConfig {
HttpServletRequest req = (HttpServletRequest) request; HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response; HttpServletResponse resp = (HttpServletResponse) response;
ServerEndpoint endpoint = ServerEndpoint.forPath(req.getServletPath()); ServerEndpoint endpoint = ServerEndpoint.forPath(req.getServletPath());
HttpServerTest.controller( if (endpoint != null && endpoint != ServerEndpoint.NOT_FOUND) {
AbstractHttpServerTest.controller(
endpoint, endpoint,
() -> { () -> {
resp.setContentType("text/plain"); resp.setContentType("text/plain");
switch (endpoint.name()) { if (endpoint == ServerEndpoint.QUERY_PARAM) {
case "SUCCESS":
resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody());
break;
case "QUERY_PARAM":
resp.setStatus(endpoint.getStatus()); resp.setStatus(endpoint.getStatus());
resp.getWriter().print(req.getQueryString()); resp.getWriter().print(req.getQueryString());
break; } else if (endpoint == ServerEndpoint.REDIRECT) {
case "PATH_PARAM":
resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody());
break;
case "REDIRECT":
resp.sendRedirect(endpoint.getBody()); resp.sendRedirect(endpoint.getBody());
break; } else if (endpoint == ServerEndpoint.CAPTURE_HEADERS) {
case "CAPTURE_HEADERS":
resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")); resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request"));
resp.setStatus(endpoint.getStatus()); resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody()); resp.getWriter().print(endpoint.getBody());
break; } else if (endpoint == ServerEndpoint.ERROR) {
case "ERROR":
resp.sendError(endpoint.getStatus(), endpoint.getBody()); resp.sendError(endpoint.getStatus(), endpoint.getBody());
break; } else if (endpoint == ServerEndpoint.EXCEPTION) {
case "EXCEPTION": throw new IllegalStateException(endpoint.getBody());
throw new Exception(endpoint.getBody()); } else if (endpoint == ServerEndpoint.INDEXED_CHILD) {
case "INDEXED_CHILD":
INDEXED_CHILD.collectSpanAttributes(req::getParameter); INDEXED_CHILD.collectSpanAttributes(req::getParameter);
resp.getWriter().print(endpoint.getBody()); resp.getWriter().print(endpoint.getBody());
break; } else {
default: resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody());
}
});
} else {
chain.doFilter(request, response); chain.doFilter(request, response);
} }
return null;
});
} }
@Override @Override

View File

@ -7,7 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.spring.webmvc.v6_0.filter;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.INDEXED_CHILD;
import io.opentelemetry.instrumentation.test.base.HttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import jakarta.servlet.Filter; import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain; import jakarta.servlet.FilterChain;
@ -29,7 +29,7 @@ class ServletFilterConfig {
return new Filter() { return new Filter() {
@Override @Override
public void init(FilterConfig filterConfig) throws ServletException {} public void init(FilterConfig filterConfig) {}
@Override @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
@ -37,45 +37,35 @@ class ServletFilterConfig {
HttpServletRequest req = (HttpServletRequest) request; HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response; HttpServletResponse resp = (HttpServletResponse) response;
ServerEndpoint endpoint = ServerEndpoint.forPath(req.getServletPath()); ServerEndpoint endpoint = ServerEndpoint.forPath(req.getServletPath());
HttpServerTest.controller( if (endpoint != null && endpoint != ServerEndpoint.NOT_FOUND) {
AbstractHttpServerTest.controller(
endpoint, endpoint,
() -> { () -> {
resp.setContentType("text/plain"); resp.setContentType("text/plain");
switch (endpoint.name()) { if (endpoint == ServerEndpoint.QUERY_PARAM) {
case "SUCCESS":
resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody());
break;
case "QUERY_PARAM":
resp.setStatus(endpoint.getStatus()); resp.setStatus(endpoint.getStatus());
resp.getWriter().print(req.getQueryString()); resp.getWriter().print(req.getQueryString());
break; } else if (endpoint == ServerEndpoint.REDIRECT) {
case "PATH_PARAM":
resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody());
break;
case "REDIRECT":
resp.sendRedirect(endpoint.getBody()); resp.sendRedirect(endpoint.getBody());
break; } else if (endpoint == ServerEndpoint.CAPTURE_HEADERS) {
case "CAPTURE_HEADERS":
resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")); resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request"));
resp.setStatus(endpoint.getStatus()); resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody()); resp.getWriter().print(endpoint.getBody());
break; } else if (endpoint == ServerEndpoint.ERROR) {
case "ERROR":
resp.sendError(endpoint.getStatus(), endpoint.getBody()); resp.sendError(endpoint.getStatus(), endpoint.getBody());
break; } else if (endpoint == ServerEndpoint.EXCEPTION) {
case "EXCEPTION": throw new IllegalStateException(endpoint.getBody());
throw new Exception(endpoint.getBody()); } else if (endpoint == ServerEndpoint.INDEXED_CHILD) {
case "INDEXED_CHILD":
INDEXED_CHILD.collectSpanAttributes(req::getParameter); INDEXED_CHILD.collectSpanAttributes(req::getParameter);
resp.getWriter().print(endpoint.getBody()); resp.getWriter().print(endpoint.getBody());
break; } else {
default: resp.setStatus(endpoint.getStatus());
resp.getWriter().print(endpoint.getBody());
}
});
} else {
chain.doFilter(request, response); chain.doFilter(request, response);
} }
return null;
});
} }
@Override @Override

View File

@ -49,6 +49,7 @@ public abstract class AbstractServletFilterTest
options.setHasResponseSpan( options.setHasResponseSpan(
endpoint -> endpoint == REDIRECT || endpoint == ERROR || endpoint == NOT_FOUND); endpoint -> endpoint == REDIRECT || endpoint == ERROR || endpoint == NOT_FOUND);
options.setTestPathParam(true); options.setTestPathParam(true);
options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
} }
@Override @Override

View File

@ -5,8 +5,9 @@
package io.opentelemetry.javaagent.instrumentation.struts2; package io.opentelemetry.javaagent.instrumentation.struts2;
import static io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest.controller;
import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ActionSupport;
import io.opentelemetry.instrumentation.test.base.HttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -17,40 +18,37 @@ public class GreetingAction extends ActionSupport {
String responseBody = "default"; String responseBody = "default";
public String success() { public String success() {
responseBody = responseBody = controller(ServerEndpoint.SUCCESS, ServerEndpoint.SUCCESS::getBody);
HttpServerTest.controller(ServerEndpoint.SUCCESS, ServerEndpoint.SUCCESS::getBody);
return "greeting"; return "greeting";
} }
public String redirect() { public String redirect() {
responseBody = responseBody = controller(ServerEndpoint.REDIRECT, ServerEndpoint.REDIRECT::getBody);
HttpServerTest.controller(ServerEndpoint.REDIRECT, ServerEndpoint.REDIRECT::getBody);
return "redirect"; return "redirect";
} }
public String query_param() { public String query_param() {
responseBody = responseBody = controller(ServerEndpoint.QUERY_PARAM, ServerEndpoint.QUERY_PARAM::getBody);
HttpServerTest.controller(ServerEndpoint.QUERY_PARAM, ServerEndpoint.QUERY_PARAM::getBody);
return "greeting"; return "greeting";
} }
public String error() { public String error() {
HttpServerTest.controller(ServerEndpoint.ERROR, ServerEndpoint.ERROR::getBody); controller(ServerEndpoint.ERROR, ServerEndpoint.ERROR::getBody);
return "error"; return "error";
} }
public String exception() { public String exception() {
HttpServerTest.controller( controller(
ServerEndpoint.EXCEPTION, ServerEndpoint.EXCEPTION,
() -> { () -> {
throw new Exception(ServerEndpoint.EXCEPTION.getBody()); throw new IllegalStateException(ServerEndpoint.EXCEPTION.getBody());
}); });
throw new AssertionError(); // should not reach here throw new AssertionError(); // should not reach here
} }
public String path_param() { public String path_param() {
HttpServerTest.controller( controller(
ServerEndpoint.PATH_PARAM, ServerEndpoint.PATH_PARAM,
() -> () ->
"this does nothing, as responseBody is set in setId, but we need this controller span nevertheless"); "this does nothing, as responseBody is set in setId, but we need this controller span nevertheless");
@ -59,7 +57,7 @@ public class GreetingAction extends ActionSupport {
public String indexed_child() { public String indexed_child() {
responseBody = responseBody =
HttpServerTest.controller( controller(
ServerEndpoint.INDEXED_CHILD, ServerEndpoint.INDEXED_CHILD,
() -> { () -> {
ServerEndpoint.INDEXED_CHILD.collectSpanAttributes( ServerEndpoint.INDEXED_CHILD.collectSpanAttributes(
@ -74,8 +72,7 @@ public class GreetingAction extends ActionSupport {
HttpServletResponse response = ServletActionContext.getResponse(); HttpServletResponse response = ServletActionContext.getResponse();
response.setHeader("X-Test-Response", request.getHeader("X-Test-Request")); response.setHeader("X-Test-Response", request.getHeader("X-Test-Request"));
responseBody = responseBody =
HttpServerTest.controller( controller(ServerEndpoint.CAPTURE_HEADERS, ServerEndpoint.CAPTURE_HEADERS::getBody);
ServerEndpoint.CAPTURE_HEADERS, ServerEndpoint.CAPTURE_HEADERS::getBody);
return "greeting"; return "greeting";
} }

View File

@ -6,7 +6,6 @@
package io.opentelemetry.javaagent.instrumentation.struts2; package io.opentelemetry.javaagent.instrumentation.struts2;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -14,8 +13,7 @@ import javax.servlet.http.HttpServletResponse;
public class GreetingServlet extends HttpServlet { public class GreetingServlet extends HttpServlet {
@Override @Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
throws ServletException, IOException {
resp.getWriter().write("greeting"); resp.getWriter().write("greeting");
} }
} }

View File

@ -96,6 +96,7 @@ class Struts2ActionSpanTest extends AbstractHttpServerTest<Server> {
options.setTestPathParam(true); options.setTestPathParam(true);
options.setTestErrorBody(false); options.setTestErrorBody(false);
options.setHasHandlerSpan(endpoint -> !endpoint.equals(NOT_FOUND)); options.setHasHandlerSpan(endpoint -> !endpoint.equals(NOT_FOUND));
options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
options.setHasResponseSpan( options.setHasResponseSpan(
endpoint -> endpoint ->
endpoint == REDIRECT endpoint == REDIRECT
@ -139,7 +140,8 @@ class Struts2ActionSpanTest extends AbstractHttpServerTest<Server> {
.hasKind(SpanKind.INTERNAL); .hasKind(SpanKind.INTERNAL);
if (endpoint.equals(EXCEPTION)) { if (endpoint.equals(EXCEPTION)) {
span.hasStatus(StatusData.error()).hasException(new Exception(EXCEPTION.getBody())); span.hasStatus(StatusData.error())
.hasException(new IllegalStateException(EXCEPTION.getBody()));
} }
span.hasAttributesSatisfyingExactly( span.hasAttributesSatisfyingExactly(

View File

@ -13,14 +13,14 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS;
import io.opentelemetry.instrumentation.test.base.HttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import jakarta.servlet.AsyncContext; import jakarta.servlet.AsyncContext;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet; import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
@ -37,7 +37,7 @@ class AsyncServlet extends HttpServlet {
context.start( context.start(
() -> { () -> {
try { try {
HttpServerTest.controller( AbstractHttpServerTest.controller(
endpoint, endpoint,
() -> { () -> {
resp.setContentType("text/plain"); resp.setContentType("text/plain");
@ -61,10 +61,11 @@ class AsyncServlet extends HttpServlet {
PrintWriter writer = resp.getWriter(); PrintWriter writer = resp.getWriter();
writer.print(endpoint.getBody()); writer.print(endpoint.getBody());
writer.close(); writer.close();
throw new ServletException(endpoint.getBody()); throw new IllegalStateException(endpoint.getBody());
} }
return null;
}); });
} catch (IOException exception) {
throw new IllegalStateException(exception);
} finally { } finally {
// complete at the end so the server span will end after the controller span // complete at the end so the server span will end after the controller span
if (endpoint != EXCEPTION) { if (endpoint != EXCEPTION) {

View File

@ -5,9 +5,8 @@
package io.opentelemetry.javaagent.instrumentation.tomcat.v10_0; package io.opentelemetry.javaagent.instrumentation.tomcat.v10_0;
import io.opentelemetry.instrumentation.test.base.HttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@ -21,11 +20,11 @@ class TestServlet extends HttpServlet {
ServerEndpoint serverEndpoint = ServerEndpoint.forPath(path); ServerEndpoint serverEndpoint = ServerEndpoint.forPath(path);
if (serverEndpoint != null) { if (serverEndpoint != null) {
HttpServerTest.controller( AbstractHttpServerTest.controller(
serverEndpoint, serverEndpoint,
() -> { () -> {
if (serverEndpoint == ServerEndpoint.EXCEPTION) { if (serverEndpoint == ServerEndpoint.EXCEPTION) {
throw new Exception(serverEndpoint.getBody()); throw new IllegalStateException(serverEndpoint.getBody());
} }
if (serverEndpoint == ServerEndpoint.CAPTURE_HEADERS) { if (serverEndpoint == ServerEndpoint.CAPTURE_HEADERS) {
resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")); resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request"));
@ -34,7 +33,7 @@ class TestServlet extends HttpServlet {
req.setCharacterEncoding("UTF8"); req.setCharacterEncoding("UTF8");
String value = req.getParameter("test-parameter"); String value = req.getParameter("test-parameter");
if (!"test value õäöü".equals(value)) { if (!"test value õäöü".equals(value)) {
throw new ServletException( throw new IllegalStateException(
"request parameter does not have expected value " + value); "request parameter does not have expected value " + value);
} }
} }

View File

@ -26,7 +26,6 @@ import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
import jakarta.servlet.Servlet; import jakarta.servlet.Servlet;
import jakarta.servlet.ServletException;
import java.io.File; import java.io.File;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.UUID; import java.util.UUID;
@ -110,8 +109,7 @@ class TomcatAsyncTest extends AbstractHttpServerTest<Tomcat> {
return super.expectedHttpRoute(endpoint, method); return super.expectedHttpRoute(endpoint, method);
}); });
options.setExpectedException(new ServletException(EXCEPTION.getBody())); options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
options.setHasResponseSpan(endpoint -> endpoint == NOT_FOUND || endpoint == REDIRECT); options.setHasResponseSpan(endpoint -> endpoint == NOT_FOUND || endpoint == REDIRECT);
} }

View File

@ -99,6 +99,7 @@ class TomcatHandlerTest extends AbstractHttpServerTest<Tomcat> {
options.setHasResponseCustomizer(serverEndpoint -> true); options.setHasResponseCustomizer(serverEndpoint -> true);
options.setTestCaptureRequestParameters(true); options.setTestCaptureRequestParameters(true);
options.setTestErrorBody(false); options.setTestErrorBody(false);
options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
options.setHasResponseSpan( options.setHasResponseSpan(
endpoint -> endpoint == REDIRECT || endpoint == ERROR || endpoint == NOT_FOUND); endpoint -> endpoint == REDIRECT || endpoint == ERROR || endpoint == NOT_FOUND);

View File

@ -13,12 +13,11 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS;
import io.opentelemetry.instrumentation.test.base.HttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.util.concurrent.CountDownLatch; import java.util.concurrent.CountDownLatch;
import javax.servlet.AsyncContext; import javax.servlet.AsyncContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet; import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -37,7 +36,7 @@ class AsyncServlet extends HttpServlet {
context.start( context.start(
() -> { () -> {
try { try {
HttpServerTest.controller( AbstractHttpServerTest.controller(
endpoint, endpoint,
() -> { () -> {
resp.setContentType("text/plain"); resp.setContentType("text/plain");
@ -61,10 +60,15 @@ class AsyncServlet extends HttpServlet {
PrintWriter writer = resp.getWriter(); PrintWriter writer = resp.getWriter();
writer.print(endpoint.getBody()); writer.print(endpoint.getBody());
writer.close(); writer.close();
throw new ServletException(endpoint.getBody()); throw new IllegalStateException(endpoint.getBody());
} }
return null; return null;
}); });
} catch (Exception exception) {
if (exception instanceof RuntimeException) {
throw (RuntimeException) exception;
}
throw new IllegalStateException(exception);
} finally { } finally {
// complete at the end so the server span will end after the controller span // complete at the end so the server span will end after the controller span
if (endpoint != EXCEPTION) { if (endpoint != EXCEPTION) {

View File

@ -5,10 +5,9 @@
package io.opentelemetry.javaagent.instrumentation.tomcat.v7_0; package io.opentelemetry.javaagent.instrumentation.tomcat.v7_0;
import io.opentelemetry.instrumentation.test.base.HttpServerTest; import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint; import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
import java.io.IOException; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@ -21,11 +20,11 @@ class TestServlet extends HttpServlet {
ServerEndpoint serverEndpoint = ServerEndpoint.forPath(path); ServerEndpoint serverEndpoint = ServerEndpoint.forPath(path);
if (serverEndpoint != null) { if (serverEndpoint != null) {
HttpServerTest.controller( AbstractHttpServerTest.controller(
serverEndpoint, serverEndpoint,
() -> { () -> {
if (serverEndpoint == ServerEndpoint.EXCEPTION) { if (serverEndpoint == ServerEndpoint.EXCEPTION) {
throw new Exception(serverEndpoint.getBody()); throw new IllegalStateException(serverEndpoint.getBody());
} }
if (serverEndpoint == ServerEndpoint.CAPTURE_HEADERS) { if (serverEndpoint == ServerEndpoint.CAPTURE_HEADERS) {
resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request")); resp.setHeader("X-Test-Response", req.getHeader("X-Test-Request"));
@ -34,7 +33,7 @@ class TestServlet extends HttpServlet {
req.setCharacterEncoding("UTF8"); req.setCharacterEncoding("UTF8");
String value = req.getParameter("test-parameter"); String value = req.getParameter("test-parameter");
if (!"test value õäöü".equals(value)) { if (!"test value õäöü".equals(value)) {
throw new ServletException( throw new IllegalStateException(
"request parameter does not have expected value " + value); "request parameter does not have expected value " + value);
} }
} }

View File

@ -28,7 +28,6 @@ import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
import java.io.File; import java.io.File;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.UUID; import java.util.UUID;
import javax.servlet.ServletException;
import org.apache.catalina.Context; import org.apache.catalina.Context;
import org.apache.catalina.LifecycleException; import org.apache.catalina.LifecycleException;
import org.apache.catalina.startup.Tomcat; import org.apache.catalina.startup.Tomcat;
@ -105,8 +104,7 @@ class TomcatAsyncTest extends AbstractHttpServerTest<Tomcat> {
return super.expectedHttpRoute(endpoint, method); return super.expectedHttpRoute(endpoint, method);
}); });
options.setExpectedException(new ServletException(EXCEPTION.getBody())); options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
options.setHasResponseSpan(endpoint -> endpoint == NOT_FOUND || endpoint == REDIRECT); options.setHasResponseSpan(endpoint -> endpoint == NOT_FOUND || endpoint == REDIRECT);
} }

View File

@ -99,6 +99,7 @@ class TomcatHandlerTest extends AbstractHttpServerTest<Tomcat> {
options.setHasResponseCustomizer(serverEndpoint -> true); options.setHasResponseCustomizer(serverEndpoint -> true);
options.setTestCaptureRequestParameters(true); options.setTestCaptureRequestParameters(true);
options.setTestErrorBody(false); options.setTestErrorBody(false);
options.setExpectedException(new IllegalStateException(EXCEPTION.getBody()));
options.setHasResponseSpan( options.setHasResponseSpan(
endpoint -> endpoint == REDIRECT || endpoint == ERROR || endpoint == NOT_FOUND); endpoint -> endpoint == REDIRECT || endpoint == ERROR || endpoint == NOT_FOUND);

View File

@ -18,6 +18,8 @@ import io.vertx.core.json.JsonObject
import java.util.concurrent.CompletableFuture import java.util.concurrent.CompletableFuture
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION
abstract class AbstractVertxHttpServerTest extends HttpServerTest<Vertx> implements AgentTestTrait { abstract class AbstractVertxHttpServerTest extends HttpServerTest<Vertx> implements AgentTestTrait {
@Override @Override
Vertx startServer(int port) { Vertx startServer(int port) {
@ -63,6 +65,11 @@ abstract class AbstractVertxHttpServerTest extends HttpServerTest<Vertx> impleme
"/vertx-app" "/vertx-app"
} }
@Override
Throwable expectedException() {
new IllegalStateException(EXCEPTION.body)
}
@Override @Override
String expectedHttpRoute(ServerEndpoint endpoint, String method) { String expectedHttpRoute(ServerEndpoint endpoint, String method) {
if (method == HttpConstants._OTHER) { if (method == HttpConstants._OTHER) {

View File

@ -5,6 +5,7 @@
package server; package server;
import static io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest.controller;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.CAPTURE_HEADERS;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.ERROR;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.EXCEPTION;
@ -14,7 +15,6 @@ import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT;
import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS; import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.SUCCESS;
import io.opentelemetry.instrumentation.test.base.HttpServerTest;
import io.vertx.core.AbstractVerticle; import io.vertx.core.AbstractVerticle;
import io.vertx.core.Handler; import io.vertx.core.Handler;
import io.vertx.core.http.HttpServerResponse; import io.vertx.core.http.HttpServerResponse;
@ -42,7 +42,7 @@ public abstract class AbstractVertxWebServer extends AbstractVerticle {
new Handler<RoutingContext>() { new Handler<RoutingContext>() {
@Override @Override
public void handle(RoutingContext ctx) { public void handle(RoutingContext ctx) {
HttpServerTest.controller( controller(
SUCCESS, SUCCESS,
() -> { () -> {
end(ctx.response().setStatusCode(SUCCESS.getStatus()), SUCCESS.getBody()); end(ctx.response().setStatusCode(SUCCESS.getStatus()), SUCCESS.getBody());
@ -54,7 +54,7 @@ public abstract class AbstractVertxWebServer extends AbstractVerticle {
.route(INDEXED_CHILD.getPath()) .route(INDEXED_CHILD.getPath())
.handler( .handler(
ctx -> ctx ->
HttpServerTest.controller( controller(
INDEXED_CHILD, INDEXED_CHILD,
() -> { () -> {
INDEXED_CHILD.collectSpanAttributes(it -> ctx.request().getParam(it)); INDEXED_CHILD.collectSpanAttributes(it -> ctx.request().getParam(it));
@ -65,7 +65,7 @@ public abstract class AbstractVertxWebServer extends AbstractVerticle {
.route(QUERY_PARAM.getPath()) .route(QUERY_PARAM.getPath())
.handler( .handler(
ctx -> ctx ->
HttpServerTest.controller( controller(
QUERY_PARAM, QUERY_PARAM,
() -> { () -> {
end( end(
@ -77,7 +77,7 @@ public abstract class AbstractVertxWebServer extends AbstractVerticle {
.route(REDIRECT.getPath()) .route(REDIRECT.getPath())
.handler( .handler(
ctx -> ctx ->
HttpServerTest.controller( controller(
REDIRECT, REDIRECT,
() -> { () -> {
end( end(
@ -90,7 +90,7 @@ public abstract class AbstractVertxWebServer extends AbstractVerticle {
.route(ERROR.getPath()) .route(ERROR.getPath())
.handler( .handler(
ctx -> ctx ->
HttpServerTest.controller( controller(
ERROR, ERROR,
() -> { () -> {
end(ctx.response().setStatusCode(ERROR.getStatus()), ERROR.getBody()); end(ctx.response().setStatusCode(ERROR.getStatus()), ERROR.getBody());
@ -100,16 +100,16 @@ public abstract class AbstractVertxWebServer extends AbstractVerticle {
.route(EXCEPTION.getPath()) .route(EXCEPTION.getPath())
.handler( .handler(
ctx -> ctx ->
HttpServerTest.controller( controller(
EXCEPTION, EXCEPTION,
() -> { () -> {
throw new Exception(EXCEPTION.getBody()); throw new IllegalStateException(EXCEPTION.getBody());
})); }));
router router
.route("/path/:id/param") .route("/path/:id/param")
.handler( .handler(
ctx -> ctx ->
HttpServerTest.controller( controller(
PATH_PARAM, PATH_PARAM,
() -> { () -> {
end( end(
@ -121,7 +121,7 @@ public abstract class AbstractVertxWebServer extends AbstractVerticle {
.route(CAPTURE_HEADERS.getPath()) .route(CAPTURE_HEADERS.getPath())
.handler( .handler(
ctx -> ctx ->
HttpServerTest.controller( controller(
CAPTURE_HEADERS, CAPTURE_HEADERS,
() -> { () -> {
end( end(

View File

@ -29,6 +29,8 @@ import io.opentelemetry.context.propagation.TextMapPropagator;
import io.opentelemetry.context.propagation.TextMapSetter; import io.opentelemetry.context.propagation.TextMapSetter;
import io.opentelemetry.instrumentation.api.internal.HttpConstants; import io.opentelemetry.instrumentation.api.internal.HttpConstants;
import io.opentelemetry.instrumentation.testing.GlobalTraceUtil; import io.opentelemetry.instrumentation.testing.GlobalTraceUtil;
import io.opentelemetry.instrumentation.testing.util.ThrowingRunnable;
import io.opentelemetry.instrumentation.testing.util.ThrowingSupplier;
import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
import io.opentelemetry.sdk.testing.assertj.TraceAssert; import io.opentelemetry.sdk.testing.assertj.TraceAssert;
import io.opentelemetry.sdk.trace.data.SpanData; import io.opentelemetry.sdk.trace.data.SpanData;
@ -75,7 +77,6 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Consumer; import java.util.function.Consumer;
import java.util.function.Supplier;
import java.util.stream.Stream; import java.util.stream.Stream;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.assertj.core.api.AssertAccess; import org.assertj.core.api.AssertAccess;
@ -115,15 +116,17 @@ public abstract class AbstractHttpServerTest<SERVER> extends AbstractHttpServerU
protected void configure(HttpServerTestOptions options) {} protected void configure(HttpServerTestOptions options) {}
public static <T> T controller(ServerEndpoint endpoint, Supplier<T> closure) { public static <T, E extends Throwable> T controller(
ServerEndpoint endpoint, ThrowingSupplier<T, E> closure) throws E {
assert Span.current().getSpanContext().isValid() : "Controller should have a parent span."; assert Span.current().getSpanContext().isValid() : "Controller should have a parent span.";
if (endpoint == NOT_FOUND) { if (endpoint == NOT_FOUND) {
return closure.get(); return closure.get();
} }
return GlobalTraceUtil.runWithSpan("controller", closure::get); return GlobalTraceUtil.runWithSpan("controller", closure);
} }
public static void controller(ServerEndpoint endpoint, Runnable closure) { public static <E extends Throwable> void controller(
ServerEndpoint endpoint, ThrowingRunnable<E> closure) throws E {
controller( controller(
endpoint, endpoint,
() -> { () -> {