diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-08-09 09:01:22 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-08-11 16:07:33 +0300 |
commit | c7996255726c86e1196924a22c8b00c34b2eccce (patch) | |
tree | 3f31d68568b615c926381eb95eac752251d7c992 | |
parent | 8cd3dc3038dfac98779b95bda112ee4d8c0961c7 (diff) |
gitpipe: Refactor DiffTree tests to not use seeded repos
Refactor the DiffTree tests to not use seeded repositories with
hardcoded object IDs. Instead, the tests are changed such that they
generate test data at runtime so that we can easily support different
object hashes.
-rw-r--r-- | internal/git/gitpipe/diff_tree_test.go | 236 |
1 files changed, 163 insertions, 73 deletions
diff --git a/internal/git/gitpipe/diff_tree_test.go b/internal/git/gitpipe/diff_tree_test.go index f2cac6a38..556ec4e9f 100644 --- a/internal/git/gitpipe/diff_tree_test.go +++ b/internal/git/gitpipe/diff_tree_test.go @@ -3,10 +3,12 @@ package gitpipe import ( + "bytes" "errors" "testing" "github.com/stretchr/testify/require" + "gitlab.com/gitlab-org/gitaly/v15/internal/git" "gitlab.com/gitlab-org/gitaly/v15/internal/git/gittest" "gitlab.com/gitlab-org/gitaly/v15/internal/git/localrepo" "gitlab.com/gitlab-org/gitaly/v15/internal/testhelper" @@ -17,105 +19,186 @@ func TestDiffTree(t *testing.T) { ctx := testhelper.Context(t) cfg := testcfg.Build(t) - repoProto, _ := gittest.CreateRepository(ctx, t, cfg, gittest.CreateRepositoryConfig{ - SkipCreationViaService: true, - Seed: gittest.SeedGitLabTest, - }) - repo := localrepo.NewTestRepo(t, cfg, repoProto) - for _, tc := range []struct { - desc string - leftRevision string - rightRevision string - options []DiffTreeOption - expectedResults []RevisionResult - expectedErr error + desc string + setup func(t *testing.T, repoPath string) (git.Revision, git.Revision, []RevisionResult) + options []DiffTreeOption + expectedErr error }{ { - desc: "single file", - leftRevision: "b83d6e391c22777fca1ed3012fce84f633d7fed0", - rightRevision: "4a24d82dbca5c11c61556f3b35ca472b7463187e", - expectedResults: []RevisionResult{ - { - OID: "c60514b6d3d6bf4bec1030f70026e34dfbd69ad5", - ObjectName: []byte("README.md"), - }, + desc: "single file", + setup: func(t *testing.T, repoPath string) (git.Revision, git.Revision, []RevisionResult) { + treeA := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: "unchanged", Mode: "100644", Content: "unchanged"}, + {Path: "changed", Mode: "100644", Content: "a"}, + }) + + changedBlob := gittest.WriteBlob(t, cfg, repoPath, []byte("b")) + treeB := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: "unchanged", Mode: "100644", Content: "unchanged"}, + {Path: "changed", Mode: "100644", OID: changedBlob}, + }) + + return treeA.Revision(), treeB.Revision(), []RevisionResult{ + {OID: changedBlob, ObjectName: []byte("changed")}, + } }, }, { - desc: "single file in subtree without recursive", - leftRevision: "7975be0116940bf2ad4321f79d02a55c5f7779aa", - rightRevision: "1e292f8fedd741b75372e19097c76d327140c312", - expectedResults: []RevisionResult{ - { - OID: "ceb102b8d3f9a95c2eb979213e49f7cc1b23d56e", - ObjectName: []byte("files"), - }, + desc: "single file in subtree without recursive", + setup: func(t *testing.T, repoPath string) (git.Revision, git.Revision, []RevisionResult) { + treeA := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + { + Path: "unchanged", + Mode: "100644", + Content: "unchanged", + }, + { + Path: "subtree", + Mode: "040000", + OID: gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: "changed", Mode: "100644", Content: "a"}, + }), + }, + }) + + changedSubtree := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: "changed", Mode: "100644", Content: "b"}, + }) + treeB := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + { + Path: "unchanged", + Mode: "100644", + Content: "unchanged", + }, + { + Path: "subtree", + Mode: "040000", + OID: changedSubtree, + }, + }) + + return treeA.Revision(), treeB.Revision(), []RevisionResult{ + {OID: changedSubtree, ObjectName: []byte("subtree")}, + } }, }, { - desc: "single file in subtree with recursive", - leftRevision: "7975be0116940bf2ad4321f79d02a55c5f7779aa", - rightRevision: "1e292f8fedd741b75372e19097c76d327140c312", + desc: "single file in subtree with recursive", + setup: func(t *testing.T, repoPath string) (git.Revision, git.Revision, []RevisionResult) { + treeA := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + { + Path: "unchanged", + Mode: "100644", + Content: "unchanged", + }, + { + Path: "subtree", + Mode: "040000", + OID: gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: "changed", Mode: "100644", Content: "a"}, + }), + }, + }) + + changedBlob := gittest.WriteBlob(t, cfg, repoPath, []byte("b")) + treeB := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + { + Path: "unchanged", + Mode: "100644", + Content: "unchanged", + }, + { + Path: "subtree", + Mode: "040000", + OID: gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: "changed", Mode: "100644", OID: changedBlob}, + }), + }, + }) + + return treeA.Revision(), treeB.Revision(), []RevisionResult{ + {OID: changedBlob, ObjectName: []byte("subtree/changed")}, + } + }, options: []DiffTreeOption{ DiffTreeWithRecursive(), }, - expectedResults: []RevisionResult{ - { - OID: "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", - ObjectName: []byte("files/flat/path/correct/content.txt"), - }, - }, }, { - desc: "with submodules", - leftRevision: "570e7b2abdd848b95f2f578043fc23bd6f6fd24d", - rightRevision: "5937ac0a7beb003549fc5fd26fc247adbce4a52e", - expectedResults: []RevisionResult{ - { - OID: "efd587ccb47caf5f31fc954edb21f0a713d9ecc3", - ObjectName: []byte(".gitmodules"), - }, - { - OID: "645f6c4c82fd3f5e06f67134450a570b795e55a6", - ObjectName: []byte("gitlab-grack"), - }, + desc: "with submodules", + setup: func(t *testing.T, repoPath string) (git.Revision, git.Revision, []RevisionResult) { + submodule := gittest.WriteCommit(t, cfg, repoPath) + + treeA := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: ".gitmodules", Mode: "100644", Content: "a"}, + }) + + changedGitmodules := gittest.WriteBlob(t, cfg, repoPath, []byte("b")) + treeB := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: ".gitmodules", Mode: "100644", OID: changedGitmodules}, + {Path: "submodule", Mode: "160000", OID: submodule}, + }) + + return treeA.Revision(), treeB.Revision(), []RevisionResult{ + {OID: changedGitmodules, ObjectName: []byte(".gitmodules")}, + {OID: submodule, ObjectName: []byte("submodule")}, + } }, }, { - desc: "without submodules", - leftRevision: "570e7b2abdd848b95f2f578043fc23bd6f6fd24d", - rightRevision: "5937ac0a7beb003549fc5fd26fc247adbce4a52e", + desc: "without submodules", + setup: func(t *testing.T, repoPath string) (git.Revision, git.Revision, []RevisionResult) { + submodule := gittest.WriteCommit(t, cfg, repoPath) + + treeA := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: ".gitmodules", Mode: "100644", Content: "a"}, + }) + + changedGitmodules := gittest.WriteBlob(t, cfg, repoPath, []byte("b")) + treeB := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: ".gitmodules", Mode: "100644", OID: changedGitmodules}, + {Path: "submodule", Mode: "160000", OID: submodule}, + }) + + return treeA.Revision(), treeB.Revision(), []RevisionResult{ + {OID: changedGitmodules, ObjectName: []byte(".gitmodules")}, + } + }, options: []DiffTreeOption{ DiffTreeWithIgnoreSubmodules(), }, - expectedResults: []RevisionResult{ - { - OID: "efd587ccb47caf5f31fc954edb21f0a713d9ecc3", - ObjectName: []byte(".gitmodules"), - }, - }, }, { - desc: "with skip function", - leftRevision: "570e7b2abdd848b95f2f578043fc23bd6f6fd24d", - rightRevision: "5937ac0a7beb003549fc5fd26fc247adbce4a52e", + desc: "with skip function", + setup: func(t *testing.T, repoPath string) (git.Revision, git.Revision, []RevisionResult) { + treeA := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: "a", Mode: "100644", Content: "1"}, + {Path: "b", Mode: "100644", Content: "2"}, + }) + + changedBlobA := gittest.WriteBlob(t, cfg, repoPath, []byte("x")) + treeB := gittest.WriteTree(t, cfg, repoPath, []gittest.TreeEntry{ + {Path: "a", Mode: "100644", OID: changedBlobA}, + {Path: "b", Mode: "100644", Content: "y"}, + }) + + return treeA.Revision(), treeB.Revision(), []RevisionResult{ + {OID: changedBlobA, ObjectName: []byte("a")}, + } + }, options: []DiffTreeOption{ DiffTreeWithSkip(func(r *RevisionResult) bool { - return r.OID == "efd587ccb47caf5f31fc954edb21f0a713d9ecc3" + return bytes.Equal(r.ObjectName, []byte("b")) }), }, - expectedResults: []RevisionResult{ - { - OID: "645f6c4c82fd3f5e06f67134450a570b795e55a6", - ObjectName: []byte("gitlab-grack"), - }, - }, }, { - desc: "invalid revision", - leftRevision: "refs/heads/master", - rightRevision: "refs/heads/does-not-exist", + desc: "invalid revision", + setup: func(t *testing.T, repoPath string) (git.Revision, git.Revision, []RevisionResult) { + gittest.WriteCommit(t, cfg, repoPath, gittest.WithBranch("main")) + return "refs/heads/main", "refs/heads/does-not-exist", nil + }, expectedErr: errors.New("diff-tree pipeline command: exit status 128, stderr: " + "\"fatal: ambiguous argument 'refs/heads/does-not-exist': unknown revision or path not in the working tree.\\n" + "Use '--' to separate paths from revisions, like this:\\n" + @@ -123,7 +206,14 @@ func TestDiffTree(t *testing.T) { }, } { t.Run(tc.desc, func(t *testing.T) { - it := DiffTree(ctx, repo, tc.leftRevision, tc.rightRevision, tc.options...) + repoProto, repoPath := gittest.CreateRepository(ctx, t, cfg, gittest.CreateRepositoryConfig{ + SkipCreationViaService: true, + }) + repo := localrepo.NewTestRepo(t, cfg, repoProto) + + leftRevision, rightRevision, expectedResults := tc.setup(t, repoPath) + + it := DiffTree(ctx, repo, leftRevision.String(), rightRevision.String(), tc.options...) var results []RevisionResult for it.Next() { @@ -138,7 +228,7 @@ func TestDiffTree(t *testing.T) { } require.Equal(t, tc.expectedErr, err) - require.Equal(t, tc.expectedResults, results) + require.Equal(t, expectedResults, results) }) } } |