From 8b78527436f4171d1fbd1c44b1954b7807ec5ef4 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Wed, 9 Aug 2017 12:57:23 +0200 Subject: pkg/csource, pkg/repro: filter out invalid options combinations We currently have 2 invalid options combinations: - collide without threads - procs>1 without repeat They are invalid in the sense that result of csource.Write is the same for them. Filter out these combinations. This cuts csource testing time in half and reduces repro minimization time. --- pkg/csource/csource.go | 17 +++++++++++++++++ pkg/csource/csource_test.go | 10 ++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) (limited to 'pkg/csource') diff --git a/pkg/csource/csource.go b/pkg/csource/csource.go index 32415e982..e351a2e1d 100644 --- a/pkg/csource/csource.go +++ b/pkg/csource/csource.go @@ -9,6 +9,7 @@ package csource import ( "bytes" + "errors" "fmt" "io" "io/ioutil" @@ -45,7 +46,23 @@ type Options struct { Repro bool } +// Check checks if the opts combination is valid or not. +// For example, Collide without Threaded is not valid. +// Invalid combinations must not be passed to Write. +func (opts Options) Check() error { + if !opts.Threaded && opts.Collide { + return errors.New("Collide without Threaded") + } + if !opts.Repeat && opts.Procs > 1 { + return errors.New("Procs>1 without Repeat") + } + return nil +} + func Write(p *prog.Prog, opts Options) ([]byte, error) { + if err := opts.Check(); err != nil { + return nil, fmt.Errorf("csource: invalid opts: %v", err) + } exec := make([]byte, prog.ExecBufferSize) if err := p.SerializeForExec(exec, 0); err != nil { return nil, fmt.Errorf("failed to serialize program: %v", err) diff --git a/pkg/csource/csource_test.go b/pkg/csource/csource_test.go index dc703d37d..ae34a9499 100644 --- a/pkg/csource/csource_test.go +++ b/pkg/csource/csource_test.go @@ -51,7 +51,13 @@ func enumerateField(opt Options, field int) []Options { } else { panic(fmt.Sprintf("field '%v' is not boolean", fldName)) } - return opts + var checked []Options + for _, opt := range opts { + if err := opt.Check(); err == nil { + checked = append(checked, opt) + } + } + return checked } func allOptionsSingle() []Options { @@ -102,7 +108,7 @@ func TestOptions(t *testing.T) { permutations = append(permutations, allPermutations[r.Intn(len(allPermutations))]) } } else { - permutations = append(permutations, allPermutations...) + permutations = allPermutations } for i, opts := range permutations { t.Run(fmt.Sprintf("%v", i), func(t *testing.T) { -- cgit mrf-deployment