blob: 7de74c64787cb302e79468db3497f848f77c62cd [file] [log] [blame]
// Copyright 2021 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package main
import (
"os"
"os/exec"
"path/filepath"
"runtime"
"testing"
"golang.org/x/tools/internal/testenv"
)
// buildDriver builds the fuzz-driver executable, returning its path.
func buildDriver(t *testing.T) string {
t.Helper()
if runtime.GOOS == "android" {
t.Skipf("the dependencies are not available on android")
return ""
}
bindir := filepath.Join(t.TempDir(), "bin")
err := os.Mkdir(bindir, os.ModePerm)
if err != nil {
t.Fatal(err)
}
binary := filepath.Join(bindir, "driver")
if runtime.GOOS == "windows" {
binary += ".exe"
}
cmd := exec.Command("go", "build", "-o", binary)
if err := cmd.Run(); err != nil {
t.Fatalf("Building fuzz-driver: %v", err)
}
return binary
}
func TestEndToEndIntegration(t *testing.T) {
testenv.NeedsTool(t, "go")
td := t.TempDir()
// Build the fuzz-driver binary.
// Note: if more tests are added to this package, move this to single setup fcn, so
// that we don't have to redo the build each time.
binary := buildDriver(t)
// Kick off a run.
gendir := filepath.Join(td, "gen")
args := []string{"-numfcns", "3", "-numpkgs", "1", "-seed", "101", "-outdir", gendir}
c := exec.Command(binary, args...)
b, err := c.CombinedOutput()
if err != nil {
t.Fatalf("error invoking fuzz-driver: %v\n%s", err, b)
}
found := ""
walker := func(path string, info os.FileInfo, err error) error {
found = found + ":" + info.Name()
return nil
}
// Make sure it emits something.
err2 := filepath.Walk(gendir, walker)
if err2 != nil {
t.Fatalf("error from filepath.Walk: %v", err2)
}
const expected = ":gen:genCaller0:genCaller0.go:genChecker0:genChecker0.go:genMain.go:genUtils:genUtils.go:go.mod"
if found != expected {
t.Errorf("walk of generated code: got %s want %s", found, expected)
}
}