diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-07-16 12:48:06 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2021-07-16 12:48:06 +0300 |
commit | 416129c4eb340f685339da169eb9ce4418e6f3b4 (patch) | |
tree | 927bcd8d99f7958efee557320eacabf97b930f85 | |
parent | c10028e6fb66cf4c1fbf44f29a4ea24461574fbc (diff) |
forEachRef pipeline test
-rw-r--r-- | internal/git/gitpipe/pipeline_test.go | 68 |
1 files changed, 67 insertions, 1 deletions
diff --git a/internal/git/gitpipe/pipeline_test.go b/internal/git/gitpipe/pipeline_test.go index 97062e6f6..94e174ad2 100644 --- a/internal/git/gitpipe/pipeline_test.go +++ b/internal/git/gitpipe/pipeline_test.go @@ -8,6 +8,7 @@ import ( "testing" "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitaly/v14/internal/git" "gitlab.com/gitlab-org/gitaly/v14/internal/git/catfile" "gitlab.com/gitlab-org/gitaly/v14/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v14/internal/git/localrepo" @@ -15,7 +16,7 @@ import ( "gitlab.com/gitlab-org/gitaly/v14/internal/testhelper/testcfg" ) -func TestPipeline(t *testing.T) { +func TestPipeline_revlist(t *testing.T) { cfg := testcfg.Build(t) repoProto, _, cleanup := gittest.CloneRepoAtStorage(t, cfg, cfg.Storages[0], t.Name()) @@ -330,3 +331,68 @@ func TestPipeline(t *testing.T) { require.Greater(t, i, 1000) }) } + +func TestPipeline_forEachRef(t *testing.T) { + cfg := testcfg.Build(t) + + repoProto, _, cleanup := gittest.CloneRepoAtStorage(t, cfg, cfg.Storages[0], t.Name()) + defer cleanup() + repo := localrepo.NewTestRepo(t, cfg, repoProto) + + ctx, cancel := testhelper.Context() + defer cancel() + + catfileCache := catfile.NewCache(cfg) + defer catfileCache.Stop() + + catfileProcess, err := catfileCache.BatchProcess(ctx, repo) + require.NoError(t, err) + + forEachRefIter := ForEachRef(ctx, repo, nil) + catfileInfoIter := CatfileInfo(ctx, catfileProcess, forEachRefIter) + catfileObjectIter := CatfileObject(ctx, catfileProcess, catfileInfoIter) + + type object struct { + oid git.ObjectID + content []byte + } + + objectsByRef := make(map[git.ReferenceName]object) + for catfileObjectIter.Next() { + result := catfileObjectIter.Result() + + // While we could also assert object data, let's not do + // this: it would just be too annoying. + require.NotNil(t, result.ObjectReader) + + objectData, err := ioutil.ReadAll(result.ObjectReader) + require.NoError(t, err) + require.Len(t, objectData, int(result.ObjectInfo.Size)) + + objectsByRef[git.ReferenceName(result.ObjectName)] = object{ + oid: result.ObjectInfo.Oid, + content: objectData, + } + } + require.NoError(t, catfileObjectIter.Err()) + require.Greater(t, len(objectsByRef), 90) + + // We certainly don't want to hard-code all the references, so we just cross-check with the + // localrepo implementation to verify that both return the same data. + refs, err := repo.GetReferences(ctx) + require.NoError(t, err) + require.Equal(t, len(refs), len(objectsByRef)) + + expectedObjectsByRef := make(map[git.ReferenceName]object) + for _, ref := range refs { + oid := git.ObjectID(ref.Target) + content, err := repo.ReadObject(ctx, oid) + require.NoError(t, err) + + expectedObjectsByRef[ref.Name] = object{ + oid: oid, + content: content, + } + } + require.Equal(t, expectedObjectsByRef, objectsByRef) +} |