Skip to content

Commit

Permalink
fuzz: increase coverage of the descriptor targets
Browse files Browse the repository at this point in the history
Once a descriptor is successfully parsed, execute more of its methods.
There is probably still room for improvements by checking for some
invariants, but this is a low hanging fruit that significantly increases
the code coverage of these targets.
  • Loading branch information
darosior committed Jun 15, 2023
1 parent 845810d commit 8edac3d
Showing 1 changed file with 23 additions and 4 deletions.
27 changes: 23 additions & 4 deletions src/test/fuzz/descriptor_parse.cpp
Expand Up @@ -107,11 +107,30 @@ class MockedDescriptorConverter {
MockedDescriptorConverter MOCKED_DESC_CONVERTER;

/** Test a successfully parsed descriptor. */
static void TestDescriptor(const Descriptor& desc)
static void TestDescriptor(const Descriptor& desc, FlatSigningProvider& sig_provider, std::string& dummy)
{
(void)desc.ToString();
// Trivial helpers.
(void)desc.IsRange();
(void)desc.IsSolvable();
(void)desc.IsSingleType();
(void)desc.GetOutputType();

// Serialization to string representation.
(void)desc.ToString();
(void)desc.ToPrivateString(sig_provider, dummy);
(void)desc.ToNormalizedString(sig_provider, dummy);

// Serialization to Script.
DescriptorCache cache;
std::vector<CScript> out_scripts;
(void)desc.Expand(0, sig_provider, out_scripts, sig_provider, &cache);
(void)desc.ExpandPrivate(0, sig_provider, sig_provider);
(void)desc.ExpandFromCache(0, cache, out_scripts, sig_provider);

// If we could serialize to script we must be able to infer using the same provider.
if (!out_scripts.empty()) {
assert(InferDescriptor(out_scripts.back(), sig_provider));
}
}

void initialize_descriptor_parse()
Expand All @@ -133,7 +152,7 @@ FUZZ_TARGET_INIT(mocked_descriptor_parse, initialize_mocked_descriptor_parse)
FlatSigningProvider signing_provider;
std::string error;
const auto desc = Parse(*descriptor, signing_provider, error);
if (desc) TestDescriptor(*desc);
if (desc) TestDescriptor(*desc, signing_provider, error);
}
}

Expand All @@ -144,6 +163,6 @@ FUZZ_TARGET_INIT(descriptor_parse, initialize_descriptor_parse)
std::string error;
for (const bool require_checksum : {true, false}) {
const auto desc = Parse(descriptor, signing_provider, error, require_checksum);
if (desc) TestDescriptor(*desc);
if (desc) TestDescriptor(*desc, signing_provider, error);
}
}

0 comments on commit 8edac3d

Please sign in to comment.