aboutsummaryrefslogtreecommitdiff
path: root/src/mutator.cc
diff options
context:
space:
mode:
authorVitaly Buka <vitalybuka@google.com>2020-02-04 15:40:30 -0800
committerVitaly Buka <vitalybuka@gmail.com>2020-02-04 15:41:57 -0800
commit1989ccb24edb741d0c6ca73aef0eeaf0cef5a140 (patch)
tree0f943571ad92ca9db3781073b72a7435e26f2713 /src/mutator.cc
parentf62086cb8dac014aa1cf7290bac58540dc588f08 (diff)
downloadlibprotobuf-mutator-1989ccb24edb741d0c6ca73aef0eeaf0cef5a140.tar.gz
Deflake FailedMutations test
Diffstat (limited to 'src/mutator.cc')
-rw-r--r--src/mutator.cc12
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;
}