code-intelligence.com/cifuzz@v0.40.0/internal/build/cmake/cmake_test.go (about)

     1  package cmake
     2  
     3  import (
     4  	"log"
     5  	"os"
     6  	"path/filepath"
     7  	"strings"
     8  	"testing"
     9  
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"code-intelligence.com/cifuzz/util/fileutil"
    13  )
    14  
    15  var baseTempDir string
    16  
    17  func TestMain(m *testing.M) {
    18  	var err error
    19  	baseTempDir, err = os.MkdirTemp("", "cmake-test-")
    20  	if err != nil {
    21  		log.Fatalf("Failed to create temp dir for tests: %+v", err)
    22  	}
    23  	defer fileutil.Cleanup(baseTempDir)
    24  
    25  	m.Run()
    26  }
    27  
    28  func TestNewBuilder(t *testing.T) {
    29  	projectDir, err := os.MkdirTemp(baseTempDir, "project-dir-")
    30  	require.NoError(t, err)
    31  
    32  	// Create a builder
    33  	builder1, err := NewBuilder(&BuilderOptions{
    34  		ProjectDir: projectDir,
    35  		Sanitizers: []string{"sanitizer1", "sanitizer2"},
    36  		Stdout:     os.Stderr,
    37  		Stderr:     os.Stderr,
    38  	})
    39  	require.NoError(t, err)
    40  	buildDir1, err := builder1.BuildDir()
    41  	require.NoError(t, err)
    42  	require.DirExists(t, buildDir1)
    43  	expectedBuildDir1 := filepath.Join(projectDir, ".cifuzz-build", "libfuzzer", "sanitizer1+sanitizer2")
    44  	require.Equal(t, expectedBuildDir1, buildDir1)
    45  
    46  	// Create another builder with additional args
    47  	builder2, err := NewBuilder(&BuilderOptions{
    48  		ProjectDir: projectDir,
    49  		Args:       []string{"foo"},
    50  		Sanitizers: []string{"sanitizer1", "sanitizer2"},
    51  		Stdout:     os.Stderr,
    52  		Stderr:     os.Stderr,
    53  	})
    54  	require.NoError(t, err)
    55  	buildDir2, err := builder2.BuildDir()
    56  	require.NoError(t, err)
    57  	require.DirExists(t, buildDir2)
    58  	// Check that the build dir name contains an additional hash value
    59  	require.Equal(t, 8, len(strings.Split(filepath.Base(buildDir2), "-")[1]))
    60  
    61  	// Check that the two builders have different build directories
    62  	// (because they use different engines)
    63  	require.NotEqual(t, buildDir1, buildDir2)
    64  
    65  	// Create another builder without additional args
    66  	builder3, err := NewBuilder(&BuilderOptions{
    67  		ProjectDir: projectDir,
    68  		Sanitizers: []string{"sanitizer1", "sanitizer2"},
    69  		Stdout:     os.Stderr,
    70  		Stderr:     os.Stderr,
    71  	})
    72  	require.NoError(t, err)
    73  	buildDir3, err := builder3.BuildDir()
    74  	require.NoError(t, err)
    75  	require.DirExists(t, buildDir3)
    76  
    77  	// Check that builder1 and builder3 have the same build directory
    78  	// (because they use the same engine and sanitizers)
    79  	require.Equal(t, buildDir1, buildDir3)
    80  }