Add tests for Restlet Servlet extension (#4428)

* test servlet

* delete unused web.xml
This commit is contained in:
Anna Nosek 2021-10-22 07:56:38 +02:00 committed by GitHub
parent 05a391459b
commit 4b21d8c8c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 306 additions and 179 deletions

View File

@ -25,6 +25,9 @@ dependencies {
implementation(project(":instrumentation:restlet:restlet-1.0:library"))
testImplementation(project(":instrumentation:restlet:restlet-1.0:testing"))
testInstrumentation(project(":instrumentation:jetty:jetty-8.0:javaagent"))
testInstrumentation(project(":instrumentation:servlet:servlet-3.0:javaagent"))
testInstrumentation(project(":instrumentation:servlet:servlet-javax-common:javaagent"))
latestDepTestLibrary("org.restlet:org.restlet:1.1.+")
latestDepTestLibrary("com.noelios.restlet:com.noelios.restlet:1.1.+")

View File

@ -7,13 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.restlet.v1_0
import io.opentelemetry.instrumentation.restlet.v1_0.AbstractRestletServerTest
import io.opentelemetry.instrumentation.test.AgentTestTrait
import org.restlet.Restlet
class RestletServerTest extends AbstractRestletServerTest implements AgentTestTrait {
@Override
Restlet wrapRestlet(Restlet restlet, String path){
return restlet
}
}

View File

@ -0,0 +1,14 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.javaagent.instrumentation.restlet.v1_0
import io.opentelemetry.instrumentation.restlet.v1_0.AbstractServletServerTest
import io.opentelemetry.instrumentation.test.AgentTestTrait
class ServletServerTest extends AbstractServletServerTest implements AgentTestTrait {
}

View File

@ -14,7 +14,7 @@ import org.restlet.Restlet
class RestletServerTest extends AbstractRestletServerTest implements LibraryTestTrait {
@Override
Restlet wrapRestlet(Restlet restlet, String path){
Restlet wrapRestlet(Restlet restlet, String path) {
RestletTracing tracing = RestletTracing.newBuilder(openTelemetry)
.captureHttpHeaders(capturedHttpHeadersForTesting())
.build()

View File

@ -13,10 +13,16 @@ dependencies {
implementation("org.restlet:org.restlet:1.1.5")
implementation("com.noelios.restlet:com.noelios.restlet:1.1.5")
implementation("com.noelios.restlet:com.noelios.restlet.ext.servlet:1.1.5")
implementation("org.restlet:org.restlet.ext.spring:1.1.5")
implementation("org.springframework:spring:2.5.6")
implementation("org.codehaus.groovy:groovy-all")
implementation("io.opentelemetry:opentelemetry-api")
implementation("org.spockframework:spock-core")
val jettyVersion = "8.1.8.v20121106"
api("org.eclipse.jetty:jetty-annotations:$jettyVersion")
implementation("org.eclipse.jetty:jetty-server:$jettyVersion")
implementation("org.eclipse.jetty:jetty-servlet:$jettyVersion")
}

View File

@ -0,0 +1,110 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.restlet.v1_0
import io.opentelemetry.api.common.AttributeKey
import io.opentelemetry.instrumentation.test.base.HttpServerTest
import io.opentelemetry.semconv.trace.attributes.SemanticAttributes
import org.eclipse.jetty.server.Server
import org.eclipse.jetty.util.resource.Resource
import org.eclipse.jetty.webapp.WebAppContext
import org.restlet.Application
import org.restlet.Restlet
import org.restlet.Router
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.NOT_FOUND
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
abstract class AbstractServletServerTest extends HttpServerTest<Server> {
@Override
Server startServer(int port) {
def webAppContext = new WebAppContext()
webAppContext.setContextPath(getContextPath())
webAppContext.setBaseResource(Resource.newSystemResource("servlet-ext-app"))
def jettyServer = new Server(port)
jettyServer.connectors.each {
it.setHost('localhost')
}
jettyServer.setHandler(webAppContext)
jettyServer.start()
return jettyServer
}
@Override
List<AttributeKey<?>> extraAttributes() {
[
SemanticAttributes.NET_TRANSPORT,
SemanticAttributes.HTTP_SERVER_NAME
]
}
@Override
void stopServer(Server server) {
server.stop()
server.destroy()
}
@Override
boolean testException() {
false
}
@Override
boolean testPathParam() {
true
}
@Override
boolean testConcurrency() {
true
}
@Override
String expectedServerSpanName(ServerEndpoint endpoint) {
switch (endpoint) {
case PATH_PARAM:
return getContextPath() + "/path/{id}/param"
case NOT_FOUND:
return getContextPath() + "/*"
default:
return endpoint.resolvePath(address).path
}
}
static class TestApp extends Application {
@Override
Restlet createRoot() {
def router = new Router(getContext())
router.attach(SUCCESS.path, RestletAppTestBase.SuccessResource)
router.attach(REDIRECT.path, RestletAppTestBase.RedirectResource)
router.attach(ERROR.path, RestletAppTestBase.ErrorResource)
router.attach(EXCEPTION.path, RestletAppTestBase.ExceptionResource)
router.attach("/path/{id}/param", RestletAppTestBase.PathParamResource)
router.attach(QUERY_PARAM.path, RestletAppTestBase.QueryParamResource)
router.attach(CAPTURE_HEADERS.path, RestletAppTestBase.CaptureHeadersResource)
router.attach(INDEXED_CHILD.path, RestletAppTestBase.IndexedChildResource)
return router
}
}
}

View File

@ -0,0 +1,129 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
package io.opentelemetry.instrumentation.restlet.v1_0
import org.restlet.Context
import org.restlet.data.Form
import org.restlet.data.MediaType
import org.restlet.data.Reference
import org.restlet.data.Request
import org.restlet.data.Response
import org.restlet.data.Status
import org.restlet.resource.Representation
import org.restlet.resource.Resource
import org.restlet.resource.StringRepresentation
import org.restlet.resource.Variant
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 abstract class BaseResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
}
static class SuccessResource extends BaseResource {
@Override
Representation represent(Variant variant) {
controller(SUCCESS) {
return new StringRepresentation(SUCCESS.body)
}
}
}
static class ErrorResource extends BaseResource {
@Override
Representation represent(Variant variant) {
controller(ERROR) {
getResponse().setStatus(Status.valueOf(ERROR.getStatus()), ERROR.getBody())
return new StringRepresentation(ERROR.body)
}
}
}
static class ExceptionResource extends BaseResource {
@Override
Representation represent(Variant variant) {
controller(EXCEPTION) {
throw new Exception(EXCEPTION.body)
}
}
}
static class QueryParamResource extends BaseResource {
@Override
Representation represent(Variant variant) {
controller(QUERY_PARAM) {
return new StringRepresentation(QUERY_PARAM.getBody())
}
}
}
static class PathParamResource extends BaseResource {
@Override
Representation represent(Variant variant) {
controller(PATH_PARAM) {
return new StringRepresentation(PATH_PARAM.getBody())
}
}
}
static class RedirectResource extends BaseResource {
@Override
Representation represent(Variant variant) {
controller(REDIRECT) {
response.setLocationRef(new Reference(REDIRECT.getBody()))
response.setStatus(Status.valueOf(REDIRECT.status))
return new StringRepresentation(REDIRECT.getBody())
}
}
}
static class CaptureHeadersResource extends BaseResource {
@Override
Representation represent(Variant variant) {
controller(CAPTURE_HEADERS) {
Form requestHeaders = request.getAttributes().get("org.restlet.http.headers")
Form responseHeaders = response.getAttributes().computeIfAbsent("org.restlet.http.headers", { new Form() })
responseHeaders.add("X-Test-Response", requestHeaders.getValues("X-Test-Request"))
return new StringRepresentation(CAPTURE_HEADERS.getBody())
}
}
}
static class IndexedChildResource extends BaseResource {
@Override
Representation represent(Variant variant) {
controller(INDEXED_CHILD) {
INDEXED_CHILD.collectSpanAttributes { request.getOriginalRef().getQueryAsForm().getFirst(it).getValue() }
return new StringRepresentation(INDEXED_CHILD.getBody())
}
}
}
}

View File

@ -7,30 +7,10 @@ package io.opentelemetry.instrumentation.restlet.v1_0.spring
import io.opentelemetry.instrumentation.restlet.v1_0.AbstractRestletServerTest
import org.restlet.Component
import org.restlet.Context
import org.restlet.Router
import org.restlet.Server
import org.restlet.data.Form
import org.restlet.data.MediaType
import org.restlet.data.Reference
import org.restlet.data.Request
import org.restlet.data.Response
import org.restlet.data.Status
import org.restlet.resource.Representation
import org.restlet.resource.Resource
import org.restlet.resource.StringRepresentation
import org.restlet.resource.Variant
import org.springframework.context.support.ClassPathXmlApplicationContext
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
abstract class AbstractSpringServerTest extends AbstractRestletServerTest {
Router router
@ -51,140 +31,4 @@ abstract class AbstractSpringServerTest extends AbstractRestletServerTest {
host.attach(router)
}
static class SuccessResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
@Override
Representation represent(Variant variant) {
controller(SUCCESS) {
return new StringRepresentation(SUCCESS.body)
}
}
}
static class ErrorResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
@Override
Representation represent(Variant variant) {
controller(ERROR) {
getResponse().setStatus(Status.valueOf(ERROR.getStatus()), ERROR.getBody())
return new StringRepresentation(ERROR.body)
}
}
}
static class ExceptionResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
@Override
Representation represent(Variant variant) {
controller(ERROR) {
throw new Exception(EXCEPTION.body)
}
}
}
static class QueryParamResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
@Override
Representation represent(Variant variant) {
controller(QUERY_PARAM) {
return new StringRepresentation(QUERY_PARAM.getBody())
}
}
}
static class PathParamResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
@Override
Representation represent(Variant variant) {
controller(PATH_PARAM) {
return new StringRepresentation(PATH_PARAM.getBody())
}
}
}
static class RedirectResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
@Override
Representation represent(Variant variant) {
controller(REDIRECT) {
response.setLocationRef(new Reference(REDIRECT.getBody()))
response.setStatus(Status.REDIRECTION_FOUND)
return new StringRepresentation(REDIRECT.getBody())
}
}
}
static class CaptureHeadersResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
@Override
Representation represent(Variant variant) {
controller(CAPTURE_HEADERS) {
Form requestHeaders = request.getAttributes().get("org.restlet.http.headers")
Form responseHeaders = response.getAttributes().computeIfAbsent("org.restlet.http.headers", { new Form() })
responseHeaders.add("X-Test-Response", requestHeaders.getValues("X-Test-Request"))
return new StringRepresentation(CAPTURE_HEADERS.getBody())
}
}
}
static class IndexedChildResource extends Resource {
@Override
void init(Context context, Request request, Response response) {
super.init(context, request, response)
getVariants().add(new Variant(MediaType.TEXT_PLAIN))
}
@Override
Representation represent(Variant variant) {
controller(INDEXED_CHILD) {
INDEXED_CHILD.collectSpanAttributes { request.getOriginalRef().getQueryAsForm().getFirst(it).getValue() }
return new StringRepresentation(INDEXED_CHILD.getBody())
}
}
}
}

View File

@ -0,0 +1,27 @@
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Restlet test</display-name>
<servlet>
<servlet-name>RestletServlet</servlet-name>
<servlet-class>com.noelios.restlet.ext.servlet.ServerServlet</servlet-class>
<init-param>
<param-name>org.restlet.application</param-name>
<param-value>io.opentelemetry.instrumentation.restlet.v1_0.AbstractServletServerTest$TestApp
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>RestletServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>

View File

@ -10,20 +10,20 @@
<bean name="testRouter" class="org.restlet.ext.spring.SpringBeanRouter"/>
<bean name="/success" scope="prototype" id="successResource"
class="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$SuccessResource"/>
class="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$SuccessResource"/>
<bean name="/error-status" scope="prototype" id="errorResource"
class="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$ErrorResource"/>
class="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$ErrorResource"/>
<bean name="/exception" scope="prototype" id="exceptionResource"
class="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$ExceptionResource"/>
class="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$ExceptionResource"/>
<bean name="/query" scope="prototype" id="queryParamResource"
class="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$QueryParamResource"/>
class="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$QueryParamResource"/>
<bean name="/path/{id}/param" scope="prototype" id="pathParamResource"
class="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$PathParamResource"/>
class="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$PathParamResource"/>
<bean name="/redirect" scope="prototype" id="redirectResource"
class="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$RedirectResource"/>
class="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$RedirectResource"/>
<bean name="/captureHeaders" scope="prototype" id="captureHeadersResource"
class="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$CaptureHeadersResource"/>
class="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$CaptureHeadersResource"/>
<bean name="/child" scope="prototype" id="indexedChildResource"
class="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$IndexedChildResource"/>
class="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$IndexedChildResource"/>
</beans>

View File

@ -12,21 +12,21 @@
<property name="attachments">
<map>
<entry key="/success"
value="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$SuccessResource"/>
value="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$SuccessResource"/>
<entry key="/error-status"
value="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$ErrorResource"/>
value="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$ErrorResource"/>
<entry key="/exception"
value="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$ExceptionResource"/>
value="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$ExceptionResource"/>
<entry key="/query"
value="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$QueryParamResource"/>
value="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$QueryParamResource"/>
<entry key="/path/{id}/param"
value="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$PathParamResource"/>
value="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$PathParamResource"/>
<entry key="/redirect"
value="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$RedirectResource"/>
value="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$RedirectResource"/>
<entry key="/captureHeaders"
value="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$CaptureHeadersResource"/>
value="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$CaptureHeadersResource"/>
<entry key="/child"
value="io.opentelemetry.instrumentation.restlet.v1_0.spring.AbstractSpringServerTest$IndexedChildResource"/>
value="io.opentelemetry.instrumentation.restlet.v1_0.RestletAppTestBase$IndexedChildResource"/>
</map>
</property>
</bean>