From a2bdbd8c37841cc507a2ad59f25d90d6467e5858 Mon Sep 17 00:00:00 2001 From: Zubin Mithra Date: Tue, 8 Oct 2019 15:57:52 -0700 Subject: pkg/bisect: add initial testing support for cause bisection (note: incomplete change) Refactor existing code as follows: * Move reusable test utility functions from git_repo_test.go to pkg/vcs/test_util.go and make them exported. * Split Run() into Run()+runImpl(). * Change type of bisect.go:env.inst to `instance.BuilderTester`. Change usage inside syz-testbuild/testbuild.go accordingly. * Move most of linux.PreviousReleaseTags() into vcs/git.go as git.previousReleaseTags(). * Allow build.CompilerIdentity to be mocked. Introduce the following changes: * instance.BuilderTester is an interface with methods BuildSyzkaller() BuildKernel() Test() NewEnv() now returns this interface. * type testEnv implements instance.BuilderTester. * type testBuilder implements builder interface. Add a entry into table inside pkg/build/build.go:getBuilder() to return testBuilder object. --- pkg/bisect/bisect.go | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) (limited to 'pkg/bisect/bisect.go') diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go index 78cb58bd4..904be4b53 100644 --- a/pkg/bisect/bisect.go +++ b/pkg/bisect/bisect.go @@ -55,7 +55,7 @@ type env struct { repo vcs.Repo bisecter vcs.Bisecter head *vcs.Commit - inst *instance.Env + inst instance.BuilderTester numTests int buildTime time.Duration testTime time.Duration @@ -85,11 +85,30 @@ func Run(cfg *Config) ([]*vcs.Commit, *report.Report, error) { if !ok { return nil, nil, fmt.Errorf("bisection is not implemented for %v", cfg.Manager.TargetOS) } + inst, err := instance.NewEnv(&cfg.Manager) + if err != nil { + return nil, nil, err + } + if _, err = repo.CheckoutBranch(cfg.Kernel.Repo, cfg.Kernel.Branch); err != nil { + return nil, nil, err + } + + return runImpl(cfg, repo, bisecter, inst) +} + +func runImpl(cfg *Config, repo vcs.Repo, bisecter vcs.Bisecter, inst instance.BuilderTester) ( + []*vcs.Commit, *report.Report, error) { env := &env{ cfg: cfg, repo: repo, bisecter: bisecter, + inst: inst, } + head, err := repo.HeadCommit() + if err != nil { + return nil, nil, err + } + env.head = head if cfg.Fix { env.log("bisecting fixing commit since %v", cfg.Kernel.Commit) } else { @@ -135,12 +154,6 @@ func Run(cfg *Config) ([]*vcs.Commit, *report.Report, error) { func (env *env) bisect() ([]*vcs.Commit, *report.Report, error) { cfg := env.cfg var err error - if env.inst, err = instance.NewEnv(&cfg.Manager); err != nil { - return nil, nil, err - } - if env.head, err = env.repo.CheckoutBranch(cfg.Kernel.Repo, cfg.Kernel.Branch); err != nil { - return nil, nil, err - } if err := build.Clean(cfg.Manager.TargetOS, cfg.Manager.TargetVMArch, cfg.Manager.Type, cfg.Manager.KernelSrc); err != nil { return nil, nil, fmt.Errorf("kernel clean failed: %v", err) -- cgit mrf-deployment