// Making this virtual to allow Moq to override
        public virtual IotHubConnection GetConnection(IotHubConnectionString connectionString, AmqpTransportSettings amqpTransportSetting)
        {
            // Only the initial transportSetting is used, subsequent ones are ignored
            if (this.amqpTransportSettings == null)
            {
                Interlocked.CompareExchange(ref this.amqpTransportSettings, amqpTransportSetting, null);
            }
            else
            {
#if !WINDOWS_UWP && !PCL
                // Client certificate is per device and must be overriden
                this.amqpTransportSettings.ClientCertificate = amqpTransportSetting.ClientCertificate;
#endif
            }

            // Uncomment when we rev the ApiVersion since this is a breaking change
            //if (!this.amqpTransportSettings.Equals(amqpTransportSetting))
            //{
            //    throw new ArgumentException("AmqpTransportSettings cannot be modified from the initial settings.");
            //}

            IotHubConnection iotHubConnection;
            if (connectionString.SharedAccessKeyName != null || connectionString.SharedAccessSignature != null)
            {
                // Connections are not pooled when SAS signatures are used. However, we still use a connection pool object
                // Connections are not shared since the SAS signature will not match another connection string
                IotHubScopeConnectionPool iotHubScopeConnectionPool;
                do
                {
                    iotHubScopeConnectionPool =
                        this.hubScopeConnectionPools.GetOrAdd(
                            connectionString,
                            k => new IotHubScopeConnectionPool(this, k, this.amqpTransportSettings)
                            );
                }while (!iotHubScopeConnectionPool.TryAddRef());

                iotHubConnection = iotHubScopeConnectionPool.Connection;
            }
            else if (this.amqpTransportSettings.AmqpConnectionPoolSettings.Pooling)
            {
                // use connection pooling for device scope connection string
                do
                {
                    IotHubDeviceScopeConnectionPool iotHubDeviceScopeConnectionPool =
                        this.deviceScopeConnectionPools.GetOrAdd(
                            connectionString,
                            k => new IotHubDeviceScopeConnectionPool(this, k, this.amqpTransportSettings)
                            );
                    iotHubConnection = iotHubDeviceScopeConnectionPool.GetConnection(connectionString.DeviceId);
                }while (iotHubConnection == null);
            }
            else
            {
                // Connection pooling is turned off for device-scope connection strings
                iotHubConnection = new IotHubSingleTokenConnection(null, connectionString, this.amqpTransportSettings);
            }

            return(iotHubConnection);
        }
        // Making this virtual to allow Moq to override
        public virtual IotHubConnection GetConnection(IotHubConnectionString connectionString, AmqpTransportSettings amqpTransportSetting)
        {
            // Only the initial transportSetting is used, subsequent ones are ignored
            if (this.amqpTransportSettings == null)
            {
                Interlocked.CompareExchange(ref this.amqpTransportSettings, amqpTransportSetting, null);
            }

            IotHubConnection iotHubConnection;

            if (connectionString.SharedAccessKeyName != null || connectionString.SharedAccessSignature != null)
            {
                // Connections are not pooled when SAS signatures are used. However, we still use a connection pool object
                // Connections are not shared since the SAS signature will not match another connection string
                IotHubScopeConnectionPool iotHubScopeConnectionPool;
                do
                {
                    iotHubScopeConnectionPool =
                        this.hubScopeConnectionPools.GetOrAdd(
                            connectionString,
                            k => new IotHubScopeConnectionPool(this, k, this.amqpTransportSettings)
                            );
                }while (!iotHubScopeConnectionPool.TryAddRef());

                iotHubConnection = iotHubScopeConnectionPool.Connection;
            }
            else if (this.amqpTransportSettings.AmqpConnectionPoolSettings.Pooling)
            {
                // use connection pooling for device scope connection string
                do
                {
                    IotHubDeviceScopeConnectionPool iotHubDeviceScopeConnectionPool =
                        this.deviceScopeConnectionPools.GetOrAdd(
                            connectionString,
                            k => new IotHubDeviceScopeConnectionPool(this, k, this.amqpTransportSettings)
                            );
                    iotHubConnection = iotHubDeviceScopeConnectionPool.GetConnection(connectionString.DeviceId);
                }while (iotHubConnection == null);
            }
            else
            {
                // Connection pooling is turned off for device-scope connection strings
                iotHubConnection = new IotHubSingleTokenConnection(null, connectionString, this.amqpTransportSettings);
            }

            return(iotHubConnection);
        }