Crate apollo_smith
source · [−]Expand description
apollo-smith
About
The goal of apollo-smith is to generate valid GraphQL documents by sampling
from all available possibilities of GraphQL grammar.
We’ve written apollo-smith to use in fuzzing, but you may wish to use it for
anything that requires GraphQL document generation.
apollo-smith is inspired by bytecodealliance’s wasm-smith crate, and the
article written by Nick Fitzgerald on writing test case generators in Rust.
This is still a work in progress, for outstanding issues, checkout out the apollo-smith label in our issue tracker.
Using apollo-smith with cargo fuzz
Define a new target with cargo fuzz,
$ cargo fuzz add my_apollo_smith_fuzz_targetand add apollo-smith to your Cargo.toml:
# fuzz/Cargo.toml
[dependencies]
apollo-smith = "0.1.0"It can then be used in a fuzz_target along with the arbitrary crate,
// fuzz/fuzz_targets/my_apollo_smith_fuzz_target.rs
#![no_main]
use libfuzzer_sys::fuzz_target;
use arbitrary::Unstructured;
use apollo_smith::DocumentBuilder;
fuzz_target!(|input: &[u8]| {
let mut u = Unstructured::new(input);
let gql_doc = DocumentBuilder::new(&mut u)?;
let document = gql_doc.finish();
let document_str = String::from(document);
});and fuzzed with the following command:
$ cargo +nightly fuzz run my_apollo_smith_fuzz_targetLimitations
- Recursive object type not yet supported (example :
myType { inner: myType })
License
Licensed under either of
- Apache License, Version 2.0 (LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or https://opensource.org/licenses/MIT)
at your option.
Structs
The __DirectiveDef type represents a Directive definition.
The __Document type represents a GraphQL document.A GraphQL Document describes a complete file or request string operated on by a GraphQL service or client.
A document contains multiple definitions, either executable or representative of a GraphQL type system.
DocumentBuilder is a struct to build an arbitrary valid GraphQL document
Enums are special scalars that can only have a defined set of values.
The __fragmentDef type represents a fragment definition
Input objects are composite types used as inputs into queries defined as a list of named input values..
InterfaceTypeDef is an abstract type where there are common fields declared.
Object types represent concrete instantiations of sets of fields.
The __operationDef type represents an operation definition
Represents scalar types such as Int, String, and Boolean. Scalars cannot have fields.
A GraphQL service’s collective type system capabilities are referred to as that service’s “schema”.
UnionDefs are an abstract type where no common fields are declared.
Type Definitions
A Result with the error type fixed as arbitrary::Error.