mirror of
https://github.com/reactos/syzkaller.git
synced 2025-02-17 01:58:02 +00:00
pkg/runtest: test parsing of all tests
Currently we only test parsing in tools/syz-runtest and for test OS in pkg/runtest tests. This means errors in tests for other OSes won't be noticed until somebody runs tests manually. Test parsing of all tests in pkg/runtest tests. Fix up 2 broken tests.
This commit is contained in:
parent
c52d06e410
commit
55b6cd4333
@ -153,10 +153,6 @@ func (ctx *Context) Run() error {
|
||||
}
|
||||
|
||||
func (ctx *Context) generatePrograms(progs chan *RunRequest) error {
|
||||
files, err := ioutil.ReadDir(ctx.Dir)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read %v: %v", ctx.Dir, err)
|
||||
}
|
||||
cover := []bool{false}
|
||||
if ctx.Features[host.FeatureCoverage].Enabled {
|
||||
cover = append(cover, true)
|
||||
@ -166,19 +162,35 @@ func (ctx *Context) generatePrograms(progs chan *RunRequest) error {
|
||||
sandboxes = append(sandboxes, sandbox)
|
||||
}
|
||||
sort.Strings(sandboxes)
|
||||
files, err := progFileList(ctx.Dir, ctx.Tests)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, file := range files {
|
||||
if strings.HasSuffix(file.Name(), "~") ||
|
||||
strings.HasSuffix(file.Name(), ".swp") ||
|
||||
!strings.HasPrefix(file.Name(), ctx.Tests) {
|
||||
continue
|
||||
}
|
||||
if err := ctx.generateFile(progs, sandboxes, cover, file.Name()); err != nil {
|
||||
if err := ctx.generateFile(progs, sandboxes, cover, file); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func progFileList(dir, filter string) ([]string, error) {
|
||||
files, err := ioutil.ReadDir(dir)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to read %v: %v", dir, err)
|
||||
}
|
||||
var res []string
|
||||
for _, file := range files {
|
||||
if strings.HasSuffix(file.Name(), "~") ||
|
||||
strings.HasSuffix(file.Name(), ".swp") ||
|
||||
!strings.HasPrefix(file.Name(), filter) {
|
||||
continue
|
||||
}
|
||||
res = append(res, file.Name())
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (ctx *Context) generateFile(progs chan *RunRequest, sandboxes []string, cover []bool, filename string) error {
|
||||
p, requires, results, err := ctx.parseProg(filename)
|
||||
if err != nil {
|
||||
@ -264,11 +276,6 @@ func (ctx *Context) parseProg(filename string) (*prog.Prog, map[string]bool, *ip
|
||||
return parseProg(ctx.Target, ctx.Dir, filename)
|
||||
}
|
||||
|
||||
func TestParseProg(target *prog.Target, dir, filename string) error {
|
||||
_, _, _, err := parseProg(target, dir, filename)
|
||||
return err
|
||||
}
|
||||
|
||||
func parseProg(target *prog.Target, dir, filename string) (*prog.Prog, map[string]bool, *ipc.ProgInfo, error) {
|
||||
data, err := ioutil.ReadFile(filepath.Join(dir, filename))
|
||||
if err != nil {
|
||||
@ -323,7 +330,7 @@ func parseProg(target *prog.Target, dir, filename string) (*prog.Prog, map[strin
|
||||
default:
|
||||
res, ok := errnos[call.Comment]
|
||||
if !ok {
|
||||
return nil, nil, nil, fmt.Errorf("%v: unknown comment %q",
|
||||
return nil, nil, nil, fmt.Errorf("%v: unknown call comment %q",
|
||||
filename, call.Comment)
|
||||
}
|
||||
info.Calls[i].Errno = res
|
||||
|
@ -12,6 +12,7 @@ import (
|
||||
|
||||
"github.com/google/syzkaller/pkg/csource"
|
||||
"github.com/google/syzkaller/pkg/host"
|
||||
"github.com/google/syzkaller/pkg/osutil"
|
||||
"github.com/google/syzkaller/prog"
|
||||
"github.com/google/syzkaller/sys/targets"
|
||||
_ "github.com/google/syzkaller/sys/test/gen" // pull in the test target
|
||||
@ -95,3 +96,27 @@ func test(t *testing.T, sysTarget *targets.Target) {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParsing(t *testing.T) {
|
||||
for OS, arches := range targets.List {
|
||||
dir := filepath.Join("..", "..", "sys", OS, "test")
|
||||
if !osutil.IsExist(dir) {
|
||||
continue
|
||||
}
|
||||
files, err := progFileList(dir, "")
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for arch := range arches {
|
||||
target, err := prog.GetTarget(OS, arch)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
for _, file := range files {
|
||||
if _, _, _, err := parseProg(target, dir, file); err != nil {
|
||||
t.Errorf("failed to parse %v/%v for %v: %v", dir, file, arch, err)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2,7 +2,11 @@ mkdirat(0xffffffffffffff9c, &AUTO='./file0\x00', 0x0)
|
||||
r0 = openat$fuse(0xffffffffffffff9c, &AUTO='/dev/fuse\x00', 0x2, 0x0)
|
||||
mount$fuse(0x0, &AUTO='./file0\x00', &AUTO='fuse\x00', 0x0, &AUTO={{'fd', 0x3d, r0}, 0x2c, {'rootmode', 0x3d, 0x4000}, 0x2c, {'user_id', 0x3d, 0x0}, 0x2c, {'group_id', 0x3d, 0x0}, 0x2c, {[], [], 0x0}})
|
||||
r1 = openat$dir(0xffffffffffffff9c, &AUTO='./file0\x00', 0x0, 0x0)
|
||||
|
||||
# FUSE_INIT
|
||||
|
||||
syz_fuse_handle_req(r0, &AUTO=""/8192, AUTO, &AUTO={&AUTO={AUTO, 0x0, 0x0, {AUTO, AUTO, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, AUTO, AUTO, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]}}, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0})
|
||||
|
||||
# FUSE_OPENDIR
|
||||
|
||||
syz_fuse_handle_req(r0, &AUTO=""/8192, AUTO, &AUTO={0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, &AUTO={AUTO, 0x0, 0x0, {0x0, 0x0, 0x0}}, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0})
|
||||
|
@ -2,7 +2,11 @@ r0 = openat$fuse(0xffffffffffffff9c, &AUTO='/dev/fuse\x00', 0x2, 0x0)
|
||||
r1 = getuid()
|
||||
r2 = getgid()
|
||||
r3 = syz_mount_image$fuse(&AUTO='fuse\x00', &AUTO='./file0\x00', 0x0, 0x0, 0x0, 0x0, &AUTO={{'fd', 0x3d, r0}, 0x2c, {'rootmode', 0x3d, 0x4000}, 0x2c, {'user_id', 0x3d, r1}, 0x2c, {'group_id', 0x3d, r2}, 0x2c, {[], [], 0x0}})
|
||||
|
||||
# FUSE_INIT
|
||||
|
||||
syz_fuse_handle_req(r0, &AUTO=""/8192, AUTO, &AUTO={&AUTO={AUTO, 0x0, 0x0, {AUTO, AUTO, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, AUTO, AUTO, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]}}, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0})
|
||||
|
||||
# FUSE_OPENDIR
|
||||
|
||||
syz_fuse_handle_req(r0, &AUTO=""/8192, AUTO, &AUTO={0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, &AUTO={AUTO, 0x0, 0x0, {0x0, 0x0, 0x0}}, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0})
|
||||
|
@ -15,7 +15,6 @@ import (
|
||||
"net"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
@ -47,10 +46,6 @@ func main() {
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
testDir := filepath.Join(cfg.Syzkaller, "sys", target.OS, "test")
|
||||
if err := testParsing(target, testDir); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
vmPool, err := vm.Create(cfg, *flagDebug)
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
@ -121,7 +116,7 @@ func main() {
|
||||
fmt.Printf("%-24v: %v calls enabled\n", sandbox+" sandbox", len(calls))
|
||||
}
|
||||
ctx := &runtest.Context{
|
||||
Dir: testDir,
|
||||
Dir: filepath.Join(cfg.Syzkaller, "sys", target.OS, "test"),
|
||||
Target: target,
|
||||
Features: mgr.checkResult.Features,
|
||||
EnabledCalls: enabledCalls,
|
||||
@ -288,25 +283,3 @@ func (mgr *Manager) Done(a *rpctype.RunTestDoneArgs, r *int) error {
|
||||
close(req.Done)
|
||||
return nil
|
||||
}
|
||||
|
||||
func testParsing(target *prog.Target, dir string) error {
|
||||
files, err := ioutil.ReadDir(dir)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to read %v: %v", dir, err)
|
||||
}
|
||||
for _, file := range files {
|
||||
if strings.HasSuffix(file.Name(), "~") {
|
||||
continue
|
||||
}
|
||||
if strings.HasSuffix(file.Name(), ".swp") {
|
||||
continue
|
||||
}
|
||||
if !strings.HasPrefix(file.Name(), *flagTests) {
|
||||
continue
|
||||
}
|
||||
if err := runtest.TestParseProg(target, dir, file.Name()); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user