From 4538d6d746f2dc7443cb25940513ef23dbb275f0 Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Tue, 10 Dec 2019 10:59:01 +0100 Subject: pkg/bisect: add test for #1527 Update #1527 --- pkg/vcs/git_test_util.go | 123 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 pkg/vcs/git_test_util.go (limited to 'pkg/vcs/git_test_util.go') 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" ` +) + +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 +} -- cgit mrf-deployment