diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2019-11-27 12:37:52 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2019-11-27 12:37:52 +0100 |
| commit | 9f5fd6fe1a3835945ce119f2b5d3633d3b81ff61 (patch) | |
| tree | cfdd469790105e25a7c5f5927d2619f6c57b5ac1 /pkg/bisect | |
| parent | 5a38f3f0660c5210d57304a7e6519d9f56bfffba (diff) | |
pkg/bisect: fix some off-by-ones
3/4 added tests currently fail.
The problem is that we don't collect results
from initial bisection range detection.
As the result we won't detect "same binary"
for release and first commit in a release.
Update #1271
Diffstat (limited to 'pkg/bisect')
| -rw-r--r-- | pkg/bisect/bisect.go | 33 | ||||
| -rw-r--r-- | pkg/bisect/bisect_test.go | 40 |
2 files changed, 59 insertions, 14 deletions
diff --git a/pkg/bisect/bisect.go b/pkg/bisect/bisect.go index c3a80a3e8..4fbeeec4f 100644 --- a/pkg/bisect/bisect.go +++ b/pkg/bisect/bisect.go @@ -187,7 +187,7 @@ func (env *env) bisect() (*Result, error) { } else if testRes.verdict != vcs.BisectBad { return nil, fmt.Errorf("the crash wasn't reproduced on the original commit") } - bad, good, rep1, err := env.commitRange() + bad, good, rep1, results1, err := env.commitRange() if err != nil { return nil, err } @@ -195,6 +195,9 @@ func (env *env) bisect() (*Result, error) { return &Result{Report: rep1, Commit: bad}, nil // still not fixed/happens on the oldest release } results := map[string]*testResult{cfg.Kernel.Commit: testRes} + for _, res := range results1 { + results[res.com.Hash] = res + } commits, err := env.bisecter.Bisect(bad.Hash, good.Hash, cfg.Trace, func() (vcs.BisectResult, error) { testRes1, err := env.test() if err != nil { @@ -232,58 +235,60 @@ func (env *env) bisect() (*Result, error) { return res, nil } -func (env *env) commitRange() (*vcs.Commit, *vcs.Commit, *report.Report, error) { +func (env *env) commitRange() (*vcs.Commit, *vcs.Commit, *report.Report, []*testResult, error) { if env.cfg.Fix { return env.commitRangeForFix() } return env.commitRangeForBug() } -func (env *env) commitRangeForFix() (*vcs.Commit, *vcs.Commit, *report.Report, error) { +func (env *env) commitRangeForFix() (*vcs.Commit, *vcs.Commit, *report.Report, []*testResult, error) { env.log("testing current HEAD %v", env.head.Hash) if _, err := env.repo.SwitchCommit(env.head.Hash); err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } res, err := env.test() if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } if res.verdict != vcs.BisectGood { - return env.head, nil, res.rep, nil + return env.head, nil, res.rep, []*testResult{res}, nil } - return env.head, env.commit, nil, nil + return env.head, env.commit, nil, []*testResult{res}, nil } -func (env *env) commitRangeForBug() (*vcs.Commit, *vcs.Commit, *report.Report, error) { +func (env *env) commitRangeForBug() (*vcs.Commit, *vcs.Commit, *report.Report, []*testResult, error) { cfg := env.cfg tags, err := env.bisecter.PreviousReleaseTags(cfg.Kernel.Commit) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } if len(tags) == 0 { - return nil, nil, nil, fmt.Errorf("no release tags before this commit") + return nil, nil, nil, nil, fmt.Errorf("no release tags before this commit") } lastBad := env.commit var lastRep *report.Report + var results []*testResult for _, tag := range tags { env.log("testing release %v", tag) com, err := env.repo.SwitchCommit(tag) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } res, err := env.test() if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } + results = append(results, res) if res.verdict == vcs.BisectGood { - return lastBad, com, nil, nil + return lastBad, com, nil, results, nil } if res.verdict == vcs.BisectBad { lastBad = com lastRep = res.rep } } - return lastBad, nil, lastRep, nil + return lastBad, nil, lastRep, results, nil } type testResult struct { diff --git a/pkg/bisect/bisect_test.go b/pkg/bisect/bisect_test.go index 04609e701..01dbfd44e 100644 --- a/pkg/bisect/bisect_test.go +++ b/pkg/bisect/bisect_test.go @@ -245,6 +245,46 @@ func TestBisectionResults(t *testing.T) { sameBinaryEnd: 504, noopChange: true, }, + { + name: "cause-same-binary-release1", + startCommit: 905, + commitLen: 1, + expectRep: true, + culprit: 500, + sameBinaryStart: 405, + sameBinaryEnd: 500, + noopChange: true, + }, + { + name: "cause-same-binary-release2", + startCommit: 905, + commitLen: 1, + expectRep: true, + culprit: 501, + sameBinaryStart: 500, + sameBinaryEnd: 501, + noopChange: true, + }, + { + name: "cause-same-binary-release3", + startCommit: 905, + commitLen: 1, + expectRep: true, + culprit: 405, + sameBinaryStart: 404, + sameBinaryEnd: 405, + noopChange: true, + }, + { + name: "fix-same-binary-last", + fix: true, + startCommit: 400, + commitLen: 1, + culprit: 905, + sameBinaryStart: 904, + sameBinaryEnd: 905, + noopChange: true, + }, } for _, test := range tests { test := test |
