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 }