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