< Summary

Class:Microsoft.Azure.ServiceBus.EntityNameHelper
Assembly:Microsoft.Azure.ServiceBus
File(s):C:\Git\azure-sdk-for-net\sdk\servicebus\Microsoft.Azure.ServiceBus\src\EntityNameHelper.cs
Covered lines:25
Uncovered lines:11
Coverable lines:36
Total lines:146
Line coverage:69.4% (25 of 36)
Covered branches:15
Total branches:20
Branch coverage:75% (15 of 20)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
FormatDeadLetterPath(...)-100%100%
FormatSubQueuePath(...)-100%100%
FormatSubscriptionPath(...)-100%100%
FormatRulePath(...)-0%100%
FormatTransferDeadLetterPath(...)-100%100%
CheckValidQueueName(...)-100%100%
CheckValidTopicName(...)-100%100%
CheckValidSubscriptionName(...)-100%100%
CheckValidRuleName(...)-0%100%
CheckValidEntityName(...)-71.43%68.75%
GetPathWithoutBaseUri(...)-100%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\servicebus\Microsoft.Azure.ServiceBus\src\EntityNameHelper.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
 5{
 6    using System;
 7    using Microsoft.Azure.ServiceBus.Management;
 8
 9    /// <summary>
 10    /// This class can be used to format the path for different Service Bus entity types.
 11    /// </summary>
 12    public static class EntityNameHelper
 13    {
 14        private const string PathDelimiter = @"/";
 15        private const string SubscriptionsSubPath = "Subscriptions";
 16        private const string RulesSubPath = "Rules";
 17        private const string SubQueuePrefix = "$";
 18        private const string DeadLetterQueueSuffix = "DeadLetterQueue";
 19        private const string DeadLetterQueueName = SubQueuePrefix + DeadLetterQueueSuffix;
 20        private const string Transfer = "Transfer";
 21        private const string TransferDeadLetterQueueName = SubQueuePrefix + Transfer + PathDelimiter + DeadLetterQueueNa
 22
 23        /// <summary>
 24        /// Formats the dead letter path for either a queue, or a subscription.
 25        /// </summary>
 26        /// <param name="entityPath">The name of the queue, or path of the subscription.</param>
 27        /// <returns>The path as a string of the dead letter entity.</returns>
 28        public static string FormatDeadLetterPath(string entityPath)
 29        {
 230            return EntityNameHelper.FormatSubQueuePath(entityPath, EntityNameHelper.DeadLetterQueueName);
 31        }
 32
 33        /// <summary>
 34        /// Formats the subqueue path for either a queue, or a subscription.
 35        /// </summary>
 36        /// <param name="entityPath">The name of the queue, or path of the subscription.</param>
 37        /// <returns>The path as a string of the subqueue entity.</returns>
 38        public static string FormatSubQueuePath(string entityPath, string subQueueName)
 39        {
 440            return string.Concat(entityPath, EntityNameHelper.PathDelimiter, subQueueName);
 41        }
 42
 43        /// <summary>
 44        /// Formats the subscription path, based on the topic path and subscription name.
 45        /// </summary>
 46        /// <param name="topicPath">The name of the topic, including slashes.</param>
 47        /// <param name="subscriptionName">The name of the subscription.</param>
 48        public static string FormatSubscriptionPath(string topicPath, string subscriptionName)
 49        {
 250            return string.Concat(topicPath, PathDelimiter, SubscriptionsSubPath, PathDelimiter, subscriptionName);
 51        }
 52
 53        /// <summary>
 54        /// Formats the rule path, based on the topic path, subscription name and rule name.
 55        /// </summary>
 56        /// <param name="topicPath">The name of the topic, including slashes.</param>
 57        /// <param name="subscriptionName">The name of the subscription.</param>
 58        /// <param name="ruleName">The name of the rule</param>
 59        public static string FormatRulePath(string topicPath, string subscriptionName, string ruleName)
 60        {
 061            return string.Concat(
 062                topicPath, PathDelimiter,
 063                SubscriptionsSubPath, PathDelimiter,
 064                subscriptionName, PathDelimiter,
 065                RulesSubPath, PathDelimiter, ruleName);
 66        }
 67
 68        /// <summary>
 69        /// Utility method that creates the name for the transfer dead letter receiver, specified by <paramref name="ent
 70        /// </summary>
 71        public static string Format​Transfer​Dead​Letter​Path(string entityPath)
 72        {
 273            return string.Concat(entityPath, PathDelimiter, TransferDeadLetterQueueName);
 74        }
 75
 76        internal static void CheckValidQueueName(string queueName, string paramName = "queuePath")
 77        {
 8078            CheckValidEntityName(GetPathWithoutBaseUri(queueName), ManagementClientConstants.QueueNameMaximumLength, tru
 6079        }
 80
 81        internal static void CheckValidTopicName(string topicName, string paramName = "topicPath")
 82        {
 2083            CheckValidEntityName(topicName, ManagementClientConstants.TopicNameMaximumLength, true, paramName);
 2084        }
 85
 86        internal static void CheckValidSubscriptionName(string subscriptionName, string paramName = "subscriptionName")
 87        {
 2088            CheckValidEntityName(subscriptionName, ManagementClientConstants.SubscriptionNameMaximumLength, false, param
 2089        }
 90
 91        internal static void CheckValidRuleName(string ruleName, string paramName = "ruleName")
 92        {
 093            CheckValidEntityName(ruleName, ManagementClientConstants.RuleNameMaximumLength, false, paramName);
 094        }
 95
 96        private static void CheckValidEntityName(string entityName, int maxEntityNameLength, bool allowSeparator, string
 97        {
 12098            if (string.IsNullOrWhiteSpace(entityName))
 99            {
 0100                throw new ArgumentNullException(paramName);
 101            }
 102
 103            // and "\" will be converted to "/" on the REST path anyway. Gateway/REST do not
 104            // have to worry about the begin/end slash problem, so this is purely a client side check.
 120105            var tmpName = entityName.Replace(@"\", Constants.PathDelimiter);
 120106            if (tmpName.Length > maxEntityNameLength)
 107            {
 20108                throw new ArgumentOutOfRangeException(paramName, $@"Entity path '{entityName}' exceeds the '{maxEntityNa
 109            }
 110
 100111            if (tmpName.StartsWith(Constants.PathDelimiter, StringComparison.OrdinalIgnoreCase) ||
 100112                tmpName.EndsWith(Constants.PathDelimiter, StringComparison.OrdinalIgnoreCase))
 113            {
 0114                throw new ArgumentException($@"The entity name/path cannot contain '/' as prefix or suffix. The supplied
 115            }
 116
 100117            if (!allowSeparator && tmpName.Contains(Constants.PathDelimiter))
 118            {
 0119                throw new ArgumentException($@"The entity name/path contains an invalid character '{Constants.PathDelimi
 120            }
 121
 1000122            foreach (var uriSchemeKey in ManagementClientConstants.InvalidEntityPathCharacters)
 123            {
 400124                if (entityName.IndexOf(uriSchemeKey) >= 0)
 125                {
 0126                    throw new ArgumentException($@"'{entityName}' contains character '{uriSchemeKey}' which is not allow
 127                }
 128            }
 100129        }
 130
 131        private static string GetPathWithoutBaseUri(string entityName)
 132        {
 133            // Note: on Linux/macOS, "/path" URLs are treated as valid absolute file URLs.
 134            // To ensure relative queue paths are correctly rejected on these platforms,
 135            // an additional check using IsWellFormedOriginalString() is made here.
 136            // See https://github.com/dotnet/corefx/issues/22098 for more information.
 80137            if (Uri.TryCreate(entityName, UriKind.Absolute, out Uri uriValue) &&
 80138                uriValue.IsWellFormedOriginalString())
 139            {
 30140                entityName = uriValue.PathAndQuery;
 30141                return entityName.TrimStart('/');
 142            }
 50143            return entityName;
 144        }
 145    }
 146}