From 16975acc67f6fd37907ca2ee5d295e5ef799cc0a Mon Sep 17 00:00:00 2001 From: Anna Nosek Date: Thu, 18 Nov 2021 20:11:22 +0100 Subject: [PATCH] add spring tests (#4670) --- .../v2_0/spring/SpringBeanRouterTest.groovy | 17 +++ .../v2_0/spring/SpringRouterTest.groovy | 17 +++ .../AbstractSpringServerLibraryTest.groovy | 70 +++++++++ .../v2_0/spring/SpringBeanRouterTest.groovy | 14 ++ .../v2_0/spring/SpringRouterTest.groovy | 15 ++ .../restlet-2.0/testing/build.gradle.kts | 1 + .../restlet/v2_0/RestletAppTestBase.groovy | 137 ++++++++++++++++++ .../spring/AbstractSpringServerTest.groovy | 34 +++++ .../main/resources/springBeanRouterConf.xml | 29 ++++ .../src/main/resources/springRouterConf.xml | 34 +++++ 10 files changed, 368 insertions(+) create mode 100644 instrumentation/restlet/restlet-2.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/spring/SpringBeanRouterTest.groovy create mode 100644 instrumentation/restlet/restlet-2.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/spring/SpringRouterTest.groovy create mode 100644 instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerLibraryTest.groovy create mode 100644 instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/SpringBeanRouterTest.groovy create mode 100644 instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/SpringRouterTest.groovy create mode 100644 instrumentation/restlet/restlet-2.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v2_0/RestletAppTestBase.groovy create mode 100644 instrumentation/restlet/restlet-2.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerTest.groovy create mode 100644 instrumentation/restlet/restlet-2.0/testing/src/main/resources/springBeanRouterConf.xml create mode 100644 instrumentation/restlet/restlet-2.0/testing/src/main/resources/springRouterConf.xml diff --git a/instrumentation/restlet/restlet-2.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/spring/SpringBeanRouterTest.groovy b/instrumentation/restlet/restlet-2.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/spring/SpringBeanRouterTest.groovy new file mode 100644 index 0000000000..b8c9837b79 --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/spring/SpringBeanRouterTest.groovy @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.restlet.v2_0.spring + +import io.opentelemetry.instrumentation.restlet.v2_0.spring.AbstractSpringServerTest +import io.opentelemetry.instrumentation.test.AgentTestTrait + +class SpringBeanRouterTest extends AbstractSpringServerTest implements AgentTestTrait { + @Override + String getConfigurationName() { + return "springBeanRouterConf.xml" + } + +} diff --git a/instrumentation/restlet/restlet-2.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/spring/SpringRouterTest.groovy b/instrumentation/restlet/restlet-2.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/spring/SpringRouterTest.groovy new file mode 100644 index 0000000000..e1d5439ec6 --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/restlet/v2_0/spring/SpringRouterTest.groovy @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.restlet.v2_0.spring + +import io.opentelemetry.instrumentation.restlet.v2_0.spring.AbstractSpringServerTest +import io.opentelemetry.instrumentation.test.AgentTestTrait + +class SpringRouterTest extends AbstractSpringServerTest implements AgentTestTrait { + @Override + String getConfigurationName() { + return "springRouterConf.xml" + } + +} diff --git a/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerLibraryTest.groovy b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerLibraryTest.groovy new file mode 100644 index 0000000000..4fdf44eb3c --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerLibraryTest.groovy @@ -0,0 +1,70 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.restlet.v2_0.spring + +import io.opentelemetry.instrumentation.restlet.v2_0.RestletTracing +import io.opentelemetry.instrumentation.test.LibraryTestTrait +import org.restlet.Request +import org.restlet.Response +import org.restlet.Restlet +import org.restlet.data.Status +import org.restlet.engine.application.StatusFilter +import org.restlet.routing.Route +import org.restlet.routing.Template +import org.restlet.routing.TemplateRoute +import org.restlet.service.StatusService +import org.restlet.util.RouteList + +import java.lang.reflect.Modifier + +abstract class AbstractSpringServerLibraryTest extends AbstractSpringServerTest implements LibraryTestTrait { + @Override + Restlet wrapRestlet(Restlet restlet, String path) { + + RestletTracing tracing = RestletTracing.builder(openTelemetry) + .captureHttpHeaders(capturedHttpHeadersForTesting()) + .build() + + def tracingFilter = tracing.newFilter(path) + def statusFilter = new StatusFilter(component.getContext(), new StatusService()) + + tracingFilter.setNext(statusFilter) + statusFilter.setNext(restlet) + + return tracingFilter + } + + + @Override + void setupRouting() { + //for latestDepTest + def routeClass = Modifier.isAbstract(Route.getModifiers()) ? TemplateRoute : Route + + List routes = [] + for (Route route : router.getRoutes()) { + def pattern = route.getTemplate().getPattern() + routes.add((Route) routeClass.newInstance(router, pattern, wrapRestlet(route.getNext(), pattern))) + } + + def notFoundRestlet = new Restlet(router.getContext()) { + @Override + void handle(Request request, Response response) { + super.handle(request, response) + response.setStatus(Status.CLIENT_ERROR_NOT_FOUND) + } + } + notFoundRestlet = wrapRestlet(notFoundRestlet, "/*") + + def route = (Route) routeClass.newInstance(router, "/", notFoundRestlet) + route.setMatchingMode(Template.MODE_STARTS_WITH) + routes.add(route) + + router.setRoutes(new RouteList(routes)) + + host.attach(router) + + } +} diff --git a/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/SpringBeanRouterTest.groovy b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/SpringBeanRouterTest.groovy new file mode 100644 index 0000000000..afe3933931 --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/SpringBeanRouterTest.groovy @@ -0,0 +1,14 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.restlet.v2_0.spring + +class SpringBeanRouterTest extends AbstractSpringServerLibraryTest { + @Override + String getConfigurationName() { + return "springBeanRouterConf.xml" + } + +} diff --git a/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/SpringRouterTest.groovy b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/SpringRouterTest.groovy new file mode 100644 index 0000000000..58f2ff4312 --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/library/src/test/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/SpringRouterTest.groovy @@ -0,0 +1,15 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.restlet.v2_0.spring + +class SpringRouterTest extends AbstractSpringServerLibraryTest { + + @Override + String getConfigurationName() { + return "springRouterConf.xml" + } + +} diff --git a/instrumentation/restlet/restlet-2.0/testing/build.gradle.kts b/instrumentation/restlet/restlet-2.0/testing/build.gradle.kts index 4e5f440e5d..1397fbe751 100644 --- a/instrumentation/restlet/restlet-2.0/testing/build.gradle.kts +++ b/instrumentation/restlet/restlet-2.0/testing/build.gradle.kts @@ -12,6 +12,7 @@ dependencies { api(project(":testing-common")) implementation("org.restlet.jse:org.restlet:2.0.2") + implementation("org.restlet.jse:org.restlet.ext.spring:2.0.2") implementation("org.codehaus.groovy:groovy-all") implementation("io.opentelemetry:opentelemetry-api") diff --git a/instrumentation/restlet/restlet-2.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v2_0/RestletAppTestBase.groovy b/instrumentation/restlet/restlet-2.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v2_0/RestletAppTestBase.groovy new file mode 100644 index 0000000000..4af9dcf412 --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v2_0/RestletAppTestBase.groovy @@ -0,0 +1,137 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.restlet.v2_0 + +import org.restlet.data.Form +import org.restlet.data.Reference +import org.restlet.data.Status +import org.restlet.resource.Get +import org.restlet.resource.ServerResource + +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.CAPTURE_HEADERS +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.ERROR +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.EXCEPTION +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.INDEXED_CHILD +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.PATH_PARAM +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.QUERY_PARAM +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.REDIRECT +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.ServerEndpoint.SUCCESS +import static io.opentelemetry.instrumentation.test.base.HttpServerTest.controller + +class RestletAppTestBase { + + static class SuccessResource extends ServerResource { + + @Get("txt") + String represent() { + controller(SUCCESS) { + return SUCCESS.getBody() + } + } + + } + + static class ErrorResource extends ServerResource { + + @Get("txt") + String represent() { + controller(ERROR) { + getResponse().setStatus(Status.valueOf(ERROR.getStatus()), ERROR.getBody()) + return ERROR.getBody() + } + } + + } + + static class ExceptionResource extends ServerResource { + + @Get("txt") + String represent() { + controller(EXCEPTION) { + throw new Exception(EXCEPTION.getBody()) + } + } + + } + + static class QueryParamResource extends ServerResource { + + @Get("txt") + String represent() { + controller(QUERY_PARAM) { + return QUERY_PARAM.getBody() + } + } + + } + + static class PathParamResource extends ServerResource { + + @Get("txt") + String represent() { + controller(PATH_PARAM) { + return PATH_PARAM.getBody() + } + } + + } + + static class RedirectResource extends ServerResource { + + @Get("txt") + String represent() { + controller(REDIRECT) { + redirectSeeOther(new Reference(getRootRef().toString() + REDIRECT.getBody())) + response.setStatus(Status.valueOf(REDIRECT.getStatus())) + return "" + } + } + + } + + static class CaptureHeadersResource extends ServerResource { + + @Get("txt") + String represent() { + controller(CAPTURE_HEADERS) { + def requestHeaders = request.getAttributes().get("org.restlet.http.headers") + def responseHeaders + + try { + def headerClass = Class.forName("org.restlet.data.Header") + def seriesClass = Class.forName("org.restlet.util.Series") + //to avoid constructor error (Series is abstract in 2.0.x) + responseHeaders = response.getAttributes().computeIfAbsent("org.restlet.http.headers", { seriesClass.newInstance(headerClass) }) + + } catch (ClassNotFoundException | NoClassDefFoundError e) { + + responseHeaders = response.getAttributes().computeIfAbsent("org.restlet.http.headers", { new Form() }) + } + + responseHeaders.add("X-Test-Response", requestHeaders.getValues("X-Test-Request")) + return CAPTURE_HEADERS.getBody() + } + } + + } + + + static class IndexedChildResource extends ServerResource { + + @Get("txt") + String represent() { + controller(INDEXED_CHILD) { + INDEXED_CHILD.collectSpanAttributes { + request.getOriginalRef().getQueryAsForm().getFirst(it).getValue() + } + //INDEXED_CHILD.getBody() returns an empty string, in which case Restlet sets status to 204 + return "child" + } + } + + } + +} diff --git a/instrumentation/restlet/restlet-2.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerTest.groovy b/instrumentation/restlet/restlet-2.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerTest.groovy new file mode 100644 index 0000000000..ebb939190c --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/testing/src/main/groovy/io/opentelemetry/instrumentation/restlet/v2_0/spring/AbstractSpringServerTest.groovy @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.restlet.v2_0.spring + +import io.opentelemetry.instrumentation.restlet.v2_0.AbstractRestletServerTest +import org.restlet.Component +import org.restlet.Server +import org.restlet.routing.Router +import org.springframework.context.support.ClassPathXmlApplicationContext + +abstract class AbstractSpringServerTest extends AbstractRestletServerTest { + + Router router + + abstract String getConfigurationName() + + @Override + Server setupServer(Component component) { + def context = new ClassPathXmlApplicationContext(getConfigurationName()) + router = (Router) context.getBean("testRouter") + def server = (Server) context.getBean("testServer", "http", port) + component.getServers().add(server) + return server + } + + @Override + void setupRouting() { + host.attach(router) + } + +} diff --git a/instrumentation/restlet/restlet-2.0/testing/src/main/resources/springBeanRouterConf.xml b/instrumentation/restlet/restlet-2.0/testing/src/main/resources/springBeanRouterConf.xml new file mode 100644 index 0000000000..03aed7f861 --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/testing/src/main/resources/springBeanRouterConf.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/instrumentation/restlet/restlet-2.0/testing/src/main/resources/springRouterConf.xml b/instrumentation/restlet/restlet-2.0/testing/src/main/resources/springRouterConf.xml new file mode 100644 index 0000000000..b7abfb72f7 --- /dev/null +++ b/instrumentation/restlet/restlet-2.0/testing/src/main/resources/springRouterConf.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file