blob: 04726db7aaa54e85aa73609c8edccbe7e72b4a16 [file] [log] [blame]
package incremental
import (
"context"
"testing"
"time"
assert "github.com/stretchr/testify/require"
"go.skia.org/infra/go/deepequal"
"go.skia.org/infra/go/git/gitinfo"
"go.skia.org/infra/go/git/repograph"
git_testutils "go.skia.org/infra/go/git/testutils"
"go.skia.org/infra/go/testutils"
"go.skia.org/infra/go/util"
"go.skia.org/infra/go/vcsinfo"
"go.skia.org/infra/task_scheduler/go/window"
)
func assertBranches(t *testing.T, gb *git_testutils.GitBuilder, actual map[string][]*gitinfo.GitBranch, expect map[string]string) {
actualBranches := make(map[string]string, len(actual[gb.RepoUrl()]))
for _, branch := range actual[gb.RepoUrl()] {
actualBranches[branch.Name] = branch.Head
}
deepequal.AssertDeepEqual(t, expect, actualBranches)
}
func assertCommits(t *testing.T, gb *git_testutils.GitBuilder, actual map[string][]*vcsinfo.LongCommit, expect []string) {
actualMap := util.NewStringSet(nil)
for _, c := range actual[gb.RepoUrl()] {
actualMap[c.Hash] = true
}
expectMap := util.NewStringSet(expect)
deepequal.AssertDeepEqual(t, expectMap, actualMap)
}
func TestIncrementalCommits(t *testing.T) {
testutils.LargeTest(t)
// Setup.
ctx := context.Background()
gb := git_testutils.GitInit(t, ctx)
defer gb.Cleanup()
c0 := gb.CommitGen(ctx, "file1")
wd, cleanupWd := testutils.TempDir(t)
defer cleanupWd()
repo, err := repograph.NewGraph(ctx, gb.Dir(), wd)
assert.NoError(t, err)
repos := repograph.Map{
gb.RepoUrl(): repo,
}
N := 100
w, err := window.New(24*time.Hour, N, repos)
assert.NoError(t, err)
cc := newCommitsCache(repos)
// Initial update. Expect a single branch with one commit.
branches, commits, err := cc.Update(ctx, w, false, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
"master": c0,
})
assertCommits(t, gb, commits, []string{c0})
// Update again, with no new commits. Expect empty response.
branches, commits, err = cc.Update(ctx, w, false, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{})
assertCommits(t, gb, commits, []string{})
// Passing in reset=true should give us ALL commits and branches,
// regardless of whether they're new.
branches, commits, err = cc.Update(ctx, w, true, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
"master": c0,
})
assertCommits(t, gb, commits, []string{c0})
// Add some new commits.
c1 := gb.CommitGen(ctx, "file1")
c2 := gb.CommitGen(ctx, "file1")
branches, commits, err = cc.Update(ctx, w, false, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
"master": c2,
})
assertCommits(t, gb, commits, []string{c1, c2})
// Add a new branch, with no commits.
gb.CreateBranchTrackBranch(ctx, "branch2", "origin/master")
branches, commits, err = cc.Update(ctx, w, false, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
"master": c2,
"branch2": c2,
})
assertCommits(t, gb, commits, []string{})
// Add a commit on the new branch.
c3 := gb.CommitGen(ctx, "file2")
branches, commits, err = cc.Update(ctx, w, false, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
"master": c2,
"branch2": c3,
})
assertCommits(t, gb, commits, []string{c3})
// Merge branch2 back into master. Note that, since there are no new
// commits on master, this does not create a merge commit but just
// updates HEAD of master to point at c3.
gb.CheckoutBranch(ctx, "master")
mergeCommit := gb.MergeBranch(ctx, "branch2")
assert.Equal(t, c3, mergeCommit)
branches, commits, err = cc.Update(ctx, w, false, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
"master": c3,
"branch2": c3,
})
assertCommits(t, gb, commits, []string{})
// Add a new branch. Add commits on both master and branch3.
gb.CreateBranchTrackBranch(ctx, "branch3", "origin/master")
c4 := gb.CommitGen(ctx, "file3")
gb.CheckoutBranch(ctx, "master")
c5 := gb.CommitGen(ctx, "file1")
branches, commits, err = cc.Update(ctx, w, false, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
"master": c5,
"branch2": c3,
"branch3": c4,
})
assertCommits(t, gb, commits, []string{c4, c5})
// Merge branch3 back into master. Because there are commits on both
// branches, a merge commit will be created.
c6 := gb.MergeBranch(ctx, "branch3")
assert.NotEqual(t, c6, c4) // Ensure that we actually created a merge commit.
branches, commits, err = cc.Update(ctx, w, false, N)
assert.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
"master": c6,
"branch2": c3,
"branch3": c4,
})
assertCommits(t, gb, commits, []string{c6})
}