Skip to content

Commit 48268d7

Browse files
committed
pr review
1 parent afefdf7 commit 48268d7

File tree

1 file changed

+56
-62
lines changed

1 file changed

+56
-62
lines changed

muzzle/src/test/java/io/opentelemetry/javaagent/tooling/muzzle/ReferenceMatcherTest.java

Lines changed: 56 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@
3535
import java.util.Map;
3636
import java.util.Set;
3737
import java.util.concurrent.TimeoutException;
38+
import java.util.stream.Stream;
3839
import muzzle.TestClasses;
3940
import muzzle.TestClasses.Nested;
4041
import org.junit.jupiter.api.BeforeAll;
4142
import org.junit.jupiter.api.Test;
4243
import org.junit.jupiter.params.ParameterizedTest;
43-
import org.junit.jupiter.params.provider.CsvSource;
44+
import org.junit.jupiter.params.provider.Arguments;
45+
import org.junit.jupiter.params.provider.MethodSource;
4446
import org.junit.jupiter.params.provider.ValueSource;
4547
import org.objectweb.asm.Type;
4648

@@ -131,46 +133,49 @@ void muzzleTypePoolCaches() throws Exception {
131133
assertThat(cl.count).isEqualTo(countAfterFirstMatch);
132134
}
133135

136+
private static Stream<Arguments> matchingRefProvider() {
137+
return Stream.of(
138+
Arguments.of(Nested.B.class, NON_INTERFACE, null),
139+
Arguments.of(Nested.B.class, INTERFACE, Mismatch.MissingFlag.class));
140+
}
141+
134142
@ParameterizedTest
135-
@CsvSource({
136-
"muzzle.TestClasses$Nested$B, NON_INTERFACE, ''",
137-
"muzzle.TestClasses$Nested$B, INTERFACE, MissingFlag"
138-
})
139-
void matchingRef(String referenceName, String referenceFlag, String expectedMismatch) {
140-
Flag flag = "NON_INTERFACE".equals(referenceFlag) ? NON_INTERFACE : INTERFACE;
141-
ClassRef ref = ClassRef.builder(referenceName).addFlag(flag).build();
143+
@MethodSource("matchingRefProvider")
144+
void matchingRef(Class<?> referenceClass, Flag referenceFlag, Class<? extends Mismatch> expectedMismatch) {
145+
ClassRef ref = ClassRef.builder(referenceClass.getName()).addFlag(referenceFlag).build();
142146

143147
List<Mismatch> mismatches =
144148
createMatcher(Collections.singletonMap(ref.getClassName(), ref))
145149
.getMismatchedReferenceSources(this.getClass().getClassLoader());
146150

147-
if (expectedMismatch.isEmpty()) {
151+
if (expectedMismatch == null) {
148152
assertThat(getMismatchClassSet(mismatches)).isEmpty();
149153
} else {
150-
assertThat(getMismatchClassSet(mismatches)).containsExactly(Mismatch.MissingFlag.class);
154+
assertThat(getMismatchClassSet(mismatches)).containsExactly(expectedMismatch);
151155
}
152156
}
153157

158+
private static Stream<Arguments> methodMatchProvider() {
159+
return Stream.of(
160+
Arguments.of("method", "(Ljava/lang/String;)Ljava/lang/String;", "", Nested.B.class, null),
161+
Arguments.of("hashCode", "()I", "", Nested.B.class, null),
162+
Arguments.of("someMethod", "()V", "", Nested.SomeInterface.class, null),
163+
Arguments.of("privateStuff", "()V", "PRIVATE_OR_HIGHER", Nested.B.class, null),
164+
Arguments.of("privateStuff", "()V", "PROTECTED_OR_HIGHER", Nested.B2.class, Mismatch.MissingFlag.class),
165+
Arguments.of("staticMethod", "()V", "NON_STATIC", Nested.B.class, Mismatch.MissingFlag.class),
166+
Arguments.of("missingMethod", "()V", "", Nested.B.class, Mismatch.MissingMethod.class));
167+
}
168+
154169
@ParameterizedTest
155-
@CsvSource({
156-
"method, (Ljava/lang/String;)Ljava/lang/String;, '', muzzle.TestClasses$Nested$B, ''",
157-
"hashCode, ()I, '', muzzle.TestClasses$Nested$B, ''",
158-
"someMethod, ()V, '', muzzle.TestClasses$Nested$SomeInterface, ''",
159-
"privateStuff, ()V, PRIVATE_OR_HIGHER, muzzle.TestClasses$Nested$B, ''",
160-
"privateStuff, ()V, PROTECTED_OR_HIGHER, muzzle.TestClasses$Nested$B2, MissingFlag",
161-
"staticMethod, ()V, NON_STATIC, muzzle.TestClasses$Nested$B, MissingFlag",
162-
"missingMethod, ()V, '', muzzle.TestClasses$Nested$B, MissingMethod"
163-
})
170+
@MethodSource("methodMatchProvider")
164171
void methodMatch(
165172
String methodName,
166173
String methodDesc,
167174
String methodFlagsStr,
168-
String classToCheckName,
169-
String expectedMismatch)
170-
throws ClassNotFoundException {
175+
Class<?> classToCheck,
176+
Class<? extends Mismatch> expectedMismatch) {
171177
Type methodType = Type.getMethodType(methodDesc);
172178
List<Flag> methodFlags = parseMethodFlags(methodFlagsStr);
173-
Class<?> classToCheck = Class.forName(classToCheckName);
174179

175180
ClassRef reference =
176181
ClassRef.builder(classToCheck.getName())
@@ -186,34 +191,34 @@ void methodMatch(
186191
createMatcher(Collections.singletonMap(reference.getClassName(), reference))
187192
.getMismatchedReferenceSources(this.getClass().getClassLoader());
188193

189-
if (expectedMismatch.isEmpty()) {
194+
if (expectedMismatch == null) {
190195
assertThat(getMismatchClassSet(mismatches)).isEmpty();
191196
} else {
192-
Class<? extends Mismatch> expectedMismatchClass = getMismatchClass(expectedMismatch);
193-
assertThat(getMismatchClassSet(mismatches)).containsExactly(expectedMismatchClass);
197+
assertThat(getMismatchClassSet(mismatches)).containsExactly(expectedMismatch);
194198
}
195199
}
196200

201+
private static Stream<Arguments> fieldMatchProvider() {
202+
return Stream.of(
203+
Arguments.of("missingField", "Ljava/lang/String;", "", Nested.A.class, Mismatch.MissingField.class),
204+
Arguments.of("privateField", "Ljava/lang/String;", "", Nested.A.class, Mismatch.MissingField.class),
205+
Arguments.of("privateField", "Ljava/lang/Object;", "PRIVATE_OR_HIGHER", Nested.A.class, null),
206+
Arguments.of("privateField", "Ljava/lang/Object;", "PROTECTED_OR_HIGHER", Nested.A2.class, Mismatch.MissingFlag.class),
207+
Arguments.of("protectedField", "Ljava/lang/Object;", "STATIC", Nested.A.class, Mismatch.MissingFlag.class),
208+
Arguments.of("staticB", "Lmuzzle/TestClasses$Nested$B;", "STATIC|PROTECTED_OR_HIGHER", Nested.A.class, null),
209+
Arguments.of("number", "I", "PACKAGE_OR_HIGHER", Nested.Primitives.class, null),
210+
Arguments.of("flag", "Z", "PACKAGE_OR_HIGHER", Nested.Primitives.class, null));
211+
}
212+
197213
@ParameterizedTest
198-
@CsvSource({
199-
"missingField, Ljava/lang/String;, '', muzzle.TestClasses$Nested$A, MissingField",
200-
"privateField, Ljava/lang/String;, '', muzzle.TestClasses$Nested$A, MissingField",
201-
"privateField, Ljava/lang/Object;, PRIVATE_OR_HIGHER, muzzle.TestClasses$Nested$A, ''",
202-
"privateField, Ljava/lang/Object;, PROTECTED_OR_HIGHER, muzzle.TestClasses$Nested$A2, MissingFlag",
203-
"protectedField, Ljava/lang/Object;, STATIC, muzzle.TestClasses$Nested$A, MissingFlag",
204-
"staticB, Lmuzzle/TestClasses$Nested$B;, STATIC|PROTECTED_OR_HIGHER, muzzle.TestClasses$Nested$A, ''",
205-
"number, I, PACKAGE_OR_HIGHER, muzzle.TestClasses$Nested$Primitives, ''",
206-
"flag, Z, PACKAGE_OR_HIGHER, muzzle.TestClasses$Nested$Primitives, ''"
207-
})
214+
@MethodSource("fieldMatchProvider")
208215
void fieldMatch(
209216
String fieldName,
210217
String fieldType,
211218
String fieldFlagsStr,
212-
String classToCheckName,
213-
String expectedMismatch)
214-
throws ClassNotFoundException {
219+
Class<?> classToCheck,
220+
Class<? extends Mismatch> expectedMismatch) {
215221
List<Flag> fieldFlags = parseFieldFlags(fieldFlagsStr);
216-
Class<?> classToCheck = Class.forName(classToCheckName);
217222

218223
ClassRef reference =
219224
ClassRef.builder(classToCheck.getName())
@@ -229,11 +234,10 @@ void fieldMatch(
229234
createMatcher(Collections.singletonMap(reference.getClassName(), reference))
230235
.getMismatchedReferenceSources(this.getClass().getClassLoader());
231236

232-
if (expectedMismatch.isEmpty()) {
237+
if (expectedMismatch == null) {
233238
assertThat(getMismatchClassSet(mismatches)).isEmpty();
234239
} else {
235-
Class<? extends Mismatch> expectedMismatchClass = getMismatchClass(expectedMismatch);
236-
assertThat(getMismatchClassSet(mismatches)).containsExactly(expectedMismatchClass);
240+
assertThat(getMismatchClassSet(mismatches)).containsExactly(expectedMismatch);
237241
}
238242
}
239243

@@ -392,13 +396,16 @@ void shouldCheckHelperClassWhetherUsedFieldsAreDeclaredInTheSuperClass(String cl
392396
assertThat(mismatches).isEmpty();
393397
}
394398

399+
private static Stream<Arguments> shouldFailHelperClassWhenItUsesFieldsUndeclaredInTheSuperClassProvider() {
400+
return Stream.of(
401+
Arguments.of("io.opentelemetry.instrumentation.Helper", "differentField", "Ljava/lang/Integer;"),
402+
Arguments.of("io.opentelemetry.instrumentation.Helper", "field", "Lcom/external/DifferentType;"),
403+
Arguments.of("com.external.otel.instrumentation.Helper", "differentField", "Ljava/lang/Integer;"),
404+
Arguments.of("com.external.otel.instrumentation.Helper", "field", "Lcom/external/DifferentType;"));
405+
}
406+
395407
@ParameterizedTest
396-
@CsvSource({
397-
"io.opentelemetry.instrumentation.Helper, differentField, Ljava/lang/Integer;",
398-
"io.opentelemetry.instrumentation.Helper, field, Lcom/external/DifferentType;",
399-
"com.external.otel.instrumentation.Helper, differentField, Ljava/lang/Integer;",
400-
"com.external.otel.instrumentation.Helper, field, Lcom/external/DifferentType;"
401-
})
408+
@MethodSource("shouldFailHelperClassWhenItUsesFieldsUndeclaredInTheSuperClassProvider")
402409
void shouldFailHelperClassWhenItUsesFieldsUndeclaredInTheSuperClass(
403410
String className, String fieldName, String fieldType) {
404411
ClassRef helper =
@@ -504,17 +511,4 @@ private static List<Flag> parseFieldFlags(String flagsStr) {
504511
}
505512
return flags;
506513
}
507-
508-
private static Class<? extends Mismatch> getMismatchClass(String mismatchName) {
509-
switch (mismatchName) {
510-
case "MissingFlag":
511-
return Mismatch.MissingFlag.class;
512-
case "MissingMethod":
513-
return Mismatch.MissingMethod.class;
514-
case "MissingField":
515-
return Mismatch.MissingField.class;
516-
default:
517-
throw new IllegalArgumentException("Unknown mismatch: " + mismatchName);
518-
}
519-
}
520514
}

0 commit comments

Comments
 (0)