aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/vcs/git_test_util.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2019-12-10 10:59:01 +0100
committerDmitry Vyukov <dvyukov@google.com>2019-12-10 12:35:10 +0100
commit4538d6d746f2dc7443cb25940513ef23dbb275f0 (patch)
tree7f6e3ccbe559cf8de8a4aa60fbb444006532158a /pkg/vcs/git_test_util.go
parente068fcf62261c6ecd6416418c7adcba000213072 (diff)
pkg/bisect: add test for #1527
Update #1527
Diffstat (limited to 'pkg/vcs/git_test_util.go')
-rw-r--r--pkg/vcs/git_test_util.go123
1 files changed, 123 insertions, 0 deletions
diff --git a/pkg/vcs/git_test_util.go b/pkg/vcs/git_test_util.go
new file mode 100644
index 000000000..86713bac0
--- /dev/null
+++ b/pkg/vcs/git_test_util.go
@@ -0,0 +1,123 @@
+package vcs
+
+import (
+ "fmt"
+ "path/filepath"
+ "strings"
+ "testing"
+ "time"
+
+ "github.com/google/syzkaller/pkg/osutil"
+)
+
+const (
+ userEmail = `test@syzkaller.com`
+ userName = `Test Syzkaller`
+ extractFixTagsEmail = `"syzbot" <syzbot@my.mail.com>`
+)
+
+type TestRepo struct {
+ t *testing.T
+ Dir string
+ name string
+ Commits map[string]map[string]*Commit
+ repo *git
+}
+
+func (repo *TestRepo) Git(args ...string) {
+ if _, err := osutil.RunCmd(time.Minute, repo.Dir, "git", args...); err != nil {
+ repo.t.Fatal(err)
+ }
+}
+
+func MakeTestRepo(t *testing.T, dir string) *TestRepo {
+ if err := osutil.MkdirAll(dir); err != nil {
+ t.Fatal(err)
+ }
+ ignoreCC := map[string]bool{
+ "stable@vger.kernel.org": true,
+ }
+ repo := &TestRepo{
+ t: t,
+ Dir: dir,
+ name: filepath.Base(dir),
+ Commits: make(map[string]map[string]*Commit),
+ repo: newGit(dir, ignoreCC),
+ }
+ repo.Git("init")
+ repo.Git("config", "--add", "user.email", userEmail)
+ repo.Git("config", "--add", "user.name", userName)
+ return repo
+}
+
+func (repo *TestRepo) CommitFileChange(branch, change string) {
+ id := fmt.Sprintf("%v-%v-%v", repo.name, branch, change)
+ file := filepath.Join(repo.Dir, "file")
+ if err := osutil.WriteFile(file, []byte(id)); err != nil {
+ repo.t.Fatal(err)
+ }
+ repo.Git("add", file)
+ repo.Git("commit", "-m", id)
+ if repo.Commits[branch] == nil {
+ repo.Commits[branch] = make(map[string]*Commit)
+ }
+ com, err := repo.repo.HeadCommit()
+ if err != nil {
+ repo.t.Fatal(err)
+ }
+ repo.Commits[branch][change] = com
+}
+
+func (repo *TestRepo) CommitChange(description string) *Commit {
+ repo.Git("commit", "--allow-empty", "-m", description)
+ com, err := repo.repo.HeadCommit()
+ if err != nil {
+ repo.t.Fatal(err)
+ }
+ return com
+}
+
+func (repo *TestRepo) SetTag(tag string) {
+ repo.Git("tag", tag)
+}
+
+func (repo *TestRepo) SupportsBisection() bool {
+ // Detect too old git binary. --no-contains appeared in git 2.13.
+ _, err := repo.repo.previousReleaseTags("HEAD", true)
+ return err == nil ||
+ !strings.Contains(err.Error(), "usage: git tag") &&
+ !strings.Contains(err.Error(), "error: unknown option")
+}
+
+func CreateTestRepo(t *testing.T, baseDir, name string) *TestRepo {
+ repo := MakeTestRepo(t, filepath.Join(baseDir, name))
+ repo.Git("checkout", "-b", "master")
+ repo.CommitFileChange("master", "0")
+ for _, branch := range []string{"branch1", "branch2"} {
+ repo.Git("checkout", "-b", branch, "master")
+ repo.CommitFileChange(branch, "0")
+ repo.CommitFileChange(branch, "1")
+ }
+ repo.Git("checkout", "master")
+ repo.CommitFileChange("master", "1")
+ return repo
+}
+
+func CloneTestRepo(t *testing.T, baseDir string, name string, originRepo *TestRepo) *TestRepo {
+ dir := filepath.Join(baseDir, name)
+ if err := osutil.MkdirAll(dir); err != nil {
+ t.Fatal(err)
+ }
+ ignoreCC := map[string]bool{
+ "stable@vger.kernel.org": true,
+ }
+ repo := &TestRepo{
+ t: t,
+ Dir: dir,
+ name: filepath.Base(dir),
+ Commits: make(map[string]map[string]*Commit),
+ repo: newGit(dir, ignoreCC),
+ }
+ repo.Git("clone", originRepo.Dir, repo.Dir)
+ return repo
+}