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_repo_test.go | 7 +++ pkg/vcs/git_test_util.go | 123 ++++++++++++++++++++++++++++++++++++++++++++++ pkg/vcs/test_util.go | 125 ----------------------------------------------- 3 files changed, 130 insertions(+), 125 deletions(-) create mode 100644 pkg/vcs/git_test_util.go delete mode 100644 pkg/vcs/test_util.go (limited to 'pkg/vcs') diff --git a/pkg/vcs/git_repo_test.go b/pkg/vcs/git_repo_test.go index e1d317ea2..ffdba7f9d 100644 --- a/pkg/vcs/git_repo_test.go +++ b/pkg/vcs/git_repo_test.go @@ -410,3 +410,10 @@ func TestBisect(t *testing.T) { } } } + +type testWriter testing.T + +func (t *testWriter) Write(data []byte) (int, error) { + (*testing.T)(t).Log(string(data)) + return len(data), nil +} 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 +} diff --git a/pkg/vcs/test_util.go b/pkg/vcs/test_util.go deleted file mode 100644 index 148360a08..000000000 --- a/pkg/vcs/test_util.go +++ /dev/null @@ -1,125 +0,0 @@ -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 testWriter testing.T - -func (t *testWriter) Write(data []byte) (int, error) { - (*testing.T)(t).Log(string(data)) - return len(data), nil -} - -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) { - repo.git("commit", "--allow-empty", "-m", description) -} - -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