| 1 | // Copyright 2021 The Go Authors. All rights reserved. |
|---|---|
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
| 5 | package main |
| 6 | |
| 7 | import ( |
| 8 | "os" |
| 9 | "os/exec" |
| 10 | "path/filepath" |
| 11 | "runtime" |
| 12 | "testing" |
| 13 | |
| 14 | "golang.org/x/tools/internal/testenv" |
| 15 | ) |
| 16 | |
| 17 | // buildDriver builds the fuzz-driver executable, returning its path. |
| 18 | func buildDriver(t *testing.T) string { |
| 19 | t.Helper() |
| 20 | if runtime.GOOS == "android" { |
| 21 | t.Skipf("the dependencies are not available on android") |
| 22 | return "" |
| 23 | } |
| 24 | bindir := filepath.Join(t.TempDir(), "bin") |
| 25 | err := os.Mkdir(bindir, os.ModePerm) |
| 26 | if err != nil { |
| 27 | t.Fatal(err) |
| 28 | } |
| 29 | binary := filepath.Join(bindir, "driver") |
| 30 | if runtime.GOOS == "windows" { |
| 31 | binary += ".exe" |
| 32 | } |
| 33 | cmd := exec.Command("go", "build", "-o", binary) |
| 34 | if err := cmd.Run(); err != nil { |
| 35 | t.Fatalf("Building fuzz-driver: %v", err) |
| 36 | } |
| 37 | return binary |
| 38 | } |
| 39 | |
| 40 | func TestEndToEndIntegration(t *testing.T) { |
| 41 | testenv.NeedsTool(t, "go") |
| 42 | td := t.TempDir() |
| 43 | |
| 44 | // Build the fuzz-driver binary. |
| 45 | // Note: if more tests are added to this package, move this to single setup fcn, so |
| 46 | // that we don't have to redo the build each time. |
| 47 | binary := buildDriver(t) |
| 48 | |
| 49 | // Kick off a run. |
| 50 | gendir := filepath.Join(td, "gen") |
| 51 | args := []string{"-numfcns", "3", "-numpkgs", "1", "-seed", "101", "-outdir", gendir} |
| 52 | c := exec.Command(binary, args...) |
| 53 | b, err := c.CombinedOutput() |
| 54 | if err != nil { |
| 55 | t.Fatalf("error invoking fuzz-driver: %v\n%s", err, b) |
| 56 | } |
| 57 | |
| 58 | found := "" |
| 59 | walker := func(path string, info os.FileInfo, err error) error { |
| 60 | found = found + ":" + info.Name() |
| 61 | return nil |
| 62 | } |
| 63 | |
| 64 | // Make sure it emits something. |
| 65 | err2 := filepath.Walk(gendir, walker) |
| 66 | if err2 != nil { |
| 67 | t.Fatalf("error from filepath.Walk: %v", err2) |
| 68 | } |
| 69 | const expected = ":gen:genCaller0:genCaller0.go:genChecker0:genChecker0.go:genMain.go:genUtils:genUtils.go:go.mod" |
| 70 | if found != expected { |
| 71 | t.Errorf("walk of generated code: got %s want %s", found, expected) |
| 72 | } |
| 73 | } |
| 74 |
Members