From 55b6cd4333071949c60b9e52b6b201b09e837a4d Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Sun, 13 Sep 2020 19:03:51 +0200 Subject: 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. --- pkg/runtest/run.go | 37 ++++++++++++++++++++++--------------- pkg/runtest/run_test.go | 25 +++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 15 deletions(-) (limited to 'pkg') diff --git a/pkg/runtest/run.go b/pkg/runtest/run.go index 408029467..54d949249 100644 --- a/pkg/runtest/run.go +++ b/pkg/runtest/run.go @@ -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,17 +162,33 @@ 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 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(), ctx.Tests) { + !strings.HasPrefix(file.Name(), filter) { continue } - if err := ctx.generateFile(progs, sandboxes, cover, file.Name()); err != nil { - return err - } + res = append(res, file.Name()) } - return nil + return res, nil } func (ctx *Context) generateFile(progs chan *RunRequest, sandboxes []string, cover []bool, filename string) error { @@ -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 diff --git a/pkg/runtest/run_test.go b/pkg/runtest/run_test.go index d9fdadfab..29ef57237 100644 --- a/pkg/runtest/run_test.go +++ b/pkg/runtest/run_test.go @@ -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) + } + } + } + } +} -- cgit mrf-deployment