diff --git a/dd-smoke-tests/src/main/java/datadog/smoketest/OutputThreads.java b/dd-smoke-tests/src/main/java/datadog/smoketest/OutputThreads.java index 0166663bc26..515a38567ea 100644 --- a/dd-smoke-tests/src/main/java/datadog/smoketest/OutputThreads.java +++ b/dd-smoke-tests/src/main/java/datadog/smoketest/OutputThreads.java @@ -1,5 +1,6 @@ package datadog.smoketest; +import datadog.trace.api.internal.VisibleForTesting; import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; @@ -23,17 +24,26 @@ public class OutputThreads implements Closeable { private static final int MAX_LINE_SIZE = 1024 * 1024; private static final int DEFAULT_TIMEOUT_MILLIS = 10_000; - final ThreadGroup tg = new ThreadGroup("smoke-output"); + final ThreadGroup tg; final List testLogMessages = new ArrayList<>(); + public OutputThreads() { + this(new ThreadGroup("smoke-output")); + } + + @VisibleForTesting + OutputThreads(ThreadGroup tg) { + this.tg = tg; + } + public void close() { tg.interrupt(); Thread[] threads = new Thread[tg.activeCount()]; - tg.enumerate(threads); + int threadCount = tg.enumerate(threads); - for (Thread thread : threads) { + for (int i = 0; i < threadCount; i++) { try { - thread.join(THREAD_JOIN_TIMEOUT_MILLIS); + threads[i].join(THREAD_JOIN_TIMEOUT_MILLIS); } catch (InterruptedException e) { // ignore } diff --git a/dd-smoke-tests/src/test/java/datadog/smoketest/OutputThreadsTest.java b/dd-smoke-tests/src/test/java/datadog/smoketest/OutputThreadsTest.java new file mode 100644 index 00000000000..d41d549f830 --- /dev/null +++ b/dd-smoke-tests/src/test/java/datadog/smoketest/OutputThreadsTest.java @@ -0,0 +1,26 @@ +package datadog.smoketest; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; + +import org.junit.jupiter.api.Test; + +class OutputThreadsTest { + + @Test + void closeOnlyJoinsEnumeratedThreads() { + ThreadGroup shrinkingThreadGroup = + new ThreadGroup("shrinking-smoke-output") { + @Override + public int activeCount() { + return 1; + } + + @Override + public int enumerate(Thread[] threads) { + return 0; + } + }; + + assertDoesNotThrow(() -> new OutputThreads(shrinkingThreadGroup).close()); + } +}