code-intelligence.com/cifuzz@v0.40.0/internal/build/other/other_test.go (about) 1 package other 2 3 import ( 4 "bytes" 5 "fmt" 6 "path/filepath" 7 "runtime" 8 "testing" 9 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 13 "code-intelligence.com/cifuzz/internal/builder" 14 "code-intelligence.com/cifuzz/internal/cmdutils" 15 "code-intelligence.com/cifuzz/pkg/mocks" 16 "code-intelligence.com/cifuzz/util/envutil" 17 ) 18 19 func defaultFinderMock(t *testing.T, repoRoot string) *mocks.RunfilesFinderMock { 20 t.Helper() 21 22 finderMock := &mocks.RunfilesFinderMock{} 23 finderMock.On("CIFuzzIncludePath").Return(filepath.Join(repoRoot, "include"), nil) 24 finderMock.On("DumperSourcePath").Return(filepath.Join(repoRoot, "tools", "dumper"), nil) 25 finderMock.On("ClangPath").Return("clang", nil) 26 return finderMock 27 } 28 29 func TestEnvsSetInBuild(t *testing.T) { 30 if runtime.GOOS == "windows" { 31 t.Skip() 32 } 33 34 repoRoot, err := builder.FindProjectDir() 35 require.NoError(t, err) 36 37 projectDir := filepath.Join(repoRoot, "internal", "build", "other", "testdata") 38 39 finderMock := defaultFinderMock(t, repoRoot) 40 41 output := bytes.Buffer{} 42 43 // "Building" without coverage 44 b, err := NewBuilder(&BuilderOptions{ 45 ProjectDir: projectDir, 46 BuildCommand: "env | grep FUZZ", 47 RunfilesFinder: finderMock, 48 Stdout: &output, 49 }) 50 require.NoError(t, err) 51 52 cmd := "test" 53 cmdutils.CurrentInvocation = &cmdutils.Invocation{Command: cmd} 54 55 fuzzTestName := "my_fuzz_test" 56 _, err = b.Build(fuzzTestName) 57 require.NoError(t, err) 58 59 // Note: Testing the environment variables explicitly here 60 // because changing them would be a breaking change 61 assert.Contains(t, output.String(), fmt.Sprintf("%s=%s", "CIFUZZ_BUILD_STEP", "fuzzing"), "CIFUZZ_BUILD_STEP for fuzzing is not set correctly in environment") 62 assert.Contains(t, output.String(), fmt.Sprintf("%s=%s", "CIFUZZ_BUILD_LOCATION", fuzzTestName), "CIFUZZ_BUILD_LOCATION is not set correctly in environment") 63 assert.Contains(t, output.String(), fmt.Sprintf("%s=%s", "FUZZ_TEST", fuzzTestName), "FUZZ_TEST is not set correctly in environment") 64 assert.Contains(t, output.String(), fmt.Sprintf("%s=%s", "CIFUZZ_COMMAND", cmd), "CIFUZZ_COMMAND is not set correctly in environment") 65 66 // "Building" for coverage 67 b, err = NewBuilder(&BuilderOptions{ 68 ProjectDir: projectDir, 69 BuildCommand: "env | grep FUZZ", 70 RunfilesFinder: finderMock, 71 Stdout: &output, 72 Sanitizers: []string{"coverage"}, 73 }) 74 require.NoError(t, err) 75 76 _, err = b.Build(fuzzTestName) 77 require.NoError(t, err) 78 assert.Contains(t, output.String(), fmt.Sprintf("%s=%s", "CIFUZZ_BUILD_STEP", "coverage"), "CIFUZZ_BUILD_STEP for coverage is not set correctly in environment") 79 } 80 81 // regression test for CLI-1128 82 // environment variables for c/cxx flags should enclosed by single quotes 83 func TestNoQuotesOnEnv(t *testing.T) { 84 repoRoot, err := builder.FindProjectDir() 85 require.NoError(t, err) 86 projectDir := filepath.Join(repoRoot, "internal", "build", "other", "testdata") 87 88 b, err := NewBuilder(&BuilderOptions{ 89 ProjectDir: projectDir, 90 RunfilesFinder: defaultFinderMock(t, repoRoot), 91 }) 92 require.NoError(t, err) 93 94 err = b.setLibFuzzerEnv() 95 require.NoError(t, err) 96 assert.NotContains(t, envutil.Getenv(b.env, EnvFuzzTestCFlags), "'") 97 assert.NotContains(t, envutil.Getenv(b.env, EnvFuzzTestCXXFlags), "'") 98 99 err = b.setCoverageEnv() 100 require.NoError(t, err) 101 assert.NotContains(t, envutil.Getenv(b.env, EnvFuzzTestCFlags), "'") 102 assert.NotContains(t, envutil.Getenv(b.env, EnvFuzzTestCXXFlags), "'") 103 }