Skip to content

Commit ed256f0

Browse files
committed
fix: support lists of arbitrary types
Previously, types like List<List<Integer>[]> failed because the parameterTypeIfParameterized helper function incorrectly filtered out generic array types. Removed this filtering since the mutation framework already handles supported type matching.
1 parent b2bbec1 commit ed256f0

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

selffuzz/src/test/java/com/code_intelligence/selffuzz/mutation/ArgumentsMutatorFuzzTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,13 +16,15 @@
1616

1717
package com.code_intelligence.selffuzz.mutation;
1818

19+
import static com.code_intelligence.selffuzz.jazzer.mutation.utils.PropertyConstraint.RECURSIVE;
1920
import static com.google.common.truth.Truth.assertThat;
2021

2122
import com.code_intelligence.jazzer.api.FuzzedDataProvider;
2223
import com.code_intelligence.jazzer.junit.FuzzTest;
2324
import com.code_intelligence.jazzer.protobuf.Proto2;
2425
import com.code_intelligence.jazzer.protobuf.Proto3;
2526
import com.code_intelligence.selffuzz.jazzer.mutation.ArgumentsMutator;
27+
import com.code_intelligence.selffuzz.jazzer.mutation.annotation.InRange;
2628
import com.code_intelligence.selffuzz.jazzer.mutation.annotation.NotNull;
2729
import com.code_intelligence.selffuzz.jazzer.mutation.annotation.WithLength;
2830
import com.code_intelligence.selffuzz.jazzer.mutation.annotation.WithSize;
@@ -291,6 +293,25 @@ void fuzzStrings(
291293
assertThat(arrayOfArraysOfListOfIntegers.length).isAtMost(2);
292294
}
293295

296+
@SelfFuzzTest
297+
public static void fuzzListOfGenericArrays(
298+
@NotNull(constraint = RECURSIVE)
299+
@WithSize(min = 1, max = 1, constraint = RECURSIVE)
300+
@WithLength(min = 1, max = 1, constraint = RECURSIVE)
301+
@InRange(min = 2, max = 3, constraint = RECURSIVE)
302+
List<List<Integer>[]> lofGenericArrays) {
303+
// Make sure all annotations are respected.
304+
assertThat(lofGenericArrays.size()).isEqualTo(1);
305+
for (List<Integer>[] array : lofGenericArrays) {
306+
assertThat(array.length).isEqualTo(1);
307+
for (List<Integer> list : array) {
308+
assertThat(list.size()).isEqualTo(1);
309+
assertThat(list.get(0)).isAtLeast(2);
310+
assertThat(list.get(0)).isAtMost(3);
311+
}
312+
}
313+
}
314+
294315
/**
295316
* @return all methods in this class annotated by @SelfFuzzTest. If any of those methods are
296317
* annotated by @Solo, only those are returned.

src/main/java/com/code_intelligence/jazzer/mutation/support/TypeSupport.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -488,13 +488,7 @@ public static Optional<AnnotatedType> parameterTypeIfParameterized(
488488
if (typeArguments.size() != 1) {
489489
return Optional.empty();
490490
} else {
491-
AnnotatedType elementType = typeArguments.get(0);
492-
if (!(elementType.getType() instanceof ParameterizedType)
493-
&& !(elementType.getType() instanceof Class)) {
494-
return Optional.empty();
495-
} else {
496-
return Optional.of(elementType);
497-
}
491+
return Optional.of(typeArguments.get(0));
498492
}
499493
});
500494
}

src/test/java/com/code_intelligence/jazzer/mutation/support/TypeSupportTest.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,13 @@
4747
import java.lang.annotation.Target;
4848
import java.lang.reflect.AnnotatedParameterizedType;
4949
import java.lang.reflect.AnnotatedType;
50+
import java.lang.reflect.GenericArrayType;
5051
import java.lang.reflect.ParameterizedType;
5152
import java.util.LinkedHashMap;
5253
import java.util.List;
5354
import java.util.Map;
5455
import java.util.Objects;
56+
import java.util.Optional;
5557
import java.util.function.BiPredicate;
5658
import java.util.function.Function;
5759
import java.util.stream.Stream;
@@ -554,4 +556,17 @@ void testForwardAnnotations_withExcludes(
554556
AnnotatedType src, AnnotatedType target, Annotation[] excludes, AnnotatedType expected) {
555557
assertThat(forwardAnnotations(src, target, excludes)).isEqualTo(expected);
556558
}
559+
560+
@Test
561+
void testParameterTypeIfParameterizedList() {
562+
AnnotatedType type = new TypeHolder<List<List<Integer>[]>>() {}.annotatedType();
563+
Optional<AnnotatedType> parameterType =
564+
TypeSupport.parameterTypeIfParameterized(type, List.class);
565+
if (!parameterType.isPresent()
566+
|| !(parameterType.get().getType() instanceof GenericArrayType)) {
567+
throw new AssertionError("Expected to find a GenericArrayType as parameter type.");
568+
}
569+
AnnotatedType expectedParameterType = new TypeHolder<List<Integer>[]>() {}.annotatedType();
570+
assertThat(annotatedTypeEquals(parameterType.get(), expectedParameterType)).isTrue();
571+
}
557572
}

0 commit comments

Comments
 (0)