opentelemetry-java-instrume.../instrumentation/jaxws/jaxws-2.0-arquillian-testing/src/main/java/AbstractArquillianJaxWsTest...

131 lines
4.9 KiB
Java

/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
import io.opentelemetry.sdk.testing.assertj.SpanDataAssert;
import io.opentelemetry.semconv.incubating.CodeIncubatingAttributes;
import io.opentelemetry.testing.internal.armeria.client.WebClient;
import io.opentelemetry.testing.internal.armeria.common.AggregatedHttpResponse;
import java.net.URI;
import org.jboss.arquillian.container.test.api.Deployment;
import org.jboss.arquillian.container.test.api.RunAsClient;
import org.jboss.arquillian.junit5.ArquillianExtension;
import org.jboss.arquillian.test.api.ArquillianResource;
import org.jboss.shrinkwrap.api.ShrinkWrap;
import org.jboss.shrinkwrap.api.asset.EmptyAsset;
import org.jboss.shrinkwrap.api.spec.WebArchive;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.api.extension.RegisterExtension;
import test.EjbHelloServiceImpl;
import test.HelloService;
import test.HelloServiceImpl;
@ExtendWith(ArquillianExtension.class)
@TestInstance(TestInstance.Lifecycle.PER_CLASS)
@RunAsClient
public abstract class AbstractArquillianJaxWsTest {
@RegisterExtension
static final InstrumentationExtension testing = AgentInstrumentationExtension.create();
public final WebClient client = WebClient.of();
@ArquillianResource public URI url;
@Deployment
static WebArchive createDeployment() {
return ShrinkWrap.create(WebArchive.class)
.addClass(HelloService.class)
.addClass(HelloServiceImpl.class)
.addClass(EjbHelloServiceImpl.class)
.addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}
private String getContextRoot() {
return url.getPath();
}
protected String getServicePath(String service) {
return service;
}
private String getAddress(String service) {
return url.resolve(getServicePath(service)).toString();
}
@Test
public void testHelloService() {
testHelloRequest("HelloService");
}
@Test
public void testEjbHelloService() {
testHelloRequest("EjbHelloService");
}
// @ParameterizedTest doesn't work correctly with arquillian, all exceptions (assertion errors)
// thrown from the test method are ignored
private void testHelloRequest(String service) {
String soapMessage =
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:hel=\"http://opentelemetry.io/test/hello-web-service\">"
+ " <soapenv:Header/>"
+ " <soapenv:Body>"
+ " <hel:helloRequest>"
+ " <name>Test</name>"
+ " </hel:helloRequest>"
+ " </soapenv:Body>"
+ "</soapenv:Envelope>";
AggregatedHttpResponse response =
client.post(getAddress(service), soapMessage).aggregate().join();
Document doc = Jsoup.parse(response.contentUtf8());
assertThat(response.status().code()).isEqualTo(200);
assertThat(doc.selectFirst("message").text()).isEqualTo("Hello Test");
String methodName = "hello";
testing.waitAndAssertTraces(
trace ->
trace.hasSpansSatisfyingExactly(
span -> assertServerSpan(span, serverSpanName(service, methodName)).hasNoParent(),
span -> assertHandlerSpan(span, service, methodName).hasParent(trace.getSpan(0)),
span ->
assertAnnotationHandlerSpan(span, service, methodName)
.hasParent(trace.getSpan(1))));
}
private String serverSpanName(String service, String operation) {
return getContextRoot() + getServicePath(service) + "/" + service + "/" + operation;
}
private static SpanDataAssert assertServerSpan(SpanDataAssert span, String operation) {
return span.hasName(operation).hasKind(SpanKind.SERVER);
}
private static SpanDataAssert assertHandlerSpan(
SpanDataAssert span, String service, String methodName) {
return span.hasName(service + "/" + methodName).hasKind(SpanKind.INTERNAL);
}
@SuppressWarnings("deprecation") // using deprecated semconv
private static SpanDataAssert assertAnnotationHandlerSpan(
SpanDataAssert span, String service, String methodName) {
return span.hasName(service + "Impl." + methodName)
.hasKind(SpanKind.INTERNAL)
.hasAttributesSatisfyingExactly(
equalTo(CodeIncubatingAttributes.CODE_NAMESPACE, "test." + service + "Impl"),
equalTo(CodeIncubatingAttributes.CODE_FUNCTION, methodName));
}
}