Selaa lähdekoodia

Convert struts tests from groovy to java (#11468)

Jay DeLuca 9 kuukautta sitten
vanhempi
säilyke
84b954afc8

+ 0 - 172
instrumentation/struts-2.3/javaagent/src/test/groovy/Struts2ActionSpanTest.groovy

@@ -1,172 +0,0 @@
-/*
- * Copyright The OpenTelemetry Authors
- * SPDX-License-Identifier: Apache-2.0
- */
-
-import io.opentelemetry.api.trace.SpanKind
-import io.opentelemetry.api.trace.StatusCode
-import io.opentelemetry.instrumentation.api.internal.HttpConstants
-import io.opentelemetry.instrumentation.test.AgentTestTrait
-import io.opentelemetry.instrumentation.test.asserts.TraceAssert
-import io.opentelemetry.instrumentation.test.base.HttpServerTest
-import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint
-import io.opentelemetry.sdk.trace.data.SpanData
-import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes
-import io.opentelemetry.struts.GreetingServlet
-import org.eclipse.jetty.server.Server
-import org.eclipse.jetty.server.session.HashSessionIdManager
-import org.eclipse.jetty.server.session.HashSessionManager
-import org.eclipse.jetty.server.session.SessionHandler
-import org.eclipse.jetty.servlet.DefaultServlet
-import org.eclipse.jetty.servlet.ServletContextHandler
-import org.eclipse.jetty.util.resource.FileResource
-
-import javax.servlet.DispatcherType
-
-import static io.opentelemetry.api.trace.SpanKind.INTERNAL
-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.NOT_FOUND
-import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM
-import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT
-
-class Struts2ActionSpanTest extends HttpServerTest<Server> implements AgentTestTrait {
-
-  @Override
-  boolean testPathParam() {
-    return true
-  }
-
-  @Override
-  boolean testErrorBody() {
-    return false
-  }
-
-  @Override
-  boolean hasHandlerSpan(ServerEndpoint endpoint) {
-    return endpoint != NOT_FOUND
-  }
-
-  @Override
-  boolean hasResponseSpan(ServerEndpoint endpoint) {
-    endpoint == REDIRECT || endpoint == ERROR || endpoint == EXCEPTION || endpoint == NOT_FOUND
-  }
-
-  @Override
-  void responseSpan(TraceAssert trace, int index, Object controllerSpan, Object handlerSpan, String method, ServerEndpoint endpoint) {
-    switch (endpoint) {
-      case REDIRECT:
-        redirectSpan(trace, index, handlerSpan)
-        break
-      case ERROR:
-      case EXCEPTION:
-      case NOT_FOUND:
-        sendErrorSpan(trace, index, handlerSpan)
-        break
-    }
-  }
-
-  String expectedHttpRoute(ServerEndpoint endpoint, String method) {
-    if (method == HttpConstants._OTHER) {
-      return getContextPath() + endpoint.path
-    }
-    switch (endpoint) {
-      case PATH_PARAM:
-        return getContextPath() + "/path/{id}/param"
-      case NOT_FOUND:
-        return getContextPath() + "/*"
-      default:
-        return super.expectedHttpRoute(endpoint, method)
-    }
-  }
-
-  @Override
-  void handlerSpan(TraceAssert trace, int index, Object parent, String method, ServerEndpoint endpoint) {
-    trace.span(index) {
-      name "GreetingAction.${endpoint.name().toLowerCase()}"
-      kind INTERNAL
-      if (endpoint == EXCEPTION) {
-        status StatusCode.ERROR
-        errorEvent(Exception, EXCEPTION.body)
-      }
-      def expectedMethodName = endpoint.name().toLowerCase()
-      attributes {
-        "$CodeIncubatingAttributes.CODE_NAMESPACE" "io.opentelemetry.struts.GreetingAction"
-        "$CodeIncubatingAttributes.CODE_FUNCTION" expectedMethodName
-      }
-      childOf((SpanData) parent)
-    }
-  }
-
-  @Override
-  String getContextPath() {
-    return "/context"
-  }
-
-  @Override
-  Server startServer(int port) {
-    def server = new Server(port)
-    ServletContextHandler context = new ServletContextHandler(0)
-    context.setContextPath(getContextPath())
-    def resource = new FileResource(getClass().getResource("/"))
-    context.setBaseResource(resource)
-    server.setHandler(context)
-
-    def sessionIdManager = new HashSessionIdManager()
-    server.setSessionIdManager(sessionIdManager)
-    def sessionManager = new HashSessionManager()
-    def sessionHandler = new SessionHandler(sessionManager)
-    context.setHandler(sessionHandler)
-    // disable adding jsessionid to url, affects redirect test
-    context.setInitParameter("org.eclipse.jetty.servlet.SessionIdPathParameterName", "none")
-
-    context.addServlet(DefaultServlet, "/")
-    context.addServlet(GreetingServlet, "/greetingServlet")
-    def strutsFilterClass = null
-    try {
-      // struts 2.3
-      strutsFilterClass = Class.forName("org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter")
-    } catch (ClassNotFoundException exception) {
-      // struts 2.5
-      strutsFilterClass = Class.forName("org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter")
-    }
-    context.addFilter(strutsFilterClass, "/*", EnumSet.of(DispatcherType.REQUEST))
-
-    server.start()
-
-    return server
-  }
-
-  @Override
-  void stopServer(Server server) {
-    server.stop()
-    server.destroy()
-  }
-
-  // Struts runs from a servlet filter. Test that dispatching from struts action to a servlet
-  // does not overwrite server span name given by struts instrumentation.
-  def "test dispatch to servlet"() {
-    setup:
-    def response = client.get(address.resolve("dispatch").toString()).aggregate().join()
-
-    expect:
-    response.status().code() == 200
-    response.contentUtf8() == "greeting"
-
-    and:
-    assertTraces(1) {
-      trace(0, 2) {
-        span(0) {
-          name "GET " + getContextPath() + "/dispatch"
-          kind SpanKind.SERVER
-          hasNoParent()
-        }
-        span(1) {
-          name "GreetingAction.dispatch_servlet"
-          kind INTERNAL
-          childOf span(0)
-        }
-      }
-    }
-  }
-}

+ 1 - 1
instrumentation/struts-2.3/javaagent/src/test/java/io/opentelemetry/struts/GreetingAction.java → instrumentation/struts-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/struts2/GreetingAction.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  */
 
-package io.opentelemetry.struts;
+package io.opentelemetry.javaagent.instrumentation.struts2;
 
 import com.opensymphony.xwork2.ActionSupport;
 import io.opentelemetry.instrumentation.test.base.HttpServerTest;

+ 1 - 1
instrumentation/struts-2.3/javaagent/src/test/java/io/opentelemetry/struts/GreetingServlet.java → instrumentation/struts-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/struts2/GreetingServlet.java

@@ -3,7 +3,7 @@
  * SPDX-License-Identifier: Apache-2.0
  */
 
-package io.opentelemetry.struts;
+package io.opentelemetry.javaagent.instrumentation.struts2;
 
 import java.io.IOException;
 import javax.servlet.ServletException;

+ 173 - 0
instrumentation/struts-2.3/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/struts2/Struts2ActionSpanTest.java

@@ -0,0 +1,173 @@
+/*
+ * Copyright The OpenTelemetry Authors
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+package io.opentelemetry.javaagent.instrumentation.struts2;
+
+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.NOT_FOUND;
+import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.PATH_PARAM;
+import static io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint.REDIRECT;
+import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
+import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_FUNCTION;
+import static io.opentelemetry.semconv.incubating.CodeIncubatingAttributes.CODE_NAMESPACE;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import io.opentelemetry.api.trace.SpanKind;
+import io.opentelemetry.instrumentation.api.internal.HttpConstants;
+import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
+import io.opentelemetry.instrumentation.testing.junit.http.AbstractHttpServerTest;
+import io.opentelemetry.instrumentation.testing.junit.http.HttpServerInstrumentationExtension;
+import io.opentelemetry.instrumentation.testing.junit.http.HttpServerTestOptions;
+import io.opentelemetry.instrumentation.testing.junit.http.ServerEndpoint;
+import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
+import io.opentelemetry.sdk.trace.data.SpanData;
+import io.opentelemetry.sdk.trace.data.StatusData;
+import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse;
+import java.util.EnumSet;
+import java.util.Locale;
+import javax.servlet.DispatcherType;
+import javax.servlet.Filter;
+import org.eclipse.jetty.server.Server;
+import org.eclipse.jetty.server.session.HashSessionIdManager;
+import org.eclipse.jetty.server.session.HashSessionManager;
+import org.eclipse.jetty.server.session.SessionHandler;
+import org.eclipse.jetty.servlet.DefaultServlet;
+import org.eclipse.jetty.servlet.ServletContextHandler;
+import org.eclipse.jetty.util.resource.FileResource;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+
+class Struts2ActionSpanTest extends AbstractHttpServerTest<Server> {
+
+  @RegisterExtension
+  public static final InstrumentationExtension testing =
+      HttpServerInstrumentationExtension.forAgent();
+
+  @Override
+  @SuppressWarnings("unchecked")
+  protected Server setupServer() throws Exception {
+    Server server = new Server(port);
+    ServletContextHandler context = new ServletContextHandler(0);
+    context.setContextPath(getContextPath());
+    FileResource resource = new FileResource(getClass().getResource("/"));
+    context.setBaseResource(resource);
+    server.setHandler(context);
+
+    HashSessionIdManager sessionIdManager = new HashSessionIdManager();
+    server.setSessionIdManager(sessionIdManager);
+    HashSessionManager sessionManager = new HashSessionManager();
+    SessionHandler sessionHandler = new SessionHandler(sessionManager);
+    context.setHandler(sessionHandler);
+
+    // disable adding jsessionid to url, affects redirect test
+    context.setInitParameter("org.eclipse.jetty.servlet.SessionIdPathParameterName", "none");
+
+    context.addServlet(DefaultServlet.class, "/");
+    context.addServlet(GreetingServlet.class, "/greetingServlet");
+    Class<?> strutsFilterClass;
+    try {
+      // struts 2.3
+      strutsFilterClass =
+          Class.forName("org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter");
+    } catch (ClassNotFoundException exception) {
+      // struts 2.5
+      strutsFilterClass =
+          Class.forName("org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter");
+    }
+    context.addFilter(
+        (Class<? extends Filter>) strutsFilterClass, "/*", EnumSet.of(DispatcherType.REQUEST));
+
+    server.start();
+    return server;
+  }
+
+  @Override
+  protected void stopServer(Server server) throws Exception {
+    server.stop();
+    server.destroy();
+  }
+
+  @Override
+  protected void configure(HttpServerTestOptions options) {
+    options.setContextPath("/context");
+    options.setTestPathParam(true);
+    options.setTestErrorBody(false);
+    options.setHasHandlerSpan(endpoint -> !endpoint.equals(NOT_FOUND));
+    options.setHasResponseSpan(
+        endpoint ->
+            endpoint == REDIRECT
+                || endpoint == ERROR
+                || endpoint == EXCEPTION
+                || endpoint == NOT_FOUND);
+
+    options.setExpectedHttpRoute(
+        (ServerEndpoint endpoint, String method) -> {
+          if (method.equals(HttpConstants._OTHER)) {
+            return getContextPath() + endpoint.getPath();
+          }
+          if (endpoint.equals(PATH_PARAM)) {
+            return getContextPath() + "/path/{id}/param";
+          } else if (endpoint.equals(NOT_FOUND)) {
+            return getContextPath() + "/*";
+          } else {
+            return super.expectedHttpRoute(endpoint, method);
+          }
+        });
+  }
+
+  @Override
+  protected SpanDataAssert assertResponseSpan(
+      SpanDataAssert span, SpanData parentSpan, String method, ServerEndpoint endpoint) {
+    if (endpoint.equals(REDIRECT)) {
+      span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendRedirect"));
+    } else if (endpoint.equals(NOT_FOUND)) {
+      span.satisfies(spanData -> assertThat(spanData.getName()).endsWith(".sendError"))
+          .hasParent(parentSpan);
+    }
+
+    span.hasKind(SpanKind.INTERNAL);
+    return span;
+  }
+
+  @Override
+  protected SpanDataAssert assertHandlerSpan(
+      SpanDataAssert span, String method, ServerEndpoint endpoint) {
+    span.hasName("GreetingAction." + endpoint.name().toLowerCase(Locale.ROOT))
+        .hasKind(SpanKind.INTERNAL);
+
+    if (endpoint.equals(EXCEPTION)) {
+      span.hasStatus(StatusData.error()).hasException(new Exception(EXCEPTION.getBody()));
+    }
+
+    span.hasAttributesSatisfyingExactly(
+        equalTo(CODE_NAMESPACE, GreetingAction.class.getName()),
+        equalTo(CODE_FUNCTION, endpoint.name().toLowerCase(Locale.ROOT)));
+    return span;
+  }
+
+  // Struts runs from a servlet filter. Test that dispatching from struts action to a servlet
+  // does not overwrite server span name given by struts instrumentation.
+  @Test
+  void testDispatchToServlet() {
+    AggregatedHttpResponse response =
+        client.get(address.resolve("dispatch").toString()).aggregate().join();
+
+    assertThat(response.status().code()).isEqualTo(200);
+    assertThat(response.contentUtf8()).isEqualTo("greeting");
+
+    testing.waitAndAssertTraces(
+        trace ->
+            trace.hasSpansSatisfyingExactly(
+                span ->
+                    span.hasName("GET " + getContextPath() + "/dispatch")
+                        .hasKind(SpanKind.SERVER)
+                        .hasNoParent(),
+                span ->
+                    span.hasName("GreetingAction.dispatch_servlet")
+                        .hasKind(SpanKind.INTERNAL)
+                        .hasParent(trace.getSpan(0))));
+  }
+}

+ 9 - 9
instrumentation/struts-2.3/javaagent/src/test/resources/struts.xml

@@ -26,16 +26,16 @@
       <exception-mapping exception="java.lang.Exception" result="error"/>
     </global-exception-mappings>
 
-    <action name="success" class="io.opentelemetry.struts.GreetingAction" method="success"/>
-    <action name="redirect" class="io.opentelemetry.struts.GreetingAction" method="redirect"/>
-    <action name="query" class="io.opentelemetry.struts.GreetingAction" method="query_param"/>
-    <action name="error-status" class="io.opentelemetry.struts.GreetingAction" method="error"/>
-    <action name="exception" class="io.opentelemetry.struts.GreetingAction" method="exception"/>
-    <action name="/path/{id}/param" class="io.opentelemetry.struts.GreetingAction"
+    <action name="success" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction" method="success"/>
+    <action name="redirect" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction" method="redirect"/>
+    <action name="query" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction" method="query_param"/>
+    <action name="error-status" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction" method="error"/>
+    <action name="exception" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction" method="exception"/>
+    <action name="/path/{id}/param" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction"
       method="path_param"/>
-    <action name="child" class="io.opentelemetry.struts.GreetingAction" method="indexed_child"/>
-    <action name="captureHeaders" class="io.opentelemetry.struts.GreetingAction" method="capture_headers"/>
-    <action name="dispatch" class="io.opentelemetry.struts.GreetingAction" method="dispatch_servlet"/>
+    <action name="child" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction" method="indexed_child"/>
+    <action name="captureHeaders" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction" method="capture_headers"/>
+    <action name="dispatch" class="io.opentelemetry.javaagent.instrumentation.struts2.GreetingAction" method="dispatch_servlet"/>
   </package>