code-intelligence.com/cifuzz@v0.40.0/internal/cmdutils/jazzer_test.go (about)

     1  package cmdutils
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path/filepath"
     7  	"testing"
     8  
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  
    12  	"code-intelligence.com/cifuzz/internal/config"
    13  	"code-intelligence.com/cifuzz/internal/testutil"
    14  	"code-intelligence.com/cifuzz/pkg/stubs"
    15  )
    16  
    17  func TestListJVMFuzzTests(t *testing.T) {
    18  	projectDir := testutil.MkdirTemp(t, "", "list-jvm-files")
    19  	testDir := filepath.Join(projectDir, "src", "test")
    20  
    21  	// create some java files including one valid fuzz test
    22  	javaDir := filepath.Join(testDir, "java", "com", "example")
    23  	err := os.MkdirAll(javaDir, 0o755)
    24  	require.NoError(t, err)
    25  	err = stubs.Create(filepath.Join(javaDir, "FuzzTestCase1.java"), config.Java)
    26  	require.NoError(t, err)
    27  	_, err = os.Create(filepath.Join(javaDir, "UnitTestCase.java"))
    28  	require.NoError(t, err)
    29  	javaDirToFilter := filepath.Join(testDir, "java", "com", "filter", "me")
    30  	err = os.MkdirAll(javaDirToFilter, 0o755)
    31  	require.NoError(t, err)
    32  	err = stubs.Create(filepath.Join(javaDirToFilter, "FuzzTestCase2.java"), config.Java)
    33  	require.NoError(t, err)
    34  
    35  	// create some kotlin files including one valid fuzz test
    36  	kotlinDir := filepath.Join(testDir, "kotlin", "com", "example")
    37  	err = os.MkdirAll(kotlinDir, 0o755)
    38  	require.NoError(t, err)
    39  	err = stubs.Create(filepath.Join(kotlinDir, "FuzzTestCase3.kt"), config.Kotlin)
    40  	require.NoError(t, err)
    41  	_, err = os.Create(filepath.Join(kotlinDir, "UnitTestCase.kt"))
    42  	require.NoError(t, err)
    43  
    44  	// create some extra files
    45  	resDir := filepath.Join(testDir, "resources")
    46  	err = os.MkdirAll(resDir, 0o755)
    47  	require.NoError(t, err)
    48  	_, err = os.Create(filepath.Join(resDir, "SomeTestData"))
    49  	require.NoError(t, err)
    50  
    51  	// Check result
    52  	testDirs := []string{filepath.Join(projectDir, "src", "test")}
    53  	result, err := ListJVMFuzzTests(testDirs, "com.example")
    54  	require.NoError(t, err)
    55  	assert.Len(t, result, 2)
    56  	assert.Contains(t, result, "com.example.FuzzTestCase1")
    57  	assert.Contains(t, result, "com.example.FuzzTestCase3")
    58  
    59  	// Check result without filter
    60  	result, err = ListJVMFuzzTests(testDirs, "")
    61  	require.NoError(t, err)
    62  	assert.Len(t, result, 3)
    63  	assert.Contains(t, result, "com.example.FuzzTestCase1")
    64  	assert.Contains(t, result, "com.filter.me.FuzzTestCase2")
    65  	assert.Contains(t, result, "com.example.FuzzTestCase3")
    66  }
    67  
    68  func TestGetTargetMethodsFromJVMFuzzTestFileSingleMethod(t *testing.T) {
    69  	tempDir := testutil.MkdirTemp(t, "", "jazzer-*")
    70  
    71  	type target struct {
    72  		targetName string
    73  		code       []byte
    74  	}
    75  
    76  	testCases := []target{
    77  		{
    78  			targetName: "fuzzWithoutParameter",
    79  			code: []byte(`
    80  package com.example;
    81  
    82  import com.code_intelligence.jazzer.junit.FuzzTest;
    83  
    84  class FuzzTest {
    85      @FuzzTest
    86      public static void fuzzWithoutParameter(byte[] data) {}
    87  }`),
    88  		},
    89  		{
    90  			targetName: "fuzzWithParameter",
    91  			code: []byte(`
    92  package com.example;
    93  
    94  import com.code_intelligence.jazzer.junit.FuzzTest;
    95  
    96  class FuzzTest {
    97      @FuzzTest(maxDuration = "1m")
    98      public static void fuzzWithParameter(byte[] data) {}
    99  }`),
   100  		},
   101  		{
   102  			targetName: "fuzzerTestOneInput",
   103  			code: []byte(`
   104  package com.example;
   105  
   106  import com.code_intelligence.jazzer.junit.FuzzTest;
   107  
   108  class FuzzTest {
   109      public static void fuzzerTestOneInput(byte[] data) {}
   110  }`)}}
   111  
   112  	for _, tc := range testCases {
   113  		t.Run(tc.targetName, func(t *testing.T) {
   114  			path := filepath.Join(tempDir, fmt.Sprintf("FuzzTest%s.java", tc.targetName))
   115  			err := os.WriteFile(path, tc.code, 0o644)
   116  			require.NoError(t, err)
   117  
   118  			result, err := GetTargetMethodsFromJVMFuzzTestFile(path)
   119  			require.NoError(t, err)
   120  			assert.Equal(t, []string{tc.targetName}, result)
   121  		})
   122  	}
   123  }
   124  
   125  func TestGetTargetMethodsFromJVMFuzzTestFileMultipleMethods(t *testing.T) {
   126  	tempDir := testutil.MkdirTemp(t, "", "jazzer-*")
   127  
   128  	path := filepath.Join(tempDir, "FuzzTest.java")
   129  	err := os.WriteFile(path, []byte(`
   130  package com.example;
   131  
   132  import com.code_intelligence.jazzer.junit.FuzzTest;
   133  
   134  class FuzzTest {
   135      @FuzzTest
   136      public static void fuzz(byte[] data) {}
   137  
   138  	@FuzzTest
   139  	public static void fuzz2(byte[] data) {}
   140  
   141  	@FuzzTest(maxDuration = "1m")
   142  	public static void fuzz3(byte[] data) {}
   143  
   144  	public static void fuzzerTestOneInput(byte[] data) {}
   145  }
   146  `), 0o644)
   147  	require.NoError(t, err)
   148  
   149  	result, err := GetTargetMethodsFromJVMFuzzTestFile(path)
   150  	require.NoError(t, err)
   151  	assert.Equal(t, []string{"fuzz", "fuzz2", "fuzz3", "fuzzerTestOneInput"}, result)
   152  }
   153  
   154  func TestGetJazzerSeedCorpus(t *testing.T) {
   155  	seedCorpusDir := JazzerSeedCorpus("com.example.FuzzTestCase", "project-dir")
   156  	expectedSeedCorpusDir := filepath.Join(
   157  		"project-dir", "src", "test", "resources", "com", "example", "FuzzTestCaseInputs",
   158  	)
   159  	assert.Equal(t, expectedSeedCorpusDir, seedCorpusDir)
   160  }