From 7e3dfa62b8a77bad494b7876f4da182fa0ea3a8b Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Mon, 13 Feb 2023 16:55:20 +0100 Subject: mutation: Add proto3 tests to StressTest When messages become too complex to exercise fully in unit tests, we should be adding them to `StressTest` instead. --- .../jazzer/mutation/mutator/BUILD.bazel | 1 + .../jazzer/mutation/mutator/StressTest.java | 33 ++++++++++++++++++++-- .../jazzer/mutation/mutator/proto/BUILD.bazel | 2 ++ .../mutator/proto/BuilderMutatorProto3Test.java | 12 -------- 4 files changed, 33 insertions(+), 15 deletions(-) (limited to 'src/test/java/com/code_intelligence/jazzer/mutation') diff --git a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/BUILD.bazel b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/BUILD.bazel index bf8a690c..5553c653 100644 --- a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/BUILD.bazel +++ b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/BUILD.bazel @@ -10,6 +10,7 @@ java_test_suite( "//src/main/java/com/code_intelligence/jazzer/mutation/api", "//src/main/java/com/code_intelligence/jazzer/mutation/mutator", "//src/main/java/com/code_intelligence/jazzer/mutation/support", + "//src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto:proto3_java_proto", "//src/test/java/com/code_intelligence/jazzer/mutation/support:test_support", ], ) diff --git a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/StressTest.java b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/StressTest.java index 0f672570..4de5c54f 100644 --- a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/StressTest.java +++ b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/StressTest.java @@ -36,13 +36,13 @@ import com.code_intelligence.jazzer.mutation.api.PseudoRandom; import com.code_intelligence.jazzer.mutation.api.Serializer; import com.code_intelligence.jazzer.mutation.api.SerializingMutator; import com.code_intelligence.jazzer.mutation.support.TypeHolder; +import com.code_intelligence.jazzer.protobuf.Proto3.OptionalPrimitiveField3; +import com.code_intelligence.jazzer.protobuf.Proto3.RepeatedRecursiveMessageField3; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; -import java.io.PipedInputStream; -import java.io.PipedOutputStream; import java.lang.reflect.AnnotatedType; import java.util.ArrayList; import java.util.HashSet; @@ -122,6 +122,29 @@ public class StressTest { exactly(rangeClosed(Integer.MIN_VALUE, Integer.MIN_VALUE + 5).boxed().toArray()))); } + public static Stream protoStressTestCases() { + return Stream.of( + arguments(new TypeHolder<@NotNull OptionalPrimitiveField3>() {}.annotatedType(), + "{Builder.Nullable} -> Message", + exactly(OptionalPrimitiveField3.newBuilder().build(), + OptionalPrimitiveField3.newBuilder().setSomeField(false).build(), + OptionalPrimitiveField3.newBuilder().setSomeField(true).build()), + exactly(OptionalPrimitiveField3.newBuilder().build(), + OptionalPrimitiveField3.newBuilder().setSomeField(false).build(), + OptionalPrimitiveField3.newBuilder().setSomeField(true).build())), + arguments(new TypeHolder<@NotNull RepeatedRecursiveMessageField3>() {}.annotatedType(), + "{Builder.Boolean, Builder via List<(cycle)>} -> Message", + contains(RepeatedRecursiveMessageField3.getDefaultInstance(), + RepeatedRecursiveMessageField3.newBuilder().setSomeField(true).build(), + RepeatedRecursiveMessageField3.newBuilder() + .addMessageField(RepeatedRecursiveMessageField3.getDefaultInstance()) + .build(), + RepeatedRecursiveMessageField3.newBuilder() + .addMessageField(RepeatedRecursiveMessageField3.newBuilder().setSomeField(true)) + .build()), + manyDistinctElements())); + } + @SafeVarargs private static Consumer> all(Consumer>... checks) { return list -> { @@ -131,6 +154,10 @@ public class StressTest { }; } + private static Consumer> distinctElements(int num) { + return list -> assertThat(new HashSet<>(list).size()).isAtLeast(num); + } + private static Consumer> manyDistinctElements() { return distinctElementsRatio(MANY_DISTINCT_ELEMENTS_RATIO); } @@ -187,7 +214,7 @@ public class StressTest { } @ParameterizedTest(name = "{0}") - @MethodSource("stressTestCases") + @MethodSource({"stressTestCases", "protoStressTestCases"}) void genericMutatorStressTest(AnnotatedType type, String mutatorTree, Consumer> expectedInitValues, Consumer> expectedMutatedValues) throws IOException { diff --git a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BUILD.bazel b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BUILD.bazel index 0814ddfc..8a5ebd36 100644 --- a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BUILD.bazel +++ b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BUILD.bazel @@ -7,6 +7,8 @@ proto_library( java_proto_library( name = "proto3_java_proto", + testonly = True, + visibility = ["//src/test/java/com/code_intelligence/jazzer/mutation/mutator:__pkg__"], deps = [":proto3_proto"], ) diff --git a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BuilderMutatorProto3Test.java b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BuilderMutatorProto3Test.java index f615e4e2..02587259 100644 --- a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BuilderMutatorProto3Test.java +++ b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BuilderMutatorProto3Test.java @@ -19,7 +19,6 @@ package com.code_intelligence.jazzer.mutation.mutator.proto; import static com.code_intelligence.jazzer.mutation.support.TestSupport.mockPseudoRandom; import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat; -import static org.junit.jupiter.api.Assertions.fail; import com.code_intelligence.jazzer.mutation.annotation.NotNull; import com.code_intelligence.jazzer.mutation.api.ChainedMutatorFactory; @@ -36,9 +35,6 @@ import com.code_intelligence.jazzer.protobuf.Proto3.PrimitiveField3; import com.code_intelligence.jazzer.protobuf.Proto3.RecursiveMessageField3; import com.code_intelligence.jazzer.protobuf.Proto3.RepeatedMessageField3; import com.code_intelligence.jazzer.protobuf.Proto3.RepeatedPrimitiveField3; -import com.code_intelligence.jazzer.protobuf.Proto3.RepeatedRecursiveMessageField3; -import com.google.protobuf.Any; -import com.google.protobuf.Descriptors.OneofDescriptor; import org.junit.jupiter.api.Test; class BuilderMutatorProto3Test { @@ -294,14 +290,6 @@ class BuilderMutatorProto3Test { assertThat(builder.getMessageField().hasMessageField()).isTrue(); } - @Test - void testRepeatedRecursiveMessageField() { - InPlaceMutator mutator = - (InPlaceMutator) FACTORY.createInPlaceOrThrow( - new TypeHolder() {}.annotatedType()); - assertThat(mutator.toString()).isEqualTo("{Builder.Boolean, Builder via List<(cycle)>}"); - } - @Test void testOneOfField3() { InPlaceMutator mutator = -- cgit v1.2.3