github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/pkg/instance/instance_test.go (about)

     1  // Copyright 2018 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 instance
     5  
     6  import (
     7  	"flag"
     8  	"os"
     9  	"runtime"
    10  	"strings"
    11  	"testing"
    12  
    13  	"github.com/google/syzkaller/pkg/csource"
    14  	"github.com/google/syzkaller/pkg/tool"
    15  	"github.com/google/syzkaller/sys/targets"
    16  )
    17  
    18  func TestExecprogCmd(t *testing.T) {
    19  	// IMPORTANT: if this test fails, do not fix it by changing flags here!
    20  	// This test checks that an old version of syz-execprog can parse flags generated by the
    21  	// current ExecprogCmd.
    22  	// If you need to make changes to syz-execprog's flags, consider using `OptionalFlags`.
    23  	flags := flag.NewFlagSet("", flag.ContinueOnError)
    24  	flagOS := flags.String("os", runtime.GOOS, "target os")
    25  	flagArch := flags.String("arch", "", "target arch")
    26  	flagRepeat := flags.Int("repeat", 1, "repeat execution that many times (0 for infinite loop)")
    27  	flagProcs := flags.Int("procs", 1, "number of parallel processes to execute programs")
    28  	flagFaultCall := flags.Int("fault_call", -1, "inject fault into this call (0-based)")
    29  	flagFaultNth := flags.Int("fault_nth", 0, "inject fault on n-th operation (0-based)")
    30  	flagExecutor := flags.String("executor", "./syz-executor", "path to executor binary")
    31  	flagThreaded := flags.Bool("threaded", true, "use threaded mode in executor")
    32  	// In the older syzkaller versions `collide` flag defaulted to `true`, but in this
    33  	// test we can change it to false (new default), because syzkaller always explicitly
    34  	// sets this flag and never relies on the default value.
    35  	flagCollide := flags.Bool("collide", false, "collide syscalls to provoke data races")
    36  	flagSignal := flags.Bool("cover", false, "collect feedback signals (coverage)")
    37  	flagSandbox := flags.String("sandbox", "none", "sandbox for fuzzing (none/setuid/namespace/android)")
    38  	flagSlowdown := flags.Int("slowdown", 1, "")
    39  	flagSandboxArg := flags.Int("sandbox_arg", 0, "argument for sandbox runner to adjust it via config")
    40  	cmdLine := ExecprogCmd(os.Args[0], "/myexecutor", targets.FreeBSD, targets.I386, "vmtype",
    41  		csource.Options{
    42  			Sandbox:    "namespace",
    43  			SandboxArg: 3,
    44  			Repeat:     true,
    45  			Threaded:   false,
    46  			Procs:      7,
    47  			LegacyOptions: csource.LegacyOptions{
    48  				Collide:   true,
    49  				Fault:     true,
    50  				FaultCall: 2,
    51  				FaultNth:  3,
    52  			},
    53  		}, true, 10, "myprog")
    54  	args := strings.Split(cmdLine, " ")[1:]
    55  	if err := tool.ParseFlags(flags, args); err != nil {
    56  		t.Fatal(err)
    57  	}
    58  	if len(flags.Args()) != 1 || flags.Arg(0) != "myprog" {
    59  		t.Errorf("bad args: %q, want: %q", flags.Args(), "myprog")
    60  	}
    61  	if *flagOS != runtime.GOOS {
    62  		t.Errorf("bad os: %q, want: %q", *flagOS, runtime.GOOS)
    63  	}
    64  	if *flagArch != targets.I386 {
    65  		t.Errorf("bad arch: %q, want: %q", *flagArch, targets.I386)
    66  	}
    67  	if *flagRepeat != 0 {
    68  		t.Errorf("bad repeat: %v, want: %v", *flagRepeat, 0)
    69  	}
    70  	if *flagProcs != 7 {
    71  		t.Errorf("bad procs: %v, want: %v", *flagProcs, 7)
    72  	}
    73  	if *flagFaultCall != 2 {
    74  		t.Errorf("bad procs: %v, want: %v", *flagFaultCall, 2)
    75  	}
    76  	if *flagFaultNth != 3 {
    77  		t.Errorf("bad procs: %v, want: %v", *flagFaultNth, 3)
    78  	}
    79  	if *flagExecutor != "/myexecutor" {
    80  		t.Errorf("bad executor: %q, want: %q", *flagExecutor, "/myexecutor")
    81  	}
    82  	if *flagSandbox != "namespace" {
    83  		t.Errorf("bad sandbox: %q, want: %q", *flagSandbox, "namespace")
    84  	}
    85  	if *flagSandboxArg != 3 {
    86  		t.Errorf("bad sandbox_arg: %q, want: %q", *flagSandboxArg, 3)
    87  	}
    88  	if *flagSignal {
    89  		t.Errorf("bad signal: %v, want: %v", *flagSignal, false)
    90  	}
    91  	if *flagThreaded {
    92  		t.Errorf("bad threaded: %v, want: %v", *flagThreaded, false)
    93  	}
    94  	if !*flagCollide {
    95  		t.Errorf("bad collide: %v, want: %v", *flagCollide, true)
    96  	}
    97  	if *flagSlowdown != 10 {
    98  		t.Errorf("bad slowdown: %v, want: %v", *flagSlowdown, 10)
    99  	}
   100  }
   101  
   102  func TestRunnerCmd(t *testing.T) {
   103  	flags := flag.NewFlagSet("", flag.ContinueOnError)
   104  	flagFwdAddr := flags.String("addr", "", "verifier rpc address")
   105  	flagOS := flags.String("os", "", "target OS")
   106  	flagArch := flags.String("arch", "", "target architecture")
   107  	flagPool := flags.Int("pool", 0, "index of pool that started VM")
   108  	flagVM := flags.Int("vm", 0, "index of VM that started the Runner")
   109  	flagThreaded := flags.Bool("threaded", true, "use threaded mode in executor")
   110  	flagEnv := flags.Bool("new-env", true, "create a new environment for each program")
   111  
   112  	cmdLine := RunnerCmd(os.Args[0], "localhost:1234", targets.Linux, targets.AMD64, 0, 0, false, false)
   113  	args := strings.Split(cmdLine, " ")[1:]
   114  	if err := flags.Parse(args); err != nil {
   115  		t.Fatalf("error parsing flags: %v, want: nil", err)
   116  	}
   117  
   118  	if got, want := *flagFwdAddr, "localhost:1234"; got != want {
   119  		t.Errorf("bad addr: %q, want: %q", got, want)
   120  	}
   121  
   122  	if got, want := *flagOS, targets.Linux; got != want {
   123  		t.Errorf("bad os: %q, want %q", got, want)
   124  	}
   125  
   126  	if got, want := *flagArch, targets.AMD64; got != want {
   127  		t.Errorf("bad arch: %q, want: %q", got, want)
   128  	}
   129  
   130  	if got, want := *flagPool, 0; got != want {
   131  		t.Errorf("bad pool index: %d, want: %d", got, want)
   132  	}
   133  
   134  	if got, want := *flagVM, 0; got != want {
   135  		t.Errorf("bad vm index: %d, want: %d", got, want)
   136  	}
   137  
   138  	if got, want := *flagThreaded, false; got != want {
   139  		t.Errorf("bad threaded: %t, want: %t", got, want)
   140  	}
   141  
   142  	if got, want := *flagEnv, false; got != want {
   143  		t.Errorf("bad new-env: %t, want: %t", got, want)
   144  	}
   145  }