aboutsummaryrefslogtreecommitdiff
path: root/src/mutator_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/mutator_test.cc')
-rw-r--r--src/mutator_test.cc197
1 files changed, 60 insertions, 137 deletions
diff --git a/src/mutator_test.cc b/src/mutator_test.cc
index 0ae37aa..34766c6 100644
--- a/src/mutator_test.cc
+++ b/src/mutator_test.cc
@@ -216,11 +216,7 @@ const char kRepeatedNestedFields[] = R"(
class TestMutator : public Mutator {
public:
- explicit TestMutator(bool keep_initialized,
- size_t random_to_default_ratio = 0) {
- Seed(17);
- if (random_to_default_ratio)
- random_to_default_ratio_ = random_to_default_ratio;
+ explicit TestMutator(bool keep_initialized) : Mutator(&random_), random_(17) {
keep_initialized_ = keep_initialized;
}
@@ -236,7 +232,7 @@ class TestMutator : public Mutator {
class ReducedTestMutator : public TestMutator {
public:
- ReducedTestMutator() : TestMutator(false, 4) {
+ ReducedTestMutator() : TestMutator(false) {
for (float i = 1000; i > 0.1; i /= 7) {
values_.push_back(i);
values_.push_back(-i);
@@ -259,13 +255,13 @@ class ReducedTestMutator : public TestMutator {
double MutateDouble(double value) override { return GetRandomValue(); }
std::string MutateString(const std::string& value,
size_t size_increase_hint) override {
- return strings_[std::uniform_int_distribution<>(
+ return strings_[std::uniform_int_distribution<uint8_t>(
0, strings_.size() - 1)(*random())];
}
private:
float GetRandomValue() {
- return values_[std::uniform_int_distribution<>(
+ return values_[std::uniform_int_distribution<uint8_t>(
0, values_.size() - 1)(*random())];
}
@@ -316,7 +312,6 @@ bool Mutate(const protobuf::Message& from, const protobuf::Message& to) {
EXPECT_FALSE(MessageDifferencer::Equals(from, to));
ReducedTestMutator mutator;
std::unique_ptr<protobuf::Message> message(from.New());
- EXPECT_FALSE(MessageDifferencer::Equals(from, to));
for (int j = 0; j < 1000000; ++j) {
message->CopyFrom(from);
mutator.Mutate(message.get(), 1000);
@@ -342,16 +337,16 @@ class MutatorTest : public TestWithParam<TestParams> {
EXPECT_TRUE(ParseTextMessage(text_, message));
}
- void LoadWithoutLine(protobuf::Message* message) {
+ bool LoadWithoutLine(protobuf::Message* message) {
std::ostringstream oss;
auto lines = Split(text_);
for (size_t i = 0; i != lines.size(); ++i) {
if (i != line_) oss << lines[i] << '\n';
}
- EXPECT_TRUE(ParseTextMessage(oss.str(), message));
+ return ParseTextMessage(oss.str(), message);
}
- void LoadWithChangedLine(protobuf::Message* message, int value) {
+ bool LoadWithChangedLine(protobuf::Message* message, int value) {
auto lines = Split(text_);
std::ostringstream oss;
for (size_t i = 0; i != lines.size(); ++i) {
@@ -373,7 +368,7 @@ class MutatorTest : public TestWithParam<TestParams> {
oss << s << '\n';
}
}
- EXPECT_TRUE(ParseTextMessage(oss.str(), message));
+ return ParseTextMessage(oss.str(), message);
}
std::string text_;
@@ -386,11 +381,11 @@ class MutatorTest : public TestWithParam<TestParams> {
// insertion/deletion.
class MutatorFieldInsDelTest : public MutatorTest {};
-INSTANTIATE_TEST_SUITE_P(Proto2, MutatorFieldInsDelTest,
- ValuesIn(GetFieldTestParams<Msg>(
- {kRequiredFields, kOptionalFields, kRepeatedFields,
- kRequiredNestedFields, kOptionalNestedFields,
- kRepeatedNestedFields})));
+INSTANTIATE_TEST_CASE_P(Proto2, MutatorFieldInsDelTest,
+ ValuesIn(GetFieldTestParams<Msg>(
+ {kRequiredFields, kOptionalFields, kRepeatedFields,
+ kRequiredNestedFields, kOptionalNestedFields,
+ kRepeatedNestedFields})));
TEST_P(MutatorFieldInsDelTest, DeleteField) {
LoadMessage(m1_.get());
@@ -409,15 +404,15 @@ class MutatorFieldTest : public MutatorTest {
template <class Msg>
void TestCopyField();
};
-INSTANTIATE_TEST_SUITE_P(Proto2, MutatorFieldTest,
- ValuesIn(GetFieldTestParams<Msg>(
- {kRequiredFields, kOptionalFields, kRepeatedFields,
- kRequiredNestedFields, kOptionalNestedFields,
- kRepeatedNestedFields})));
-INSTANTIATE_TEST_SUITE_P(Proto3, MutatorFieldTest,
- ValuesIn(GetFieldTestParams<Msg3>(
- {kOptionalFields, kRepeatedFields,
- kOptionalNestedFields, kRepeatedNestedFields})));
+INSTANTIATE_TEST_CASE_P(Proto2, MutatorFieldTest,
+ ValuesIn(GetFieldTestParams<Msg>(
+ {kRequiredFields, kOptionalFields, kRepeatedFields,
+ kRequiredNestedFields, kOptionalNestedFields,
+ kRepeatedNestedFields})));
+INSTANTIATE_TEST_CASE_P(Proto3, MutatorFieldTest,
+ ValuesIn(GetFieldTestParams<Msg3>(
+ {kOptionalFields, kRepeatedFields,
+ kOptionalNestedFields, kRepeatedNestedFields})));
TEST_P(MutatorFieldTest, Initialized) {
LoadWithoutLine(m1_.get());
@@ -461,18 +456,15 @@ TEST_P(MutatorFieldTest, CopyField) {
}
class MutatorSingleFieldTest : public MutatorTest {};
-INSTANTIATE_TEST_SUITE_P(Proto2, MutatorSingleFieldTest,
- ValuesIn(GetFieldTestParams<Msg>({
- kRequiredFields,
- kOptionalFields,
- kRequiredNestedFields,
- kOptionalNestedFields,
- })));
-INSTANTIATE_TEST_SUITE_P(Proto3, MutatorSingleFieldTest,
- ValuesIn(GetFieldTestParams<Msg3>({
- kOptionalFields,
- kOptionalNestedFields,
- })));
+INSTANTIATE_TEST_CASE_P(Proto2, MutatorSingleFieldTest,
+ ValuesIn(GetFieldTestParams<Msg>({
+ kRequiredFields, kOptionalFields,
+ kRequiredNestedFields, kOptionalNestedFields,
+ })));
+INSTANTIATE_TEST_CASE_P(Proto3, MutatorSingleFieldTest,
+ ValuesIn(GetFieldTestParams<Msg3>({
+ kOptionalFields, kOptionalNestedFields,
+ })));
TEST_P(MutatorSingleFieldTest, CrossOver) {
LoadWithoutLine(m1_.get());
@@ -505,7 +497,7 @@ class MutatorTypedTest : public ::testing::Test {
};
using MutatorTypedTestTypes = testing::Types<Msg, Msg3>;
-TYPED_TEST_SUITE(MutatorTypedTest, MutatorTypedTestTypes);
+TYPED_TEST_CASE(MutatorTypedTest, MutatorTypedTestTypes);
TYPED_TEST(MutatorTypedTest, CrossOverRepeated) {
typename TestFixture::Message m1;
@@ -562,7 +554,7 @@ TYPED_TEST(MutatorTypedTest, CrossOverRepeatedMessages) {
TYPED_TEST(MutatorTypedTest, FailedMutations) {
TestMutator mutator(false);
size_t crossovers = 0;
- for (int i = 0; i < 1000; ++i) {
+ for (int i = 0; i < 10000; ++i) {
typename TestFixture::Message messages[2];
typename TestFixture::Message tmp;
for (int j = 0; j < 20; ++j) {
@@ -582,40 +574,7 @@ TYPED_TEST(MutatorTypedTest, FailedMutations) {
}
// CrossOver may fail but very rare.
- EXPECT_LT(crossovers, 10u);
-}
-
-TYPED_TEST(MutatorTypedTest, RegisterPostProcessor) {
- constexpr char kInitialString[] = " ";
- constexpr char kIndicatorString[] = "0123456789abcdef";
- bool custom_mutation = false;
- bool regular_mutation = false;
-
- TestMutator mutator(false);
- mutator.RegisterPostProcessor(
- [kIndicatorString](protobuf::Message* message, uint32_t seed) {
- typename TestFixture::Message* test_message =
- static_cast<typename TestFixture::Message*>(message);
- if (seed % 2) test_message->set_optional_string(kIndicatorString);
- });
-
- for (int j = 0; j < 100000; ++j) {
- // Include this field to increase the probability of mutation.
- typename TestFixture::Message message;
- message.set_optional_string(kInitialString);
- mutator.Mutate(&message, 1000);
-
- if (message.optional_string() == kIndicatorString) {
- custom_mutation = true;
- } else if (message.optional_string() != kInitialString) {
- regular_mutation = true;
- }
-
- if (custom_mutation && regular_mutation) break;
- }
-
- EXPECT_TRUE(custom_mutation);
- EXPECT_TRUE(regular_mutation);
+ EXPECT_LT(crossovers, 100u);
}
TYPED_TEST(MutatorTypedTest, Serialization) {
@@ -635,34 +594,29 @@ TYPED_TEST(MutatorTypedTest, Serialization) {
}
}
-TYPED_TEST(MutatorTypedTest, DeepRecursion) {
- typename TestFixture::Message message;
- typename TestFixture::Message* last = &message;
- for (int i = 0; i < 150; ++i) {
- last = last->mutable_optional_msg();
- std::string text = SaveMessageAsText(message);
- std::string binary = SaveMessageAsBinary(message);
- typename TestFixture::Message parsed;
- EXPECT_EQ(i < 100, ParseTextMessage(SaveMessageAsText(message), &parsed));
- EXPECT_EQ(i < 100,
- ParseBinaryMessage(SaveMessageAsBinary(message), &parsed));
- }
-}
+class MutatorMessagesTest : public MutatorTest {};
+INSTANTIATE_TEST_CASE_P(Proto2, MutatorMessagesTest,
+ ValuesIn(GetMessageTestParams<Msg>({kMessages})));
+INSTANTIATE_TEST_CASE_P(
+ Proto3, MutatorMessagesTest,
+ ValuesIn(GetMessageTestParams<Msg3>({kMessagesProto3})));
-TYPED_TEST(MutatorTypedTest, EmptyMessage) {
- typename TestFixture::Message::EmptyMessage message;
- TestMutator mutator(false);
- for (int j = 0; j < 10000; ++j) mutator.Mutate(&message, 1000);
+TEST_P(MutatorMessagesTest, DeletedMessage) {
+ LoadMessage(m1_.get());
+ LoadWithoutLine(m2_.get());
+ EXPECT_TRUE(Mutate(*m1_, *m2_));
}
-TYPED_TEST(MutatorTypedTest, Regressions) {
- typename TestFixture::Message::RegressionMessage message;
- TestMutator mutator(false);
- for (int j = 0; j < 10000; ++j) mutator.Mutate(&message, 1000);
+TEST_P(MutatorMessagesTest, InsertMessage) {
+ LoadWithoutLine(m1_.get());
+ LoadMessage(m2_.get());
+ EXPECT_TRUE(Mutate(*m1_, *m2_));
}
-TYPED_TEST(MutatorTypedTest, UsageExample) {
- typename TestFixture::Message::SmallMessage message;
+// TODO(vitalybuka): Special tests for oneof.
+
+TEST(MutatorMessagesTest, UsageExample) {
+ SmallMessage message;
TestMutator mutator(false);
// Test that we can generate all variation of the message.
@@ -673,52 +627,21 @@ TYPED_TEST(MutatorTypedTest, UsageExample) {
mutations.insert(str);
}
- if (std::is_same<typename TestFixture::Message, Msg>::value) {
- // 3 states for boolean and 5 for enum, including missing fields.
- EXPECT_EQ(3u * 5u, mutations.size());
- } else {
- // 2 states for boolean and 4 for enum.
- EXPECT_EQ(2u * 4u, mutations.size());
- }
+ // 3 states for boolean and 5 for enum, including missing fields.
+ EXPECT_EQ(3u * 5u, mutations.size());
}
-TYPED_TEST(MutatorTypedTest, Maps) {
- TestMutator mutator(true);
-
- typename TestFixture::Message::MapMessage message;
+TEST(MutatorMessagesTest, EmptyMessage) {
+ EmptyMessage message;
+ TestMutator mutator(false);
for (int j = 0; j < 10000; ++j) mutator.Mutate(&message, 1000);
}
-class MutatorMessagesTest : public MutatorTest {};
-INSTANTIATE_TEST_SUITE_P(Proto2, MutatorMessagesTest,
- ValuesIn(GetMessageTestParams<Msg>({kMessages})));
-INSTANTIATE_TEST_SUITE_P(
- Proto3, MutatorMessagesTest,
- ValuesIn(GetMessageTestParams<Msg3>({kMessagesProto3})));
-TEST_P(MutatorMessagesTest, DeletedMessage) {
- LoadMessage(m1_.get());
- LoadWithoutLine(m2_.get());
- EXPECT_TRUE(Mutate(*m1_, *m2_));
-}
-
-TEST_P(MutatorMessagesTest, InsertMessage) {
- LoadWithoutLine(m1_.get());
- LoadMessage(m2_.get());
- EXPECT_TRUE(Mutate(*m1_, *m2_));
-}
-
-// TODO(vitalybuka): Special tests for oneof.
-
-TEST(MutatorMessagesTest, NeverCopyUnknownEnum) {
+TEST(MutatorMessagesTest, Regressions) {
+ RegressionMessage message;
TestMutator mutator(false);
- for (int j = 0; j < 10000; ++j) {
- Msg3 message;
- message.set_optional_enum(Msg3::ENUM_5);
- message.add_repeated_enum(static_cast<Msg3::Enum>(100));
- mutator.Mutate(&message, 100);
- EXPECT_NE(message.optional_enum(), 100);
- }
+ for (int j = 0; j < 10000; ++j) mutator.Mutate(&message, 1000);
}
} // namespace protobuf_mutator