diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-06-17 12:47:35 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-06-17 14:41:15 +0200 |
| commit | e8e63830a60fc048df976188bf726abc32045162 (patch) | |
| tree | 9e38c6b9d3e6cbaeba29cc5b29ed36aac0706d3d /pkg/ipc/ipc_test.go | |
| parent | baad3b4b027658f49ba318c41dfc745788ba87d1 (diff) | |
pkg/ipc: move from ipc
Diffstat (limited to 'pkg/ipc/ipc_test.go')
| -rw-r--r-- | pkg/ipc/ipc_test.go | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/pkg/ipc/ipc_test.go b/pkg/ipc/ipc_test.go new file mode 100644 index 000000000..b7d591d5d --- /dev/null +++ b/pkg/ipc/ipc_test.go @@ -0,0 +1,109 @@ +// Copyright 2015 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 ipc + +import ( + "math/rand" + "os" + "path/filepath" + "testing" + "time" + + "github.com/google/syzkaller/pkg/csource" + "github.com/google/syzkaller/pkg/fileutil" + "github.com/google/syzkaller/prog" +) + +const timeout = 10 * time.Second + +func buildExecutor(t *testing.T) string { + return buildProgram(t, filepath.FromSlash("../../executor/executor.cc")) +} + +func buildSource(t *testing.T, src []byte) string { + tmp, err := fileutil.WriteTempFile(src) + if err != nil { + t.Fatalf("%v", err) + } + defer os.Remove(tmp) + return buildProgram(t, tmp) +} + +func buildProgram(t *testing.T, src string) string { + bin, err := csource.Build("c++", src) + if err != nil { + t.Fatalf("%v", err) + } + return bin +} + +func initTest(t *testing.T) (rand.Source, int) { + t.Parallel() + iters := 100 + if testing.Short() { + iters = 10 + } + seed := int64(time.Now().UnixNano()) + rs := rand.NewSource(seed) + t.Logf("seed=%v", seed) + return rs, iters +} + +func TestEmptyProg(t *testing.T) { + bin := buildExecutor(t) + defer os.Remove(bin) + + cfg := Config{ + Timeout: timeout, + } + env, err := MakeEnv(bin, 0, cfg) + if err != nil { + t.Fatalf("failed to create env: %v", err) + } + defer env.Close() + + p := new(prog.Prog) + opts := &ExecOpts{} + output, _, failed, hanged, err := env.Exec(opts, p) + if err != nil { + t.Fatalf("failed to run executor: %v", err) + } + if len(output) != 0 { + t.Fatalf("output on empty program") + } + if failed || hanged { + t.Fatalf("empty program failed") + } +} + +func TestExecute(t *testing.T) { + rs, iters := initTest(t) + flags := []uint64{0, FlagThreaded, FlagThreaded | FlagCollide} + + bin := buildExecutor(t) + defer os.Remove(bin) + + for _, flag := range flags { + t.Logf("testing flags 0x%x\n", flag) + cfg := Config{ + Flags: flag, + Timeout: timeout, + } + env, err := MakeEnv(bin, 0, cfg) + if err != nil { + t.Fatalf("failed to create env: %v", err) + } + defer env.Close() + + for i := 0; i < iters/len(flags); i++ { + p := prog.Generate(rs, 10, nil) + opts := &ExecOpts{} + output, _, _, _, err := env.Exec(opts, p) + if err != nil { + t.Logf("program:\n%s\n", p.Serialize()) + t.Fatalf("failed to run executor: %v\n%s", err, output) + } + } + } +} |
