Skip to content

Bump Npgsql from 8.0.3 to 9.0.4

5ec3f3c
Select commit
Loading
Failed to load commit list.
Sign in for the full log view
Merged

Bump Npgsql from 8.0.3 to 9.0.4 #45

Bump Npgsql from 8.0.3 to 9.0.4
5ec3f3c
Select commit
Loading
Failed to load commit list.
GitHub Actions / Test Results succeeded Nov 20, 2025 in 0s

328 passed, 0 failed and 0 skipped

Tests passed successfully

Report Passed Failed Skipped Time
tests/MultiLock.IntegrationTests/TestResults/test-results.trx 76✅ 36s
tests/MultiLock.Tests/TestResults/test-results.trx 252✅ 9s

✅ tests/MultiLock.IntegrationTests/TestResults/test-results.trx

76 tests were completed in 36s with 76 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
MultiLock.IntegrationTests.AzureBlobStorageIntegrationTests 8✅ 2s
MultiLock.IntegrationTests.ConsulIntegrationTests 8✅ 34s
MultiLock.IntegrationTests.FileSystemIntegrationTests 13✅ 728ms
MultiLock.IntegrationTests.PostgreSqlIntegrationTests 9✅ 1s
MultiLock.IntegrationTests.RedisIntegrationTests 9✅ 2s
MultiLock.IntegrationTests.SqlServerIntegrationTests 9✅ 1s
MultiLock.IntegrationTests.ZooKeeperIntegrationTests 20✅ 6s

✅ MultiLock.IntegrationTests.AzureBlobStorageIntegrationTests

✅ AzureBlobStorage_LeaderElection_ShouldWork
✅ HealthCheck_WithAzurite_ShouldReturnTrue
✅ IsLeader_WhenLeader_ShouldReturnTrue
✅ ReleaseLeadership_ShouldAllowNewLeader
✅ TryAcquireLeadership_WhenAlreadyAcquired_ShouldReturnFalse
✅ TryAcquireLeadership_WithAzurite_ShouldSucceed
✅ UpdateHeartbeat_AsLeader_ShouldSucceed
✅ UpdateHeartbeat_AsNonLeader_ShouldReturnFalse

✅ MultiLock.IntegrationTests.ConsulIntegrationTests

✅ Consul_LeaderElection_ShouldWork
✅ HealthCheck_WithConsul_ShouldReturnTrue
✅ IsLeader_WhenLeader_ShouldReturnTrue
✅ ReleaseLeadership_ShouldAllowNewLeader
✅ TryAcquireLeadership_WhenAlreadyAcquired_ShouldReturnFalse
✅ TryAcquireLeadership_WithConsul_ShouldSucceed
✅ UpdateHeartbeat_AsLeader_ShouldSucceed
✅ UpdateHeartbeat_AsNonLeader_ShouldReturnFalse

✅ MultiLock.IntegrationTests.FileSystemIntegrationTests

✅ AutoCreateDirectory_WhenEnabled_ShouldCreateDirectory
✅ GetCurrentLeader_WhenLeaderExists_ShouldReturnLeaderInfo
✅ GetCurrentLeader_WhenNoLeader_ShouldReturnNull
✅ HealthCheck_WithFileSystem_ShouldReturnTrue
✅ IsLeader_WhenLeader_ShouldReturnTrue
✅ IsLeader_WhenNotLeader_ShouldReturnFalse
✅ ReleaseLeadership_WhenLeader_ShouldReleaseLeadership
✅ ReleaseLeadership_WhenNotLeader_ShouldNotThrow
✅ TryAcquireLeadership_SameParticipantTwice_ShouldSucceed
✅ TryAcquireLeadership_WhenAlreadyHeld_ShouldFail
✅ TryAcquireLeadership_WithFileSystem_ShouldSucceed
✅ UpdateHeartbeat_WhenLeader_ShouldSucceed
✅ UpdateHeartbeat_WhenNotLeader_ShouldFail

✅ MultiLock.IntegrationTests.PostgreSqlIntegrationTests

✅ GetCurrentLeader_ShouldReturnLeaderInfo
✅ HealthCheck_WithPostgreSQL_ShouldReturnTrue
✅ IsLeader_ShouldReturnCorrectStatus
✅ PostgreSQL_LeaderElection_ShouldWork
✅ ReleaseLeadership_ShouldAllowNewLeader
✅ TryAcquireLeadership_WhenAlreadyAcquired_ShouldReturnFalse
✅ TryAcquireLeadership_WithPostgreSQL_ShouldSucceed
✅ UpdateHeartbeat_AsLeader_ShouldSucceed
✅ UpdateHeartbeat_AsNonLeader_ShouldReturnFalse

✅ MultiLock.IntegrationTests.RedisIntegrationTests

✅ GetCurrentLeader_ShouldReturnLeaderInfo
✅ HealthCheck_WithRedis_ShouldReturnTrue
✅ IsLeader_ShouldReturnCorrectStatus
✅ Redis_LeaderElection_ShouldWork
✅ ReleaseLeadership_ShouldAllowNewLeader
✅ TryAcquireLeadership_WhenAlreadyAcquired_ShouldReturnFalse
✅ TryAcquireLeadership_WithRedis_ShouldSucceed
✅ UpdateHeartbeat_AsLeader_ShouldSucceed
✅ UpdateHeartbeat_AsNonLeader_ShouldReturnFalse

✅ MultiLock.IntegrationTests.SqlServerIntegrationTests

✅ GetCurrentLeader_ShouldReturnLeaderInfo
✅ HealthCheck_WithSqlServer_ShouldReturnTrue
✅ IsLeader_ShouldReturnCorrectStatus
✅ ReleaseLeadership_ShouldAllowNewLeader
✅ SqlServer_LeaderElection_ShouldWork
✅ TryAcquireLeadership_WhenAlreadyAcquired_ShouldReturnFalse
✅ TryAcquireLeadership_WithSqlServer_ShouldSucceed
✅ UpdateHeartbeat_AsLeader_ShouldSucceed
✅ UpdateHeartbeat_AsNonLeader_ShouldReturnFalse

✅ MultiLock.IntegrationTests.ZooKeeperIntegrationTests

✅ DisposeAsync_CalledTwice_ShouldBeIdempotent
✅ DisposeAsync_ShouldPreventFurtherOperations
✅ GetCurrentLeader_ShouldReturnLeaderInfo
✅ GetCurrentLeader_WhenNoLeader_ShouldReturnNull
✅ HealthCheck_AfterDisposal_ShouldReturnFalse
✅ HealthCheck_WithZooKeeper_ShouldReturnTrue
✅ IsLeader_ShouldReturnCorrectStatus
✅ MultipleElectionGroups_ShouldWorkIndependently
✅ ReleaseLeadership_ShouldAllowNewLeader
✅ ReleaseLeadership_WhenNotHoldingLeadership_ShouldNotThrow
✅ TryAcquireLeadership_SameParticipantTwice_ShouldReuseNode
✅ TryAcquireLeadership_WhenAlreadyAcquired_ShouldReturnFalse
✅ TryAcquireLeadership_WithZooKeeper_ShouldSucceed
✅ UpdateHeartbeat_AsLeader_ShouldSucceed
✅ UpdateHeartbeat_AsNonLeader_ShouldReturnFalse
✅ UpdateHeartbeat_WhenNodeDeleted_ShouldReturnFalse
✅ UpdateHeartbeat_WithMetadataChanges_ShouldUpdateMetadata
✅ ZooKeeper_HealthCheck_ShouldWork
✅ ZooKeeper_LeaderElection_ShouldWork
✅ ZooKeeper_SingleParticipant_ShouldBecomeLeader

✅ tests/MultiLock.Tests/TestResults/test-results.trx

252 tests were completed in 9s with 252 passed, 0 failed and 0 skipped.

Test suite Passed Failed Skipped Time
MultiLock.Tests.AsyncEnumerableApiTests 8✅ 1s
MultiLock.Tests.AzureBlobStorageProviderTests 9✅ 364ms
MultiLock.Tests.ConcurrentScenarioTests 12✅ 2s
MultiLock.Tests.ConsulProviderTests 11✅ 142ms
MultiLock.Tests.DisposalRaceConditionTests 8✅ 2s
MultiLock.Tests.FileSystemServiceCollectionExtensionsTests 7✅ 29ms
MultiLock.Tests.InMemoryProviderTests 14✅ 247ms
MultiLock.Tests.InMemoryServiceCollectionExtensionsTests 5✅ 79ms
MultiLock.Tests.LeadershipExtensionMethodsTests 16✅ 2s
MultiLock.Tests.MultiInstanceLeaderElectionTests 3✅ 587ms
MultiLock.Tests.ParameterValidationTests 70✅ 59ms
MultiLock.Tests.PostgreSqlProviderTests 9✅ 74ms
MultiLock.Tests.ProviderInputValidationTests 26✅ 661ms
MultiLock.Tests.RedisProviderTests 8✅ 52ms
MultiLock.Tests.ServiceExtensionsValidationTests 12✅ 9ms
MultiLock.Tests.SqlServerProviderTests 9✅ 168ms
MultiLock.Tests.ZooKeeperProviderTests 14✅ 144ms
MultiLock.Tests.ZooKeeperServiceCollectionExtensionsTests 11✅ 90ms

✅ MultiLock.Tests.AsyncEnumerableApiTests

✅ GetLeadershipChangesAsync_CancellationToken_ShouldStopEnumeration
✅ GetLeadershipChangesAsync_EventOrder_ShouldBeCorrect
✅ GetLeadershipChangesAsync_MultipleSubscribers_ShouldAllReceiveEvents
✅ GetLeadershipChangesAsync_ShouldEmitAcquiredEvent_WhenBecomingLeader
✅ GetLeadershipChangesAsync_ShouldEmitLostEvent_WhenLosingLeadership
✅ GetLeadershipChangesAsync_WithChangedFilter_ShouldEmitAllStatusChanges
✅ GetLeadershipChangesAsync_WithFilter_ShouldOnlyEmitAcquiredEvents
✅ GetLeadershipChangesAsync_WithFilter_ShouldOnlyEmitLostEvents

✅ MultiLock.Tests.AzureBlobStorageProviderTests

✅ Constructor_WithValidOptions_ShouldSucceed
✅ Dispose_MultipleTimes_ShouldNotThrow
✅ Dispose_ShouldNotThrow
✅ MethodsAfterDispose_ShouldThrow
✅ Options_WithEmptyConnectionString_ShouldThrow
✅ Options_WithEmptyContainerName_ShouldThrow
✅ Options_WithInfiniteLeaseDuration_ShouldSucceed
✅ Options_WithInvalidLeaseDuration_ShouldThrow
✅ Options_WithValidLeaseDuration_ShouldSucceed

✅ MultiLock.Tests.ConcurrentScenarioTests

✅ ConcurrentAcquireAndRelease_ShouldMaintainConsistency
✅ ConcurrentAcquireAttempts_20Participants_OnlyOneSucceeds
✅ ConcurrentGetCurrentLeader_ShouldReturnConsistentResults
✅ ConcurrentHeartbeatUpdates_ShouldBeThreadSafe
✅ ConcurrentIsLeaderChecks_ShouldBeThreadSafe
✅ ConcurrentMetadataUpdates_ShouldNotCorruptData
✅ HighConcurrency_10Participants_ShouldElectExactlyOneLeader
✅ LeaderFailover_ConcurrentFailoverAttempts_ShouldBeThreadSafe
✅ LeaderFailover_MultipleWaitingParticipants_ShouldElectExactlyOneNewLeader
✅ LeaderFailover_RapidLeaderChanges_ShouldMaintainConsistency
✅ LeaderFailover_SimultaneousFailureAndAcquire_ShouldNotCauseSplitBrain
✅ RapidAcquireReleaseCycles_100Iterations_ShouldNotCauseRaceConditions

✅ MultiLock.Tests.ConsulProviderTests

✅ Constructor_WithValidOptions_ShouldSucceed
✅ Dispose_MultipleTimes_ShouldNotThrow
✅ Dispose_ShouldNotThrow
✅ DisposeAsync_MultipleTimes_ShouldNotThrow
✅ DisposeAsync_ShouldNotThrow
✅ MethodsAfterDispose_ShouldThrow
✅ Options_WithEmptyAddress_ShouldThrow
✅ Options_WithEmptyKeyPrefix_ShouldThrow
✅ Options_WithInvalidSessionLockDelay_ShouldThrow
✅ Options_WithInvalidSessionTtl_ShouldThrow
✅ Options_WithValidConfiguration_ShouldSucceed

✅ MultiLock.Tests.DisposalRaceConditionTests

✅ ConcurrentDispose_ShouldBeIdempotent
✅ Dispose_ShouldStopTimerCallbacksFromExecuting
✅ Dispose_ShouldWaitForActiveCallbacksToComplete
✅ Dispose_WhileElectionCallbackRunning_ShouldNotThrowObjectDisposedException
✅ Dispose_WhileHeartbeatCallbackRunning_ShouldNotThrowObjectDisposedException
✅ DisposeAsync_ThenDispose_ShouldBeIdempotent
✅ MultipleServices_DisposedConcurrently_ShouldNotInterfere
✅ RapidStartStopCycles_ShouldNotCauseRaceConditions

✅ MultiLock.Tests.FileSystemServiceCollectionExtensionsTests

✅ AddFileSystemLeaderElection_ShouldAllowMultipleCalls
✅ AddFileSystemLeaderElection_WithConfigureOptions_ShouldRegisterProvider
✅ AddFileSystemLeaderElection_WithConfigureOptionsAndLeaderElectionOptions_ShouldRegisterProvider
✅ AddFileSystemLeaderElection_WithDirectoryPath_ShouldRegisterProvider
✅ AddFileSystemLeaderElection_WithDirectoryPathAndLeaderElectionOptions_ShouldRegisterProvider
✅ AddFileSystemLeaderElection_WithNullLeaderElectionOptions_ShouldRegisterProvider
✅ AddFileSystemLeaderElection_WithNullServices_ShouldThrowArgumentNullException

✅ MultiLock.Tests.InMemoryProviderTests

✅ Dispose_MultipleTimes_ShouldNotThrow
✅ Dispose_ShouldNotThrow
✅ GetCurrentLeaderAsync_WhenLeaderExists_ShouldReturnLeaderInfo
✅ GetCurrentLeaderAsync_WhenNoLeader_ShouldReturnNull
✅ HealthCheckAsync_ShouldReturnTrue
✅ IsLeaderAsync_WhenIsLeader_ShouldReturnTrue
✅ IsLeaderAsync_WhenNotLeader_ShouldReturnFalse
✅ MethodsAfterDispose_ShouldThrow
✅ ReleaseLeadershipAsync_WhenIsLeader_ShouldReleaseLeadership
✅ TryAcquireLeadershipAsync_WhenLeaderExists_ShouldFail
✅ TryAcquireLeadershipAsync_WhenLeaderExpired_ShouldSucceed
✅ TryAcquireLeadershipAsync_WhenNoExistingLeader_ShouldSucceed
✅ UpdateHeartbeatAsync_WhenIsLeader_ShouldSucceed
✅ UpdateHeartbeatAsync_WhenNotLeader_ShouldFail

✅ MultiLock.Tests.InMemoryServiceCollectionExtensionsTests

✅ AddInMemoryLeaderElection_ShouldAllowMultipleCalls
✅ AddInMemoryLeaderElection_WithConfigureOptions_ShouldRegisterProviderAndConfigureOptions
✅ AddInMemoryLeaderElection_WithNullConfigureOptions_ShouldRegisterProvider
✅ AddInMemoryLeaderElection_WithNullServices_ShouldThrowArgumentNullException
✅ AddInMemoryLeaderElection_WithValidServices_ShouldRegisterProvider

✅ MultiLock.Tests.LeadershipExtensionMethodsTests

✅ BufferByCount_ShouldGroupEventsByCount
✅ BufferByTime_ShouldGroupEventsByTimeWindow
✅ CombinedExtensions_ShouldWorkTogether
✅ Debounce_ShouldDelayEvents
✅ DistinctUntilChanged_ShouldFilterConsecutiveDuplicates
✅ ForEachAsync_ShouldExecuteActionForEachEvent
✅ ForEachAsync_WithAsyncAction_ShouldExecuteAsyncActionForEachEvent
✅ OnLeadershipTransition_ShouldExecuteCallbacks
✅ OnLeadershipTransition_WithAsyncCallbacks_ShouldExecuteAsyncCallbacks
✅ Select_ShouldTransformEvents
✅ Skip_ShouldSkipEvents
✅ Take_ShouldLimitNumberOfEvents
✅ TakeUntilLeader_ShouldStopWhenBecomingLeader
✅ Throttle_ShouldLimitEventRate
✅ Where_ShouldFilterEvents
✅ WhileLeader_ShouldContinueWhileLeader

✅ MultiLock.Tests.MultiInstanceLeaderElectionTests

✅ ConcurrentElectionAttempts_ShouldResultInSingleLeader
✅ LeaderFailover_ShouldElectNewLeader
✅ MultipleInstances_WithInMemoryProvider_ShouldElectOneLeader

✅ MultiLock.Tests.ParameterValidationTests

✅ ValidateElectionGroup_WithCustomParamName_ShouldUseCustomName
✅ ValidateElectionGroup_WithEmptyString_ShouldThrowArgumentException
✅ ValidateElectionGroup_WithExactlyMaxLength_ShouldNotThrow
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group with spaces")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group,invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group;invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group:invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group!invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group?invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group'invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group(invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group)invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group[invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group]invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group{invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group}invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group@invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group*invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group/invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group\"invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group\\invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group&invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group#invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group%invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group`invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group+invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group<invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group=invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group>invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group|invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group~invalid")
✅ ValidateElectionGroup_WithInvalidCharacters_ShouldThrowArgumentException(invalidGroup: "group$invalid")
✅ ValidateElectionGroup_WithNull_ShouldThrowArgumentException
✅ ValidateElectionGroup_WithTooLongValue_ShouldThrowArgumentException
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "1")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "123valid")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "a")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "group-name_with.multiple-separators123")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "lowercase")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "MixedCase")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "UPPERCASE")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "valid_group")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "valid-group")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "valid.group")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "valid")
✅ ValidateElectionGroup_WithValidCharacters_ShouldNotThrow(validGroup: "valid123")
✅ ValidateElectionGroup_WithValidValue_ShouldNotThrow
✅ ValidateElectionGroup_WithWhitespace_ShouldThrowArgumentException
✅ ValidateLockTimeout_WithExactlyOneDay_ShouldNotThrow
✅ ValidateLockTimeout_WithMoreThanOneDay_ShouldThrowArgumentException
✅ ValidateLockTimeout_WithNegative_ShouldThrowArgumentException
✅ ValidateLockTimeout_WithOneMillisecond_ShouldNotThrow
✅ ValidateLockTimeout_WithValidTimeout_ShouldNotThrow
✅ ValidateLockTimeout_WithZero_ShouldThrowArgumentException
✅ ValidateMetadata_WithEmptyKey_ShouldThrowArgumentException
✅ ValidateMetadata_WithEmptyMetadata_ShouldNotThrow
✅ ValidateMetadata_WithExactlyMaxEntries_ShouldNotThrow
✅ ValidateMetadata_WithMaxLengthValue_ShouldNotThrow
✅ ValidateMetadata_WithNull_ShouldThrowArgumentNullException
✅ ValidateMetadata_WithNullValue_ShouldNotThrow
✅ ValidateMetadata_WithTooLongKey_ShouldThrowArgumentException
✅ ValidateMetadata_WithTooLongValue_ShouldThrowArgumentException
✅ ValidateMetadata_WithTooManyEntries_ShouldThrowArgumentException
✅ ValidateMetadata_WithValidMetadata_ShouldNotThrow
✅ ValidateMetadata_WithWhitespaceKey_ShouldThrowArgumentException
✅ ValidateParticipantId_WithEmptyString_ShouldThrowArgumentException
✅ ValidateParticipantId_WithInvalidCharacters_ShouldThrowArgumentException
✅ ValidateParticipantId_WithNull_ShouldThrowArgumentException
✅ ValidateParticipantId_WithTooLongValue_ShouldThrowArgumentException
✅ ValidateParticipantId_WithValidValue_ShouldNotThrow

✅ MultiLock.Tests.PostgreSqlProviderTests

✅ Constructor_WithValidOptions_ShouldSucceed
✅ Dispose_CalledMultipleTimes_ShouldNotThrow
✅ Dispose_ShouldNotThrow
✅ MethodsAfterDispose_ShouldThrow
✅ Options_WithEmptyConnectionString_ShouldThrow
✅ Options_WithEmptySchemaName_ShouldThrow
✅ Options_WithEmptyTableName_ShouldThrow
✅ Options_WithInvalidCommandTimeout_ShouldThrow
✅ Options_WithValidConfiguration_ShouldSucceed

✅ MultiLock.Tests.ProviderInputValidationTests

✅ GetCurrentLeaderAsync_WithEmptyElectionGroup_ShouldThrowArgumentException
✅ GetCurrentLeaderAsync_WithInvalidElectionGroup_ShouldThrowArgumentException
✅ GetCurrentLeaderAsync_WithNullElectionGroup_ShouldThrowArgumentException
✅ IsLeaderAsync_WithNullElectionGroup_ShouldThrowArgumentException
✅ IsLeaderAsync_WithNullParticipantId_ShouldThrowArgumentException
✅ IsLeaderAsync_WithValidParameters_ShouldSucceed
✅ ReleaseLeadershipAsync_WithEmptyElectionGroup_ShouldThrowArgumentException
✅ ReleaseLeadershipAsync_WithEmptyParticipantId_ShouldThrowArgumentException
✅ ReleaseLeadershipAsync_WithNullElectionGroup_ShouldThrowArgumentException
✅ ReleaseLeadershipAsync_WithNullParticipantId_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithEmptyElectionGroup_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithEmptyParticipantId_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithInvalidElectionGroup_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithInvalidParticipantId_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithNegativeLockTimeout_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithNullElectionGroup_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithNullMetadata_ShouldThrowArgumentNullException
✅ TryAcquireLeadershipAsync_WithNullParticipantId_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithTooLongElectionGroup_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithTooLongLockTimeout_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithTooManyMetadataEntries_ShouldThrowArgumentException
✅ TryAcquireLeadershipAsync_WithValidParameters_ShouldSucceed
✅ TryAcquireLeadershipAsync_WithZeroLockTimeout_ShouldThrowArgumentException
✅ UpdateHeartbeatAsync_WithNullElectionGroup_ShouldThrowArgumentException
✅ UpdateHeartbeatAsync_WithNullMetadata_ShouldThrowArgumentNullException
✅ UpdateHeartbeatAsync_WithNullParticipantId_ShouldThrowArgumentException

✅ MultiLock.Tests.RedisProviderTests

✅ Constructor_WithValidOptions_ShouldSucceed
✅ Dispose_MultipleTimes_ShouldNotThrow
✅ Dispose_ShouldNotThrow
✅ MethodsAfterDispose_ShouldThrow
✅ Options_WithEmptyConnectionString_ShouldThrow
✅ Options_WithEmptyKeyPrefix_ShouldThrow
✅ Options_WithNegativeDatabase_ShouldThrow
✅ Options_WithValidConfiguration_ShouldSucceed

✅ MultiLock.Tests.ServiceExtensionsValidationTests

✅ AddLeaderElection_WithConfigureOptions_ShouldSucceed
✅ AddLeaderElection_WithNullConfigureOptions_ShouldSucceed
✅ AddLeaderElection_WithNullServices_ShouldThrowArgumentNullException
✅ AddLeaderElection_WithValidServices_ShouldSucceed
✅ AddLeaderElectionGeneric_WithConfigureOptions_ShouldSucceed
✅ AddLeaderElectionGeneric_WithNullServices_ShouldThrowArgumentNullException
✅ AddLeaderElectionGeneric_WithValidServices_ShouldSucceed
✅ AddLeaderElectionWithFactory_WithConfigureOptions_ShouldSucceed
✅ AddLeaderElectionWithFactory_WithNullConfigureOptions_ShouldSucceed
✅ AddLeaderElectionWithFactory_WithNullFactory_ShouldThrowArgumentNullException
✅ AddLeaderElectionWithFactory_WithNullServices_ShouldThrowArgumentNullException
✅ AddLeaderElectionWithFactory_WithValidParameters_ShouldSucceed

✅ MultiLock.Tests.SqlServerProviderTests

✅ Constructor_WithValidOptions_ShouldSucceed
✅ Dispose_CalledMultipleTimes_ShouldNotThrow
✅ Dispose_ShouldNotThrow
✅ MethodsAfterDispose_ShouldThrow
✅ Options_WithEmptyConnectionString_ShouldThrow
✅ Options_WithEmptySchemaName_ShouldThrow
✅ Options_WithEmptyTableName_ShouldThrow
✅ Options_WithInvalidCommandTimeout_ShouldThrow
✅ Options_WithValidConfiguration_ShouldSucceed

✅ MultiLock.Tests.ZooKeeperProviderTests

✅ Constructor_WithValidOptions_ShouldSucceed
✅ Dispose_CalledMultipleTimes_ShouldNotThrow
✅ Dispose_ShouldNotThrow
✅ DisposeAsync_MultipleTimes_ShouldNotThrow
✅ DisposeAsync_ShouldNotThrow
✅ MethodsAfterDispose_ShouldThrow
✅ Options_WithEmptyConnectionString_ShouldThrow
✅ Options_WithEmptyRootPath_ShouldThrow
✅ Options_WithInvalidConnectionTimeout_ShouldThrow
✅ Options_WithInvalidMaxRetries_ShouldThrow
✅ Options_WithInvalidRetryDelay_ShouldThrow
✅ Options_WithInvalidRootPath_ShouldThrow
✅ Options_WithInvalidSessionTimeout_ShouldThrow
✅ Options_WithValidConfiguration_ShouldSucceed

✅ MultiLock.Tests.ZooKeeperServiceCollectionExtensionsTests

✅ AddZooKeeperLeaderElection_ShouldAllowMultipleCalls
✅ AddZooKeeperLeaderElection_WithConfigureOptions_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithConfigureOptionsAndLeaderElectionOptions_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithConnectionString_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithConnectionStringAndLeaderElectionOptions_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithConnectionStringAndRootPath_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithConnectionStringRootPathAndLeaderElectionOptions_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithFullConfiguration_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithFullConfigurationAndLeaderElectionOptions_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithNullLeaderElectionOptions_ShouldRegisterProvider
✅ AddZooKeeperLeaderElection_WithNullServices_ShouldThrowArgumentNullException