Add test to check that mutator is actually change messages.
diff --git a/src/protobuf_mutator.proto b/src/protobuf_mutator.proto
index d0f81e2..6be6f95 100644
--- a/src/protobuf_mutator.proto
+++ b/src/protobuf_mutator.proto
@@ -93,7 +93,9 @@
Msg oneof_msg = 68;
}
- map<string, uint64> map = 69;
+ // TODO(vitalybuka): Tests maps.
+ // map<string, uint64> map = 69;
+ // map<int32, bytes> map2 = 71;
required group Group = 70 {
required bool required_bool = 1;
diff --git a/src/protobuf_mutator_test.cc b/src/protobuf_mutator_test.cc
index d23dcdc..e227723 100644
--- a/src/protobuf_mutator_test.cc
+++ b/src/protobuf_mutator_test.cc
@@ -475,14 +475,28 @@
EXPECT_EQ(1 << 6, sets.size());
}
-TYPED_TEST(ProtobufMutatorTypedTest, SmallBenchmark) {
+TYPED_TEST(ProtobufMutatorTypedTest, FailedMutations) {
TestProtobufMutator mutator(false);
- for (int i = 0; i < 100000; ++i) {
- typename TestFixture::Message message;
+ size_t crossovers = 0;
+ for (int i = 0; i < 10000; ++i) {
+ typename TestFixture::Message messages[2];
+ typename TestFixture::Message tmp;
for (int j = 0; j < 20; ++j) {
- mutator.Mutate(&message, 1000);
+ for (auto& m : messages) {
+ tmp.CopyFrom(m);
+ mutator.Mutate(&m, 1000);
+ // Mutate must not produce the same result.
+ EXPECT_FALSE(MessageDifferencer::Equals(m, tmp));
+ }
}
+
+ tmp.CopyFrom(messages[1]);
+ mutator.CrossOver(messages[0], &tmp);
+ if (MessageDifferencer::Equals(tmp, messages[1])) ++crossovers;
}
+
+ // CrossOver may fail but very rare.
+ EXPECT_LT(crossovers, 100);
}
TYPED_TEST(ProtobufMutatorTypedTest, Size) {