github.com/decred/dcrlnd@v0.7.6/scripts/fuzz.sh (about)

     1  #!/bin/bash
     2  
     3  set -e
     4  
     5  function build_fuzz() {
     6    PACKAGES=$1
     7  
     8    for pkg in $PACKAGES; do
     9      pushd fuzz/$pkg
    10  
    11      for file in *.go; do
    12        if [[ "$file" == "fuzz_utils.go" ]]; then
    13          continue
    14        fi
    15  
    16        NAME=$(echo $file | sed 's/\.go$//1')
    17        echo "Building zip file for $pkg/$NAME"
    18        go-fuzz-build -func "Fuzz_$NAME" -o "$pkg-$NAME-fuzz.zip" "github.com/decred/dcrlnd/fuzz/$pkg"
    19      done
    20  
    21      popd
    22    done
    23  }
    24  
    25  # timeout is a cross platform alternative to the GNU timeout command that
    26  # unfortunately isn't available on macOS by default.
    27  timeout() {
    28      time=$1
    29      $2 &
    30      pid=$!
    31      sleep $time
    32      kill -s SIGINT $pid    
    33  }
    34  
    35  function run_fuzz() {
    36    PACKAGES=$1
    37    RUN_TIME=$2
    38    TIMEOUT=$3
    39    PROCS=$4
    40    BASE_WORKDIR=$5
    41  
    42    for pkg in $PACKAGES; do
    43      pushd fuzz/$pkg
    44  
    45      for file in *.go; do
    46        if [[ "$file" == "fuzz_utils.go" ]]; then
    47          continue
    48        fi
    49  
    50        NAME=$(echo $file | sed 's/\.go$//1')
    51        WORKDIR=$BASE_WORKDIR/$pkg/$NAME
    52        mkdir -p $WORKDIR
    53        echo "Running fuzzer $pkg-$NAME-fuzz.zip with $PROCS processors for $RUN_TIME seconds"
    54        COMMAND="go-fuzz -bin=$pkg-$NAME-fuzz.zip -workdir=$WORKDIR -procs=$PROCS -timeout=$TIMEOUT"
    55        echo "$COMMAND"
    56        timeout "$RUN_TIME" "$COMMAND"
    57      done
    58  
    59      popd
    60    done
    61  }
    62  
    63  # usage prints the usage of the whole script.
    64  function usage() {
    65    echo "Usage: "
    66    echo "fuzz.sh build <packages>"
    67    echo "fuzz.sh run <packages> <run_time> <timeout>"
    68  }
    69  
    70  # Extract the sub command and remove it from the list of parameters by shifting
    71  # them to the left.
    72  SUBCOMMAND=$1
    73  shift
    74  
    75  # Call the function corresponding to the specified sub command or print the
    76  # usage if the sub command was not found.
    77  case $SUBCOMMAND in
    78  build)
    79    echo "Building fuzz packages"
    80    build_fuzz "$@"
    81    ;;
    82  run)
    83    echo "Running fuzzer"
    84    run_fuzz "$@"
    85    ;;
    86  *)
    87    usage
    88    exit 1
    89    ;;
    90  esac