Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQuang-Minh Nguyen <qmnguyen@gitlab.com>2023-12-06 10:21:40 +0300
committerQuang-Minh Nguyen <qmnguyen@gitlab.com>2023-12-08 08:18:04 +0300
commitc0d0d21aba9df45916b22e30d130ad813c0c0183 (patch)
treef33f4bbdb2785ab69dfc11bccb2ed09fabacc040
parent190e94fa5f05b01325a7f2da0cf474f6b0e85ae0 (diff)
Split tests related to default branch out of TransactionManager
-rw-r--r--internal/gitaly/storage/storagemgr/transaction_manager_default_branch_test.go308
-rw-r--r--internal/gitaly/storage/storagemgr/transaction_manager_test.go297
2 files changed, 309 insertions, 296 deletions
diff --git a/internal/gitaly/storage/storagemgr/transaction_manager_default_branch_test.go b/internal/gitaly/storage/storagemgr/transaction_manager_default_branch_test.go
new file mode 100644
index 000000000..200877c9a
--- /dev/null
+++ b/internal/gitaly/storage/storagemgr/transaction_manager_default_branch_test.go
@@ -0,0 +1,308 @@
+package storagemgr
+
+import (
+ "testing"
+
+ "gitlab.com/gitlab-org/gitaly/v16/internal/git"
+)
+
+func generateDefaultBranchTests(t *testing.T, setup testTransactionSetup) []transactionTestCase {
+ return []transactionTestCase{
+ {
+ desc: "update default branch with existing branch",
+ steps: steps{
+ StartManager{},
+ Begin{
+ TransactionID: 1,
+ RelativePath: setup.RelativePath,
+ },
+ Commit{
+ TransactionID: 1,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ },
+ },
+ Begin{
+ TransactionID: 2,
+ RelativePath: setup.RelativePath,
+ ExpectedSnapshotLSN: 1,
+ },
+ Commit{
+ TransactionID: 2,
+ DefaultBranchUpdate: &DefaultBranchUpdate{
+ Reference: "refs/heads/branch2",
+ },
+ },
+ },
+ expectedState: StateAssertion{
+ Database: DatabaseState{
+ string(keyAppliedLSN(setup.PartitionID)): LSN(2).toProto(),
+ },
+ Repositories: RepositoryStates{
+ setup.RelativePath: {
+ DefaultBranch: "refs/heads/branch2",
+ References: []git.Reference{
+ {Name: "refs/heads/branch2", Target: setup.Commits.First.OID.String()},
+ {Name: "refs/heads/main", Target: setup.Commits.First.OID.String()},
+ },
+ },
+ },
+ },
+ },
+ {
+ desc: "update default branch with new branch created in same transaction",
+ steps: steps{
+ StartManager{},
+ Begin{
+ TransactionID: 1,
+ RelativePath: setup.RelativePath,
+ },
+ Commit{
+ TransactionID: 1,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ },
+ },
+ Begin{
+ TransactionID: 2,
+ RelativePath: setup.RelativePath,
+ ExpectedSnapshotLSN: 1,
+ },
+ Commit{
+ TransactionID: 2,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ "refs/heads/main": {OldOID: setup.Commits.First.OID, NewOID: setup.Commits.Second.OID},
+ },
+ DefaultBranchUpdate: &DefaultBranchUpdate{
+ Reference: "refs/heads/branch2",
+ },
+ },
+ },
+ expectedState: StateAssertion{
+ Database: DatabaseState{
+ string(keyAppliedLSN(setup.PartitionID)): LSN(2).toProto(),
+ },
+ Repositories: RepositoryStates{
+ setup.RelativePath: {
+ DefaultBranch: "refs/heads/branch2",
+ References: []git.Reference{
+ {Name: "refs/heads/branch2", Target: setup.Commits.First.OID.String()},
+ {Name: "refs/heads/main", Target: setup.Commits.Second.OID.String()},
+ },
+ },
+ },
+ },
+ },
+ {
+ desc: "update default branch with invalid reference name",
+ steps: steps{
+ StartManager{},
+ Begin{
+ RelativePath: setup.RelativePath,
+ },
+ Commit{
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ },
+ DefaultBranchUpdate: &DefaultBranchUpdate{
+ Reference: "refs/heads/../main",
+ },
+ ExpectedError: InvalidReferenceFormatError{
+ ReferenceName: "refs/heads/../main",
+ },
+ },
+ },
+ },
+ {
+ desc: "update default branch to point to a non-existent reference name",
+ steps: steps{
+ StartManager{},
+ Begin{
+ RelativePath: setup.RelativePath,
+ },
+ Commit{
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ },
+ DefaultBranchUpdate: &DefaultBranchUpdate{
+ Reference: "refs/heads/non-existent",
+ },
+ },
+ },
+ expectedState: StateAssertion{
+ Database: DatabaseState{
+ string(keyAppliedLSN(setup.PartitionID)): LSN(1).toProto(),
+ },
+ Repositories: RepositoryStates{
+ setup.RelativePath: {
+ DefaultBranch: "refs/heads/non-existent",
+ References: []git.Reference{{Name: "refs/heads/main", Target: setup.Commits.First.OID.String()}},
+ },
+ },
+ },
+ },
+ {
+ desc: "update default branch to point non-refs prefixed reference",
+ steps: steps{
+ StartManager{},
+ Begin{
+ RelativePath: setup.RelativePath,
+ },
+ Commit{
+ DefaultBranchUpdate: &DefaultBranchUpdate{
+ Reference: "other/non-existent",
+ },
+ ExpectedError: InvalidReferenceFormatError{ReferenceName: "other/non-existent"},
+ },
+ },
+ },
+ {
+ desc: "update default branch to point to reference being deleted in the same transaction",
+ steps: steps{
+ StartManager{},
+ Begin{
+ TransactionID: 1,
+ RelativePath: setup.RelativePath,
+ },
+ Commit{
+ TransactionID: 1,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ },
+ },
+ Begin{
+ TransactionID: 2,
+ RelativePath: setup.RelativePath,
+ ExpectedSnapshotLSN: 1,
+ },
+ Commit{
+ TransactionID: 2,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/branch2": {OldOID: setup.Commits.First.OID, NewOID: setup.ObjectHash.ZeroOID},
+ },
+ DefaultBranchUpdate: &DefaultBranchUpdate{
+ Reference: "refs/heads/branch2",
+ },
+ },
+ },
+ expectedState: StateAssertion{
+ Database: DatabaseState{
+ string(keyAppliedLSN(setup.PartitionID)): LSN(2).toProto(),
+ },
+ Repositories: RepositoryStates{
+ setup.RelativePath: {
+ DefaultBranch: "refs/heads/branch2",
+ References: []git.Reference{
+ {Name: "refs/heads/main", Target: setup.Commits.First.OID.String()},
+ },
+ },
+ },
+ },
+ },
+ {
+ desc: "update default branch with existing branch and other modifications",
+ steps: steps{
+ StartManager{},
+ Begin{
+ TransactionID: 1,
+ RelativePath: setup.RelativePath,
+ },
+ Commit{
+ TransactionID: 1,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ },
+ },
+ Begin{
+ TransactionID: 2,
+ RelativePath: setup.RelativePath,
+ ExpectedSnapshotLSN: 1,
+ },
+ Commit{
+ TransactionID: 2,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/main": {OldOID: setup.Commits.First.OID, NewOID: setup.Commits.Second.OID},
+ },
+ DefaultBranchUpdate: &DefaultBranchUpdate{
+ Reference: "refs/heads/branch2",
+ },
+ },
+ },
+ expectedState: StateAssertion{
+ Database: DatabaseState{
+ string(keyAppliedLSN(setup.PartitionID)): LSN(2).toProto(),
+ },
+ Repositories: RepositoryStates{
+ setup.RelativePath: {
+ DefaultBranch: "refs/heads/branch2",
+ References: []git.Reference{
+ {Name: "refs/heads/branch2", Target: setup.Commits.First.OID.String()},
+ {Name: "refs/heads/main", Target: setup.Commits.Second.OID.String()},
+ },
+ },
+ },
+ },
+ },
+ {
+ desc: "update default branch fails before storing log index",
+ steps: steps{
+ StartManager{
+ Hooks: testTransactionHooks{
+ BeforeStoreAppliedLSN: func(hookCtx hookContext) {
+ panic(errSimulatedCrash)
+ },
+ },
+ ExpectedError: errSimulatedCrash,
+ },
+ Begin{
+ TransactionID: 1,
+ RelativePath: setup.RelativePath,
+ },
+ Commit{
+ TransactionID: 1,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
+ },
+ DefaultBranchUpdate: &DefaultBranchUpdate{
+ Reference: "refs/heads/branch2",
+ },
+ ExpectedError: ErrTransactionProcessingStopped,
+ },
+ AssertManager{
+ ExpectedError: errSimulatedCrash,
+ },
+ StartManager{},
+ Begin{
+ TransactionID: 2,
+ RelativePath: setup.RelativePath,
+ ExpectedSnapshotLSN: 1,
+ },
+ Commit{
+ TransactionID: 2,
+ ReferenceUpdates: ReferenceUpdates{
+ "refs/heads/main": {OldOID: setup.Commits.First.OID, NewOID: setup.Commits.Second.OID},
+ },
+ },
+ },
+ expectedState: StateAssertion{
+ Database: DatabaseState{
+ string(keyAppliedLSN(setup.PartitionID)): LSN(2).toProto(),
+ },
+ Repositories: RepositoryStates{
+ setup.RelativePath: {
+ DefaultBranch: "refs/heads/branch2",
+ References: []git.Reference{
+ {Name: "refs/heads/branch2", Target: setup.Commits.First.OID.String()},
+ {Name: "refs/heads/main", Target: setup.Commits.Second.OID.String()},
+ },
+ },
+ },
+ },
+ },
+ }
+}
diff --git a/internal/gitaly/storage/storagemgr/transaction_manager_test.go b/internal/gitaly/storage/storagemgr/transaction_manager_test.go
index fb0bea1ea..7abb9bf61 100644
--- a/internal/gitaly/storage/storagemgr/transaction_manager_test.go
+++ b/internal/gitaly/storage/storagemgr/transaction_manager_test.go
@@ -377,302 +377,6 @@ func TestTransactionManager(t *testing.T) {
},
},
{
- desc: "update default branch with existing branch",
- steps: steps{
- StartManager{},
- Begin{
- TransactionID: 1,
- RelativePath: relativePath,
- },
- Commit{
- TransactionID: 1,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- },
- },
- Begin{
- TransactionID: 2,
- RelativePath: relativePath,
- ExpectedSnapshotLSN: 1,
- },
- Commit{
- TransactionID: 2,
- DefaultBranchUpdate: &DefaultBranchUpdate{
- Reference: "refs/heads/branch2",
- },
- },
- },
- expectedState: StateAssertion{
- Database: DatabaseState{
- string(keyAppliedLSN(partitionID)): LSN(2).toProto(),
- },
- Repositories: RepositoryStates{
- relativePath: {
- DefaultBranch: "refs/heads/branch2",
- References: []git.Reference{
- {Name: "refs/heads/branch2", Target: setup.Commits.First.OID.String()},
- {Name: "refs/heads/main", Target: setup.Commits.First.OID.String()},
- },
- },
- },
- },
- },
- {
- desc: "update default branch with new branch created in same transaction",
- steps: steps{
- StartManager{},
- Begin{
- TransactionID: 1,
- RelativePath: relativePath,
- },
- Commit{
- TransactionID: 1,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- },
- },
- Begin{
- TransactionID: 2,
- RelativePath: relativePath,
- ExpectedSnapshotLSN: 1,
- },
- Commit{
- TransactionID: 2,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- "refs/heads/main": {OldOID: setup.Commits.First.OID, NewOID: setup.Commits.Second.OID},
- },
- DefaultBranchUpdate: &DefaultBranchUpdate{
- Reference: "refs/heads/branch2",
- },
- },
- },
- expectedState: StateAssertion{
- Database: DatabaseState{
- string(keyAppliedLSN(partitionID)): LSN(2).toProto(),
- },
- Repositories: RepositoryStates{
- relativePath: {
- DefaultBranch: "refs/heads/branch2",
- References: []git.Reference{
- {Name: "refs/heads/branch2", Target: setup.Commits.First.OID.String()},
- {Name: "refs/heads/main", Target: setup.Commits.Second.OID.String()},
- },
- },
- },
- },
- },
- {
- desc: "update default branch with invalid reference name",
- steps: steps{
- StartManager{},
- Begin{
- RelativePath: relativePath,
- },
- Commit{
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- },
- DefaultBranchUpdate: &DefaultBranchUpdate{
- Reference: "refs/heads/../main",
- },
- ExpectedError: InvalidReferenceFormatError{
- ReferenceName: "refs/heads/../main",
- },
- },
- },
- },
- {
- desc: "update default branch to point to a non-existent reference name",
- steps: steps{
- StartManager{},
- Begin{
- RelativePath: relativePath,
- },
- Commit{
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- },
- DefaultBranchUpdate: &DefaultBranchUpdate{
- Reference: "refs/heads/non-existent",
- },
- },
- },
- expectedState: StateAssertion{
- Database: DatabaseState{
- string(keyAppliedLSN(partitionID)): LSN(1).toProto(),
- },
- Repositories: RepositoryStates{
- relativePath: {
- DefaultBranch: "refs/heads/non-existent",
- References: []git.Reference{{Name: "refs/heads/main", Target: setup.Commits.First.OID.String()}},
- },
- },
- },
- },
- {
- desc: "update default branch to point non-refs prefixed reference",
- steps: steps{
- StartManager{},
- Begin{
- RelativePath: relativePath,
- },
- Commit{
- DefaultBranchUpdate: &DefaultBranchUpdate{
- Reference: "other/non-existent",
- },
- ExpectedError: InvalidReferenceFormatError{ReferenceName: "other/non-existent"},
- },
- },
- },
- {
- desc: "update default branch to point to reference being deleted in the same transaction",
- steps: steps{
- StartManager{},
- Begin{
- TransactionID: 1,
- RelativePath: relativePath,
- },
- Commit{
- TransactionID: 1,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- },
- },
- Begin{
- TransactionID: 2,
- RelativePath: relativePath,
- ExpectedSnapshotLSN: 1,
- },
- Commit{
- TransactionID: 2,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/branch2": {OldOID: setup.Commits.First.OID, NewOID: setup.ObjectHash.ZeroOID},
- },
- DefaultBranchUpdate: &DefaultBranchUpdate{
- Reference: "refs/heads/branch2",
- },
- },
- },
- expectedState: StateAssertion{
- Database: DatabaseState{
- string(keyAppliedLSN(partitionID)): LSN(2).toProto(),
- },
- Repositories: RepositoryStates{
- relativePath: {
- DefaultBranch: "refs/heads/branch2",
- References: []git.Reference{
- {Name: "refs/heads/main", Target: setup.Commits.First.OID.String()},
- },
- },
- },
- },
- },
- {
- desc: "update default branch with existing branch and other modifications",
- steps: steps{
- StartManager{},
- Begin{
- TransactionID: 1,
- RelativePath: relativePath,
- },
- Commit{
- TransactionID: 1,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- },
- },
- Begin{
- TransactionID: 2,
- RelativePath: relativePath,
- ExpectedSnapshotLSN: 1,
- },
- Commit{
- TransactionID: 2,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/main": {OldOID: setup.Commits.First.OID, NewOID: setup.Commits.Second.OID},
- },
- DefaultBranchUpdate: &DefaultBranchUpdate{
- Reference: "refs/heads/branch2",
- },
- },
- },
- expectedState: StateAssertion{
- Database: DatabaseState{
- string(keyAppliedLSN(partitionID)): LSN(2).toProto(),
- },
- Repositories: RepositoryStates{
- relativePath: {
- DefaultBranch: "refs/heads/branch2",
- References: []git.Reference{
- {Name: "refs/heads/branch2", Target: setup.Commits.First.OID.String()},
- {Name: "refs/heads/main", Target: setup.Commits.Second.OID.String()},
- },
- },
- },
- },
- },
- {
- desc: "update default branch fails before storing log index",
- steps: steps{
- StartManager{
- Hooks: testTransactionHooks{
- BeforeStoreAppliedLSN: func(hookCtx hookContext) {
- panic(errSimulatedCrash)
- },
- },
- ExpectedError: errSimulatedCrash,
- },
- Begin{
- TransactionID: 1,
- RelativePath: relativePath,
- },
- Commit{
- TransactionID: 1,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/main": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- "refs/heads/branch2": {OldOID: setup.ObjectHash.ZeroOID, NewOID: setup.Commits.First.OID},
- },
- DefaultBranchUpdate: &DefaultBranchUpdate{
- Reference: "refs/heads/branch2",
- },
- ExpectedError: ErrTransactionProcessingStopped,
- },
- AssertManager{
- ExpectedError: errSimulatedCrash,
- },
- StartManager{},
- Begin{
- TransactionID: 2,
- RelativePath: relativePath,
- ExpectedSnapshotLSN: 1,
- },
- Commit{
- TransactionID: 2,
- ReferenceUpdates: ReferenceUpdates{
- "refs/heads/main": {OldOID: setup.Commits.First.OID, NewOID: setup.Commits.Second.OID},
- },
- },
- },
- expectedState: StateAssertion{
- Database: DatabaseState{
- string(keyAppliedLSN(partitionID)): LSN(2).toProto(),
- },
- Repositories: RepositoryStates{
- relativePath: {
- DefaultBranch: "refs/heads/branch2",
- References: []git.Reference{
- {Name: "refs/heads/branch2", Target: setup.Commits.First.OID.String()},
- {Name: "refs/heads/main", Target: setup.Commits.Second.OID.String()},
- },
- },
- },
- },
- },
- {
desc: "read snapshots include committed data",
steps: steps{
StartManager{},
@@ -1774,6 +1478,7 @@ func TestTransactionManager(t *testing.T) {
generateModifyReferencesTests(t, setup),
generateCreateRepositoryTests(t, setup),
generateDeleteRepositoryTests(t, setup),
+ generateDefaultBranchTests(t, setup),
generateAlternateTests(t, setup),
generateCustomHooksTests(t, setup),
}