Skip to content

Commit e53c4bc

Browse files
committed
Refactor waitForInstrumentation
1 parent 1c59b38 commit e53c4bc

File tree

5 files changed

+33
-25
lines changed

5 files changed

+33
-25
lines changed

dd-java-agent/agent-debugger/src/main/java/com/datadog/debugger/util/ExceptionHelper.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,6 @@ public static Throwable getInnerMostThrowable(Throwable t) {
7373

7474
public static StackTraceElement[] flattenStackTrace(Throwable t) {
7575
List<StackTraceElement> result = new ArrayList<>();
76-
// result.add(null); // add a stack frame representing the exception message
7776
result.addAll(Arrays.asList(t.getStackTrace()));
7877
if (t.getCause() != null) {
7978
internalFlattenStackTrace(t.getCause(), t.getStackTrace(), result);

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/DefaultExceptionDebuggerTest.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.datadog.debugger.exception;
22

33
import static com.datadog.debugger.exception.DefaultExceptionDebugger.SNAPSHOT_ID_TAG_FMT;
4-
import static com.datadog.debugger.exception.ExceptionProbeManagerTest.waitForInstrumentation;
4+
import static com.datadog.debugger.util.TestHelper.assertWithTimeout;
55
import static java.util.Collections.emptyList;
66
import static java.util.stream.Collectors.toMap;
77
import static org.junit.jupiter.api.Assertions.*;
@@ -31,6 +31,7 @@
3131
import java.io.PrintWriter;
3232
import java.io.StringReader;
3333
import java.io.StringWriter;
34+
import java.time.Duration;
3435
import java.util.ArrayList;
3536
import java.util.HashMap;
3637
import java.util.List;
@@ -62,7 +63,9 @@ public void simpleException() {
6263
String fingerprint = Fingerprinter.fingerprint(exception, classNameFiltering);
6364
AgentSpan span = mock(AgentSpan.class);
6465
exceptionDebugger.handleException(exception, span);
65-
waitForInstrumentation(exceptionDebugger.getExceptionProbeManager(), fingerprint);
66+
assertWithTimeout(
67+
() -> exceptionDebugger.getExceptionProbeManager().isAlreadyInstrumented(fingerprint),
68+
Duration.ofSeconds(30));
6669
exceptionDebugger.handleException(exception, span);
6770
verify(configurationUpdater).accept(eq(ConfigurationAcceptor.Source.EXCEPTION), any());
6871
}

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeInstrumentationTest.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
import static com.datadog.debugger.exception.DefaultExceptionDebugger.DD_DEBUG_ERROR_EXCEPTION_ID;
55
import static com.datadog.debugger.exception.DefaultExceptionDebugger.ERROR_DEBUG_INFO_CAPTURED;
66
import static com.datadog.debugger.exception.DefaultExceptionDebugger.SNAPSHOT_ID_TAG_FMT;
7-
import static com.datadog.debugger.exception.ExceptionProbeManagerTest.waitForInstrumentation;
7+
import static com.datadog.debugger.util.TestHelper.assertWithTimeout;
88
import static org.junit.jupiter.api.Assertions.assertEquals;
99
import static org.junit.jupiter.api.Assertions.assertTrue;
1010
import static org.mockito.Mockito.mock;
@@ -32,6 +32,7 @@
3232
import datadog.trace.core.CoreTracer;
3333
import java.lang.instrument.ClassFileTransformer;
3434
import java.lang.instrument.Instrumentation;
35+
import java.time.Duration;
3536
import java.util.Arrays;
3637
import java.util.Map;
3738
import java.util.Set;
@@ -80,7 +81,8 @@ public void onlyInstrument() throws Exception {
8081
Class<?> testClass = compileAndLoadClass(CLASS_NAME);
8182
String fingerprint =
8283
callMethodThrowingRuntimeException(testClass); // instrument exception stacktrace
83-
waitForInstrumentation(exceptionProbeManager, fingerprint);
84+
assertWithTimeout(
85+
() -> exceptionProbeManager.isAlreadyInstrumented(fingerprint), Duration.ofSeconds(30));
8486
assertEquals(2, exceptionProbeManager.getProbes().size());
8587
callMethodNoException(testClass);
8688
assertEquals(0, listener.snapshots.size());
@@ -96,7 +98,8 @@ public void instrumentAndCaptureSnapshots() throws Exception {
9698
Class<?> testClass = compileAndLoadClass(CLASS_NAME);
9799
String fingerprint =
98100
callMethodThrowingRuntimeException(testClass); // instrument exception stacktrace
99-
waitForInstrumentation(exceptionProbeManager, fingerprint);
101+
assertWithTimeout(
102+
() -> exceptionProbeManager.isAlreadyInstrumented(fingerprint), Duration.ofSeconds(30));
100103
assertEquals(2, exceptionProbeManager.getProbes().size());
101104
callMethodThrowingRuntimeException(testClass); // generate snapshots
102105
Map<String, Set<String>> probeIdsByMethodName =
@@ -125,11 +128,13 @@ public void differentExceptionsSameStack() throws Exception {
125128
Class<?> testClass = compileAndLoadClass(CLASS_NAME);
126129
// instrument RuntimeException stacktrace
127130
String fingerprint0 = callMethodThrowingRuntimeException(testClass);
128-
waitForInstrumentation(exceptionProbeManager, fingerprint0);
131+
assertWithTimeout(
132+
() -> exceptionProbeManager.isAlreadyInstrumented(fingerprint0), Duration.ofSeconds(30));
129133
assertEquals(2, exceptionProbeManager.getProbes().size());
130134
// instrument IllegalArgumentException stacktrace
131135
String fingerprint1 = callMethodThrowingIllegalArgException(testClass);
132-
waitForInstrumentation(exceptionProbeManager, fingerprint1);
136+
assertWithTimeout(
137+
() -> exceptionProbeManager.isAlreadyInstrumented(fingerprint1), Duration.ofSeconds(30));
133138
assertEquals(4, exceptionProbeManager.getProbes().size());
134139
Map<String, Set<String>> probeIdsByMethodName =
135140
extractProbeIdsByMethodName(exceptionProbeManager);

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/exception/ExceptionProbeManagerTest.java

Lines changed: 1 addition & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import com.datadog.debugger.probe.ExceptionProbe;
66
import com.datadog.debugger.util.ClassNameFiltering;
7-
import java.time.Duration;
87
import java.util.Arrays;
98
import java.util.Collections;
109
import org.junit.jupiter.api.Test;
@@ -29,7 +28,7 @@ void instrumentSingleFrame() {
2928
ExceptionProbeManager exceptionProbeManager = new ExceptionProbeManager(classNameFiltering);
3029

3130
String fingerprint = Fingerprinter.fingerprint(exception, classNameFiltering);
32-
assertEquals("ca4d9f3a1033d7262a89855f4b5cbdc225ed63c592c6cdf83fc5a88589e5fb", fingerprint);
31+
assertEquals("aa4a4dd768f6ef0fcc2b39a3bdedcbe44baff2e9dd0a779228db7bd8bf58", fingerprint);
3332
exceptionProbeManager.createProbesForException(fingerprint, exception.getStackTrace());
3433
assertEquals(1, exceptionProbeManager.getProbes().size());
3534
ExceptionProbe exceptionProbe = exceptionProbeManager.getProbes().iterator().next();
@@ -53,19 +52,4 @@ void filterAllFrames() {
5352
exceptionProbeManager.createProbesForException("", exception.getStackTrace());
5453
assertEquals(0, exceptionProbeManager.getProbes().size());
5554
}
56-
57-
static void waitForInstrumentation(
58-
ExceptionProbeManager exceptionProbeManager, String fingerprint) {
59-
Duration timeout = Duration.ofSeconds(30);
60-
Duration sleepTime = Duration.ofMillis(10);
61-
long count = timeout.toMillis() / sleepTime.toMillis();
62-
while (count-- > 0 && !exceptionProbeManager.isAlreadyInstrumented(fingerprint)) {
63-
try {
64-
Thread.sleep(sleepTime.toMillis());
65-
} catch (InterruptedException e) {
66-
throw new RuntimeException(e);
67-
}
68-
}
69-
assertTrue(exceptionProbeManager.isAlreadyInstrumented(fingerprint));
70-
}
7155
}

dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/util/TestHelper.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
package com.datadog.debugger.util;
22

3+
import static org.junit.jupiter.api.Assertions.assertTrue;
4+
35
import datadog.trace.api.Config;
46
import java.lang.reflect.Field;
7+
import java.time.Duration;
8+
import java.util.function.BooleanSupplier;
59

610
public class TestHelper {
711

@@ -14,4 +18,17 @@ public static void setFieldInConfig(Config config, String fieldName, Object valu
1418
e.printStackTrace();
1519
}
1620
}
21+
22+
public static void assertWithTimeout(BooleanSupplier predicate, Duration timeout) {
23+
Duration sleepTime = Duration.ofMillis(10);
24+
long count = timeout.toMillis() / sleepTime.toMillis();
25+
while (count-- > 0 && !predicate.getAsBoolean()) {
26+
try {
27+
Thread.sleep(sleepTime.toMillis());
28+
} catch (InterruptedException e) {
29+
throw new RuntimeException(e);
30+
}
31+
}
32+
assertTrue(predicate.getAsBoolean());
33+
}
1734
}

0 commit comments

Comments
 (0)