aboutsummaryrefslogtreecommitdiffstats
path: root/prog/test
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2019-04-01 12:20:19 +0200
committerDmitry Vyukov <dvyukov@google.com>2019-04-01 12:20:19 +0200
commit44fe9159be031342cb956bde7dc3f3fa0340d9af (patch)
tree234a97e0f1c423bbf9c812497b0bad337cbe9060 /prog/test
parent36b433b718e36d924005b19a1d1525c928171aff (diff)
prog/test: rename prog/fuzz to prog/test
gometalinter complained about fuzz.FuzzFoo names, but go-fuzz now requires all fuzz functions to start with Fuzz. So move the package to prog/test.
Diffstat (limited to 'prog/test')
-rw-r--r--prog/test/fuzz.go74
-rw-r--r--prog/test/fuzz_test.go30
2 files changed, 104 insertions, 0 deletions
diff --git a/prog/test/fuzz.go b/prog/test/fuzz.go
new file mode 100644
index 000000000..e86509237
--- /dev/null
+++ b/prog/test/fuzz.go
@@ -0,0 +1,74 @@
+// Copyright 2019 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 test
+
+import (
+ "bytes"
+ "fmt"
+ "math/rand"
+
+ "github.com/google/syzkaller/prog"
+ _ "github.com/google/syzkaller/sys/test/gen" // import the target we use for fuzzing
+)
+
+func FuzzDeserialize(data []byte) int {
+ p0, err0 := fuzzTarget.Deserialize(data, prog.NonStrict)
+ p1, err1 := fuzzTarget.Deserialize(data, prog.Strict)
+ if p0 == nil {
+ if p1 != nil {
+ panic("NonStrict is stricter than Strict")
+ }
+ if err0 == nil || err1 == nil {
+ panic("no error")
+ }
+ return 0
+ }
+ if err0 != nil {
+ panic("got program and error")
+ }
+ data0 := p0.Serialize()
+ if p1 != nil {
+ if err1 != nil {
+ panic("got program and error")
+ }
+ if !bytes.Equal(data0, p1.Serialize()) {
+ panic("got different data")
+ }
+ }
+ p2, err2 := fuzzTarget.Deserialize(data0, prog.NonStrict)
+ if err2 != nil {
+ panic(fmt.Sprintf("failed to parse serialized: %v\n%s", err2, data0))
+ }
+ if !bytes.Equal(data0, p2.Serialize()) {
+ panic("got different data")
+ }
+ p3 := p0.Clone()
+ if !bytes.Equal(data0, p3.Serialize()) {
+ panic("got different data")
+ }
+ if n, err := p0.SerializeForExec(fuzzBuffer); err == nil {
+ if _, err := fuzzTarget.DeserializeExec(fuzzBuffer[:n]); err != nil {
+ panic(err)
+ }
+ }
+ p3.Mutate(rand.NewSource(0), 3, nil, nil)
+ return 0
+}
+
+func FuzzParseLog(data []byte) int {
+ if len(fuzzTarget.ParseLog(data)) != 0 {
+ return 1
+ }
+ return 0
+}
+
+var fuzzBuffer = make([]byte, prog.ExecBufferSize)
+var fuzzTarget = func() *prog.Target {
+ prog.Debug()
+ target, err := prog.GetTarget("test", "64")
+ if err != nil {
+ panic(err)
+ }
+ return target
+}()
diff --git a/prog/test/fuzz_test.go b/prog/test/fuzz_test.go
new file mode 100644
index 000000000..22c4066df
--- /dev/null
+++ b/prog/test/fuzz_test.go
@@ -0,0 +1,30 @@
+// Copyright 2019 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 test
+
+import (
+ "testing"
+)
+
+func TestFuzz(t *testing.T) {
+ for i, data := range []string{
+ `test$length10(&200000000000009`,
+ `test$str0(&(0x7f0000000000)='\xz+')`,
+ `syz_compare(&AUTO=""/81546506777")`,
+ `syz_compare(&AUTO=""/190734863281259)`,
+ `syz_compare(&AUTO=""/500000)`,
+ `test$vma0(&(0x7f0000000000)=0)`,
+ `test$vma0(&(0x7f0000000000)=')`,
+ `test$length10(&(0x7f0000009000),AUTO)`,
+ `syz_compare(&AUTO=""/2712404)
+mutate4()
+mutate7()
+mutate8()
+`,
+ } {
+ t.Logf("test #%v: %q", i, string(data))
+ FuzzDeserialize([]byte(data))
+ FuzzParseLog([]byte(data))
+ }
+}