aboutsummaryrefslogtreecommitdiff
path: root/src/test/java/com
diff options
context:
space:
mode:
authorFabian Meumertzheim <meumertzheim@code-intelligence.com>2023-03-29 14:23:00 +0200
committerFabian Meumertzheim <fabian@meumertzhe.im>2023-04-01 12:09:31 +0200
commit93113857855deb56bba1f344d919619d740370ed (patch)
tree264537525435947c000df5f5f1d6549bda79ead6 /src/test/java/com
parent6828ca23e7e955465eb27aebedc5f63d3171f70f (diff)
downloadjazzer-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')
-rw-r--r--src/test/java/com/code_intelligence/jazzer/mutation/mutator/BUILD.bazel2
-rw-r--r--src/test/java/com/code_intelligence/jazzer/mutation/mutator/StressTest.java56
-rw-r--r--src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BUILD.bazel4
-rw-r--r--src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/BuilderMutatorProto3Test.java72
-rw-r--r--src/test/java/com/code_intelligence/jazzer/mutation/mutator/proto/proto3.proto6
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;
+}