From a2f9a446496d23c4bf6db95e0d4337583595c78c Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 17 Mar 2020 10:44:38 +0100 Subject: prog: export deserialization test helper for sys/{linux,openbsd} sys/{linux,openbsd} duplicate deserialization test logic as well. Export and reuse the existing helper function. --- prog/test_util.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 prog/test_util.go (limited to 'prog/test_util.go') diff --git a/prog/test_util.go b/prog/test_util.go new file mode 100644 index 000000000..bb96a64e8 --- /dev/null +++ b/prog/test_util.go @@ -0,0 +1,72 @@ +// Copyright 2020 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 prog + +import ( + "fmt" + "strings" + "testing" +) + +func InitTargetTest(t *testing.T, os, arch string) *Target { + t.Parallel() + target, err := GetTarget(os, arch) + if err != nil { + t.Fatal(err) + } + return target +} + +type DeserializeTest struct { + In string + Out string + Err string + StrictErr string +} + +func TestDeserializeHelper(t *testing.T, OS, arch string, transform func(*Target, *Prog), tests []DeserializeTest) { + target := InitTargetTest(t, OS, arch) + buf := make([]byte, ExecBufferSize) + for testidx, test := range tests { + t.Run(fmt.Sprint(testidx), func(t *testing.T) { + if test.StrictErr == "" { + test.StrictErr = test.Err + } + if test.Err != "" && test.Out != "" { + t.Fatalf("both Err and Out are set") + } + for _, mode := range []DeserializeMode{NonStrict, Strict} { + p, err := target.Deserialize([]byte(test.In), mode) + wantErr := test.Err + if mode == Strict { + wantErr = test.StrictErr + } + if err != nil { + if wantErr == "" { + t.Fatalf("deserialization failed with\n%s\ndata:\n%s\n", + err, test.In) + } + if !strings.Contains(err.Error(), wantErr) { + t.Fatalf("deserialization failed with\n%s\nwhich doesn't match\n%s\ndata:\n%s", + err, wantErr, test.In) + } + } else { + if wantErr != "" { + t.Fatalf("deserialization should have failed with:\n%s\ndata:\n%s\n", + wantErr, test.In) + } + if transform != nil { + transform(target, p) + } + output := strings.TrimSpace(string(p.Serialize())) + want := strings.TrimSpace(test.Out) + if want != "" && want != output { + t.Fatalf("wrong serialized data:\n%s\nexpect:\n%s\n", output, want) + } + p.SerializeForExec(buf) + } + } + }) + } +} -- cgit mrf-deployment