Skip to content

Commit

Permalink
Convert spring-core tests from groovy to java (#8166)
Browse files Browse the repository at this point in the history
Related to #7195.

Converts spring core instrumentation tests from groovy to java.

---------

Co-authored-by: Mateusz Rzeszutek <[email protected]>
  • Loading branch information
abhisesh and Mateusz Rzeszutek authored Mar 31, 2023
1 parent 67aabce commit b23af1b
Show file tree
Hide file tree
Showing 3 changed files with 118 additions and 93 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,10 @@ dependencies {
// 4.0 introduces submitListenable() methods
testLibrary("org.springframework:spring-core:4.0.0.RELEASE")
}

// spring 6 requires java 17
if (findProperty("testLatestDeps") as Boolean) {
otelJava {
minJavaVersionSupported.set(JavaVersion.VERSION_17)
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

import io.opentelemetry.api.GlobalOpenTelemetry;
import io.opentelemetry.api.trace.SpanKind;
import io.opentelemetry.api.trace.Tracer;
import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension;
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.RegisterExtension;
import org.junit.jupiter.api.function.ThrowingConsumer;
import org.springframework.core.task.SimpleAsyncTaskExecutor;

public class SimpleAsyncTaskExecutorInstrumentationTest {

@RegisterExtension
private static final InstrumentationExtension testing = AgentInstrumentationExtension.create();

private static final SimpleAsyncTaskExecutor EXECUTOR = new SimpleAsyncTaskExecutor();

@Test
void executeRunnable() {
executeTwoTasks(EXECUTOR::execute);
}

@Test
void submitRunnable() {
executeTwoTasks(task -> EXECUTOR.submit((Runnable) task));
}

@Test
void submitCallable() {
executeTwoTasks(task -> EXECUTOR.submit((Callable<?>) task));
}

@Test
void submitListenableRunnable() {
executeTwoTasks(task -> EXECUTOR.submitListenable((Runnable) task));
}

@Test
void submitListenableCallable() {
executeTwoTasks(task -> EXECUTOR.submitListenable((Callable<?>) task));
}

private static void executeTwoTasks(ThrowingConsumer<AsyncTask> task) {
testing.runWithSpan(
"parent",
() -> {
AsyncTask child1 = new AsyncTask(true);
AsyncTask child2 = new AsyncTask(false);
try {
task.accept(child1);
task.accept(child2);
} catch (Throwable throwable) {
throw new AssertionError(throwable);
}
child1.waitForCompletion();
child2.waitForCompletion();
});
testing.waitAndAssertTraces(
trace ->
trace
.hasSize(2)
.hasSpansSatisfyingExactly(
span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(),
span ->
span.hasName("asyncChild")
.hasKind(SpanKind.INTERNAL)
.hasParent(trace.getSpan(0))));
}

static class AsyncTask implements Runnable, Callable<Object> {

private static final Tracer TRACER = GlobalOpenTelemetry.getTracer("test");

private final boolean startSpan;
private final CountDownLatch latch = new CountDownLatch(1);

public AsyncTask(boolean startSpan) {
this.startSpan = startSpan;
}

@Override
public void run() {
if (startSpan) {
TRACER.spanBuilder("asyncChild").startSpan().end();
}
latch.countDown();
}

@Override
public Object call() {
run();
return null;
}

void waitForCompletion() {
try {
latch.await();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new AssertionError(e);
}
}
}
}

0 comments on commit b23af1b

Please sign in to comment.