oss.indeed.com/go/go-opine@v1.3.0/internal/coverage/coverage_test.go (about)

     1  package coverage
     2  
     3  import (
     4  	"bufio"
     5  	"errors"
     6  	"io/ioutil"
     7  	"os"
     8  	"path/filepath"
     9  	"strings"
    10  	"testing"
    11  
    12  	"github.com/stretchr/testify/require"
    13  
    14  	"golang.org/x/tools/cover"
    15  )
    16  
    17  func Test_Load(t *testing.T) {
    18  	inPath := filepath.Join("testdata", "cover.out")
    19  	result, err := Load(inPath)
    20  	require.NoError(t, err)
    21  
    22  	// Check that the generated file was removed and the non-generated
    23  	// file was not.
    24  	files := make([]string, len(result.profiles))
    25  	for i, profile := range result.profiles {
    26  		files[i] = profile.FileName
    27  	}
    28  	require.Contains(t, files, "oss.indeed.com/go/go-opine/internal/coverage/testdata/not_generated.go")
    29  	require.NotContains(t, files, "oss.indeed.com/go/go-opine/internal/coverage/testdata/generated.go")
    30  
    31  	// Check that the modPaths is populated and correct.
    32  	expectedModPath, err := filepath.Abs("./testdata")
    33  	require.NoError(t, err)
    34  	require.Equal(
    35  		t,
    36  		map[string]string{"oss.indeed.com/go/go-opine/internal/coverage/testdata": expectedModPath},
    37  		result.modPaths,
    38  	)
    39  }
    40  
    41  func Test_CoverProfile(t *testing.T) {
    42  	inPath := filepath.Join("testdata", "cover.out")
    43  	profiles, err := cover.ParseProfiles(inPath)
    44  	require.NoError(t, err)
    45  
    46  	outDir, err := ioutil.TempDir("", "go-opine-coverage-test.")
    47  	require.NoError(t, err)
    48  	defer os.RemoveAll(outDir)
    49  	outPath := filepath.Join(outDir, "cover.out")
    50  
    51  	cov := &Coverage{profiles: profiles}
    52  	err = cov.CoverProfile(outPath)
    53  	require.NoError(t, err)
    54  
    55  	inBytes, err := os.ReadFile(inPath)
    56  	require.NoError(t, err)
    57  	outBytes, err := os.ReadFile(outPath)
    58  	require.NoError(t, err)
    59  	require.Equal(t, string(inBytes), string(outBytes))
    60  }
    61  
    62  func Test_XML(t *testing.T) {
    63  	inPath := filepath.Join("testdata", "cover.out")
    64  	profiles, err := cover.ParseProfiles(inPath)
    65  	require.NoError(t, err)
    66  
    67  	outDir, err := ioutil.TempDir("", "go-opine-coverage-test.")
    68  	require.NoError(t, err)
    69  	defer os.RemoveAll(outDir)
    70  	outPath := filepath.Join(outDir, "lang-go-cobertura.xml")
    71  
    72  	testdata, err := filepath.Abs("./testdata")
    73  	require.NoError(t, err)
    74  	cov := &Coverage{
    75  		profiles: profiles,
    76  		modPaths: map[string]string{"oss.indeed.com/go/go-opine/internal/coverage/testdata": testdata},
    77  	}
    78  	err = cov.XML(outPath)
    79  	require.NoError(t, err)
    80  	outBytes, err := os.ReadFile(outPath)
    81  	require.NoError(t, err)
    82  	out := string(outBytes)
    83  	require.Contains(t, out, "\"testdata/not_generated.go\"")
    84  	require.Contains(t, out, "\"testdata/generated.go\"") // included because we did not use Load
    85  }
    86  
    87  func Test_Ratio_50percent(t *testing.T) {
    88  	inPath := filepath.Join("testdata", "cover.out")
    89  	profiles, err := cover.ParseProfiles(inPath) // 50% because generated.go is not excluded
    90  	require.NoError(t, err)
    91  	cov := &Coverage{profiles: profiles}
    92  	ratio := cov.Ratio()
    93  	require.Equal(t, 0.5, ratio)
    94  }
    95  
    96  func Test_Ratio_100percent(t *testing.T) {
    97  	inPath := filepath.Join("testdata", "cover.out")
    98  	cov, err := Load(inPath) // 100% because generated.go is excluded
    99  	require.NoError(t, err)
   100  	ratio := cov.Ratio()
   101  	require.Equal(t, 1.0, ratio)
   102  }
   103  func Test_isGeneratedReader_veryLongLine(t *testing.T) {
   104  	veryLongLine := "package foo\n\n" +
   105  		"// " + strings.Repeat("a", bufio.MaxScanTokenSize+1) +
   106  		"\n\n// Code generated ... DO NOT EDIT.\n"
   107  	res, err := isGeneratedReader(strings.NewReader(veryLongLine))
   108  	require.NoError(t, err)
   109  	require.True(t, res)
   110  }
   111  
   112  func Test_isGeneratedReader_runeReaderErr(t *testing.T) {
   113  	_, err := isGeneratedReader(notEOFErrRuneReader{})
   114  	require.Error(t, err)
   115  }
   116  
   117  type notEOFErrRuneReader struct{}
   118  
   119  func (notEOFErrRuneReader) ReadRune() (rune, int, error) {
   120  	return 0, 0, errors.New("not EOF")
   121  }