Skip to content

Commit 2cd6a7b

Browse files
committed
LLM helps
1 parent 055b415 commit 2cd6a7b

File tree

5 files changed

+368
-73
lines changed

5 files changed

+368
-73
lines changed

dd-java-agent/instrumentation-testing/src/main/groovy/datadog/trace/agent/test/InstrumentationSpecification.groovy

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -576,7 +576,17 @@ abstract class InstrumentationSpecification extends DDSpecification implements A
576576
options = "datadog.trace.agent.test.asserts.ListWriterAssert")
577577
@DelegatesTo(value = ListWriterAssert, strategy = Closure.DELEGATE_FIRST)
578578
final Closure spec) {
579-
ListWriterAssert.assertTraces(TEST_WRITER, size, ignoreAdditionalTraces, spec)
579+
// Ensure Groovy closure resolves methods (e.g., trace(), sortSpansByStart()) against ListWriterAssert
580+
ListWriterAssert.assertTraces(
581+
TEST_WRITER,
582+
size,
583+
ignoreAdditionalTraces,
584+
{ ListWriterAssert asserter ->
585+
spec.delegate = asserter
586+
spec.resolveStrategy = Closure.DELEGATE_FIRST
587+
spec.call(asserter)
588+
} as java.util.function.Consumer<ListWriterAssert>
589+
)
580590
}
581591

582592
protected static final Comparator<List<DDSpan>> SORT_TRACES_BY_ID = ListWriterAssert.SORT_TRACES_BY_ID
@@ -591,7 +601,18 @@ abstract class InstrumentationSpecification extends DDSpecification implements A
591601
options = "datadog.trace.agent.test.asserts.ListWriterAssert")
592602
@DelegatesTo(value = ListWriterAssert, strategy = Closure.DELEGATE_FIRST)
593603
final Closure spec) {
594-
ListWriterAssert.assertTraces(TEST_WRITER, size, false, traceSorter, spec)
604+
// Ensure Groovy closure resolves methods against ListWriterAssert when a custom sorter is provided
605+
ListWriterAssert.assertTraces(
606+
TEST_WRITER,
607+
size,
608+
false,
609+
traceSorter,
610+
{ ListWriterAssert asserter ->
611+
spec.delegate = asserter
612+
spec.resolveStrategy = Closure.DELEGATE_FIRST
613+
spec.call(asserter)
614+
} as java.util.function.Consumer<ListWriterAssert>
615+
)
595616
}
596617

597618
void blockUntilChildSpansFinished(final int numberOfSpans) {

dd-java-agent/testing/src/main/java/datadog/trace/agent/test/asserts/ListWriterAssert.java

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,22 @@ public static void assertTraces(
3535
assertTraces(writer, expectedSize, false, SORT_TRACES_BY_START, spec);
3636
}
3737

38+
// Groovy-friendly overload: allow passing a Closure and set delegate to ListWriterAssert
39+
public static void assertTraces(
40+
ListWriter writer, int expectedSize, groovy.lang.Closure<?> spec) {
41+
assertTraces(
42+
writer,
43+
expectedSize,
44+
false,
45+
SORT_TRACES_BY_START,
46+
(Consumer<ListWriterAssert>)
47+
(asserter) -> {
48+
spec.setDelegate(asserter);
49+
spec.setResolveStrategy(groovy.lang.Closure.DELEGATE_FIRST);
50+
spec.call(asserter);
51+
});
52+
}
53+
3854
public static void assertTraces(
3955
ListWriter writer,
4056
int expectedSize,
@@ -43,6 +59,25 @@ public static void assertTraces(
4359
assertTraces(writer, expectedSize, ignoreAdditionalTraces, SORT_TRACES_BY_START, spec);
4460
}
4561

62+
// Groovy-friendly overload with ignoreAdditionalTraces
63+
public static void assertTraces(
64+
ListWriter writer,
65+
int expectedSize,
66+
boolean ignoreAdditionalTraces,
67+
groovy.lang.Closure<?> spec) {
68+
assertTraces(
69+
writer,
70+
expectedSize,
71+
ignoreAdditionalTraces,
72+
SORT_TRACES_BY_START,
73+
(Consumer<ListWriterAssert>)
74+
(asserter) -> {
75+
spec.setDelegate(asserter);
76+
spec.setResolveStrategy(groovy.lang.Closure.DELEGATE_FIRST);
77+
spec.call(asserter);
78+
});
79+
}
80+
4681
public static void assertTraces(
4782
ListWriter writer,
4883
int expectedSize,
@@ -113,6 +148,26 @@ public static void assertTraces(
113148
}
114149
}
115150

151+
// Groovy-friendly overload with explicit trace sorter
152+
public static void assertTraces(
153+
ListWriter writer,
154+
int expectedSize,
155+
boolean ignoreAdditionalTraces,
156+
Comparator<List<DDSpan>> traceSorter,
157+
groovy.lang.Closure<?> spec) {
158+
assertTraces(
159+
writer,
160+
expectedSize,
161+
ignoreAdditionalTraces,
162+
traceSorter,
163+
(Consumer<ListWriterAssert>)
164+
(asserter) -> {
165+
spec.setDelegate(asserter);
166+
spec.setResolveStrategy(groovy.lang.Closure.DELEGATE_FIRST);
167+
spec.call(asserter);
168+
});
169+
}
170+
116171
public void sortSpansByStart() {
117172
this.traces =
118173
traces.stream()
@@ -133,10 +188,36 @@ public void trace(int expectedSize, Consumer<TraceAssert> spec) {
133188
trace(expectedSize, false, spec);
134189
}
135190

191+
// Groovy-friendly overload: allow passing a Closure and set delegate to TraceAssert
192+
public void trace(int expectedSize, groovy.lang.Closure<?> spec) {
193+
trace(
194+
expectedSize,
195+
false,
196+
(Consumer<TraceAssert>)
197+
(asserter) -> {
198+
spec.setDelegate(asserter);
199+
spec.setResolveStrategy(groovy.lang.Closure.DELEGATE_FIRST);
200+
spec.call(asserter);
201+
});
202+
}
203+
136204
public void trace(int expectedSize, boolean sortByName, Consumer<TraceAssert> spec) {
137205
trace(expectedSize, sortByName ? TraceAssert.NAME_COMPARATOR : null, spec);
138206
}
139207

208+
// Groovy-friendly overload with sortByName flag
209+
public void trace(int expectedSize, boolean sortByName, groovy.lang.Closure<?> spec) {
210+
trace(
211+
expectedSize,
212+
sortByName ? TraceAssert.NAME_COMPARATOR : null,
213+
(Consumer<TraceAssert>)
214+
(asserter) -> {
215+
spec.setDelegate(asserter);
216+
spec.setResolveStrategy(groovy.lang.Closure.DELEGATE_FIRST);
217+
spec.call(asserter);
218+
});
219+
}
220+
140221
public void trace(int expectedSize, Comparator<DDSpan> sorter, Consumer<TraceAssert> spec) {
141222
int index = traceAssertCount.getAndIncrement();
142223
if (index >= size) {
@@ -149,6 +230,20 @@ public void trace(int expectedSize, Comparator<DDSpan> sorter, Consumer<TraceAss
149230
assertTrace(trace(index), expectedSize, sorter, spec);
150231
}
151232

233+
// Groovy-friendly overload with explicit sorter
234+
public void trace(
235+
int expectedSize, Comparator<DDSpan> sorter, groovy.lang.Closure<?> spec) {
236+
trace(
237+
expectedSize,
238+
sorter,
239+
(Consumer<TraceAssert>)
240+
(asserter) -> {
241+
spec.setDelegate(asserter);
242+
spec.setResolveStrategy(groovy.lang.Closure.DELEGATE_FIRST);
243+
spec.call(asserter);
244+
});
245+
}
246+
152247
public void assertTracesAllVerified() {
153248
if (assertedIndexes.size() != size) {
154249
throw new AssertionError("Not all traces were verified.");

dd-java-agent/testing/src/main/java/datadog/trace/agent/test/asserts/SpanAssert.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,15 @@ public void operationNameMatches(java.util.function.Predicate<String> eval) {
7979
checked.put("operationName", true);
8080
}
8181

82+
// Groovy-friendly overload: allow calling operationName { it -> boolean }
83+
public void operationName(groovy.lang.Closure<?> eval) {
84+
operationNameMatches(
85+
(name) -> {
86+
Object res = eval.call(name);
87+
return res instanceof Boolean ? (Boolean) res : res != null;
88+
});
89+
}
90+
8291
public void operationNameContains(String... operationNameParts) {
8392
assertSpanNameContains(span.getOperationName().toString(), operationNameParts);
8493
checked.put("operationName", true);
@@ -108,6 +117,15 @@ public void resourceNameMatches(java.util.function.Predicate<String> eval) {
108117
checked.put("resourceName", true);
109118
}
110119

120+
// Groovy-friendly overload: allow calling resourceName { it -> boolean }
121+
public void resourceName(groovy.lang.Closure<?> eval) {
122+
resourceNameMatches(
123+
(name) -> {
124+
Object res = eval.call(name);
125+
return res instanceof Boolean ? (Boolean) res : res != null;
126+
});
127+
}
128+
111129
public void resourceNameContains(String... resourceNameParts) {
112130
assertSpanNameContains(span.getResourceName().toString(), resourceNameParts);
113131
checked.put("resourceName", true);
@@ -248,6 +266,15 @@ public void tags(boolean checkAllTags, Consumer<TagsAssert> spec) {
248266
assertTags(span, spec, checkAllTags);
249267
}
250268

269+
// Groovy-friendly overloads: allow a Closure and set its delegate to TagsAssert
270+
public void tags(groovy.lang.Closure<?> spec) {
271+
TagsAssert.assertTags(span, spec);
272+
}
273+
274+
public void tags(boolean checkAllTags, groovy.lang.Closure<?> spec) {
275+
TagsAssert.assertTags(span, spec, checkAllTags);
276+
}
277+
251278
public void ignoreSpanLinks() {
252279
this.checkLinks = false;
253280
}

0 commit comments

Comments
 (0)