From c420eee25b902f3740acf05216897674cc1bedfb Mon Sep 17 00:00:00 2001 From: Robert Fratto Date: Sat, 27 Apr 2024 11:07:54 -0400 Subject: [PATCH] wip --- .github/workflows/fuzz.yml | 103 +++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 .github/workflows/fuzz.yml diff --git a/.github/workflows/fuzz.yml b/.github/workflows/fuzz.yml new file mode 100644 index 0000000000..92e60344ea --- /dev/null +++ b/.github/workflows/fuzz.yml @@ -0,0 +1,103 @@ +name: Fuzz test +on: + pull_request: +jobs: + find-tests: + name: Find fuzz tests + runs-on: ubuntu-latest + outputs: + matrix: ${{ steps.set-matrix.outputs.matrix }} + steps: + - uses: actions/checkout@v4 + - name: Find fuzz tests + id: set-matrix + run: | + TEST_FILES=$(find . -name '*_test.go' -not -path './vendor/*') + + RESULTS=() + + for FILE in $TEST_FILES; do + FUZZ_FUNC=$(grep -E 'func Fuzz\w*' $FILE | sed 's/func //' | sed 's/(.*$//') + if [ -z "$FUZZ_FUNC" ]; then + continue + fi + + PACKAGE_PATH=$(dirname ${FILE#./}) + RESULTS+=("{\"package\":\"$PACKAGE_PATH\",\"function\":\"$FUZZ_FUNC\"}") + + echo "Found $PACKAGE_PATH :: $FUZZ_FUNC" + done + + NUM_RESULTS=${#RESULTS[@]} + INCLUDE_STRING="" + for (( i=0; i<$NUM_RESULTS; i++ )); do + INCLUDE_STRING+="${RESULTS[$i]}" + + if [[ $i -lt $(($NUM_RESULTS-1)) ]]; then + INCLUDE_STRING+="," + fi + done + + echo 'matrix={"include": ['$INCLUDE_STRING']}' >> $GITHUB_OUTPUT + + fuzz: + name: "${{ matrix.package }} :: ${{ matrix.function }}" + runs-on: ubuntu-latest + if: needs.find-tests.outputs.matrix != '' + needs: [find-tests] + strategy: + fail-fast: false # Allow other jobs in the matrix to run even if a single one fails. + matrix: ${{fromJson(needs.find-tests.outputs.matrix)}} + steps: + - uses: actions/checkout@v4 + + - name: Set up Go 1.22 + uses: actions/setup-go@v5 + with: + go-version: "1.22" + cache: false + + - name: Find cache location + run: + echo "FUZZ_CACHE=$(go env GOCACHE)/fuzz" >> $GITHUB_ENV + + - name: Restore corpus + uses: actions/cache@v4 + with: + path: ${{ env.FUZZ_CACHE }} + key: fuzz-${{ matrix.package }}-${{ matrix.function }}-${{ github.sha }} + restore-keys: | + fuzz-${{ matrix.package }}-${{ matrix.function }}- + save-always: true + + - name: Fuzz + run: | + cd "${{ matrix.package }}" + go test -fuzz="${{ matrix.function }}\$" -run="${{ matrix.function }}\$" -fuzztime=5s . + + # Fuzzing may have failed because of an existing bug, or it may have + # found a new one and written a new corpus entry in testdata/ relative to + # the package. + # + # If that file was written, we should save it as an artifact and then + # create an issue. + + - name: Check for new corpus entry + id: new-entry + if: ${{ failure() }} + run: | + UNTRACKED=$(git ls-files . --exclude-standard --others) + if [ -z "$UNTRACKED" ]; then + exit 0 + fi + echo "Found new corpus entry: $UNTRACKED" + echo "entry=$UNTRACKED" >> $GITHUB_OUTPUT + + - name: Upload corpus entry + if: ${{ failure() && steps.new-entry.outputs.entry != '' }} + uses: actions/upload-artifact@v4 + with: + name: failed-test + path: ${{ steps.new-entry.outputs.entry }} + +