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 }