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  }