From d8b9e87fa5433fdb9e18ef0b260a23306a581025 Mon Sep 17 00:00:00 2001 From: jean-philippe bempel Date: Tue, 21 Jan 2025 15:38:03 +0100 Subject: [PATCH] Refactor CapturedSnapshotTest method/line probes make a clear distinction when creating method probes and line probes Removing lines varargs to use int for helper methods Use dedicated line probe ids in preparation of id-based line probe source matching --- .../debugger/agent/CapturedSnapshotTest.java | 244 ++++++++++-------- .../debugger/agent/CapturingTestBase.java | 76 +++--- 2 files changed, 168 insertions(+), 152 deletions(-) diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java index ce3ea578b0f1..dff3593a5f90 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturedSnapshotTest.java @@ -94,11 +94,21 @@ public class CapturedSnapshotTest extends CapturingTestBase { private static final ProbeId PROBE_ID2 = new ProbeId("beae1807-f3b0-4ea8-a74f-826790c5e6f7", 0); private static final ProbeId PROBE_ID3 = new ProbeId("beae1807-f3b0-4ea8-a74f-826790c5e6f8", 0); private static final ProbeId PROBE_ID4 = new ProbeId("beae1807-f3b0-4ea8-a74f-826790c5e6f9", 0); + private static final ProbeId LINE_PROBE_ID1 = + new ProbeId("beae1817-f3b0-4ea8-a74f-000000000001", 0); + private static final ProbeId LINE_PROBE_ID2 = + new ProbeId("beae1817-f3b0-4ea8-a74f-000000000002", 0); + private static final ProbeId LINE_PROBE_ID3 = + new ProbeId("beae1817-f3b0-4ea8-a74f-000000000003", 0); + private static final ProbeId LINE_PROBE_ID4 = + new ProbeId("beae1817-f3b0-4ea8-a74f-000000000004", 0); + private static final ProbeId LINE_PROBE_ID5 = + new ProbeId("beae1817-f3b0-4ea8-a74f-000000000005", 0); @Test public void bridgeMethods() throws IOException, URISyntaxException { final String CLASS_NAME = "BridgeMethods"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "process", null); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "process", null); Class testClass = compileAndLoadClass(CLASS_NAME); String result = Reflect.onClass(testClass).call("main").get(); assertEquals("hello world", result); @@ -108,7 +118,7 @@ public void bridgeMethods() throws IOException, URISyntaxException { @Test public void methodNotFound() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "foobar", null); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "foobar", null); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(2, result); @@ -120,7 +130,7 @@ public void methodNotFound() throws IOException, URISyntaxException { public void methodProbe() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; TestSnapshotListener listener = - installSingleProbe(CLASS_NAME, "main", "int (java.lang.String)"); + installMethodProbe(CLASS_NAME, "main", "int (java.lang.String)"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(3, result); @@ -138,7 +148,7 @@ public void methodProbe() throws IOException, URISyntaxException { public void methodProbeAtExit() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; TestSnapshotListener listener = - installSingleProbeAtExit(CLASS_NAME, "main", "int (java.lang.String)"); + installMethodProbeAtExit(CLASS_NAME, "main", "int (java.lang.String)"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(3, result); @@ -174,7 +184,7 @@ public void methodProbeAtExitWithCondition() throws IOException, URISyntaxExcept @Test public void localVarHoistingNoPreviousStore() throws IOException, URISyntaxException { final String CLASS_NAME = "com.fasterxml.jackson.core.json.ByteSourceJsonBootstrapper"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "detectEncoding", null); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "detectEncoding", null); Class testClass = loadClass( CLASS_NAME, @@ -185,12 +195,11 @@ public void localVarHoistingNoPreviousStore() throws IOException, URISyntaxExcep @Test public void singleLineProbe() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - TestSnapshotListener listener = - installSingleProbeAtExit(CLASS_NAME, "main", "int (java.lang.String)", "8"); + TestSnapshotListener listener = installLineProbe(LINE_PROBE_ID1, CLASS_NAME, 8); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(3, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertNull(snapshot.getCaptures().getEntry()); assertNull(snapshot.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot.getCaptures().getLines().size()); @@ -203,8 +212,7 @@ public void singleLineProbe() throws IOException, URISyntaxException { @Test public void resolutionFails() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - TestSnapshotListener listener = - installSingleProbe(CLASS_NAME, "main", "int (java.lang.String)", "8"); + TestSnapshotListener listener = installLineProbe(LINE_PROBE_ID1, CLASS_NAME, 8); DebuggerAgentHelper.injectSink(listener); DebuggerContext.initProbeResolver((encodedProbeId) -> null); Class testClass = compileAndLoadClass(CLASS_NAME); @@ -216,8 +224,9 @@ public void resolutionFails() throws IOException, URISyntaxException { @Test public void resolutionThrows() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot01"; - LogProbe lineProbe = createProbe(PROBE_ID1, CLASS_NAME, "main", "int (java.lang.String)", "8"); - LogProbe methodProbe = createProbe(PROBE_ID2, CLASS_NAME, "main", "int (java.lang.String)"); + LogProbe lineProbe = createLineProbe(LINE_PROBE_ID1, CLASS_NAME, 8); + LogProbe methodProbe = + createMethodProbe(PROBE_ID2, CLASS_NAME, "main", "int (java.lang.String)"); TestSnapshotListener listener = installProbes(lineProbe, methodProbe); DebuggerAgentHelper.injectSink(listener); DebuggerContext.initProbeResolver( @@ -233,7 +242,7 @@ public void resolutionThrows() throws IOException, URISyntaxException { @Test public void constructor() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot02"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "", "(String, Object)"); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "", "(String, Object)"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "f").get(); assertEquals(42, result); @@ -243,7 +252,7 @@ public void constructor() throws IOException, URISyntaxException { @Test public void overloadedConstructor() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot02"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "", "()"); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "", "()"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "f").get(); assertEquals(42, result); @@ -253,7 +262,7 @@ public void overloadedConstructor() throws IOException, URISyntaxException { @Test public void veryOldClassFile() throws Exception { final String CLASS_NAME = "antlr.Token"; // compiled with jdk 1.2 - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "", "()"); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "", "()"); Class testClass = Class.forName(CLASS_NAME); assertNotNull(testClass); testClass.newInstance(); @@ -263,7 +272,7 @@ public void veryOldClassFile() throws Exception { @Test public void oldClass1_1() throws Exception { final String CLASS_NAME = "org.apache.commons.lang.BooleanUtils"; // compiled with jdk 1.1 - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "toBoolean", null); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "toBoolean", null); when(config.isDebuggerVerifyByteCode()).thenReturn(true); Class testClass = loadClass( @@ -279,7 +288,7 @@ public void oldJavacBug() throws Exception { setFieldInConfig(Config.get(), "debuggerHoistLocalVarsEnabled", true); try { final String CLASS_NAME = "com.datadog.debugger.classfiles.JavacBug"; // compiled with jdk 1.6 - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "main", null); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "main", null); Class testClass = Class.forName(CLASS_NAME); assertNotNull(testClass); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -295,7 +304,7 @@ public void oldJavacBug() throws Exception { @Test public void nestedConstructor() throws Exception { final String CLASS_NAME = "CapturedSnapshot02"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "", "(Throwable)"); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "", "(Throwable)"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "init").get(); assertEquals(42, result); @@ -305,7 +314,7 @@ public void nestedConstructor() throws Exception { @Test public void nestedConstructor2() throws Exception { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot13"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "", "(int)"); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "", "(int)"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(42, result); @@ -315,7 +324,7 @@ public void nestedConstructor2() throws Exception { @Test public void nestedConstructor3() throws Exception { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot14"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "", "(int, int, int)"); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "", "(int, int, int)"); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(42, result); @@ -325,7 +334,7 @@ public void nestedConstructor3() throws Exception { @Test public void inheritedConstructor() throws Exception { final String CLASS_NAME = "CapturedSnapshot06"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME + "$Inherited", "", null); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME + "$Inherited", "", null); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(42, result); @@ -345,8 +354,8 @@ public void largeStackInheritedConstructor() throws Exception { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot15"; TestSnapshotListener listener = installProbes( - createProbe(PROBE_ID1, CLASS_NAME, "", "()"), - createProbe(PROBE_ID2, CLASS_NAME, "", "(String, long, String)")); + createMethodProbe(PROBE_ID1, CLASS_NAME, "", "()"), + createMethodProbe(PROBE_ID2, CLASS_NAME, "", "(String, long, String)")); Class testClass = compileAndLoadClass(CLASS_NAME); long result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(4_000_000_001L, result); @@ -358,8 +367,8 @@ public void multiMethods() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; TestSnapshotListener listener = installProbes( - createProbe(PROBE_ID1, CLASS_NAME, "f1", "(int)"), - createProbe(PROBE_ID2, CLASS_NAME, "f2", "(int)")); + createMethodProbe(PROBE_ID1, CLASS_NAME, "f1", "(int)"), + createMethodProbe(PROBE_ID2, CLASS_NAME, "f2", "(int)")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(48, result); @@ -375,8 +384,8 @@ public void multiMethods() throws IOException, URISyntaxException { @Test public void multiProbeSameMethod() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; - LogProbe probe = createProbe(PROBE_ID1, CLASS_NAME, "f1", "(int)"); - LogProbe probe2 = createProbe(PROBE_ID2, CLASS_NAME, "f1", "(int)"); + LogProbe probe = createMethodProbe(PROBE_ID1, CLASS_NAME, "f1", "(int)"); + LogProbe probe2 = createMethodProbe(PROBE_ID2, CLASS_NAME, "f1", "(int)"); TestSnapshotListener listener = installProbes(probe, probe2); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -402,7 +411,8 @@ private List assertSnapshots( @Test public void catchBlock() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot02"; - TestSnapshotListener listener = installProbes(createProbe(PROBE_ID, CLASS_NAME, "f", "()")); + TestSnapshotListener listener = + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "f", "()")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "f").get(); assertEquals(42, result); @@ -415,10 +425,11 @@ public void insideSynchronizedBlock() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot02"; final int LINE_START = 46; final int LINE_END = 48; - TestSnapshotListener listener = - installProbes( - createProbe( - PROBE_ID, CLASS_NAME, "synchronizedBlock", "(int)", LINE_START + "-" + LINE_END)); + LogProbe logProbe = + createProbeBuilder(PROBE_ID) + .where(CLASS_NAME, "synchronizedBlock", "(int)", LINE_START + "-" + LINE_END) + .build(); + TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "synchronizedBlock").get(); assertEquals(76, result); @@ -442,10 +453,11 @@ public void outsideSynchronizedBlock() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot02"; final int LINE_START = 45; final int LINE_END = 49; - TestSnapshotListener listener = - installProbes( - createProbe( - PROBE_ID, CLASS_NAME, "synchronizedBlock", "(int)", LINE_START + "-" + LINE_END)); + LogProbe logProbe = + createProbeBuilder(PROBE_ID) + .where(CLASS_NAME, "synchronizedBlock", "(int)", LINE_START + "-" + LINE_END) + .build(); + TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "synchronizedBlock").get(); assertEquals(76, result); @@ -461,11 +473,11 @@ public void outsideSynchronizedBlock() throws IOException, URISyntaxException { public void sourceFileProbe() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot03"; TestSnapshotListener listener = - installProbes(createSourceFileProbe(PROBE_ID, CLASS_NAME + ".java", 4)); + installProbes(createLineProbe(LINE_PROBE_ID1, CLASS_NAME + ".java", 4)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(48, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertNull(snapshot.getCaptures().getEntry()); assertNull(snapshot.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot.getCaptures().getLines().size()); @@ -478,11 +490,11 @@ public void sourceFileProbe() throws IOException, URISyntaxException { public void simpleSourceFileProbe() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot10"; TestSnapshotListener listener = - installProbes(createSourceFileProbe(PROBE_ID, "CapturedSnapshot10.java", 11)); + installProbes(createLineProbe(LINE_PROBE_ID1, "CapturedSnapshot10.java", 11)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(2, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertNull(snapshot.getCaptures().getEntry()); assertNull(snapshot.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot.getCaptures().getLines().size()); @@ -497,11 +509,11 @@ public void sourceFileProbeFullPath() throws IOException, URISyntaxException { String DIR_CLASS_NAME = CLASS_NAME.replace('.', '/'); TestSnapshotListener listener = installProbes( - createSourceFileProbe(PROBE_ID, "src/main/java/" + DIR_CLASS_NAME + ".java", 11)); + createLineProbe(LINE_PROBE_ID1, "src/main/java/" + DIR_CLASS_NAME + ".java", 11)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(2, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertNull(snapshot.getCaptures().getEntry()); assertNull(snapshot.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot.getCaptures().getLines().size()); @@ -516,11 +528,11 @@ public void sourceFileProbeFullPathTopLevelClass() throws IOException, URISyntax String DIR_CLASS_NAME = CLASS_NAME.replace('.', '/'); TestSnapshotListener listener = installProbes( - createSourceFileProbe(PROBE_ID, "src/main/java/" + DIR_CLASS_NAME + ".java", 21)); + createLineProbe(LINE_PROBE_ID2, "src/main/java/" + DIR_CLASS_NAME + ".java", 21)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(42 * 42, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID2, listener); assertNull(snapshot.getCaptures().getEntry()); assertNull(snapshot.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot.getCaptures().getLines().size()); @@ -536,12 +548,12 @@ public void methodProbeLineProbeMix() throws IOException, URISyntaxException { String DIR_CLASS_NAME = CLASS_NAME.replace('.', '/'); TestSnapshotListener listener = installProbes( - createSourceFileProbe(PROBE_ID1, "src/main/java/" + DIR_CLASS_NAME + ".java", 10), - createProbe(PROBE_ID2, CLASS_NAME, "main", null)); + createLineProbe(LINE_PROBE_ID1, "src/main/java/" + DIR_CLASS_NAME + ".java", 10), + createMethodProbe(PROBE_ID2, CLASS_NAME, "main", null)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(2, result); - List snapshots = assertSnapshots(listener, 2, PROBE_ID1, PROBE_ID2); + List snapshots = assertSnapshots(listener, 2, LINE_PROBE_ID1, PROBE_ID2); Snapshot snapshot0 = snapshots.get(0); assertNull(snapshot0.getCaptures().getEntry()); assertNull(snapshot0.getCaptures().getReturn()); @@ -563,12 +575,12 @@ public void methodProbeLineProbeMix() throws IOException, URISyntaxException { public void sourceFileProbeScala() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot101"; final String FILE_NAME = CLASS_NAME + ".scala"; - TestSnapshotListener listener = installProbes(createSourceFileProbe(PROBE_ID, FILE_NAME, 3)); + TestSnapshotListener listener = installProbes(createLineProbe(LINE_PROBE_ID1, FILE_NAME, 3)); String source = getFixtureContent("/" + FILE_NAME); Class testClass = ScalaHelper.compileAndLoad(source, CLASS_NAME, FILE_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(48, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertNull(snapshot.getCaptures().getEntry()); assertNull(snapshot.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot.getCaptures().getLines().size()); @@ -581,13 +593,13 @@ public void sourceFileProbeScala() throws IOException, URISyntaxException { public void sourceFileProbeGroovy() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot201"; TestSnapshotListener listener = - installProbes(createSourceFileProbe(PROBE_ID, CLASS_NAME + ".groovy", 4)); + installProbes(createLineProbe(LINE_PROBE_ID1, CLASS_NAME + ".groovy", 4)); String source = getFixtureContent("/" + CLASS_NAME + ".groovy"); GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); Class testClass = groovyClassLoader.parseClass(source); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(48, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertNull(snapshot.getCaptures().getEntry()); assertNull(snapshot.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot.getCaptures().getLines().size()); @@ -603,7 +615,7 @@ public void sourceFileProbeGroovy() throws IOException, URISyntaxException { public void sourceFileProbeKotlin() { final String CLASS_NAME = "CapturedSnapshot301"; TestSnapshotListener listener = - installProbes(createSourceFileProbe(PROBE_ID, CLASS_NAME + ".kt", 4)); + installProbes(createLineProbe(LINE_PROBE_ID1, CLASS_NAME + ".kt", 4)); URL resource = CapturedSnapshotTest.class.getResource("/" + CLASS_NAME + ".kt"); assertNotNull(resource); List filesToDelete = new ArrayList<>(); @@ -613,7 +625,7 @@ public void sourceFileProbeKotlin() { Object companion = Reflect.onClass(testClass).get("Companion"); int result = Reflect.on(companion).call("main", "").get(); assertEquals(48, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertNull(snapshot.getCaptures().getEntry()); assertNull(snapshot.getCaptures().getReturn()); Assertions.assertEquals(1, snapshot.getCaptures().getLines().size()); @@ -632,7 +644,7 @@ public void sourceFileProbeKotlin() { public void suspendKotlin() { final String CLASS_NAME = "CapturedSnapshot302"; TestSnapshotListener listener = - installProbes(createSourceFileProbe(PROBE_ID, CLASS_NAME + ".kt", 9)); + installProbes(createLineProbe(LINE_PROBE_ID1, CLASS_NAME + ".kt", 9)); URL resource = CapturedSnapshotTest.class.getResource("/" + CLASS_NAME + ".kt"); assertNotNull(resource); List filesToDelete = new ArrayList<>(); @@ -642,7 +654,7 @@ public void suspendKotlin() { Object companion = Reflect.onClass(testClass).get("Companion"); int result = Reflect.on(companion).call("main", "").get(); assertEquals(0, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertCaptureFields(snapshot.getCaptures().getLines().get(9), "intField", "int", "42"); assertCaptureFields( snapshot.getCaptures().getLines().get(9), "strField", String.class.getTypeName(), "foo"); @@ -658,7 +670,7 @@ public void suspendKotlin() { public void suspendMethodKotlin() { final String CLASS_NAME = "CapturedSnapshot302"; TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, "download", null)); + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "download", null)); URL resource = CapturedSnapshotTest.class.getResource("/" + CLASS_NAME + ".kt"); assertNotNull(resource); List filesToDelete = new ArrayList<>(); @@ -691,7 +703,7 @@ public void suspendMethodKotlin() { public void hoistVarKotlin() { final String CLASS_NAME = "CapturedSnapshot303"; TestSnapshotListener listener = - installProbes(createProbeAtExit(PROBE_ID, CLASS_NAME + "$Companion", "main", null)); + installProbes(createMethodProbeAtExit(PROBE_ID, CLASS_NAME + "$Companion", "main", null)); URL resource = CapturedSnapshotTest.class.getResource("/" + CLASS_NAME + ".kt"); assertNotNull(resource); List filesToDelete = new ArrayList<>(); @@ -896,7 +908,8 @@ public void fieldExtractorCount2() throws IOException, URISyntaxException { @EnabledForJreRange(min = JRE.JAVA_17) public void fieldExtractorNotAccessible() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot30"; - LogProbe logProbe = createProbe(PROBE_ID, CLASS_NAME + "$MyObjectInputStream", "process", "()"); + LogProbe logProbe = + createMethodProbe(PROBE_ID, CLASS_NAME + "$MyObjectInputStream", "process", "()"); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -916,7 +929,8 @@ public void fieldExtractorNotAccessible() throws IOException, URISyntaxException @EnabledForJreRange(min = JRE.JAVA_17) public void staticFieldExtractorNotAccessible() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot30"; - LogProbe logProbe = createProbe(PROBE_ID, CLASS_NAME + "$MyHttpURLConnection", "process", "()"); + LogProbe logProbe = + createMethodProbe(PROBE_ID, CLASS_NAME + "$MyHttpURLConnection", "process", "()"); TestSnapshotListener listener = installProbes(logProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "static").get(); @@ -936,7 +950,7 @@ public void staticFieldExtractorNotAccessible() throws IOException, URISyntaxExc public void uncaughtException() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot05"; TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, "triggerUncaughtException", "()")); + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "triggerUncaughtException", "()")); Class testClass = compileAndLoadClass(CLASS_NAME); try { Reflect.onClass(testClass).call("main", "triggerUncaughtException").get(); @@ -1006,7 +1020,7 @@ public void uncaughtExceptionCondition() throws IOException, URISyntaxException public void caughtException() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot05"; TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, "triggerCaughtException", "()")); + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "triggerCaughtException", "()")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "triggerCaughtException").get(); assertEquals(42, result); @@ -1022,14 +1036,15 @@ public void caughtException() throws IOException, URISyntaxException { @Test public void lineEmptyCaughtException() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot05"; - LogProbe probe1 = createProbe(PROBE_ID1, CLASS_NAME, "triggerSwallowedException", null, "26"); - LogProbe probe2 = createProbe(PROBE_ID2, CLASS_NAME, "triggerSwallowedException", null, "29"); - LogProbe probe3 = createProbe(PROBE_ID3, CLASS_NAME, "triggerSwallowedException", null, "32"); + LogProbe probe1 = createLineProbe(LINE_PROBE_ID1, CLASS_NAME, 26); + LogProbe probe2 = createLineProbe(LINE_PROBE_ID2, CLASS_NAME, 29); + LogProbe probe3 = createLineProbe(LINE_PROBE_ID3, CLASS_NAME, 32); TestSnapshotListener listener = installProbes(probe1, probe2, probe3); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "triggerSwallowedException").get(); assertEquals(-1, result); - List snapshots = assertSnapshots(listener, 3, PROBE_ID1, PROBE_ID2, PROBE_ID3); + List snapshots = + assertSnapshots(listener, 3, LINE_PROBE_ID1, LINE_PROBE_ID2, LINE_PROBE_ID3); Snapshot snapshot0 = snapshots.get(0); Map expectedFields0 = new HashMap<>(); expectedFields0.put("detailMessage", "oops"); @@ -1156,7 +1171,7 @@ public void simpleConditionTest() throws IOException, URISyntaxException { public void lineProbeCondition() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; LogProbe logProbe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)", "7") + createProbeBuilder(LINE_PROBE_ID1, CLASS_NAME, 9) .when( new ProbeCondition( DSL.when( @@ -1183,7 +1198,7 @@ public void lineProbeCondition() throws IOException, URISyntaxException { } assertEquals(1, listener.snapshots.size()); assertCaptureArgs( - listener.snapshots.get(0).getCaptures().getLines().get(7), "arg", "java.lang.String", "5"); + listener.snapshots.get(0).getCaptures().getLines().get(9), "arg", "java.lang.String", "5"); } @Test @@ -1215,7 +1230,7 @@ public void staticFieldCondition() throws IOException, URISyntaxException { public void simpleFalseConditionTest() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; LogProbe logProbe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", "int (java.lang.String)", "8") + createProbeBuilder(LINE_PROBE_ID1, CLASS_NAME, 8) .when( new ProbeCondition(DSL.when(DSL.eq(DSL.ref("arg"), DSL.value("5"))), "arg == '5'")) .evaluateAt(MethodLocation.EXIT) @@ -1465,9 +1480,10 @@ public void mergedProbesConditionMixedLocation() throws IOException, URISyntaxEx @Test public void mergedProbesDifferentSignature() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; - LogProbe probe1 = createProbeAtExit(PROBE_ID1, CLASS_NAME, "doit", null); - LogProbe probe2 = createProbeAtExit(PROBE_ID2, CLASS_NAME, "doit", "int (java.lang.String)"); - LogProbe probe3 = createProbeAtExit(PROBE_ID3, CLASS_NAME, "doit", "(String)"); + LogProbe probe1 = createMethodProbeAtExit(PROBE_ID1, CLASS_NAME, "doit", null); + LogProbe probe2 = + createMethodProbeAtExit(PROBE_ID2, CLASS_NAME, "doit", "int (java.lang.String)"); + LogProbe probe3 = createMethodProbeAtExit(PROBE_ID3, CLASS_NAME, "doit", "(String)"); TestSnapshotListener listener = installProbes(probe1, probe2, probe3); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -1481,7 +1497,8 @@ public void mergedProbesDifferentSignature() throws IOException, URISyntaxExcept @Test public void fields() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot06"; - TestSnapshotListener listener = installProbes(createProbe(PROBE_ID, CLASS_NAME, "f", "()")); + TestSnapshotListener listener = + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "f", "()")); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "f").get(); assertEquals(42, result); @@ -1540,7 +1557,7 @@ public void inheritedFields() throws IOException, URISyntaxException { @Test public void staticFields() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot15"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "", "()"); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "", "()"); Class testClass = compileAndLoadClass(CLASS_NAME); long result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(4_000_000_001L, result); @@ -1585,12 +1602,11 @@ public void staticLambda() throws IOException, URISyntaxException { CorrelationAccess spyCorrelationAccess = spy(CorrelationAccess.instance()); setCorrelationSingleton(spyCorrelationAccess); doReturn(true).when(spyCorrelationAccess).isAvailable(); - TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, null, null, "37")); + TestSnapshotListener listener = installProbes(createLineProbe(LINE_PROBE_ID1, CLASS_NAME, 37)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "static", "email@address").get(); assertEquals(8, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); CapturedContext context = snapshot.getCaptures().getLines().get(37); assertNotNull(context); assertCaptureLocals(context, "idx", "int", "5"); @@ -1602,12 +1618,11 @@ public void capturingLambda() throws IOException, URISyntaxException { CorrelationAccess spyCorrelationAccess = spy(CorrelationAccess.instance()); setCorrelationSingleton(spyCorrelationAccess); doReturn(true).when(spyCorrelationAccess).isAvailable(); - TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, null, null, "48")); + TestSnapshotListener listener = installProbes(createLineProbe(LINE_PROBE_ID2, CLASS_NAME, 48)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "capturing", "email@address").get(); assertEquals(8, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID2, listener); CapturedContext context = snapshot.getCaptures().getLines().get(48); assertNotNull(context); assertCaptureLocals(context, "idx", "int", "5"); @@ -1620,12 +1635,11 @@ public void multiLambdas() throws IOException, URISyntaxException { CorrelationAccess spyCorrelationAccess = spy(CorrelationAccess.instance()); setCorrelationSingleton(spyCorrelationAccess); doReturn(true).when(spyCorrelationAccess).isAvailable(); - TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, null, null, "58")); + TestSnapshotListener listener = installProbes(createLineProbe(LINE_PROBE_ID3, CLASS_NAME, 58)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "multi", "FOO1,FOO2,FOO3").get(); assertEquals(3, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID3, listener); CapturedContext context = snapshot.getCaptures().getLines().get(58); assertNotNull(context); assertCaptureArgs(context, "arg", String.class.getTypeName(), "FOO1,FOO2,FOO3"); @@ -1635,7 +1649,7 @@ public void multiLambdas() throws IOException, URISyntaxException { public void tracerInstrumentedClass() throws Exception { DebuggerContext.initClassFilter(new DenyListHelper(null)); final String CLASS_NAME = "com.datadog.debugger.jaxrs.MyResource"; - TestSnapshotListener listener = installSingleProbe(CLASS_NAME, "createResource", null); + TestSnapshotListener listener = installMethodProbe(CLASS_NAME, "createResource", null); // load a class file that was previously instrumented by the DD tracer as JAX-RS resource Class testClass = loadClass(CLASS_NAME, getClass().getResource("/MyResource.class").getFile()); @@ -1660,8 +1674,8 @@ public void tracerInstrumentedClass() throws Exception { @Test public void noCodeMethods() throws Exception { final String CLASS_NAME = "CapturedSnapshot09"; - LogProbe nativeMethodProbe = createProbe(PROBE_ID1, CLASS_NAME, "nativeMethod", "()"); - LogProbe abstractMethodProbe = createProbe(PROBE_ID2, CLASS_NAME, "abstractMethod", "()"); + LogProbe nativeMethodProbe = createMethodProbe(PROBE_ID1, CLASS_NAME, "nativeMethod", "()"); + LogProbe abstractMethodProbe = createMethodProbe(PROBE_ID2, CLASS_NAME, "abstractMethod", "()"); TestSnapshotListener listener = installProbes(nativeMethodProbe, abstractMethodProbe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); @@ -1683,7 +1697,7 @@ public void duplicateClassDefinition() throws Exception { // (com.datadog.debugger.CapturedSnapshot12 is in unnamed module of loader utils.MemClassLoader // @1f7ef9ea, parent loader 'app') final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot12"; - LogProbe abstractMethodProbe = createProbe(PROBE_ID, CLASS_NAME, "", null); + LogProbe abstractMethodProbe = createMethodProbe(PROBE_ID, CLASS_NAME, "", null); TestSnapshotListener listener = installProbes(abstractMethodProbe); Class testClass = compileAndLoadClass(CLASS_NAME); assertNotNull(testClass); @@ -1693,7 +1707,7 @@ public void duplicateClassDefinition() throws Exception { public void overloadedMethods() throws Exception { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot16"; TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, "overload", null)); + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "overload", null)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(63, result); @@ -1705,7 +1719,8 @@ public void overloadedMethods() throws Exception { @Test public void noDebugInfoEmptyMethod() throws Exception { final String CLASS_NAME = "CapturedSnapshot03"; - TestSnapshotListener listener = installProbes(createProbe(PROBE_ID, CLASS_NAME, "empty", null)); + TestSnapshotListener listener = + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "empty", null)); Map classFileBuffers = compile(CLASS_NAME, SourceCompiler.DebugInfo.NONE, "8"); Class testClass = loadClass(CLASS_NAME, classFileBuffers); int result = Reflect.onClass(testClass).call("main", "2").get(); @@ -1758,7 +1773,7 @@ public void instrumentTheWorld_excludeClass(String excludeFileName) throws Excep public void objectDynamicType() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot17"; TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, "processWithArg", null)); + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "processWithArg", null)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(50, result); @@ -1773,12 +1788,11 @@ public void objectDynamicType() throws IOException, URISyntaxException { @Test public void exceptionAsLocalVariable() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot18"; - TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, null, null, "14")); + TestSnapshotListener listener = installProbes(createLineProbe(LINE_PROBE_ID1, CLASS_NAME, 14)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(42, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); Map expectedFields = new HashMap<>(); expectedFields.put("detailMessage", "For input string: \"a\""); assertCaptureLocals( @@ -1886,7 +1900,7 @@ public void uncaughtExceptionConditionLocalVar() throws IOException, URISyntaxEx disabledReason = "we cannot get local variable debug info") public void uncaughtExceptionCaptureLocalVars() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot31"; - LogProbe probe = createProbeAtExit(PROBE_ID, CLASS_NAME, "uncaughtException", null); + LogProbe probe = createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "uncaughtException", null); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); try { @@ -1912,7 +1926,7 @@ public void methodProbeLocalVarsLocalScopes() throws IOException, URISyntaxExcep setFieldInConfig(Config.get(), "debuggerHoistLocalVarsEnabled", true); try { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot31"; - LogProbe probe = createProbeAtExit(PROBE_ID, CLASS_NAME, "localScopes", "(String)"); + LogProbe probe = createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "localScopes", "(String)"); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "localScopes").get(); @@ -1931,7 +1945,7 @@ public void methodProbeLocalVarsLocalScopes() throws IOException, URISyntaxExcep disabledReason = "we cannot get local variable debug info") public void methodProbeLocalVarsDeepScopes() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot31"; - LogProbe probe = createProbeAtExit(PROBE_ID, CLASS_NAME, "deepScopes", "(String)"); + LogProbe probe = createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "deepScopes", "(String)"); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "deepScopes").get(); @@ -1963,7 +1977,7 @@ public void methodProbeLocalVarsDeepScopes() throws IOException, URISyntaxExcept disabledReason = "we cannot get local variable debug info") public void methodProbeExceptionLocalVars() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot31"; - LogProbe probe = createProbeAtExit(PROBE_ID, CLASS_NAME, "caughtException", "(String)"); + LogProbe probe = createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "caughtException", "(String)"); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "illegalState").get(); @@ -1997,7 +2011,7 @@ public void methodProbeExceptionLocalVars() throws IOException, URISyntaxExcepti disabledReason = "we cannot get local variable debug info") public void overlappingLocalVarSlot() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot31"; - LogProbe probe = createProbeAtExit(PROBE_ID, CLASS_NAME, "overlappingSlots", "(String)"); + LogProbe probe = createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "overlappingSlots", "(String)"); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "overlappingSlots").get(); @@ -2017,7 +2031,7 @@ public void duplicateLocalDifferentScope() throws IOException, URISyntaxExceptio try { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot31"; LogProbe probe = - createProbeAtExit(PROBE_ID, CLASS_NAME, "duplicateLocalDifferentScope", "(String)"); + createMethodProbeAtExit(PROBE_ID, CLASS_NAME, "duplicateLocalDifferentScope", "(String)"); TestSnapshotListener listener = installProbes(probe); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "duplicateLocalDifferentScope").get(); @@ -2035,7 +2049,7 @@ public void enumConstructorArgs() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot23"; final String ENUM_CLASS = CLASS_NAME + "$MyEnum"; TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, ENUM_CLASS, "", null)); + installProbes(createMethodProbe(PROBE_ID, ENUM_CLASS, "", null)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(2, result); @@ -2052,7 +2066,7 @@ public void enumConstructorArgs() throws IOException, URISyntaxException { public void enumValues() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot23"; TestSnapshotListener listener = - installProbes(createProbe(PROBE_ID, CLASS_NAME, "convert", null)); + installProbes(createMethodProbe(PROBE_ID, CLASS_NAME, "convert", null)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "2").get(); assertEquals(2, result); @@ -2095,7 +2109,8 @@ public void enumCondition() throws IOException, URISyntaxException { public void recursiveCapture() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot24"; final String INNER_CLASS = CLASS_NAME + "$Holder"; - TestSnapshotListener listener = installProbes(createProbe(PROBE_ID, INNER_CLASS, "size", null)); + TestSnapshotListener listener = + installProbes(createMethodProbe(PROBE_ID, INNER_CLASS, "size", null)); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "").get(); assertEquals(1, result); @@ -2105,7 +2120,8 @@ public void recursiveCapture() throws IOException, URISyntaxException { public void recursiveCaptureException() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot24"; final String INNER_CLASS = CLASS_NAME + "$HolderWithException"; - TestSnapshotListener listener = installProbes(createProbe(PROBE_ID, INNER_CLASS, "size", null)); + TestSnapshotListener listener = + installProbes(createMethodProbe(PROBE_ID, INNER_CLASS, "size", null)); Class testClass = compileAndLoadClass(CLASS_NAME); try { Reflect.onClass(testClass).call("main", "exception").get(); @@ -2153,11 +2169,11 @@ private Snapshot doUnknownCount(String CLASS_NAME) throws IOException, URISyntax @Test public void beforeForLoopLineProbe() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot02"; - TestSnapshotListener listener = installSingleProbeAtExit(CLASS_NAME, null, null, "46"); + TestSnapshotListener listener = installLineProbe(LINE_PROBE_ID1, CLASS_NAME, 46); Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "synchronizedBlock").get(); assertEquals(76, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); assertCaptureLocals(snapshot.getCaptures().getLines().get(46), "count", "int", "31"); } @@ -2166,12 +2182,12 @@ public void dupLineProbeSameTemplate() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; final String LOG_TEMPLATE = "msg1={typed.fld.fld.msg}"; LogProbe probe1 = - createProbeBuilder(PROBE_ID1, CLASS_NAME, null, null, "14") + createProbeBuilder(LINE_PROBE_ID2, CLASS_NAME, 14) .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) .evaluateAt(MethodLocation.EXIT) .build(); LogProbe probe2 = - createProbeBuilder(PROBE_ID2, CLASS_NAME, null, null, "14") + createProbeBuilder(LINE_PROBE_ID3, CLASS_NAME, 14) .template(LOG_TEMPLATE, parseTemplate(LOG_TEMPLATE)) .evaluateAt(MethodLocation.EXIT) .build(); @@ -2179,7 +2195,7 @@ public void dupLineProbeSameTemplate() throws IOException, URISyntaxException { Class testClass = compileAndLoadClass(CLASS_NAME); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(3, result); - List snapshots = assertSnapshots(listener, 2, PROBE_ID1, PROBE_ID2); + List snapshots = assertSnapshots(listener, 2, LINE_PROBE_ID2, LINE_PROBE_ID3); for (Snapshot snapshot : snapshots) { assertEquals("msg1=hello", snapshot.getMessage()); } @@ -2444,7 +2460,7 @@ private void doSamplingTest(TestMethod testRun, int expectedGlobalCount, int exp public void record() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot29"; final String RECORD_NAME = "com.datadog.debugger.MyRecord1"; - LogProbe probe1 = createProbeAtExit(PROBE_ID, RECORD_NAME, "age", null); + LogProbe probe1 = createMethodProbeAtExit(PROBE_ID, RECORD_NAME, "age", null); TestSnapshotListener listener = installProbes(probe1); Class testClass = compileAndLoadClass(CLASS_NAME, "17"); int result = Reflect.onClass(testClass).call("main", "1").get(); @@ -2464,12 +2480,12 @@ public void record() throws IOException, URISyntaxException { public void lineRecord() throws IOException, URISyntaxException { final String CLASS_NAME = "com.datadog.debugger.CapturedSnapshot29"; final String RECORD_NAME = "com.datadog.debugger.MyRecord2"; - LogProbe probe1 = createProbe(PROBE_ID, RECORD_NAME, null, null, "29"); + LogProbe probe1 = createLineProbe(LINE_PROBE_ID1, RECORD_NAME, 29); TestSnapshotListener listener = installProbes(probe1); Class testClass = compileAndLoadClass(CLASS_NAME, "17"); int result = Reflect.onClass(testClass).call("main", "1").get(); assertEquals(42, result); - Snapshot snapshot = assertOneSnapshot(listener); + Snapshot snapshot = assertOneSnapshot(LINE_PROBE_ID1, listener); CapturedContext capturedContext = snapshot.getCaptures().getLines().get(29); assertCaptureArgs(capturedContext, "firstName", String.class.getTypeName(), "john"); assertCaptureArgs(capturedContext, "lastName", String.class.getTypeName(), "doe"); @@ -2558,7 +2574,7 @@ public void allProbesSameMethod() throws IOException, URISyntaxException { public void watches() throws IOException, URISyntaxException { final String CLASS_NAME = "CapturedSnapshot08"; LogProbe probe = - createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null, null) + createProbeBuilder(PROBE_ID, CLASS_NAME, "doit", null) .evaluateAt(MethodLocation.EXIT) .tags( "dd_watches_dsl:{typed.fld.fld.msg},{nullTyped.fld}", @@ -2624,9 +2640,13 @@ private void setCorrelationSingleton(Object instance) { } private Snapshot assertOneSnapshot(TestSnapshotListener listener) { + return assertOneSnapshot(PROBE_ID, listener); + } + + private Snapshot assertOneSnapshot(ProbeId probeId, TestSnapshotListener listener) { assertEquals(1, listener.snapshots.size()); Snapshot snapshot = listener.snapshots.get(0); - assertEquals(PROBE_ID.getId(), snapshot.getProbe().getId()); + assertEquals(probeId.getId(), snapshot.getProbe().getId()); return snapshot; } } diff --git a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturingTestBase.java b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturingTestBase.java index 1a1b3fd77b53..d5efde4ea924 100644 --- a/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturingTestBase.java +++ b/dd-java-agent/agent-debugger/src/test/java/com/datadog/debugger/agent/CapturingTestBase.java @@ -80,16 +80,6 @@ public class CapturingTestBase { protected ProbeStatusSink probeStatusSink; - protected static LogProbe createSourceFileProbe(ProbeId id, String sourceFile, int line) { - return new LogProbe.Builder() - .language(LANGUAGE) - .probeId(id) - .captureSnapshot(true) - .where(null, null, null, line, sourceFile) - .evaluateAt(MethodLocation.EXIT) - .build(); - } - @AfterEach public void after() { if (currentTransformer != null) { @@ -313,16 +303,25 @@ protected void assertCaptureWatches( assertEquals(value, MoshiSnapshotTestHelper.getValue(watch)); } - protected TestSnapshotListener installSingleProbe( - String typeName, String methodName, String signature, String... lines) { - LogProbe logProbes = - createProbe(CapturedSnapshotTest.PROBE_ID, typeName, methodName, signature, lines); - return installProbes(logProbes); + protected TestSnapshotListener installMethodProbe( + String typeName, String methodName, String signature) { + LogProbe logProbe = + createMethodProbe(CapturedSnapshotTest.PROBE_ID, typeName, methodName, signature); + return installProbes(logProbe); + } + + protected TestSnapshotListener installLineProbe(ProbeId id, String typeName, int line) { + LogProbe logProbe = createLineProbe(id, typeName, line); + return installProbes(logProbe); + } + + protected static LogProbe createMethodProbe( + ProbeId id, String typeName, String methodName, String signature) { + return createProbeBuilder(id, typeName, methodName, signature).build(); } - protected static LogProbe createProbe( - ProbeId id, String typeName, String methodName, String signature, String... lines) { - return createProbeBuilder(id, typeName, methodName, signature, lines).build(); + protected static LogProbe createLineProbe(ProbeId id, String sourceFile, int line) { + return createProbeBuilder(id, sourceFile, line).build(); } protected TestSnapshotListener installProbes(LogProbe... logProbes) { @@ -330,34 +329,35 @@ protected TestSnapshotListener installProbes(LogProbe... logProbes) { Configuration.builder() .setService(CapturedSnapshotTest.SERVICE_NAME) .addLogProbes(asList(logProbes)) - .build() /*, logProbes*/); + .build()); } public static LogProbe.Builder createProbeBuilder( ProbeId id, String typeName, String methodName, String signature) { - return createProbeBuilder(id, typeName, methodName, signature, (String[]) null); + return createProbeBuilder(id) + .captureSnapshot(true) + .where(typeName, methodName, signature, (String[]) null) + // Increase sampling limit to avoid being sampled during tests + .sampling(new LogProbe.Sampling(100)); } - public static LogProbe.Builder createProbeBuilder( - ProbeId id, String typeName, String methodName, String signature, String... lines) { - return LogProbe.builder() - .language(LANGUAGE) - .probeId(id) + public static LogProbe.Builder createProbeBuilder(ProbeId id, String sourceFile, int line) { + return createProbeBuilder(id) .captureSnapshot(true) - .where(typeName, methodName, signature, lines) + .where(sourceFile, line) // Increase sampling limit to avoid being sampled during tests .sampling(new LogProbe.Sampling(100)); } - protected TestSnapshotListener installProbes( - Configuration configuration, ProbeDefinition... probes) { + public static LogProbe.Builder createProbeBuilder(ProbeId id) { + return LogProbe.builder().language(LANGUAGE).probeId(id); + } + protected TestSnapshotListener installProbes(Configuration configuration) { config = mockConfig(); instrumentationListener = new MockInstrumentationListener(); probeStatusSink = mock(ProbeStatusSink.class); - TestSnapshotListener listener = new TestSnapshotListener(config, probeStatusSink); - configurationUpdater = new ConfigurationUpdater( instr, @@ -365,12 +365,10 @@ protected TestSnapshotListener installProbes( config, new DebuggerSink(config, probeStatusSink), new ClassesToRetransformFinder()); - currentTransformer = new DebuggerTransformer(config, configuration, instrumentationListener, listener); instr.addTransformer(currentTransformer); DebuggerAgentHelper.injectSink(listener); - DebuggerContext.initProbeResolver( (encodedId) -> resolver( @@ -380,7 +378,6 @@ protected TestSnapshotListener installProbes( configuration.getTriggerProbes())); DebuggerContext.initClassFilter(new DenyListHelper(null)); DebuggerContext.initValueSerializer(new JsonSnapshotSerializer()); - Collection logProbes = configuration.getLogProbes(); if (logProbes != null) { for (LogProbe probe : logProbes) { @@ -393,7 +390,6 @@ protected TestSnapshotListener installProbes( if (configuration.getSampling() != null) { ProbeRateLimiter.setGlobalSnapshotRate(configuration.getSampling().getEventsPerSecond()); } - return listener; } @@ -440,16 +436,16 @@ public static ProbeImplementation resolver( return null; } - protected TestSnapshotListener installSingleProbeAtExit( - String typeName, String methodName, String signature, String... lines) { + protected TestSnapshotListener installMethodProbeAtExit( + String typeName, String methodName, String signature) { LogProbe logProbes = - createProbeAtExit(CapturedSnapshotTest.PROBE_ID, typeName, methodName, signature, lines); + createMethodProbeAtExit(CapturedSnapshotTest.PROBE_ID, typeName, methodName, signature); return installProbes(logProbes); } - protected static LogProbe createProbeAtExit( - ProbeId id, String typeName, String methodName, String signature, String... lines) { - return createProbeBuilder(id, typeName, methodName, signature, lines) + protected static LogProbe createMethodProbeAtExit( + ProbeId id, String typeName, String methodName, String signature) { + return createProbeBuilder(id, typeName, methodName, signature) .evaluateAt(MethodLocation.EXIT) .build(); }