Skip to content

Commit 1de97ac

Browse files
committed
Simplify @testfactory tests to @ParameterizedTest
Convert tests that used @testfactory + DynamicTest + nested TestCase classes into standard @ParameterizedTest + @MethodSource. The cases were all known at compile time with the same body per case, so the factory machinery wasn't earning its complexity. Also reshape the parseCoreResource/parseRegularResource cases in KubernetesRequestUtilsTest to use named KubernetesResource locals in the Stream<Arguments> provider instead of positional 7-argument tuples. OverheadTests is intentionally left as @testfactory since its cases are runtime-discovered via Configs.all().
1 parent 11369bc commit 1de97ac

5 files changed

Lines changed: 204 additions & 339 deletions

File tree

instrumentation/kubernetes-client-7.0/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/kubernetesclient/v7_0/KubernetesRequestUtilsTest.java

Lines changed: 61 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.javaagent.instrumentation.kubernetesclient.v7_0;
77

88
import static org.assertj.core.api.Assertions.assertThat;
9+
import static org.junit.jupiter.params.provider.Arguments.arguments;
910

1011
import java.util.stream.Stream;
1112
import org.junit.jupiter.api.Test;
@@ -38,46 +39,27 @@ void isResourceRequest() {
3839
.isTrue();
3940
}
4041

41-
@ParameterizedTest
42+
@ParameterizedTest(name = "{0}")
4243
@MethodSource("parseCoreResourceArguments")
43-
void parseCoreResource(
44-
String urlPath,
45-
String apiGroup,
46-
String apiVersion,
47-
String resource,
48-
String subResource,
49-
String namespace,
50-
String name)
44+
void parseCoreResource(String name, String urlPath, KubernetesResource expected)
5145
throws ParseKubernetesResourceException {
52-
assertThat(KubernetesResource.parseCoreResource(urlPath).getApiGroup()).isEqualTo(apiGroup);
53-
assertThat(KubernetesResource.parseCoreResource(urlPath).getApiVersion()).isEqualTo(apiVersion);
54-
assertThat(KubernetesResource.parseCoreResource(urlPath).getResource()).isEqualTo(resource);
55-
assertThat(KubernetesResource.parseCoreResource(urlPath).getSubResource())
56-
.isEqualTo(subResource);
57-
assertThat(KubernetesResource.parseCoreResource(urlPath).getNamespace()).isEqualTo(namespace);
58-
assertThat(KubernetesResource.parseCoreResource(urlPath).getName()).isEqualTo(name);
46+
assertResourceEquals(KubernetesResource.parseCoreResource(urlPath), expected);
5947
}
6048

61-
@ParameterizedTest
49+
@ParameterizedTest(name = "{0}")
6250
@MethodSource("parseRegularResourceArguments")
63-
void parseRegularResource(
64-
String urlPath,
65-
String apiGroup,
66-
String apiVersion,
67-
String resource,
68-
String subResource,
69-
String namespace,
70-
String name)
51+
void parseRegularResource(String name, String urlPath, KubernetesResource expected)
7152
throws ParseKubernetesResourceException {
72-
assertThat(KubernetesResource.parseRegularResource(urlPath).getApiGroup()).isEqualTo(apiGroup);
73-
assertThat(KubernetesResource.parseRegularResource(urlPath).getApiVersion())
74-
.isEqualTo(apiVersion);
75-
assertThat(KubernetesResource.parseRegularResource(urlPath).getResource()).isEqualTo(resource);
76-
assertThat(KubernetesResource.parseRegularResource(urlPath).getSubResource())
77-
.isEqualTo(subResource);
78-
assertThat(KubernetesResource.parseRegularResource(urlPath).getNamespace())
79-
.isEqualTo(namespace);
80-
assertThat(KubernetesResource.parseRegularResource(urlPath).getName()).isEqualTo(name);
53+
assertResourceEquals(KubernetesResource.parseRegularResource(urlPath), expected);
54+
}
55+
56+
private static void assertResourceEquals(KubernetesResource actual, KubernetesResource expected) {
57+
assertThat(actual.getApiGroup()).isEqualTo(expected.getApiGroup());
58+
assertThat(actual.getApiVersion()).isEqualTo(expected.getApiVersion());
59+
assertThat(actual.getResource()).isEqualTo(expected.getResource());
60+
assertThat(actual.getSubResource()).isEqualTo(expected.getSubResource());
61+
assertThat(actual.getNamespace()).isEqualTo(expected.getNamespace());
62+
assertThat(actual.getName()).isEqualTo(expected.getName());
8163
}
8264

8365
@ParameterizedTest
@@ -104,73 +86,59 @@ private static Stream<Arguments> k8sRequestVerbsArguments() {
10486
}
10587

10688
private static Stream<Arguments> parseRegularResourceArguments() {
89+
KubernetesResource deploymentsList =
90+
new KubernetesResource("apps", "v1", "deployments", null, null, null);
91+
KubernetesResource namespacedDeployments =
92+
new KubernetesResource("apps", "v1", "deployments", null, "default", null);
93+
KubernetesResource namedDeployment =
94+
new KubernetesResource("apps", "v1", "deployments", null, "default", "foo");
95+
KubernetesResource namedDeploymentStatus =
96+
new KubernetesResource("apps", "v1", "deployments", "status", "default", "foo");
97+
KubernetesResource foosList =
98+
new KubernetesResource("example.io", "v1alpha1", "foos", null, null, null);
99+
KubernetesResource namespacedFoos =
100+
new KubernetesResource("example.io", "v1alpha1", "foos", null, "default", null);
101+
KubernetesResource namedFoo =
102+
new KubernetesResource("example.io", "v1alpha1", "foos", null, "default", "foo");
103+
KubernetesResource namedFooStatus =
104+
new KubernetesResource("example.io", "v1alpha1", "foos", "status", "default", "foo");
107105
return Stream.of(
108-
Arguments.of("/apis/apps/v1/deployments", "apps", "v1", "deployments", null, null, null),
109-
Arguments.of(
110-
"/apis/apps/v1/namespaces/default/deployments",
111-
"apps",
112-
"v1",
113-
"deployments",
114-
null,
115-
"default",
116-
null),
117-
Arguments.of(
118-
"/apis/apps/v1/namespaces/default/deployments/foo",
119-
"apps",
120-
"v1",
121-
"deployments",
122-
null,
123-
"default",
124-
"foo"),
125-
Arguments.of(
106+
arguments("cluster-scoped list", "/apis/apps/v1/deployments", deploymentsList),
107+
arguments(
108+
"namespaced list", "/apis/apps/v1/namespaces/default/deployments", namespacedDeployments),
109+
arguments(
110+
"namespaced named", "/apis/apps/v1/namespaces/default/deployments/foo", namedDeployment),
111+
arguments(
112+
"namespaced named subresource",
126113
"/apis/apps/v1/namespaces/default/deployments/foo/status",
127-
"apps",
128-
"v1",
129-
"deployments",
130-
"status",
131-
"default",
132-
"foo"),
133-
Arguments.of(
134-
"/apis/example.io/v1alpha1/foos", "example.io", "v1alpha1", "foos", null, null, null),
135-
Arguments.of(
114+
namedDeploymentStatus),
115+
arguments("custom resource cluster-scoped list", "/apis/example.io/v1alpha1/foos", foosList),
116+
arguments(
117+
"custom resource namespaced list",
136118
"/apis/example.io/v1alpha1/namespaces/default/foos",
137-
"example.io",
138-
"v1alpha1",
139-
"foos",
140-
null,
141-
"default",
142-
null),
143-
Arguments.of(
119+
namespacedFoos),
120+
arguments(
121+
"custom resource namespaced named",
144122
"/apis/example.io/v1alpha1/namespaces/default/foos/foo",
145-
"example.io",
146-
"v1alpha1",
147-
"foos",
148-
null,
149-
"default",
150-
"foo"),
151-
Arguments.of(
123+
namedFoo),
124+
arguments(
125+
"custom resource namespaced named subresource",
152126
"/apis/example.io/v1alpha1/namespaces/default/foos/foo/status",
153-
"example.io",
154-
"v1alpha1",
155-
"foos",
156-
"status",
157-
"default",
158-
"foo"));
127+
namedFooStatus));
159128
}
160129

161130
private static Stream<Arguments> parseCoreResourceArguments() {
131+
KubernetesResource podsList = new KubernetesResource("", "v1", "pods", null, null, null);
132+
KubernetesResource namespacedPods =
133+
new KubernetesResource("", "v1", "pods", null, "default", null);
134+
KubernetesResource namedPod = new KubernetesResource("", "v1", "pods", null, "default", "foo");
135+
KubernetesResource namedPodExec =
136+
new KubernetesResource("", "v1", "pods", "exec", "default", "foo");
162137
return Stream.of(
163-
Arguments.of("/api/v1/pods", "", "v1", "pods", null, null, null),
164-
Arguments.of("/api/v1/namespaces/default/pods", "", "v1", "pods", null, "default", null),
165-
Arguments.of(
166-
"/api/v1/namespaces/default/pods/foo", "", "v1", "pods", null, "default", "foo"),
167-
Arguments.of(
168-
"/api/v1/namespaces/default/pods/foo/exec",
169-
"",
170-
"v1",
171-
"pods",
172-
"exec",
173-
"default",
174-
"foo"));
138+
arguments("cluster-scoped list", "/api/v1/pods", podsList),
139+
arguments("namespaced list", "/api/v1/namespaces/default/pods", namespacedPods),
140+
arguments("namespaced named", "/api/v1/namespaces/default/pods/foo", namedPod),
141+
arguments(
142+
"namespaced named subresource", "/api/v1/namespaces/default/pods/foo/exec", namedPodExec));
175143
}
176144
}

instrumentation/resources/library/src/test/java/io/opentelemetry/instrumentation/resources/HostIdResourceTest.java

Lines changed: 30 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -11,93 +11,63 @@
1111
import static java.util.Collections.emptyMap;
1212
import static java.util.Collections.singletonList;
1313
import static java.util.Collections.singletonMap;
14-
import static java.util.stream.Collectors.toList;
1514
import static org.assertj.core.api.Assertions.assertThat;
15+
import static org.junit.jupiter.params.provider.Arguments.arguments;
1616

1717
import io.opentelemetry.api.common.AttributeKey;
1818
import io.opentelemetry.sdk.autoconfigure.spi.internal.DefaultConfigProperties;
1919
import io.opentelemetry.sdk.resources.Resource;
2020
import java.nio.file.Path;
21-
import java.util.Collection;
2221
import java.util.Collections;
2322
import java.util.List;
2423
import java.util.function.Function;
2524
import java.util.function.Supplier;
2625
import java.util.stream.Stream;
2726
import org.assertj.core.api.MapAssert;
28-
import org.junit.jupiter.api.DynamicTest;
2927
import org.junit.jupiter.api.Test;
30-
import org.junit.jupiter.api.TestFactory;
28+
import org.junit.jupiter.params.ParameterizedTest;
29+
import org.junit.jupiter.params.provider.Arguments;
30+
import org.junit.jupiter.params.provider.MethodSource;
3131

3232
class HostIdResourceTest {
3333

34-
private static class LinuxTestCase {
35-
private final String name;
36-
private final String expectedValue;
37-
private final Function<Path, List<String>> pathReader;
38-
39-
private LinuxTestCase(
40-
String name, String expectedValue, Function<Path, List<String>> pathReader) {
41-
this.name = name;
42-
this.expectedValue = expectedValue;
43-
this.pathReader = pathReader;
44-
}
45-
}
46-
47-
private static class WindowsTestCase {
48-
private final String name;
49-
private final String expectedValue;
50-
private final Supplier<List<String>> queryWindowsRegistry;
51-
52-
private WindowsTestCase(
53-
String name, String expectedValue, Supplier<List<String>> queryWindowsRegistry) {
54-
this.name = name;
55-
this.expectedValue = expectedValue;
56-
this.queryWindowsRegistry = queryWindowsRegistry;
57-
}
34+
@ParameterizedTest(name = "{0}")
35+
@MethodSource("createResourceLinuxCases")
36+
void createResourceLinux(
37+
String name, String expectedValue, Function<Path, List<String>> pathReader) {
38+
HostIdResource hostIdResource = new HostIdResource(() -> "linux", pathReader, null);
39+
assertHostId(expectedValue, hostIdResource);
5840
}
5941

60-
@TestFactory
61-
Collection<DynamicTest> createResourceLinux() {
42+
private static Stream<Arguments> createResourceLinuxCases() {
6243
return Stream.of(
63-
new LinuxTestCase("default", "test", path -> singletonList("test")),
64-
new LinuxTestCase("empty file or error reading", null, path -> emptyList()))
65-
.map(
66-
testCase ->
67-
DynamicTest.dynamicTest(
68-
testCase.name,
69-
() -> {
70-
HostIdResource hostIdResource =
71-
new HostIdResource(() -> "linux", testCase.pathReader, null);
44+
arguments("default", "test", (Function<Path, List<String>>) path -> singletonList("test")),
45+
arguments(
46+
"empty file or error reading",
47+
null,
48+
(Function<Path, List<String>>) path -> emptyList()));
49+
}
7250

73-
assertHostId(testCase.expectedValue, hostIdResource);
74-
}))
75-
.collect(toList());
51+
@ParameterizedTest(name = "{0}")
52+
@MethodSource("createResourceWindowsCases")
53+
void createResourceWindows(
54+
String name, String expectedValue, Supplier<List<String>> queryWindowsRegistry) {
55+
HostIdResource hostIdResource =
56+
new HostIdResource(() -> "Windows 95", null, queryWindowsRegistry);
57+
assertHostId(expectedValue, hostIdResource);
7658
}
7759

78-
@TestFactory
79-
Collection<DynamicTest> createResourceWindows() {
60+
private static Stream<Arguments> createResourceWindowsCases() {
8061
return Stream.of(
81-
new WindowsTestCase(
82-
"default",
83-
"test",
62+
arguments(
63+
"default",
64+
"test",
65+
(Supplier<List<String>>)
8466
() ->
8567
asList(
8668
"HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Cryptography",
8769
" MachineGuid REG_SZ test")),
88-
new WindowsTestCase("short output", null, Collections::emptyList))
89-
.map(
90-
testCase ->
91-
DynamicTest.dynamicTest(
92-
testCase.name,
93-
() -> {
94-
HostIdResource hostIdResource =
95-
new HostIdResource(
96-
() -> "Windows 95", null, testCase.queryWindowsRegistry);
97-
98-
assertHostId(testCase.expectedValue, hostIdResource);
99-
}))
100-
.collect(toList());
70+
arguments("short output", null, (Supplier<List<String>>) Collections::emptyList));
10171
}
10272

10373
private static void assertHostId(String expectedValue, HostIdResource hostIdResource) {

0 commit comments

Comments
 (0)