aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/instance/instance_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/instance/instance_test.go')
-rw-r--r--pkg/instance/instance_test.go134
1 files changed, 134 insertions, 0 deletions
diff --git a/pkg/instance/instance_test.go b/pkg/instance/instance_test.go
new file mode 100644
index 000000000..9b75f3344
--- /dev/null
+++ b/pkg/instance/instance_test.go
@@ -0,0 +1,134 @@
+// Copyright 2018 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 instance
+
+import (
+ "flag"
+ "os"
+ "runtime"
+ "strings"
+ "testing"
+)
+
+func TestFuzzerCmd(t *testing.T) {
+ // IMPORTANT: if this test fails, do not fix it by changing flags here!
+ // Test how an old version of syz-fuzzer parses flags genereated by the current FuzzerCmd.
+ // This actually happens in syz-ci when we test a patch for an old bug and use an old syz-fuzzer/execprog.
+ flags := flag.NewFlagSet("", flag.ContinueOnError)
+ flagName := flags.String("name", "", "unique name for manager")
+ flagArch := flags.String("arch", "", "target arch")
+ flagManager := flags.String("manager", "", "manager rpc address")
+ flagProcs := flags.Int("procs", 1, "number of parallel test processes")
+ flagLeak := flags.Bool("leak", false, "detect memory leaks")
+ flagOutput := flags.String("output", "stdout", "write programs to none/stdout/dmesg/file")
+ flagPprof := flags.String("pprof", "", "address to serve pprof profiles")
+ flagTest := flags.Bool("test", false, "enable image testing mode") // used by syz-ci
+ flagExecutor := flags.String("executor", "./syz-executor", "path to executor binary")
+ flagSignal := flags.Bool("cover", false, "collect feedback signals (coverage)")
+ flagSandbox := flags.String("sandbox", "none", "sandbox for fuzzing (none/setuid/namespace)")
+ flagDebug := flags.Bool("debug", false, "debug output from executor")
+ flagV := flags.Int("v", 0, "verbosity")
+ cmdLine := FuzzerCmd(os.Args[0], "/myexecutor", "myname", "linux", "386", "localhost:1234", "namespace", 3, 5, true, false, true, false)
+ args := strings.Split(cmdLine, " ")[1:]
+ if err := flags.Parse(args); err != nil {
+ t.Fatal(err)
+ }
+ if *flagName != "myname" {
+ t.Errorf("bad name: %q, want: %q", *flagName, "myname")
+ }
+ if *flagArch != "386" {
+ t.Errorf("bad arch: %q, want: %q", *flagArch, "386")
+ }
+ if *flagManager != "localhost:1234" {
+ t.Errorf("bad manager: %q, want: %q", *flagManager, "localhost:1234")
+ }
+ if *flagProcs != 3 {
+ t.Errorf("bad procs: %v, want: %v", *flagProcs, 3)
+ }
+ if *flagLeak != false {
+ t.Errorf("bad leak: %v, want: %v", *flagLeak, false)
+ }
+ if *flagOutput != "stdout" {
+ t.Errorf("bad output: %q, want: %q", *flagOutput, "stdout")
+ }
+ if *flagPprof != "" {
+ t.Errorf("bad pprof: %q, want: %q", *flagPprof, "")
+ }
+ if *flagTest != true {
+ t.Errorf("bad test: %v, want: %v", *flagTest, true)
+ }
+ if *flagExecutor != "/myexecutor" {
+ t.Errorf("bad executor: %q, want: %q", *flagExecutor, "/myexecutor")
+ }
+ if *flagSandbox != "namespace" {
+ t.Errorf("bad sandbox: %q, want: %q", *flagSandbox, "namespace")
+ }
+ if *flagSignal != true {
+ t.Errorf("bad signal: %v, want: %v", *flagSignal, true)
+ }
+ if *flagDebug != false {
+ t.Errorf("bad debug: %v, want: %v", *flagDebug, false)
+ }
+ if *flagV != 5 {
+ t.Errorf("bad verbosity: %v, want: %v", *flagV, 5)
+ }
+}
+
+func TestExecprogCmd(t *testing.T) {
+ // IMPORTANT: if this test fails, do not fix it by changing flags here!
+ // See comment in TestFuzzerCmd.
+ flags := flag.NewFlagSet("", flag.ContinueOnError)
+ flagOS := flags.String("os", runtime.GOOS, "target os")
+ flagArch := flags.String("arch", "", "target arch")
+ flagRepeat := flags.Int("repeat", 1, "repeat execution that many times (0 for infinite loop)")
+ flagProcs := flags.Int("procs", 1, "number of parallel processes to execute programs")
+ flagFaultCall := flags.Int("fault_call", -1, "inject fault into this call (0-based)")
+ flagFaultNth := flags.Int("fault_nth", 0, "inject fault on n-th operation (0-based)")
+ flagExecutor := flags.String("executor", "./syz-executor", "path to executor binary")
+ flagThreaded := flags.Bool("threaded", true, "use threaded mode in executor")
+ flagCollide := flags.Bool("collide", true, "collide syscalls to provoke data races")
+ flagSignal := flags.Bool("cover", false, "collect feedback signals (coverage)")
+ flagSandbox := flags.String("sandbox", "none", "sandbox for fuzzing (none/setuid/namespace)")
+ cmdLine := ExecprogCmd(os.Args[0], "/myexecutor", "fuchsia", "386", "namespace", true, false, false, 7, 2, 3, "myprog")
+ args := strings.Split(cmdLine, " ")[1:]
+ if err := flags.Parse(args); err != nil {
+ t.Fatal(err)
+ }
+ if len(flags.Args()) != 1 || flags.Arg(0) != "myprog" {
+ t.Errorf("bad args: %q, want: %q", flags.Args(), "myprog")
+ }
+ if *flagOS != runtime.GOOS {
+ t.Errorf("bad os: %q, want: %q", *flagOS, runtime.GOOS)
+ }
+ if *flagArch != "386" {
+ t.Errorf("bad arch: %q, want: %q", *flagArch, "386")
+ }
+ if *flagRepeat != 0 {
+ t.Errorf("bad repeat: %v, want: %v", *flagRepeat, 0)
+ }
+ if *flagProcs != 7 {
+ t.Errorf("bad procs: %v, want: %v", *flagProcs, 7)
+ }
+ if *flagFaultCall != 2 {
+ t.Errorf("bad procs: %v, want: %v", *flagFaultCall, 2)
+ }
+ if *flagFaultNth != 3 {
+ t.Errorf("bad procs: %v, want: %v", *flagFaultNth, 3)
+ }
+ if *flagExecutor != "/myexecutor" {
+ t.Errorf("bad executor: %q, want: %q", *flagExecutor, "/myexecutor")
+ }
+ if *flagSandbox != "namespace" {
+ t.Errorf("bad sandbox: %q, want: %q", *flagSandbox, "namespace")
+ }
+ if *flagSignal != false {
+ t.Errorf("bad signal: %v, want: %v", *flagSignal, false)
+ }
+ if *flagThreaded != false {
+ t.Errorf("bad threaded: %v, want: %v", *flagThreaded, false)
+ }
+ if *flagCollide != false {
+ t.Errorf("bad collide: %v, want: %v", *flagCollide, false)
+ }
+}