diff options
Diffstat (limited to 'src/mutator_test.cc')
-rw-r--r-- | src/mutator_test.cc | 197 |
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 |