blob: a0be6268ae39bf1b1c56a8f2d9f7c232bfd71b14 [file] [log] [blame]
#!/bin/bash
# Copyright 2018 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#### CATEGORY=Run, inspect and debug
### run a fuzz test on target a device
##
## Usage: fx fuzz [options] [command] [command-arguments]
##
## Options:
## -d, --device <name> Connect to device using Fuchsia link-local name.
## Must be specified if multiple devices are present.
## -f, --foreground Run in the foreground (default is background).
## -g, --debug Disable libFuzzer exception handling.
## -n, --no-cipd Skip steps involving CIPD.
## -o, --output <dir> Use the given directory for saving output files.
## Defaults to the current directory.
## -s, --staging <dir> Use the given directory for staging temporary
## corpus files being transferred on or off of a
## target device. Defaults to a temporary directory
## that is removed on completion; use this options to
## preserve those temporary files on the host.
##
## Commands:
## help Prints this message and exits.
## list [name] Lists fuzzers matching 'name' if provided, or all
## fuzzers.
## corpus [name] Lists the corpus instances in CIPD for the named
## fuzzer.
## fetch <name> [label] Retrieves the corpus for the named fuzzer. If
## 'label' is a directory, installs the corpus from
## that location. Otherwise fetches and installs the
## corpus from CIPD given by 'label', which may
## either be a CIPD "ref", or a CIPD "tag" of the
## form "key:value". If omitted, 'label' defaults to
## "latest".
## start <name> [...] Fetches the latest corpus for a named fuzzer and
## starts it. Additional arguments are passed to the
## fuzzer. This is default command if not provided.
## check <name> Reports information about the named fuzzer, such as
## execution status, corpus size, and number of
## crashes.
## stop <name> Stops all instances of the named fuzzer.
## repro <name> [...] Runs the named fuzzer on specific inputs. If no
## additional inputs are provided, uses all previously
## found crashes.
## merge <name> [...] Fetches the latest corpus in CIPD, merges and
## minimizes it with the corpus on device, and stores
## the result in CIPD.
## store <name> Gathers the current corpus from the target platform
## and publishes it to CIPD. The package will be
## tagged with the current integration revision and
## referenced as 'latest'.
##
## Typical workflow is one of three commands:
## fx fuzz <name> # Fetches the latest corpus and starts the fuzzer
## fx fuzz repro <name> # Replays any test input artifacts found
## fx fuzz merge <name> # Merges the current corpus with the latest in CIPD
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/../lib/vars.sh || exit $?
FUZZING_DIR=${FUCHSIA_DIR}/scripts/fuzzing
cmd=
add=0
for arg in "$@"; do
shift
case "$arg" in
-h)
cmd="help"
;;
-d|--device)
arg="--device"
add=2
;;
-g|--debug)
arg="--debug"
add=1
;;
-o|--output)
arg="--output"
add=2
;;
-s|--staging)
arg="--staging"
add=2
;;
-f|--foreground)
arg="--foreground"
add=1
;;
-n|--no-cipd)
arg="--no-cipd"
add=1
;;
*)
if [[ -z "$cmd" ]] && [[ $add -eq 0 ]]; then
cmd="$arg"
else
add=1
fi
;;
esac
[[ "$cmd" = "help" ]] && break
[[ $add -eq 0 ]] && continue
set -- "$@" "$arg"
add=$(($add - 1))
done
case "$cmd" in
help)
fx-command-help
;;
list)
python ${FUZZING_DIR}/list_fuzzers.py "$@"
;;
corpus)
python ${FUZZING_DIR}/list_corpora.py "$@"
;;
fetch)
python ${FUZZING_DIR}/fetch_corpus.py "$@"
;;
start)
python ${FUZZING_DIR}/start_fuzzer.py "$@"
;;
check)
python ${FUZZING_DIR}/check_fuzzer.py "$@"
;;
stop)
python ${FUZZING_DIR}/stop_fuzzer.py "$@"
;;
repro)
python ${FUZZING_DIR}/repro_units.py "$@"
;;
merge)
python ${FUZZING_DIR}/merge_corpus.py "$@"
;;
store)
python ${FUZZING_DIR}/store_corpus.py "$@"
;;
*)
name="$cmd"
if python ${FUZZING_DIR}/list_fuzzers.py "$name" ; then
python ${FUZZING_DIR}/start_fuzzer.py "$name" "$@"
else
fx-command-help
fi
;;
esac