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  }