diff options
author | john.mcdonnell <jmcdonnell@gitlab.com> | 2021-09-24 04:05:10 +0300 |
---|---|---|
committer | john.mcdonnell <jmcdonnell@gitlab.com> | 2021-09-24 05:41:22 +0300 |
commit | 35cec56a461e0eff8b749473a4a6705d72cd90d2 (patch) | |
tree | 933e9e1780db665a28f075fc6cde29c64c83e819 | |
parent | 80b9699ea44b716e74edf32130a6a3966cb59cae (diff) |
Add tests to cover possible conflicts between branch/tag create/delete“jmd-add-tests-branch-vs-tags-issues”
-rw-r--r-- | internal/gitaly/service/operations/branches_test.go | 102 | ||||
-rw-r--r-- | internal/gitaly/service/operations/tags_test.go | 105 |
2 files changed, 207 insertions, 0 deletions
diff --git a/internal/gitaly/service/operations/branches_test.go b/internal/gitaly/service/operations/branches_test.go index 2bb6c47b5..891deeacb 100644 --- a/internal/gitaly/service/operations/branches_test.go +++ b/internal/gitaly/service/operations/branches_test.go @@ -115,6 +115,57 @@ func TestSuccessfulCreateBranchRequest(t *testing.T) { } } +func TestSuccessfulUserCreateBranchWithExistingTagOfSameName(t *testing.T) { + t.Parallel() + + ctx, cancel := testhelper.Context() + defer cancel() + + ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) + + preExistingTagName := "foobarTag" + gittest.Exec(t, cfg, "-C", repoPath, "tag", "-f", preExistingTagName) + + testCases := []struct { + desc string + branchName string + }{ + { + desc: "branch matches existing tag name", + branchName: preExistingTagName, + }, + { + // This should create a branch under refs/heads/refs/tags/{something} + desc: "branch matches existing tag ref prefix", + branchName: "refs/tags/" + preExistingTagName, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.desc, func(t *testing.T) { + refs := gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs") + require.NotContains(t, string(refs), "refs/heads/"+testCase.branchName) + require.Contains(t, string(refs), "refs/tags/"+preExistingTagName) + + request := &gitalypb.UserCreateBranchRequest{ + Repository: repoProto, + BranchName: []byte(testCase.branchName), + StartPoint: []byte("c7fbe50c7c7419d9701eebe64b1fdacc3df5b9dd"), + User: gittest.TestUser, + } + + response, err := client.UserCreateBranch(ctx, request) + require.NoError(t, err) + require.Equal(t, testCase.branchName, string(response.Branch.Name)) + require.Empty(t, response.PreReceiveError) + + refs = gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs") + require.Contains(t, string(refs), "refs/heads/"+testCase.branchName) + require.Contains(t, string(refs), "refs/tags/"+preExistingTagName) + }) + } +} + func TestUserCreateBranchWithTransaction(t *testing.T) { t.Parallel() @@ -444,6 +495,57 @@ func TestSuccessfulUserDeleteBranchRequest(t *testing.T) { } } +func TestSuccessfulDeleteBranchWithoutImpactingTagOfSameName(t *testing.T) { + t.Parallel() + + ctx, cancel := testhelper.Context() + defer cancel() + + ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) + + preExistingTagName := "foobarTag" + gittest.Exec(t, cfg, "-C", repoPath, "tag", "-f", preExistingTagName) + + testCases := []struct { + desc string + branchName string + }{ + { + desc: "branch matches existing tag name", + branchName: preExistingTagName, + }, + { + // This should create a branch under refs/heads/refs/tags/{something} + desc: "branch matches existing tag ref prefix", + branchName: "refs/tags/" + preExistingTagName, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.desc, func(t *testing.T) { + gittest.Exec(t, cfg, "-C", repoPath, "branch", "-f", testCase.branchName) + + refs := gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs") + require.Contains(t, string(refs), "refs/heads/"+testCase.branchName) + require.Contains(t, string(refs), "refs/tags/"+preExistingTagName) + + request := &gitalypb.UserDeleteBranchRequest{ + Repository: repoProto, + BranchName: []byte(testCase.branchName), + User: gittest.TestUser, + } + + response, err := client.UserDeleteBranch(ctx, request) + require.NoError(t, err) + require.Empty(t, response.PreReceiveError) + + refs = gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs") + require.NotContains(t, string(refs), "refs/heads/"+testCase.branchName) + require.Contains(t, string(refs), "refs/tags/"+preExistingTagName) + }) + } +} + func TestSuccessfulGitHooksForUserDeleteBranchRequest(t *testing.T) { t.Parallel() ctx, cancel := testhelper.Context() diff --git a/internal/gitaly/service/operations/tags_test.go b/internal/gitaly/service/operations/tags_test.go index 0a51b392a..b9af65120 100644 --- a/internal/gitaly/service/operations/tags_test.go +++ b/internal/gitaly/service/operations/tags_test.go @@ -54,6 +54,60 @@ func TestSuccessfulUserDeleteTagRequest(t *testing.T) { require.NotContains(t, string(tags), tagNameInput, "tag name still exists in tags list") } +func TestSuccessfulUserCreateTagWithExistingBranchOfSameName(t *testing.T) { + t.Parallel() + + ctx, cancel := testhelper.Context() + defer cancel() + + ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) + + preExistingBranchName := "foobarBranch" + gittest.Exec(t, cfg, "-C", repoPath, "branch", "-f", preExistingBranchName) + + testCases := []struct { + desc string + tagName string + }{ + { + desc: "branch matches existing tag name", + tagName: preExistingBranchName, + }, + { + // This should create a tag under refs/tags/refs/heads/{something} + desc: "branch matches existing tag ref prefix", + tagName: "refs/heads/" + preExistingBranchName, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.desc, func(t *testing.T) { + refs := gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs") + require.NotContains(t, string(refs), "refs/tags/"+testCase.tagName) + require.Contains(t, string(refs), "refs/heads/"+preExistingBranchName) + + tags := gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs/tags/"+testCase.tagName) + require.NotContains(t, string(tags), "refs/tags/"+testCase.tagName) + + request := &gitalypb.UserCreateTagRequest{ + Repository: repoProto, + TagName: []byte(testCase.tagName), + TargetRevision: []byte("master"), + User: gittest.TestUser, + } + + response, err := client.UserCreateTag(ctx, request) + require.NoError(t, err) + require.Equal(t, testCase.tagName, string(response.Tag.Name)) + require.Empty(t, response.PreReceiveError) + + refs = gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs") + require.Contains(t, string(refs), "refs/tags/"+testCase.tagName) + require.Contains(t, string(refs), "refs/heads/"+preExistingBranchName) + }) + } +} + func TestSuccessfulGitHooksForUserDeleteTagRequest(t *testing.T) { t.Parallel() ctx, cancel := testhelper.Context() @@ -882,6 +936,57 @@ func TestUserCreateTagStableTagIDs(t *testing.T) { }, response.Tag) } +func TestSuccessfulDeleteTagWithoutImpactingBranchOfSameName(t *testing.T) { + t.Parallel() + + ctx, cancel := testhelper.Context() + defer cancel() + + ctx, cfg, repoProto, repoPath, client := setupOperationsService(t, ctx) + + preExistingBranchName := "foobarBranch" + gittest.Exec(t, cfg, "-C", repoPath, "branch", "-f", preExistingBranchName) + + testCases := []struct { + desc string + tagName string + }{ + { + desc: "tag matches existing branch name", + tagName: preExistingBranchName, + }, + { + // This should create a branch under refs/heads/refs/tags/{something} + desc: "tag matches existing branch ref prefix", + tagName: "refs/tags/" + preExistingBranchName, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.desc, func(t *testing.T) { + gittest.Exec(t, cfg, "-C", repoPath, "tag", "-f", testCase.tagName) + + refs := gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs") + require.Contains(t, string(refs), "refs/tags/"+testCase.tagName) + require.Contains(t, string(refs), "refs/heads/"+preExistingBranchName) + + request := &gitalypb.UserDeleteTagRequest{ + Repository: repoProto, + TagName: []byte(testCase.tagName), + User: gittest.TestUser, + } + + response, err := client.UserDeleteTag(ctx, request) + require.NoError(t, err) + require.Empty(t, response.PreReceiveError) + + refs = gittest.Exec(t, cfg, "-C", repoPath, "for-each-ref", "--", "refs") + require.NotContains(t, string(refs), "refs/tags/"+testCase.tagName) + require.Contains(t, string(refs), "refs/heads/"+preExistingBranchName) + }) + } +} + func TestUserDeleteTagSuccessfulDeletionOfPrefixedTag(t *testing.T) { t.Parallel() |