< Summary

Class:Microsoft.Azure.ServiceBus.Management.SubscriptionDescription
Assembly:Microsoft.Azure.ServiceBus
File(s):C:\Git\azure-sdk-for-net\sdk\servicebus\Microsoft.Azure.ServiceBus\src\Management\SubscriptionDescription.cs
Covered lines:26
Uncovered lines:73
Coverable lines:99
Total lines:322
Line coverage:26.2% (26 of 99)
Covered branches:4
Total branches:64
Branch coverage:6.2% (4 of 64)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
.ctor(...)-100%100%
get_LockDuration()-0%100%
set_LockDuration(...)-0%100%
get_RequiresSession()-0%100%
get_DefaultMessageTimeToLive()-0%100%
set_DefaultMessageTimeToLive(...)-0%0%
get_AutoDeleteOnIdle()-0%100%
set_AutoDeleteOnIdle(...)-0%0%
get_EnableDeadLetteringOnMessageExpiration()-0%100%
get_EnableDeadLetteringOnFilterEvaluationExceptions()-0%100%
get_TopicPath()-0%100%
set_TopicPath(...)-100%100%
get_SubscriptionName()-0%100%
set_SubscriptionName(...)-100%100%
get_MaxDeliveryCount()-0%100%
set_MaxDeliveryCount(...)-0%0%
get_Status()-0%100%
get_ForwardTo()-100%100%
set_ForwardTo(...)-62.5%50%
get_ForwardDeadLetteredMessagesTo()-100%100%
set_ForwardDeadLetteredMessagesTo(...)-62.5%50%
get_EnableBatchedOperations()-0%100%
get_UserMetadata()-0%100%
set_UserMetadata(...)-0%0%
get_UnknownProperties()-0%100%
get_DefaultRuleDescription()-0%100%
GetHashCode()-0%0%
Equals(...)-0%100%
Equals(...)-0%0%
op_Equality(...)-0%0%
op_Inequality(...)-0%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\servicebus\Microsoft.Azure.ServiceBus\src\Management\SubscriptionDescription.cs

#LineLine coverage
 1// Copyright (c) Microsoft. All rights reserved.
 2// Licensed under the MIT license. See LICENSE file in the project root for full license information.
 3
 4namespace Microsoft.Azure.ServiceBus.Management
 5{
 6    using System;
 7    using System.Collections.Generic;
 8    using Microsoft.Azure.ServiceBus.Primitives;
 9
 10    /// <summary>
 11    /// Represents the metadata description of the subscription.
 12    /// </summary>
 13    public class SubscriptionDescription : IEquatable<SubscriptionDescription>
 14    {
 15        string topicPath, subscriptionName;
 2016        TimeSpan lockDuration = TimeSpan.FromSeconds(60);
 2017        TimeSpan defaultMessageTimeToLive = TimeSpan.MaxValue;
 2018        TimeSpan autoDeleteOnIdle = TimeSpan.MaxValue;
 2019        int maxDeliveryCount = 10;
 20        string forwardTo = null;
 21        string forwardDeadLetteredMessagesTo = null;
 22        string userMetadata = null;
 23
 24        /// <summary>
 25        /// Initializes a new instance of SubscriptionDescription class with the specified name and topic path.
 26        /// </summary>
 27        /// <param name="topicPath">Path of the topic relative to the namespace base address.</param>
 28        /// <param name="subscriptionName">Name of the subscription.</param>
 2029        public SubscriptionDescription(string topicPath, string subscriptionName)
 30        {
 2031            this.TopicPath = topicPath;
 2032            this.SubscriptionName = subscriptionName;
 2033        }
 34
 35        /// <summary>
 36        /// Duration of a peek lock receive. i.e., the amount of time that the message is locked by a given receiver so 
 37        /// no other receiver receives the same message.
 38        /// </summary>
 39        /// <remarks>Max value is 5 minutes. Default value is 60 seconds.</remarks>
 40        public TimeSpan LockDuration
 41        {
 042            get => this.lockDuration;
 43            set
 44            {
 045                TimeoutHelper.ThrowIfNonPositiveArgument(value, nameof(LockDuration));
 046                this.lockDuration = value;
 047            }
 48        }
 49
 50        /// <summary>
 51        /// This indicates whether the subscription supports the concept of session. Sessionful-messages follow FIFO ord
 52        /// </summary>
 53        /// <remarks>
 54        /// If true, the receiver can only receive messages using <see cref="SessionClient.AcceptMessageSessionAsync()"/
 55        /// Defaults to false.
 56        /// </remarks>
 057        public bool RequiresSession { get; set; } = false;
 58
 59        /// <summary>
 60        /// The default time to live value for the messages. This is the duration after which the message expires, start
 61        /// the message is sent to Service Bus. </summary>
 62        /// <remarks>
 63        /// This is the default value used when <see cref="Message.TimeToLive"/> is not set on a
 64        ///  message itself. Messages older than their TimeToLive value will expire and no longer be retained in the mes
 65        ///  Subscribers will be unable to receive expired messages.
 66        ///  Default value is <see cref="TimeSpan.MaxValue"/>.
 67        ///  </remarks>
 68        public TimeSpan DefaultMessageTimeToLive
 69        {
 070            get => this.defaultMessageTimeToLive;
 71            set
 72            {
 073                if (value < ManagementClientConstants.MinimumAllowedTimeToLive || value > ManagementClientConstants.Maxi
 74                {
 075                    throw new ArgumentOutOfRangeException(nameof(DefaultMessageTimeToLive),
 076                        $"The value must be between {ManagementClientConstants.MinimumAllowedTimeToLive} and {Management
 77                }
 78
 079                this.defaultMessageTimeToLive = value;
 080            }
 81        }
 82
 83        /// <summary>
 84        /// The <see cref="TimeSpan"/> idle interval after which the subscription is automatically deleted.
 85        /// </summary>
 86        /// <remarks>The minimum duration is 5 minutes. Default value is <see cref="TimeSpan.MaxValue"/>.</remarks>
 87        public TimeSpan AutoDeleteOnIdle
 88        {
 089            get => this.autoDeleteOnIdle;
 90            set
 91            {
 092                if (value < ManagementClientConstants.MinimumAllowedAutoDeleteOnIdle)
 93                {
 094                    throw new ArgumentOutOfRangeException(nameof(AutoDeleteOnIdle),
 095                        $"The value must be greater than {ManagementClientConstants.MinimumAllowedAutoDeleteOnIdle}");
 96                }
 97
 098                this.autoDeleteOnIdle = value;
 099            }
 100        }
 101
 102        /// <summary>
 103        /// Indicates whether this subscription has dead letter support when a message expires.
 104        /// </summary>
 105        /// <remarks>If true, the expired messages are moved to dead-letter sub-queue. Default value is false.</remarks>
 0106        public bool EnableDeadLetteringOnMessageExpiration { get; set; } = false;
 107
 108        /// <summary>
 109        /// indicates whether messages need to be forwarded to dead-letter sub queue when subscription rule evaluation f
 110        /// </summary>
 111        /// <remarks>Defaults to true.</remarks>
 0112        public bool EnableDeadLetteringOnFilterEvaluationExceptions { get; set; } = true;
 113
 114        /// <summary>
 115        /// Path of the topic under which subscription exists.
 116        /// </summary>
 117        /// <remarks>Value cannot be null or empty. Value cannot exceed 260 chars. Cannot start or end with a slash.
 118        /// Cannot have restricted characters: '@','?','#','*'</remarks>
 119        public string TopicPath
 120        {
 0121            get => this.topicPath;
 122            set
 123            {
 20124                EntityNameHelper.CheckValidTopicName(value, nameof(TopicPath));
 20125                this.topicPath = value;
 20126            }
 127        }
 128
 129        /// <summary>
 130        /// Name of the subscription.
 131        /// </summary>
 132        /// <remarks>Value cannot be null or empty. Value cannot exceed 50 chars.
 133        /// Cannot have restricted characters: '@','?','#','*','/','\'</remarks>
 134        public string SubscriptionName
 135        {
 0136            get => this.subscriptionName;
 137            set
 138            {
 20139                EntityNameHelper.CheckValidSubscriptionName(value, nameof(SubscriptionName));
 20140                this.subscriptionName = value;
 20141            }
 142        }
 143
 144        /// <summary>
 145        /// The maximum delivery count of a message before it is dead-lettered.
 146        /// </summary>
 147        /// <remarks>The delivery count is increased when a message is received in <see cref="ReceiveMode.PeekLock"/> mo
 148        /// and didn't complete the message before the message lock expired.
 149        /// Default value is 10. Minimum value is 1.</remarks>
 150        public int MaxDeliveryCount
 151        {
 0152            get => this.maxDeliveryCount;
 153            set
 154            {
 0155                if (value < ManagementClientConstants.MinAllowedMaxDeliveryCount)
 156                {
 0157                    throw new ArgumentOutOfRangeException(nameof(MaxDeliveryCount),
 0158                        $"The value must be greater than {ManagementClientConstants.MinAllowedMaxDeliveryCount}");
 159                }
 160
 0161                this.maxDeliveryCount = value;
 0162            }
 163        }
 164
 165        /// <summary>
 166        /// The current status of the subscription (Enabled / Disabled).
 167        /// </summary>
 168        /// <remarks>When an entity is disabled, that entity cannot send or receive messages.</remarks>
 0169        public EntityStatus Status { get; set; } = EntityStatus.Active;
 170
 171        /// <summary>
 172        /// The path of the recipient entity to which all the messages sent to the subscription are forwarded to.
 173        /// </summary>
 174        /// <remarks>If set, user cannot manually receive messages from this subscription. The destination entity
 175        /// must be an already existing entity.</remarks>
 176        public string ForwardTo
 177        {
 6178            get => this.forwardTo;
 179            set
 180            {
 10181                if (string.IsNullOrWhiteSpace(value))
 182                {
 0183                    this.forwardTo = value;
 0184                    return;
 185                }
 186
 10187                EntityNameHelper.CheckValidQueueName(value, nameof(ForwardTo));
 6188                if (this.topicPath.Equals(value, StringComparison.CurrentCultureIgnoreCase))
 189                {
 0190                    throw new InvalidOperationException("Entity cannot have auto-forwarding policy to itself");
 191                }
 192
 6193                this.forwardTo = value;
 6194            }
 195        }
 196
 197        /// <summary>
 198        /// The path of the recipient entity to which all the dead-lettered messages of this subscription are forwarded 
 199        /// </summary>
 200        /// <remarks>If set, user cannot manually receive dead-lettered messages from this subscription. The destination
 201        /// entity must already exist.</remarks>
 202        public string ForwardDeadLetteredMessagesTo
 203        {
 6204            get => this.forwardDeadLetteredMessagesTo;
 205            set
 206            {
 10207                if (string.IsNullOrWhiteSpace(value))
 208                {
 0209                    this.forwardDeadLetteredMessagesTo = value;
 0210                    return;
 211                }
 212
 10213                EntityNameHelper.CheckValidQueueName(value, nameof(ForwardDeadLetteredMessagesTo));
 6214                if (this.topicPath.Equals(value, StringComparison.CurrentCultureIgnoreCase))
 215                {
 0216                    throw new InvalidOperationException("Entity cannot have auto-forwarding policy to itself");
 217                }
 218
 6219                this.forwardDeadLetteredMessagesTo = value;
 6220            }
 221        }
 222
 223        /// <summary>
 224        /// Indicates whether server-side batched operations are enabled.
 225        /// </summary>
 226        /// <remarks>Defaults to true.</remarks>
 0227        public bool EnableBatchedOperations { get; set; } = true;
 228
 229        /// <summary>
 230        /// Custom metdata that user can associate with the description.
 231        /// </summary>
 232        /// <remarks>Cannot be null. Max length is 1024 chars.</remarks>
 233        public string UserMetadata
 234        {
 0235            get => this.userMetadata;
 236            set
 237            {
 0238                if (value == null)
 239                {
 0240                    throw new ArgumentNullException(nameof(UserMetadata), $"Value cannot be null");
 241                }
 242
 0243                if (value.Length > ManagementClientConstants.MaxUserMetadataLength)
 244                {
 0245                    throw new ArgumentOutOfRangeException(nameof(UserMetadata), $"Length cannot cross {ManagementClientC
 246                }
 247
 0248                this.userMetadata = value;
 0249            }
 250        }
 251
 252        /// <summary>
 253        /// List of properties that were retrieved using GetSubscription but are not understood by this version of clien
 254        /// The list will be sent back when an already retrieved SubscriptionDescription will be used in UpdateSubscript
 255        /// </summary>
 0256        internal List<object> UnknownProperties { get; set; }
 257
 0258        internal RuleDescription DefaultRuleDescription { get; set; }
 259
 260        public override int GetHashCode()
 261        {
 0262            int hash = 7;
 263            unchecked
 264            {
 0265                hash = (hash * 7) + this.TopicPath?.GetHashCode() ?? 0;
 0266                hash = (hash * 7) + this.SubscriptionName?.GetHashCode() ?? 0;
 267            }
 268
 0269            return hash;
 270        }
 271
 272        public override bool Equals(object obj)
 273        {
 0274            var other = obj as SubscriptionDescription;
 0275            return this.Equals(other);
 276        }
 277
 278        public bool Equals(SubscriptionDescription otherDescription)
 279        {
 0280            if (otherDescription is SubscriptionDescription other
 0281                && this.SubscriptionName.Equals(other.SubscriptionName, StringComparison.OrdinalIgnoreCase)
 0282                && this.TopicPath.Equals(other.TopicPath, StringComparison.OrdinalIgnoreCase)
 0283                && this.AutoDeleteOnIdle.Equals(other.AutoDeleteOnIdle)
 0284                && this.DefaultMessageTimeToLive.Equals(other.DefaultMessageTimeToLive)
 0285                && this.EnableBatchedOperations == other.EnableBatchedOperations
 0286                && this.EnableDeadLetteringOnMessageExpiration == other.EnableDeadLetteringOnMessageExpiration
 0287                && this.EnableDeadLetteringOnFilterEvaluationExceptions == other.EnableDeadLetteringOnFilterEvaluationEx
 0288                && string.Equals(this.ForwardDeadLetteredMessagesTo, other.ForwardDeadLetteredMessagesTo, StringComparis
 0289                && string.Equals(this.ForwardTo, other.ForwardTo, StringComparison.OrdinalIgnoreCase)
 0290                && this.LockDuration.Equals(other.LockDuration)
 0291                && this.MaxDeliveryCount == other.MaxDeliveryCount
 0292                && this.RequiresSession.Equals(other.RequiresSession)
 0293                && this.Status.Equals(other.Status)
 0294                && string.Equals(this.userMetadata, other.userMetadata, StringComparison.OrdinalIgnoreCase))
 295            {
 0296                return true;
 297            }
 298
 0299            return false;
 300        }
 301
 302        public static bool operator ==(SubscriptionDescription o1, SubscriptionDescription o2)
 303        {
 0304            if (ReferenceEquals(o1, o2))
 305            {
 0306                return true;
 307            }
 308
 0309            if (ReferenceEquals(o1, null) || ReferenceEquals(o2, null))
 310            {
 0311                return false;
 312            }
 313
 0314            return o1.Equals(o2);
 315        }
 316
 317        public static bool operator !=(SubscriptionDescription o1, SubscriptionDescription o2)
 318        {
 0319            return !(o1 == o2);
 320        }
 321    }
 322}