blob: bf2db88c8cba03305b269f8bee7535e326cb9cd3 [file] [log] [blame]
package shared_tests
import (
"context"
"math"
"time"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/git/testutils/mem_git"
"go.skia.org/infra/go/gitstore"
"go.skia.org/infra/go/sktest"
"go.skia.org/infra/go/vcsinfo"
)
func TestGitStore(t sktest.TestingT, gs gitstore.GitStore) {
ctx := context.Background()
// Empty to start.
branches, err := gs.GetBranches(ctx)
require.NoError(t, err)
require.Equal(t, 0, len(branches))
lcs, err := gs.Get(ctx, []string{"a", "b", "c"})
require.NoError(t, err)
require.Equal(t, 3, len(lcs))
for _, lc := range lcs {
require.Nil(t, lc)
}
ics, err := gs.RangeN(ctx, math.MinInt32, math.MaxInt32, gitstore.ALL_BRANCHES)
require.NoError(t, err)
require.Equal(t, 0, len(ics))
ics, err = gs.RangeByTime(ctx, time.Time{}, vcsinfo.MaxTime, gitstore.ALL_BRANCHES)
require.NoError(t, err)
require.Equal(t, 0, len(ics))
// Put a commit, but don't update the branch head. It should show up in
// results of Get() and Range, but the master branch should not be
// updated.
master := "master"
c0 := mem_git.FakeCommit(t, "c0", master)
require.NoError(t, gs.Put(ctx, []*vcsinfo.LongCommit{c0}))
branches, err = gs.GetBranches(ctx)
require.NoError(t, err)
require.Nil(t, branches[master])
lcs, err = gs.Get(ctx, []string{"a", "b", c0.Hash})
require.NoError(t, err)
require.Equal(t, 3, len(lcs))
require.Nil(t, lcs[0])
require.Nil(t, lcs[1])
assertdeep.Equal(t, c0, lcs[2])
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, gitstore.ALL_BRANCHES)
require.NoError(t, err)
require.Equal(t, 1, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
ics, err = gs.RangeByTime(ctx, time.Time{}, vcsinfo.MaxTime, gitstore.ALL_BRANCHES)
require.NoError(t, err)
require.Equal(t, 1, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
require.NoError(t, err)
require.Equal(t, 0, len(ics))
ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
require.NoError(t, err)
require.Equal(t, 0, len(ics))
// Put the master branch.
require.NoError(t, gs.PutBranches(ctx, map[string]string{
master: c0.Hash,
}))
branches, err = gs.GetBranches(ctx)
require.NoError(t, err)
require.NotNil(t, branches[master])
require.Equal(t, c0.Hash, branches[master].Head)
require.Equal(t, 0, branches[master].Index)
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
require.NoError(t, err)
require.Equal(t, 1, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
require.NoError(t, err)
require.Equal(t, 1, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
// Add a second commit.
c1 := mem_git.FakeCommit(t, "c1", master, c0)
require.NoError(t, gs.Put(ctx, []*vcsinfo.LongCommit{c1}))
branches, err = gs.GetBranches(ctx)
require.NoError(t, err)
require.NotNil(t, branches[master])
require.Equal(t, c0.Hash, branches[master].Head)
lcs, err = gs.Get(ctx, []string{c1.Hash})
require.NoError(t, err)
require.Equal(t, 1, len(lcs))
assertdeep.Equal(t, c1, lcs[0])
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, gitstore.ALL_BRANCHES)
require.NoError(t, err)
require.Equal(t, 2, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
ics, err = gs.RangeByTime(ctx, time.Time{}, vcsinfo.MaxTime, gitstore.ALL_BRANCHES)
require.NoError(t, err)
require.Equal(t, 2, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
require.NoError(t, err)
require.Equal(t, 1, len(ics))
ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
require.NoError(t, err)
require.Equal(t, 1, len(ics))
require.NoError(t, gs.PutBranches(ctx, map[string]string{
master: c1.Hash,
}))
branches, err = gs.GetBranches(ctx)
require.NoError(t, err)
require.NotNil(t, branches[master])
require.Equal(t, c1.Hash, branches[master].Head)
require.Equal(t, 1, branches[master].Index)
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
require.NoError(t, err)
require.Equal(t, 2, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
assertdeep.Equal(t, c1.IndexCommit(), ics[1])
ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
require.NoError(t, err)
require.Equal(t, 2, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
assertdeep.Equal(t, c1.IndexCommit(), ics[1])
// Add a new branch.
otherbranch := "otherbranch"
c2 := mem_git.FakeCommit(t, "c2", otherbranch, c0)
c0.Branches[otherbranch] = true // Re-insert c0 so that it shows up as part of otherbranch.
require.NoError(t, gs.Put(ctx, []*vcsinfo.LongCommit{c0, c2}))
branches, err = gs.GetBranches(ctx)
require.NoError(t, err)
require.Nil(t, branches[otherbranch])
lcs, err = gs.Get(ctx, []string{c2.Hash})
require.NoError(t, err)
require.Equal(t, 1, len(lcs))
assertdeep.Equal(t, c2, lcs[0])
// Note: Behavior for ALL_BRANCHES is undefined for RangeN when there
// are multiple branches with overlapping indexes, so we don't check
// that here.
ics, err = gs.RangeByTime(ctx, time.Time{}, vcsinfo.MaxTime, gitstore.ALL_BRANCHES)
require.NoError(t, err)
require.Equal(t, 3, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
// RangeByTime sorts by index, and c1 and c2 both have index 1.
if ics[1].Hash == c1.Hash {
assertdeep.Equal(t, c1.IndexCommit(), ics[1])
assertdeep.Equal(t, c2.IndexCommit(), ics[2])
} else {
assertdeep.Equal(t, c1.IndexCommit(), ics[2])
assertdeep.Equal(t, c2.IndexCommit(), ics[1])
}
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, otherbranch)
require.NoError(t, err)
require.Equal(t, 0, len(ics))
ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, otherbranch)
require.NoError(t, err)
require.Equal(t, 0, len(ics))
require.NoError(t, gs.PutBranches(ctx, map[string]string{
otherbranch: c2.Hash,
}))
branches, err = gs.GetBranches(ctx)
require.NoError(t, err)
require.NotNil(t, branches[otherbranch])
require.Equal(t, c2.Hash, branches[otherbranch].Head)
require.Equal(t, 1, branches[otherbranch].Index)
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, otherbranch)
require.NoError(t, err)
require.Equal(t, 2, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
assertdeep.Equal(t, c2.IndexCommit(), ics[1])
ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, otherbranch)
require.NoError(t, err)
require.Equal(t, 2, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
assertdeep.Equal(t, c2.IndexCommit(), ics[1])
ics, err = gs.RangeN(ctx, math.MinInt32, math.MaxInt32, master)
require.NoError(t, err)
require.Equal(t, 2, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
assertdeep.Equal(t, c1.IndexCommit(), ics[1])
ics, err = gs.RangeByTime(ctx, vcsinfo.MinTime, vcsinfo.MaxTime, master)
require.NoError(t, err)
require.Equal(t, 2, len(ics))
assertdeep.Equal(t, c0.IndexCommit(), ics[0])
assertdeep.Equal(t, c1.IndexCommit(), ics[1])
}