diff options
author | Vitaly Buka <vitalybuka@google.com> | 2020-02-04 15:40:30 -0800 |
---|---|---|
committer | Vitaly Buka <vitalybuka@gmail.com> | 2020-02-04 15:41:57 -0800 |
commit | 1989ccb24edb741d0c6ca73aef0eeaf0cef5a140 (patch) | |
tree | 0f943571ad92ca9db3781073b72a7435e26f2713 /src/mutator.cc | |
parent | f62086cb8dac014aa1cf7290bac58540dc588f08 (diff) | |
download | libprotobuf-mutator-1989ccb24edb741d0c6ca73aef0eeaf0cef5a140.tar.gz |
Deflake FailedMutations test
Diffstat (limited to 'src/mutator.cc')
-rw-r--r-- | src/mutator.cc | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/src/mutator.cc b/src/mutator.cc index 86e1c36..0243d03 100644 --- a/src/mutator.cc +++ b/src/mutator.cc @@ -561,6 +561,7 @@ void Mutator::CrossOver(const Message& message1, Message* message2, messages.push_back(message2); ConstMessages sources; sources.push_back(&message1); + sources.push_back(message2); int size_increase_hint = static_cast<int>(max_size_hint) - static_cast<int>(message2->ByteSizeLong()); MutateImpl(sources, messages, true, size_increase_hint); @@ -591,8 +592,6 @@ bool Mutator::MutateImpl(const ConstMessages& sources, const Messages& messages, MutationSampler mutation(keep_initialized_, mutations, &random_); for (Message* message : messages) mutation.Sample(message); - // Don't try same mutation next time. - mutations[static_cast<size_t>(mutation.mutation())] = false; switch (mutation.mutation()) { case Mutation::None: return true; @@ -610,7 +609,11 @@ bool Mutator::MutateImpl(const ConstMessages& sources, const Messages& messages, DataSourceSampler source_sampler(mutation.field(), &random_, size_increase_hint); for (const Message* source : sources) source_sampler.Sample(*source); - if (source_sampler.IsEmpty()) return true; // CreateField is enough. + if (source_sampler.IsEmpty()) { + if (!IsProto3SimpleField(*mutation.field().descriptor())) + return true; // CreateField is enough for proto2. + break; + } CopyField()(source_sampler.field(), mutation.field()); return true; } @@ -626,6 +629,9 @@ bool Mutator::MutateImpl(const ConstMessages& sources, const Messages& messages, assert(false && "unexpected mutation"); return false; } + + // Don't try same mutation next time. + mutations[static_cast<size_t>(mutation.mutation())] = false; } return false; } |