github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/syz-cluster/pkg/fuzzconfig/generate_test.go (about) 1 // Copyright 2025 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package fuzzconfig 5 6 import ( 7 "encoding/json" 8 "flag" 9 "os" 10 "path/filepath" 11 "testing" 12 13 "github.com/google/syzkaller/pkg/config" 14 "github.com/google/syzkaller/pkg/mgrconfig" 15 "github.com/google/syzkaller/syz-cluster/pkg/api" 16 "github.com/stretchr/testify/assert" 17 "github.com/stretchr/testify/require" 18 ) 19 20 var flagWrite = flag.Bool("write", false, "overwrite out.txt files") 21 22 func TestSingularFocus(t *testing.T) { 23 focusMap := map[string]struct{}{} 24 for _, target := range api.FuzzTargets { 25 for _, campaign := range target.Campaigns { 26 if campaign.Focus != "" { 27 focusMap[campaign.Focus] = struct{}{} 28 } 29 } 30 } 31 for focus := range focusMap { 32 t.Run(focus, func(t *testing.T) { 33 cfg := &api.FuzzConfig{Focus: []string{focus}} 34 runTest(t, cfg, filepath.Join("testdata", "singular", focus)) 35 }) 36 } 37 } 38 39 func TestNoFocus(t *testing.T) { 40 runTest(t, &api.FuzzConfig{}, filepath.Join("testdata", "singular", "default")) 41 } 42 43 func TestMultipleFocus(t *testing.T) { 44 runTest(t, &api.FuzzConfig{ 45 Focus: []string{api.FocusBPF, api.FocusIoUring}, 46 }, filepath.Join("testdata", "mixed", "bpf_io_uring")) 47 } 48 49 func runTest(t *testing.T, cfg *api.FuzzConfig, baseName string) { 50 base, err := GenerateBase(cfg) 51 require.NoError(t, err) 52 compareOrSave(t, baseName+".base.cfg", base) 53 54 patched, err := GeneratePatched(cfg) 55 require.NoError(t, err) 56 compareOrSave(t, baseName+".patched.cfg", patched) 57 } 58 59 func compareOrSave(t *testing.T, fileName string, mgrCfg *mgrconfig.Config) { 60 targetJSON, err := json.MarshalIndent(mgrCfg, "", "\t") 61 require.NoError(t, err) 62 if *flagWrite { 63 err = os.WriteFile(fileName, targetJSON, 0644) 64 require.NoError(t, err) 65 return 66 } 67 68 var raw json.RawMessage 69 err = config.LoadFile(fileName, &raw) 70 require.NoError(t, err) 71 72 cfg, err := mgrconfig.LoadPartialData(raw) 73 require.NoError(t, err) 74 require.NotNil(t, cfg) 75 76 resultJSON, err := json.MarshalIndent(cfg, "", "\t") 77 require.NoError(t, err) 78 assert.Equal(t, targetJSON, resultJSON) 79 }