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:
Dmitry Vyukov 2020-09-13 19:03:51 +02:00
parent c52d06e410
commit 55b6cd4333
5 changed files with 57 additions and 44 deletions

View File

@ -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

View File

@ -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)
}
}
}
}
}

View File

@ -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})

View File

@ -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})

View File

@ -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
}