| // Copyright 2013 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. |
| |
| // No testdata on Android. |
| |
| //go:build !android |
| // +build !android |
| |
| package main_test |
| |
| import ( |
| "bytes" |
| "fmt" |
| "io/ioutil" |
| "os" |
| "os/exec" |
| "path/filepath" |
| "testing" |
| |
| "golang.org/x/tools/internal/testenv" |
| ) |
| |
| const ( |
| // Data directory, also the package directory for the test. |
| testdata = "testdata" |
| ) |
| |
| var debug = false // Keeps the rewritten files around if set. |
| |
| // Run this shell script, but do it in Go so it can be run by "go test". |
| // |
| // replace the word LINE with the line number < testdata/test.go > testdata/test_line.go |
| // go build -o ./testcover |
| // ./testcover -mode=count -var=CoverTest -o ./testdata/test_cover.go testdata/test_line.go |
| // go run ./testdata/main.go ./testdata/test.go |
| func TestCover(t *testing.T) { |
| testenv.NeedsTool(t, "go") |
| |
| tmpdir, err := ioutil.TempDir("", "TestCover") |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer func() { |
| if debug { |
| fmt.Printf("test files left in %s\n", tmpdir) |
| } else { |
| os.RemoveAll(tmpdir) |
| } |
| }() |
| |
| testcover := filepath.Join(tmpdir, "testcover.exe") |
| testMain := filepath.Join(tmpdir, "main.go") |
| testTest := filepath.Join(tmpdir, "test.go") |
| coverInput := filepath.Join(tmpdir, "test_line.go") |
| coverOutput := filepath.Join(tmpdir, "test_cover.go") |
| |
| for _, f := range []string{testMain, testTest} { |
| data, err := ioutil.ReadFile(filepath.Join(testdata, filepath.Base(f))) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if err := ioutil.WriteFile(f, data, 0644); err != nil { |
| t.Fatal(err) |
| } |
| } |
| |
| // Read in the test file (testTest) and write it, with LINEs specified, to coverInput. |
| file, err := ioutil.ReadFile(testTest) |
| if err != nil { |
| t.Fatal(err) |
| } |
| lines := bytes.Split(file, []byte("\n")) |
| for i, line := range lines { |
| lines[i] = bytes.Replace(line, []byte("LINE"), []byte(fmt.Sprint(i+1)), -1) |
| } |
| err = ioutil.WriteFile(coverInput, bytes.Join(lines, []byte("\n")), 0666) |
| if err != nil { |
| t.Fatal(err) |
| } |
| |
| // go build -o testcover |
| cmd := exec.Command("go", "build", "-o", testcover) |
| run(cmd, t) |
| |
| // ./testcover -mode=count -var=coverTest -o ./testdata/test_cover.go testdata/test_line.go |
| cmd = exec.Command(testcover, "-mode=count", "-var=coverTest", "-o", coverOutput, coverInput) |
| run(cmd, t) |
| |
| // defer removal of ./testdata/test_cover.go |
| if !debug { |
| defer os.Remove(coverOutput) |
| } |
| |
| // go run ./testdata/main.go ./testdata/test.go |
| cmd = exec.Command("go", "run", testMain, coverOutput) |
| run(cmd, t) |
| } |
| |
| func run(c *exec.Cmd, t *testing.T) { |
| c.Stdout = os.Stdout |
| c.Stderr = os.Stderr |
| err := c.Run() |
| if err != nil { |
| t.Fatal(err) |
| } |
| } |