blob: 5919854f91b3d48eb43172df87003d6ba457317d [file] [log] [blame]
package incremental
import (
"context"
"testing"
"time"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/git"
"go.skia.org/infra/go/git/repograph"
git_testutils "go.skia.org/infra/go/git/testutils"
"go.skia.org/infra/go/testutils/unittest"
"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][]*git.Branch, expect map[string]string) {
actualBranches := make(map[string]string, len(actual[gb.RepoUrl()]))
for _, branch := range actual[gb.RepoUrl()] {
actualBranches[branch.Name] = branch.Head
}
assertdeep.Equal(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)
assertdeep.Equal(t, expectMap, actualMap)
}
func TestIncrementalCommits(t *testing.T) {
unittest.LargeTest(t)
// Setup.
ctx := context.Background()
gb := git_testutils.GitInit(t, ctx)
defer gb.Cleanup()
c0 := gb.CommitGen(ctx, "file1")
wd := t.TempDir()
repo, err := repograph.NewLocalGraph(ctx, gb.Dir(), wd)
require.NoError(t, err)
repos := repograph.Map{
gb.RepoUrl(): repo,
}
N := 100
w, err := window.New(24*time.Hour, N, repos)
require.NoError(t, err)
cc := newCommitsCache(repos)
// Initial update. Expect a single branch with one commit.
branches, commits, err := cc.Update(ctx, w, false, N)
require.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
git.DefaultBranch: 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)
require.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)
require.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
git.DefaultBranch: 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)
require.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
git.DefaultBranch: c2,
})
assertCommits(t, gb, commits, []string{c1, c2})
// Add a new branch, with no commits.
gb.CreateBranchTrackBranch(ctx, "branch2", git.DefaultRemoteBranch)
branches, commits, err = cc.Update(ctx, w, false, N)
require.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
git.DefaultBranch: 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)
require.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
git.DefaultBranch: c2,
"branch2": c3,
})
assertCommits(t, gb, commits, []string{c3})
// Merge branch2 back into main. Note that, since there are no new
// commits on main, this does not create a merge commit but just
// updates HEAD of main to point at c3.
gb.CheckoutBranch(ctx, git.DefaultBranch)
mergeCommit := gb.MergeBranch(ctx, "branch2")
require.Equal(t, c3, mergeCommit)
branches, commits, err = cc.Update(ctx, w, false, N)
require.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
git.DefaultBranch: c3,
"branch2": c3,
})
assertCommits(t, gb, commits, []string{})
// Add a new branch. Add commits on both main and branch3.
gb.CreateBranchTrackBranch(ctx, "branch3", git.DefaultRemoteBranch)
c4 := gb.CommitGen(ctx, "file3")
gb.CheckoutBranch(ctx, git.DefaultBranch)
c5 := gb.CommitGen(ctx, "file1")
branches, commits, err = cc.Update(ctx, w, false, N)
require.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
git.DefaultBranch: c5,
"branch2": c3,
"branch3": c4,
})
assertCommits(t, gb, commits, []string{c4, c5})
// Merge branch3 back into main. Because there are commits on both
// branches, a merge commit will be created.
c6 := gb.MergeBranch(ctx, "branch3")
require.NotEqual(t, c6, c4) // Ensure that we actually created a merge commit.
branches, commits, err = cc.Update(ctx, w, false, N)
require.NoError(t, err)
assertBranches(t, gb, branches, map[string]string{
git.DefaultBranch: c6,
"branch2": c3,
"branch3": c4,
})
assertCommits(t, gb, commits, []string{c6})
}