< Summary - AsyncResponse (Release / net8.0+net10.0 / unit+integration)

Information
Class: AsyncResponse.Transports.AzureServiceBus.AzureServiceBusOptionsValidator
Assembly: AsyncResponse.Transports.AzureServiceBus
File(s): /home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.AzureServiceBus/AzureServiceBusOptionsValidator.cs
Line coverage
100%
Covered lines: 60
Uncovered lines: 0
Coverable lines: 60
Total lines: 106
Line coverage: 100%
Branch coverage
100%
Covered branches: 34
Total branches: 34
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
ValidateCommon(...)100%1010100%
ValidateSubscriber(...)100%2020100%
Required(...)100%22100%
Positive(...)100%22100%

File(s)

/home/runner/work/AsyncResponse/AsyncResponse/src/Transports/AsyncResponse.Transports.AzureServiceBus/AzureServiceBusOptionsValidator.cs

#LineLine coverage
 1namespace AsyncResponse.Transports.AzureServiceBus;
 2
 3internal static class AzureServiceBusOptionsValidator
 4{
 5    public static void ValidateCommon(AzureServiceBusAsyncResponseOptions options)
 6    {
 37        Required(options.WorkerQueue, nameof(options.WorkerQueue));
 38        Required(options.ResponseQueue, nameof(options.ResponseQueue));
 39        Required(options.CorrelationIdProperty, nameof(options.CorrelationIdProperty));
 310        Required(options.DefaultReplyTargetName, nameof(options.DefaultReplyTargetName));
 11
 312        if (StringComparer.Ordinal.Equals(options.WorkerQueue, options.ResponseQueue))
 13        {
 314            throw new InvalidOperationException(
 315                $"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(options.WorkerQueue)} and " +
 316                $"{nameof(options.ResponseQueue)} must be distinct so worker and response subscribers do not consume eac
 17        }
 18
 319        if (options.MaxMessagesPerReceive <= 0)
 320            throw new InvalidOperationException($"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(options.MaxMessa
 321        if (options.PublishMaxAttempts <= 0)
 322            throw new InvalidOperationException($"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(options.PublishM
 23
 324        Positive(options.ReceiveWaitTime, nameof(options.ReceiveWaitTime));
 325        Positive(options.PublishRetryBaseDelay, nameof(options.PublishRetryBaseDelay));
 326        Positive(options.PublishRetryMaxDelay, nameof(options.PublishRetryMaxDelay));
 327        Positive(options.SubscriberRetryBaseDelay, nameof(options.SubscriberRetryBaseDelay));
 328        Positive(options.SubscriberRetryMaxDelay, nameof(options.SubscriberRetryMaxDelay));
 329        Positive(options.ShutdownTimeout, nameof(options.ShutdownTimeout));
 30
 331        if (options.PublishRetryBaseDelay > options.PublishRetryMaxDelay)
 332            throw new InvalidOperationException($"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(options.PublishR
 333        if (options.SubscriberRetryBaseDelay > options.SubscriberRetryMaxDelay)
 334            throw new InvalidOperationException($"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(options.Subscrib
 335    }
 36
 37    public static void ValidateSubscriber(
 38        AzureServiceBusAsyncResponseOptions transportOptions,
 39        AzureServiceBusSubscriberOptions subscriberOptions,
 40        AzureServiceBusSubscriberRole role)
 41    {
 342        var optionPath = role is AzureServiceBusSubscriberRole.Worker
 343            ? $"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(AzureServiceBusAsyncResponseOptions.WorkerSubscrib
 344            : $"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(AzureServiceBusAsyncResponseOptions.ResponseSubscr
 45
 346        if (subscriberOptions.MaxDeliveryAttempts < 0)
 347            throw new InvalidOperationException($"{optionPath}.{nameof(AzureServiceBusSubscriberOptions.MaxDeliveryAttem
 348        if (subscriberOptions.PrefetchCount < 0)
 349            throw new InvalidOperationException($"{optionPath}.{nameof(AzureServiceBusSubscriberOptions.PrefetchCount)} 
 350        if (subscriberOptions.LockRenewalInterval is { } lockRenewalInterval && lockRenewalInterval <= TimeSpan.Zero)
 351            throw new InvalidOperationException($"{optionPath}.{nameof(AzureServiceBusSubscriberOptions.LockRenewalInter
 52
 353        switch (subscriberOptions.AckMode)
 54        {
 55            case AzureServiceBusAckMode.AckAfterHandlerCompletes:
 356                return;
 57
 58            case AzureServiceBusAckMode.AckAfterEnqueue:
 359                if (subscriberOptions.BackgroundWorkerCount <= 0)
 60                {
 361                    throw new InvalidOperationException(
 362                        $"{optionPath}.{nameof(AzureServiceBusSubscriberOptions.BackgroundWorkerCount)} must be explicit
 363                        $"when {nameof(AzureServiceBusSubscriberOptions.AckMode)} is {nameof(AzureServiceBusAckMode.AckA
 64                }
 65
 366                if (subscriberOptions.BackgroundQueueCapacity <= 0)
 67                {
 368                    throw new InvalidOperationException(
 369                        $"{optionPath}.{nameof(AzureServiceBusSubscriberOptions.BackgroundQueueCapacity)} must be explic
 370                        $"when {nameof(AzureServiceBusSubscriberOptions.AckMode)} is {nameof(AzureServiceBusAckMode.AckA
 71                }
 72
 373                if (subscriberOptions.BackgroundDrainTimeout <= TimeSpan.Zero)
 74                {
 375                    throw new InvalidOperationException(
 376                        $"{optionPath}.{nameof(AzureServiceBusSubscriberOptions.BackgroundDrainTimeout)} must be positiv
 77                }
 78
 79                // Service Bus spends the background drain plus receiver close / renewal-task join
 80                // (ShutdownTimeout) at shutdown; both must fit inside the host budget.
 381                ShutdownBudgetValidator.Validate(
 382                    "Azure Service Bus",
 383                    $"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(AzureServiceBusAsyncResponseOptions.HostShut
 384                    transportOptions.HostShutdownTimeout,
 385                    ($"{optionPath}.{nameof(AzureServiceBusSubscriberOptions.BackgroundDrainTimeout)}", subscriberOption
 386                    ($"{nameof(AzureServiceBusAsyncResponseOptions)}.{nameof(AzureServiceBusAsyncResponseOptions.Shutdow
 87
 388                return;
 89
 90            default:
 391                throw new InvalidOperationException(
 392                    $"{optionPath}.{nameof(AzureServiceBusSubscriberOptions.AckMode)} has unsupported value '{subscriber
 93        }
 94    }
 95
 96    public static string Required(string? value, string name)
 397        => !string.IsNullOrWhiteSpace(value)
 398            ? value
 399            : throw new InvalidOperationException($"{nameof(AzureServiceBusAsyncResponseOptions)}.{name} must be configu
 100
 101    private static void Positive(TimeSpan value, string name)
 102    {
 3103        if (value <= TimeSpan.Zero)
 3104            throw new InvalidOperationException($"{nameof(AzureServiceBusAsyncResponseOptions)}.{name} must be positive.
 3105    }
 106}