| // 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. | |
| package main_test | |
| import ( | |
| "bytes" | |
| "fmt" | |
| "internal/testenv" | |
| "io/ioutil" | |
| "os" | |
| "os/exec" | |
| "path/filepath" | |
| "testing" | |
| ) | |
| const ( | |
| // Data directory, also the package directory for the test. | |
| testdata = "testdata" | |
| // Binaries we compile. | |
| testcover = "./testcover.exe" | |
| ) | |
| var ( | |
| // Files we use. | |
| testMain = filepath.Join(testdata, "main.go") | |
| testTest = filepath.Join(testdata, "test.go") | |
| coverInput = filepath.Join(testdata, "test_line.go") | |
| coverOutput = filepath.Join(testdata, "test_cover.go") | |
| ) | |
| 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.MustHaveGoBuild(t) | |
| // 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) | |
| } | |
| if err := ioutil.WriteFile(coverInput, bytes.Join(lines, []byte("\n")), 0666); err != nil { | |
| t.Fatal(err) | |
| } | |
| // defer removal of test_line.go | |
| if !debug { | |
| defer os.Remove(coverInput) | |
| } | |
| // go build -o testcover | |
| cmd := exec.Command("go", "build", "-o", testcover) | |
| run(cmd, t) | |
| // defer removal of testcover | |
| defer os.Remove(testcover) | |
| // ./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) | |
| } | |
| } |