aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/manager/diff/patch_test.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2026-01-23 17:18:49 +0100
committerAleksandr Nogikh <nogikh@google.com>2026-01-23 20:35:29 +0000
commit4f25b9b48bdfbc7adeaf320f8d92067afe509b49 (patch)
treee66a51fc3786e8bb8abba5ca89cfc152a59e971f /pkg/manager/diff/patch_test.go
parentb4afeb6fb8cde041ba03048f5e123ed3f304a5e6 (diff)
pkg/manager: split off diff fuzzer functionality
Move the code to a separate pkg/manager/diff package. Split the code into several files.
Diffstat (limited to 'pkg/manager/diff/patch_test.go')
-rw-r--r--pkg/manager/diff/patch_test.go109
1 files changed, 109 insertions, 0 deletions
diff --git a/pkg/manager/diff/patch_test.go b/pkg/manager/diff/patch_test.go
new file mode 100644
index 000000000..43b2f32a2
--- /dev/null
+++ b/pkg/manager/diff/patch_test.go
@@ -0,0 +1,109 @@
+// Copyright 2026 syzkaller project authors. All rights reserved.
+// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.
+
+package diff
+
+import (
+ "fmt"
+ "testing"
+
+ "github.com/google/syzkaller/pkg/mgrconfig"
+ "github.com/google/syzkaller/pkg/osutil"
+ "github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
+)
+
+func TestPatchFocusAreas(t *testing.T) {
+ cfg := &mgrconfig.Config{
+ KernelSrc: t.TempDir(),
+ }
+ require.NoError(t, osutil.FillDirectory(cfg.KernelSrc, map[string]string{
+ "header.h": `Test`,
+ "a.c": `#include <header.h>
+int main(void) { }`,
+ "b.c": `int main(void) { }`,
+ "c.c": `int main(void) { }`,
+ }))
+
+ baseHashes, patchedHashes := dummySymbolHashes(), dummySymbolHashes()
+ baseHashes["function"] = "hash1"
+ patchedHashes["function"] = "hash2"
+
+ PatchFocusAreas(cfg, [][]byte{
+ []byte(`diff --git a/b.c b/b.c
+index 103167d..fbf7a68 100644
+--- a/b.c
++++ b/b.c
+@@ -1 +1 @@
+-int main(void) { }
+\ No newline at end of file
++int main(void) { return 1; }
+\ No newline at end of file`),
+ // Also, emulate an update to header.h.
+ []byte(`diff --git a/header.h b/header.h
+index 103167d..fbf7a68 100644
+--- a/header.h
++++ b/header.h
+@@ -1 +1 @@
+-Test
+\ No newline at end of file
++Test2
+\ No newline at end of file`),
+ }, baseHashes, patchedHashes)
+
+ assert.Equal(t, []mgrconfig.FocusArea{
+ {
+ Name: symbolsArea,
+ Filter: mgrconfig.CovFilterCfg{
+ Functions: []string{"^function$"},
+ },
+ Weight: 6.0,
+ },
+ {
+ Name: filesArea,
+ Filter: mgrconfig.CovFilterCfg{
+ Files: []string{"b.c", "header.h"},
+ },
+ Weight: 3.0,
+ },
+ {
+ Name: includesArea,
+ Filter: mgrconfig.CovFilterCfg{
+ Files: []string{"a.c"},
+ },
+ Weight: 2.0,
+ },
+ {
+ Weight: 1.0,
+ },
+ }, cfg.Experimental.FocusAreas)
+}
+
+func dummySymbolHashes() map[string]string {
+ ret := map[string]string{}
+ for i := 0; i < 100; i++ {
+ ret[fmt.Sprint(i)] = fmt.Sprint(i)
+ }
+ return ret
+}
+
+func TestModifiedSymbols(t *testing.T) {
+ t.Run("too many changed", func(t *testing.T) {
+ ret := modifiedSymbols(map[string]string{
+ "functionA": "hash1",
+ "functionB": "hash2",
+ }, map[string]string{
+ "functionA": "hash1",
+ "functionB": "hash is not hash2",
+ })
+ assert.Empty(t, ret)
+ })
+ t.Run("less than threshold", func(t *testing.T) {
+ base, patched := dummySymbolHashes(), dummySymbolHashes()
+ base["function"] = "hash1"
+ patched["function"] = "hash2"
+ base["function2"] = "hash1"
+ patched["function2"] = "hash2"
+ assert.Equal(t, []string{"function", "function2"}, modifiedSymbols(base, patched))
+ })
+}