diff options
author | Quang-Minh Nguyen <qmnguyen@gitlab.com> | 2023-12-06 10:21:40 +0300 |
---|---|---|
committer | Quang-Minh Nguyen <qmnguyen@gitlab.com> | 2023-12-08 08:18:04 +0300 |
commit | c0d0d21aba9df45916b22e30d130ad813c0c0183 (patch) | |
tree | f33f4bbdb2785ab69dfc11bccb2ed09fabacc040 | |
parent | 190e94fa5f05b01325a7f2da0cf474f6b0e85ae0 (diff) |
Split tests related to default branch out of TransactionManager
-rw-r--r-- | internal/gitaly/storage/storagemgr/transaction_manager_default_branch_test.go | 308 | ||||
-rw-r--r-- | internal/gitaly/storage/storagemgr/transaction_manager_test.go | 297 |
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), } |