github.com/april1989/origin-go-tools@v0.0.32/cmd/cover/cover_test.go (about) 1 // Copyright 2013 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 // No testdata on Android. 6 7 // +build !android 8 9 package main_test 10 11 import ( 12 "bytes" 13 "fmt" 14 "io/ioutil" 15 "os" 16 "os/exec" 17 "path/filepath" 18 "testing" 19 20 "github.com/april1989/origin-go-tools/internal/testenv" 21 ) 22 23 const ( 24 // Data directory, also the package directory for the test. 25 testdata = "testdata" 26 ) 27 28 var debug = false // Keeps the rewritten files around if set. 29 30 // Run this shell script, but do it in Go so it can be run by "go test". 31 // 32 // replace the word LINE with the line number < testdata/test.go > testdata/test_line.go 33 // go build -o ./testcover 34 // ./testcover -mode=count -var=CoverTest -o ./testdata/test_cover.go testdata/test_line.go 35 // go run ./testdata/main.go ./testdata/test.go 36 // 37 func TestCover(t *testing.T) { 38 testenv.NeedsTool(t, "go") 39 40 tmpdir, err := ioutil.TempDir("", "TestCover") 41 if err != nil { 42 t.Fatal(err) 43 } 44 defer func() { 45 if debug { 46 fmt.Printf("test files left in %s\n", tmpdir) 47 } else { 48 os.RemoveAll(tmpdir) 49 } 50 }() 51 52 testcover := filepath.Join(tmpdir, "testcover.exe") 53 testMain := filepath.Join(tmpdir, "main.go") 54 testTest := filepath.Join(tmpdir, "test.go") 55 coverInput := filepath.Join(tmpdir, "test_line.go") 56 coverOutput := filepath.Join(tmpdir, "test_cover.go") 57 58 for _, f := range []string{testMain, testTest} { 59 data, err := ioutil.ReadFile(filepath.Join(testdata, filepath.Base(f))) 60 if err != nil { 61 t.Fatal(err) 62 } 63 if err := ioutil.WriteFile(f, data, 0644); err != nil { 64 t.Fatal(err) 65 } 66 } 67 68 // Read in the test file (testTest) and write it, with LINEs specified, to coverInput. 69 file, err := ioutil.ReadFile(testTest) 70 if err != nil { 71 t.Fatal(err) 72 } 73 lines := bytes.Split(file, []byte("\n")) 74 for i, line := range lines { 75 lines[i] = bytes.Replace(line, []byte("LINE"), []byte(fmt.Sprint(i+1)), -1) 76 } 77 err = ioutil.WriteFile(coverInput, bytes.Join(lines, []byte("\n")), 0666) 78 if err != nil { 79 t.Fatal(err) 80 } 81 82 // go build -o testcover 83 cmd := exec.Command("go", "build", "-o", testcover) 84 run(cmd, t) 85 86 // ./testcover -mode=count -var=coverTest -o ./testdata/test_cover.go testdata/test_line.go 87 cmd = exec.Command(testcover, "-mode=count", "-var=coverTest", "-o", coverOutput, coverInput) 88 run(cmd, t) 89 90 // defer removal of ./testdata/test_cover.go 91 if !debug { 92 defer os.Remove(coverOutput) 93 } 94 95 // go run ./testdata/main.go ./testdata/test.go 96 cmd = exec.Command("go", "run", testMain, coverOutput) 97 run(cmd, t) 98 } 99 100 func run(c *exec.Cmd, t *testing.T) { 101 c.Stdout = os.Stdout 102 c.Stderr = os.Stderr 103 err := c.Run() 104 if err != nil { 105 t.Fatal(err) 106 } 107 }