aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/bisect
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2019-11-27 12:37:52 +0100
committerDmitry Vyukov <dvyukov@google.com>2019-11-27 12:37:52 +0100
commit9f5fd6fe1a3835945ce119f2b5d3633d3b81ff61 (patch)
treecfdd469790105e25a7c5f5927d2619f6c57b5ac1 /pkg/bisect
parent5a38f3f0660c5210d57304a7e6519d9f56bfffba (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.go33
-rw-r--r--pkg/bisect/bisect_test.go40
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