code-intelligence.com/cifuzz@v0.40.0/internal/cmd/coverage/llvm/llvm_test.go (about)

     1  package llvm
     2  
     3  import (
     4  	"bytes"
     5  	"io"
     6  	"os"
     7  	"path/filepath"
     8  	"strings"
     9  	"testing"
    10  
    11  	"github.com/otiai10/copy"
    12  	"github.com/spf13/viper"
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  
    16  	"code-intelligence.com/cifuzz/integration-tests/shared"
    17  	"code-intelligence.com/cifuzz/internal/builder"
    18  	"code-intelligence.com/cifuzz/internal/testutil"
    19  	"code-intelligence.com/cifuzz/pkg/mocks"
    20  )
    21  
    22  func TestMain(m *testing.M) {
    23  	viper.Set("verbose", true)
    24  
    25  	m.Run()
    26  }
    27  
    28  func TestIntegration_LLVM(t *testing.T) {
    29  	if testing.Short() {
    30  		t.Skip()
    31  	}
    32  
    33  	// Install cifuzz
    34  	testutil.RegisterTestDepOnCIFuzz()
    35  	installDir := shared.InstallCIFuzzInTemp(t)
    36  	// Include the CMake package by setting the CMAKE_PREFIX_PATH.
    37  	t.Setenv("CMAKE_PREFIX_PATH", filepath.Join(installDir, "share", "cmake"))
    38  
    39  	testCases := map[string]struct {
    40  		format string
    41  	}{
    42  		"lcov": {
    43  			format: "lcov",
    44  		},
    45  		"html": {
    46  			format: "html",
    47  		},
    48  	}
    49  
    50  	for name, tc := range testCases {
    51  		t.Run(name, func(t *testing.T) {
    52  			cwd, err := os.Getwd()
    53  			require.NoError(t, err)
    54  			testdataDir := filepath.Join(cwd, "testdata")
    55  			testutil.RegisterTestDeps(testdataDir)
    56  
    57  			// get path to shared include
    58  			repoRoot, err := builder.FindProjectDir()
    59  			require.NoError(t, err)
    60  			includePath := filepath.Join(repoRoot, "include")
    61  
    62  			tmpDir, cleanup := testutil.ChdirToTempDir("llvm-coverage-gen")
    63  			defer cleanup()
    64  
    65  			// copy testdata project to tmp directory
    66  			err = copy.Copy(testdataDir, tmpDir)
    67  			require.NoError(t, err)
    68  
    69  			// mock finderMock to use include dir from repository
    70  			finderMock := &mocks.RunfilesFinderMock{}
    71  			finderMock.On("CIFuzzIncludePath").Return(includePath, nil)
    72  			finderMock.On("LLVMProfDataPath").Return("llvm-profdata", nil)
    73  			finderMock.On("LLVMCovPath").Return("llvm-cov", nil)
    74  
    75  			var bOut bytes.Buffer
    76  			outBuf := io.Writer(&bOut)
    77  
    78  			generator := &CoverageGenerator{
    79  				OutputFormat:   tc.format,
    80  				BuildSystem:    "cmake",
    81  				UseSandbox:     false,
    82  				FuzzTest:       "my_fuzz_test",
    83  				ProjectDir:     tmpDir,
    84  				BuildStdout:    outBuf,
    85  				Stderr:         os.Stderr,
    86  				runfilesFinder: finderMock,
    87  			}
    88  
    89  			err = generator.BuildFuzzTestForCoverage()
    90  			require.NoError(t, err)
    91  			reportPath, err := generator.GenerateCoverageReport()
    92  			require.NoError(t, err)
    93  
    94  			if tc.format == "lcov" {
    95  				assert.FileExists(t, reportPath)
    96  				assert.True(t, strings.HasSuffix(reportPath, tc.format))
    97  			} else {
    98  				assert.DirExists(t, reportPath)
    99  				assert.FileExists(t, filepath.Join(reportPath, "index.html"))
   100  			}
   101  		})
   102  	}
   103  }