diff options
author | Fabian Meumertzheim <meumertzheim@code-intelligence.com> | 2023-03-29 14:23:00 +0200 |
---|---|---|
committer | Fabian Meumertzheim <fabian@meumertzhe.im> | 2023-04-01 12:09:31 +0200 |
commit | 93113857855deb56bba1f344d919619d740370ed (patch) | |
tree | 264537525435947c000df5f5f1d6549bda79ead6 /src/test/java/com | |
parent | 6828ca23e7e955465eb27aebedc5f63d3171f70f (diff) | |
download | jazzer-api-93113857855deb56bba1f344d919619d740370ed.tar.gz |
mutator: Add AnySource annotation
The annotation controls the message types used for Any proto fields in
(recursive) submessages.
This requires passing the annotation through to message field types as
well as extending the mutator cache key to cover the annotation value.
Diffstat (limited to 'src/test/java/com')
5 files changed, 139 insertions, 1 deletions
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 b411d83a..26943353 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 @@ -16,11 +16,13 @@ java_junit5_test( tags = ["cpu:" + str(TEST_PARALLELISM)], deps = [ "//src/main/java/com/code_intelligence/jazzer/mutation/annotation", + "//src/main/java/com/code_intelligence/jazzer/mutation/annotation/proto", "//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:proto2_java_proto", "//src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto:proto3_java_proto", "//src/test/java/com/code_intelligence/jazzer/mutation/support:test_support", + "@com_google_protobuf_protobuf_java//jar", ], ) 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 1039e2c2..fc6dab74 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 @@ -34,11 +34,13 @@ import static org.junit.jupiter.params.provider.Arguments.arguments; import com.code_intelligence.jazzer.mutation.annotation.InRange; import com.code_intelligence.jazzer.mutation.annotation.NotNull; import com.code_intelligence.jazzer.mutation.annotation.WithSize; +import com.code_intelligence.jazzer.mutation.annotation.proto.AnySource; 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.Proto2.TestProtobuf; +import com.code_intelligence.jazzer.protobuf.Proto3.AnyField3; import com.code_intelligence.jazzer.protobuf.Proto3.BytesField3; import com.code_intelligence.jazzer.protobuf.Proto3.DoubleField3; import com.code_intelligence.jazzer.protobuf.Proto3.EnumField3; @@ -48,13 +50,16 @@ import com.code_intelligence.jazzer.protobuf.Proto3.EnumFieldRepeated3.TestEnumR import com.code_intelligence.jazzer.protobuf.Proto3.FloatField3; import com.code_intelligence.jazzer.protobuf.Proto3.IntegralField3; import com.code_intelligence.jazzer.protobuf.Proto3.MapField3; +import com.code_intelligence.jazzer.protobuf.Proto3.MessageField3; import com.code_intelligence.jazzer.protobuf.Proto3.MessageMapField3; import com.code_intelligence.jazzer.protobuf.Proto3.OptionalPrimitiveField3; +import com.code_intelligence.jazzer.protobuf.Proto3.PrimitiveField3; import com.code_intelligence.jazzer.protobuf.Proto3.RepeatedDoubleField3; import com.code_intelligence.jazzer.protobuf.Proto3.RepeatedFloatField3; import com.code_intelligence.jazzer.protobuf.Proto3.RepeatedIntegralField3; import com.code_intelligence.jazzer.protobuf.Proto3.RepeatedRecursiveMessageField3; import com.code_intelligence.jazzer.protobuf.Proto3.StringField3; +import com.google.protobuf.Any; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; @@ -243,7 +248,56 @@ public class StressTest { distinctElementsRatio(0.99), emptyList()), arguments(new TypeHolder<@NotNull TestProtobuf>() {}.annotatedType(), "{Builder.Nullable<Boolean>, Builder.Nullable<Integer>, Builder.Nullable<Integer>, Builder.Nullable<Long>, Builder.Nullable<Long>, Builder.Nullable<Float>, Builder.Nullable<Double>, Builder.Nullable<String>, Builder.Nullable<Enum<Enum>>, Builder.Nullable<{Builder.Nullable<Integer>, Builder via List<Integer>} -> Message>, Builder via List<Boolean>, Builder via List<Integer>, Builder via List<Integer>, Builder via List<Long>, Builder via List<Long>, Builder via List<Float>, Builder via List<Double>, Builder via List<String>, Builder via List<Enum<Enum>>, Builder via List<(cycle) -> Message>, Builder.Map<Integer,Integer>, Builder.Nullable<FixedValue(OnlyLabel)>, Builder.Nullable<{<empty>} -> Message>, Builder.Nullable<Integer> | Builder.Nullable<Long> | Builder.Nullable<Integer>} -> Message", - manyDistinctElements(), manyDistinctElements())); + manyDistinctElements(), manyDistinctElements()), + arguments( + new TypeHolder<@NotNull @AnySource( + {PrimitiveField3.class, MessageField3.class}) AnyField3>() { + }.annotatedType(), + "{Builder.Nullable<Builder.{Builder.Boolean} -> Message | Builder.{Builder.Nullable<(cycle) -> Message>} -> Message -> Message>} -> Message", + exactly(AnyField3.getDefaultInstance(), + AnyField3.newBuilder() + .setSomeField(Any.pack(PrimitiveField3.getDefaultInstance())) + .build(), + AnyField3.newBuilder() + .setSomeField(Any.pack(PrimitiveField3.newBuilder().setSomeField(true).build())) + .build(), + AnyField3.newBuilder() + .setSomeField(Any.pack(MessageField3.getDefaultInstance())) + .build(), + AnyField3.newBuilder() + .setSomeField( + Any.pack(MessageField3.newBuilder() + .setMessageField(PrimitiveField3.getDefaultInstance()) + .build())) + .build(), + AnyField3.newBuilder() + .setSomeField(Any.pack( + MessageField3.newBuilder() + .setMessageField(PrimitiveField3.newBuilder().setSomeField(true)) + .build())) + .build()), + exactly(AnyField3.getDefaultInstance(), + AnyField3.newBuilder() + .setSomeField(Any.pack(PrimitiveField3.getDefaultInstance())) + .build(), + AnyField3.newBuilder() + .setSomeField(Any.pack(PrimitiveField3.newBuilder().setSomeField(true).build())) + .build(), + AnyField3.newBuilder() + .setSomeField(Any.pack(MessageField3.getDefaultInstance())) + .build(), + AnyField3.newBuilder() + .setSomeField( + Any.pack(MessageField3.newBuilder() + .setMessageField(PrimitiveField3.getDefaultInstance()) + .build())) + .build(), + AnyField3.newBuilder() + .setSomeField(Any.pack( + MessageField3.newBuilder() + .setMessageField(PrimitiveField3.newBuilder().setSomeField(true)) + .build())) + .build()))); } @SafeVarargs 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 b360a332..520d0d1b 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 @@ -3,6 +3,9 @@ load("@contrib_rules_jvm//java:defs.bzl", "java_test_suite") proto_library( name = "proto3_proto", srcs = ["proto3.proto"], + deps = [ + "@com_google_protobuf//:any_proto", + ], ) java_proto_library( @@ -36,6 +39,7 @@ java_test_suite( ":proto2_java_proto", ":proto3_java_proto", "//src/main/java/com/code_intelligence/jazzer/mutation/annotation", + "//src/main/java/com/code_intelligence/jazzer/mutation/annotation/proto", "//src/main/java/com/code_intelligence/jazzer/mutation/api", "//src/main/java/com/code_intelligence/jazzer/mutation/mutator/collection", "//src/main/java/com/code_intelligence/jazzer/mutation/mutator/lang", 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 272e936f..608191ee 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 @@ -21,6 +21,7 @@ import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.extensions.proto.ProtoTruth.assertThat; import com.code_intelligence.jazzer.mutation.annotation.NotNull; +import com.code_intelligence.jazzer.mutation.annotation.proto.AnySource; import com.code_intelligence.jazzer.mutation.api.ChainedMutatorFactory; import com.code_intelligence.jazzer.mutation.api.InPlaceMutator; import com.code_intelligence.jazzer.mutation.api.MutatorFactory; @@ -28,6 +29,8 @@ import com.code_intelligence.jazzer.mutation.mutator.collection.CollectionMutato import com.code_intelligence.jazzer.mutation.mutator.lang.LangMutators; import com.code_intelligence.jazzer.mutation.support.TestSupport.MockPseudoRandom; import com.code_intelligence.jazzer.mutation.support.TypeHolder; +import com.code_intelligence.jazzer.protobuf.Proto3.AnyField3; +import com.code_intelligence.jazzer.protobuf.Proto3.AnyField3.Builder; import com.code_intelligence.jazzer.protobuf.Proto3.EmptyMessage3; import com.code_intelligence.jazzer.protobuf.Proto3.EnumField3; import com.code_intelligence.jazzer.protobuf.Proto3.EnumField3.TestEnum; @@ -44,6 +47,7 @@ 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.TestEnumOutside3; +import com.google.protobuf.InvalidProtocolBufferException; import java.util.Arrays; import org.junit.jupiter.api.Test; @@ -502,4 +506,72 @@ class BuilderMutatorProto3Test { } assertThat(builder.build()).isEqualTo(EmptyMessage3.getDefaultInstance()); } + + @Test + void testAnyField3() throws InvalidProtocolBufferException { + InPlaceMutator<AnyField3.Builder> mutator = + (InPlaceMutator<AnyField3.Builder>) FACTORY.createInPlaceOrThrow( + new TypeHolder<@NotNull @AnySource( + {PrimitiveField3.class, MessageField3.class}) Builder>() { + }.annotatedType()); + assertThat(mutator.toString()) + .isEqualTo( + "{Builder.Nullable<Builder.{Builder.Boolean} -> Message | Builder.{Builder.Nullable<(cycle) -> Message>} -> Message -> Message>}"); + AnyField3.Builder builder = AnyField3.newBuilder(); + + try (MockPseudoRandom prng = mockPseudoRandom( + // initialize message field + false, + // PrimitiveField3 + 0, + // boolean field + true)) { + mutator.initInPlace(builder, prng); + } + assertThat(builder.build().getSomeField().unpack(PrimitiveField3.class)) + .isEqualTo(PrimitiveField3.newBuilder().setSomeField(true).build()); + + try (MockPseudoRandom prng = mockPseudoRandom( + // mutate Any field + 0, + // keep non-null message field + false, + // keep Any state, + false, + // mutate boolean field + 0)) { + mutator.mutateInPlace(builder, prng); + } + assertThat(builder.build().getSomeField().unpack(PrimitiveField3.class)) + .isEqualTo(PrimitiveField3.newBuilder().setSomeField(false).build()); + + try (MockPseudoRandom prng = mockPseudoRandom( + // mutate Any field + 0, + // keep non-null message field + false, + // switch Any state + true, + // new Any state + 1, + // non-null message + false, + // boolean field, + true)) { + mutator.mutateInPlace(builder, prng); + } + assertThat(builder.build().getSomeField().unpack(MessageField3.class)) + .isEqualTo(MessageField3.newBuilder() + .setMessageField(PrimitiveField3.newBuilder().setSomeField(true)) + .build()); + } + + @Test + void testAnyField3WithoutAnySourceDoesNotCrash() throws InvalidProtocolBufferException { + InPlaceMutator<AnyField3.Builder> mutator = + (InPlaceMutator<AnyField3.Builder>) FACTORY.createInPlaceOrThrow( + new TypeHolder<@NotNull Builder>() {}.annotatedType()); + assertThat(mutator.toString()) + .isEqualTo("{Builder.Nullable<{Builder.String, Builder.byte[] -> ByteString} -> Message>}"); + } } diff --git a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/proto3.proto b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/proto3.proto index 32451a7d..93ab1947 100644 --- a/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/proto3.proto +++ b/src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/proto3.proto @@ -14,6 +14,8 @@ syntax = "proto3"; +import "google/protobuf/any.proto"; + option java_package = "com.code_intelligence.jazzer.protobuf"; message PrimitiveField3 { @@ -130,3 +132,7 @@ message RepeatedDoubleField3 { } message EmptyMessage3 {} + +message AnyField3 { + google.protobuf.Any some_field = 1; +} |