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 }