diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2026-01-23 17:18:49 +0100 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2026-01-23 20:35:29 +0000 |
| commit | 4f25b9b48bdfbc7adeaf320f8d92067afe509b49 (patch) | |
| tree | e66a51fc3786e8bb8abba5ca89cfc152a59e971f /pkg/manager/diff/patch_test.go | |
| parent | b4afeb6fb8cde041ba03048f5e123ed3f304a5e6 (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.go | 109 |
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)) + }) +} |
