Expand description

apollo-smith

apollo-smith

A test case generator for GraphQL language.

Crates.io Download docs.rs docs

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_target

and 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_target

Limitations

  • 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.