blob: 1c4c5a5b5f1e8899cc91d5ea48110e5c11372ccb [file] [log] [blame]
package types
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/common"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/git/repograph"
"go.skia.org/infra/go/git/testutils/mem_git"
"go.skia.org/infra/go/gitstore"
"go.skia.org/infra/go/gitstore/mem_gitstore"
)
func TestCopyPatch(t *testing.T) {
v := Patch{
Issue: "1",
Patchset: "2",
PatchRepo: "https://dummy-repo.git",
Server: "volley.com",
}
assertdeep.Copy(t, v, v.Copy())
}
func TestCopyRepoState(t *testing.T) {
v := RepoState{
Patch: Patch{
Issue: "1",
Patchset: "2",
PatchRepo: "https://dummy-repo.git",
Server: "volley.com",
},
Repo: "nou.git",
Revision: "1",
}
assertdeep.Copy(t, v, v.Copy())
}
// repoMapSetup creates two test repos, and returns a map from repo URL to
// commits (from c0 to c4), a repograph.Map, and a cleanup function. The layout
// of the repos look like this:
//
// fake1.git:
//
// c0--c1------c3--c4--
//
// \-c2-----/
//
// fake2.git:
//
// c0--c1--c2------c4--c5--
//
// \-c3-----/
func repoMapSetup(t *testing.T) (map[string][]string, repograph.Map) {
ctx := context.Background()
gs1 := mem_gitstore.New()
mg1 := mem_git.New(t, gs1)
ri1, err := gitstore.NewGitStoreRepoImpl(ctx, gs1)
require.NoError(t, err)
repo1, err := repograph.NewWithRepoImpl(ctx, ri1)
require.NoError(t, err)
mg1.AddUpdater(repo1)
commits1 := mem_git.FillWithBranchingHistory(mg1)
gs2 := mem_gitstore.New()
mg2 := mem_git.New(t, gs2)
ri2, err := gitstore.NewGitStoreRepoImpl(ctx, gs2)
require.NoError(t, err)
repo2, err := repograph.NewWithRepoImpl(ctx, ri2)
require.NoError(t, err)
mg2.AddUpdater(repo2)
initialCommitInRepo2 := mg2.Commit("Fake initial commit to ensure that hashes are different between repos")
commits2 := []string{initialCommitInRepo2}
commits2 = append(commits2, mem_git.FillWithBranchingHistory(mg2)...)
commitMap := map[string][]string{
"fake1.git": commits1,
"fake2.git": commits2,
}
repoMap := repograph.Map{
"fake1.git": repo1,
"fake2.git": repo2,
}
return commitMap, repoMap
}
func TestGetCommit(t *testing.T) {
commitMap, repoMap := repoMapSetup(t)
for repo, commits := range commitMap {
for _, commit := range commits {
graphCommit := repoMap[repo].Get(commit)
require.NotNil(t, graphCommit)
rs := RepoState{
Repo: repo,
Revision: commit,
}
rsCommit, err := rs.GetCommit(repoMap)
require.NoError(t, err)
require.Equal(t, graphCommit, rsCommit)
rs.Patch = Patch{
Issue: "1",
Patchset: "2",
Server: "volley.com",
}
rsCommit, err = rs.GetCommit(repoMap)
require.NoError(t, err)
require.Equal(t, graphCommit, rsCommit)
}
}
}
func TestGetCommitError(t *testing.T) {
commitMap, repoMap := repoMapSetup(t)
existingRepo := ""
existingRevision := ""
for repo, commits := range commitMap {
existingRepo = repo
existingRevision = commits[0]
break
}
_, err := RepoState{
Repo: "nou.git",
Revision: existingRevision,
}.GetCommit(repoMap)
require.Error(t, err)
require.Contains(t, err.Error(), "Unknown repo")
_, err = RepoState{
Repo: existingRepo,
Revision: "abc123",
}.GetCommit(repoMap)
require.Error(t, err)
require.Contains(t, err.Error(), "Unknown revision")
// Verify test data.
c, err := RepoState{
Repo: existingRepo,
Revision: existingRevision,
}.GetCommit(repoMap)
require.NoError(t, err)
require.NotNil(t, c)
}
func TestParentsTryJob(t *testing.T) {
input := RepoState{
Patch: Patch{
Issue: "1",
Patchset: "2",
Server: "volley.com",
},
Repo: "nou.git",
Revision: "1",
}
// Unused.
var repoMap repograph.Map
parents, err := input.Parents(repoMap)
require.NoError(t, err)
require.Equal(t, 1, len(parents))
assertdeep.Equal(t, RepoState{
Repo: "nou.git",
Revision: "1",
}, parents[0])
}
func TestParentsSingle(t *testing.T) {
commitMap, repoMap := repoMapSetup(t)
test := func(repo, commit, parent string) {
input := RepoState{
Repo: repo,
Revision: commit,
}
actual, err := input.Parents(repoMap)
require.NoError(t, err)
require.Equal(t, 1, len(actual))
expected := RepoState{
Repo: repo,
Revision: parent,
}
assertdeep.Equal(t, expected, actual[0])
}
repo := "fake1.git"
commits := commitMap[repo]
test(repo, commits[1], commits[0])
test(repo, commits[2], commits[1])
test(repo, commits[3], commits[1])
repo = "fake2.git"
commits = commitMap[repo]
test(repo, commits[1], commits[0])
test(repo, commits[2], commits[1])
test(repo, commits[3], commits[2])
test(repo, commits[4], commits[2])
}
func TestParentsDouble(t *testing.T) {
commitMap, repoMap := repoMapSetup(t)
test := func(repo, commit string, parents []string) {
input := RepoState{
Repo: repo,
Revision: commit,
}
actual, err := input.Parents(repoMap)
require.NoError(t, err)
require.Len(t, actual, len(parents))
for idx, parent := range parents {
expected := RepoState{
Repo: repo,
Revision: parent,
}
assertdeep.Equal(t, expected, actual[idx])
}
}
repo1 := "fake1.git"
commits1 := commitMap[repo1]
test(repo1, commits1[4], []string{commits1[3], commits1[2]})
repo2 := "fake2.git"
commits2 := commitMap[repo2]
test(repo2, commits2[5], []string{commits2[4], commits2[3]})
}
func TestParentsNone(t *testing.T) {
commitMap, repoMap := repoMapSetup(t)
for repo, commits := range commitMap {
input := RepoState{
Repo: repo,
Revision: commits[0],
}
actual, err := input.Parents(repoMap)
require.NoError(t, err)
require.Equal(t, 0, len(actual))
}
}
func TestParentsError(t *testing.T) {
// Empty.
var repoMap repograph.Map
input := RepoState{
Repo: "nou.git",
Revision: "1",
}
_, err := input.Parents(repoMap)
require.Error(t, err)
require.Contains(t, err.Error(), "Unknown repo")
}
func TestRepoStateRowKey(t *testing.T) {
check := func(rs RepoState, expect string) {
require.Equal(t, expect, rs.RowKey())
}
// Simple, no patch.
check(RepoState{
Repo: common.REPO_SKIA,
Revision: "abc123",
}, "2#abc123#skia.googlesource.com/skia#####")
// Add a patch.
check(RepoState{
Repo: common.REPO_SKIA,
Revision: "abc123",
Patch: Patch{
Issue: "12345",
Patchset: "2",
Server: "fake.server.com",
PatchRepo: "https://skia.googlesource.com/other.git",
},
}, "2#abc123#skia.googlesource.com/skia#45#12345#2#skia.googlesource.com/other#fake.server.com")
// Patches are valid without a PatchRepo.
check(RepoState{
Repo: common.REPO_SKIA,
Revision: "abc123",
Patch: Patch{
Issue: "12345",
Patchset: "2",
Server: "fake.server.com",
},
}, "2#abc123#skia.googlesource.com/skia#45#12345#2##fake.server.com")
}