diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-05-25 16:37:05 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-05-29 13:15:07 +0200 |
| commit | 0fcd5fd3ddb45f5571658c4fce1589427a5bf090 (patch) | |
| tree | cf2c53985762fb05b316b2bb868d51d171fc3560 | |
| parent | 220dc49106d66ff912db835004c88f8c9e2d1707 (diff) | |
all: speed up tests
Mark tests as parallel where makes sense.
Speed up sys.TransitivelyEnabledCalls.
Execution time is now:
ok github.com/google/syzkaller/config 0.172s
ok github.com/google/syzkaller/cover 0.060s
ok github.com/google/syzkaller/csource 3.081s
ok github.com/google/syzkaller/db 0.395s
ok github.com/google/syzkaller/executor 0.060s
ok github.com/google/syzkaller/fileutil 0.106s
ok github.com/google/syzkaller/host 1.530s
ok github.com/google/syzkaller/ifuzz 0.491s
ok github.com/google/syzkaller/ipc 1.374s
ok github.com/google/syzkaller/log 0.014s
ok github.com/google/syzkaller/prog 2.604s
ok github.com/google/syzkaller/report 0.045s
ok github.com/google/syzkaller/symbolizer 0.062s
ok github.com/google/syzkaller/sys 0.365s
ok github.com/google/syzkaller/syz-dash 0.014s
ok github.com/google/syzkaller/syz-hub/state 0.427s
ok github.com/google/syzkaller/vm 0.052s
However, main time is still taken by rebuilding sys package.
Fixes #182
| -rw-r--r-- | csource/csource_test.go | 4 | ||||
| -rw-r--r-- | host/host_test.go | 2 | ||||
| -rw-r--r-- | ipc/ipc_test.go | 6 | ||||
| -rw-r--r-- | prog/rand.go | 4 | ||||
| -rw-r--r-- | sys/decl.go | 16 | ||||
| -rw-r--r-- | sys/decl_test.go | 2 | ||||
| -rw-r--r-- | vm/merger.go | 5 |
7 files changed, 32 insertions, 7 deletions
diff --git a/csource/csource_test.go b/csource/csource_test.go index b5832ad8c..78998a32f 100644 --- a/csource/csource_test.go +++ b/csource/csource_test.go @@ -15,6 +15,7 @@ import ( ) func initTest(t *testing.T) (rand.Source, int) { + t.Parallel() iters := 10 if testing.Short() { iters = 1 @@ -70,11 +71,12 @@ func TestSyz(t *testing.T) { } func Test(t *testing.T) { - rs, iters := initTest(t) + rs, _ := initTest(t) syzProg := prog.GenerateAllSyzProg(rs) t.Logf("syz program:\n%s\n", syzProg.Serialize()) for i, opts := range allOptionsPermutations() { t.Run(fmt.Sprintf("%v", i), func(t *testing.T) { + rs, iters := initTest(t) t.Logf("opts: %+v", opts) for i := 0; i < iters; i++ { p := prog.Generate(rs, 10, nil) diff --git a/host/host_test.go b/host/host_test.go index 7f58b1cd0..9b44d8e36 100644 --- a/host/host_test.go +++ b/host/host_test.go @@ -11,6 +11,7 @@ import ( ) func TestLog(t *testing.T) { + t.Parallel() // Dump for manual inspection. supp, err := DetectSupportedSyscalls() if err != nil { @@ -40,6 +41,7 @@ func TestLog(t *testing.T) { } func TestSupportedSyscalls(t *testing.T) { + t.Parallel() supp, err := DetectSupportedSyscalls() if err != nil { t.Skipf("skipping: %v", err) diff --git a/ipc/ipc_test.go b/ipc/ipc_test.go index f1aef472a..726da8485 100644 --- a/ipc/ipc_test.go +++ b/ipc/ipc_test.go @@ -38,6 +38,7 @@ func buildProgram(t *testing.T, src string) string { } func initTest(t *testing.T) (rand.Source, int) { + t.Parallel() iters := 100 if testing.Short() { iters = 10 @@ -76,11 +77,12 @@ func TestEmptyProg(t *testing.T) { } func TestExecute(t *testing.T) { + rs, iters := initTest(t) + flags := []uint64{0, FlagThreaded, FlagThreaded | FlagCollide} + bin := buildExecutor(t) defer os.Remove(bin) - rs, iters := initTest(t) - flags := []uint64{0, FlagThreaded, FlagThreaded | FlagCollide} for _, flag := range flags { t.Logf("testing flags 0x%x\n", flag) cfg := Config{ diff --git a/prog/rand.go b/prog/rand.go index 0d4596fd3..db493e1cd 100644 --- a/prog/rand.go +++ b/prog/rand.go @@ -382,8 +382,6 @@ func (r *randGen) randPageAddr(s *state, typ sys.Type, npages uintptr, data *Arg } starts = append(starts, i) } - *poolPtr = starts - pageStartPool.Put(poolPtr) var page uintptr if len(starts) != 0 { page = starts[r.rand(len(starts))] @@ -393,6 +391,8 @@ func (r *randGen) randPageAddr(s *state, typ sys.Type, npages uintptr, data *Arg if !vma { npages = 0 } + *poolPtr = starts + pageStartPool.Put(poolPtr) return pointerArg(typ, page, 0, npages, data) } diff --git a/sys/decl.go b/sys/decl.go index 270ae4582..0956a94ee 100644 --- a/sys/decl.go +++ b/sys/decl.go @@ -521,14 +521,26 @@ func TransitivelyEnabledCalls(enabled map[*Call]bool) map[*Call]bool { for c := range enabled { supported[c] = true } + inputResources := make(map[*Call][]*ResourceType) + ctors := make(map[string][]*Call) + for c := range supported { + inputs := c.InputResources() + inputResources[c] = inputs + for _, res := range inputs { + if _, ok := ctors[res.Desc.Name]; ok { + continue + } + ctors[res.Desc.Name] = resourceCtors(res.Desc.Kind, true) + } + } for { n := len(supported) haveGettime := supported[CallMap["clock_gettime"]] for c := range supported { canCreate := true - for _, res := range c.InputResources() { + for _, res := range inputResources[c] { noctors := true - for _, ctor := range resourceCtors(res.Desc.Kind, true) { + for _, ctor := range ctors[res.Desc.Name] { if supported[ctor] { noctors = false break diff --git a/sys/decl_test.go b/sys/decl_test.go index c41a95e43..18385c321 100644 --- a/sys/decl_test.go +++ b/sys/decl_test.go @@ -8,6 +8,7 @@ import ( ) func TestTransitivelyEnabledCalls(t *testing.T) { + t.Parallel() calls := make(map[*Call]bool) for _, c := range Calls { calls[c] = true @@ -37,6 +38,7 @@ func TestTransitivelyEnabledCalls(t *testing.T) { } func TestClockGettime(t *testing.T) { + t.Parallel() calls := make(map[*Call]bool) for _, c := range Calls { calls[c] = true diff --git a/vm/merger.go b/vm/merger.go index c3b5c16d0..2902eda6c 100644 --- a/vm/merger.go +++ b/vm/merger.go @@ -13,6 +13,7 @@ import ( type OutputMerger struct { Output chan []byte Err chan error + teeMu sync.Mutex tee io.Writer wg sync.WaitGroup } @@ -42,7 +43,9 @@ func (merger *OutputMerger) Add(name string, r io.ReadCloser) { if pos := bytes.LastIndexByte(pending, '\n'); pos != -1 { out := pending[:pos+1] if merger.tee != nil { + merger.teeMu.Lock() merger.tee.Write(out) + merger.teeMu.Unlock() } select { case merger.Output <- append([]byte{}, out...): @@ -56,7 +59,9 @@ func (merger *OutputMerger) Add(name string, r io.ReadCloser) { if len(pending) != 0 { pending = append(pending, '\n') if merger.tee != nil { + merger.teeMu.Lock() merger.tee.Write(pending) + merger.teeMu.Unlock() } select { case merger.Output <- pending: |
