apollographql / apollo-rs

Spec compliant GraphQL Tools in Rust.
Apache License 2.0
566 stars 43 forks source link

Mutation-based generator of arbitrary executable documents #880

Open SimonSapin opened 2 months ago

SimonSapin commented 2 months ago

For a given valid schema, use a byte string typically provided by cargo-fuzz as a source of entropy to deterministically generate a valid executable document:

pub fn arbitrary_valid_executable_document(
    schema: &Valid<Schema>,
    arbitrary_bytes: &[u8],
) -> Valid<executable::ExecutableDocument>

Instead of using the arbitrary crate, parts of it are forked for reasons documented at the top of the new entropy.rs file.

At a high level, it creates a minimal operation then keeps adding selections to it until entropy is exhausted. As a result, providing a longer byte string tends to create larger documents. Hopefully this helps fuzzers better explore the space of possible documents, compared to apollo-smith which uses code like u.int_in_range(1..=5) to decide how many items to generate regardless of remaining entropy.

With this approach I believe we could enumerate all possible valid documents up to a certain "size" with bounded amounts of entropy. We’re not quite there yet for at least a few reasons:

SimonSapin commented 2 months ago

This PR is draft because I’m unsure if this generator should live inside apollo-rs. I think eventually yes, but at first we’ll likely want to tweak it a lot and going through a crates.io release for every change would be a significant obstacle.