Пример #1
0
        protected LinkHandler(
            IIdentity identity,
            IAmqpLink link,
            Uri requestUri,
            IDictionary <string, string> boundVariables,
            IConnectionHandler connectionHandler,
            IMessageConverter <AmqpMessage> messageConverter,
            IProductInfoStore productInfoStore,
            IModelIdStore modelIdStore)
        {
            this.Identity         = Preconditions.CheckNotNull(identity, nameof(identity));
            this.MessageConverter = Preconditions.CheckNotNull(messageConverter, nameof(messageConverter));
            this.BoundVariables   = Preconditions.CheckNotNull(boundVariables, nameof(boundVariables));
            this.Link             = Preconditions.CheckNotNull(link, nameof(link));
            this.LinkUri          = Preconditions.CheckNotNull(requestUri, nameof(requestUri));
            this.Link.SafeAddClosed(this.OnLinkClosed);
            this.connectionHandler = Preconditions.CheckNotNull(connectionHandler, nameof(connectionHandler));
            this.productInfoStore  = Preconditions.CheckNotNull(productInfoStore, nameof(productInfoStore));
            this.modelIdStore      = Preconditions.CheckNotNull(modelIdStore, nameof(modelIdStore));

            string clientVersion = null;

            if (this.Link.Settings?.Properties?.TryGetValue(IotHubAmqpProperty.ClientVersion, out clientVersion) ?? false)
            {
                this.ClientVersion = Option.Maybe(clientVersion);
            }

            string modelId = null;

            if (this.Link.Settings?.Properties?.TryGetValue(IotHubAmqpProperty.ModelId, out modelId) ?? false)
            {
                this.ModelId = Option.Maybe(modelId);
            }
        }
        public void GetLinkHandlerTest(string url, bool isReceiver, Type expectedLinkHandlerType)
        {
            // Arrange
            var messageConverter       = Mock.Of <IMessageConverter <AmqpMessage> >();
            var twinMessageConverter   = Mock.Of <IMessageConverter <AmqpMessage> >();
            var methodMessageConverter = Mock.Of <IMessageConverter <AmqpMessage> >();
            var identityProvider       = new IdentityProvider("foo.bar");
            var metadataStore          = Mock.Of <IMetadataStore>();
            var linkHandlerProvider    = new LinkHandlerProvider(messageConverter, twinMessageConverter, methodMessageConverter, identityProvider, metadataStore);

            var       uri = new Uri(url);
            var       amqpClientConnectionsHandler = Mock.Of <IClientConnectionsHandler>(c => c.GetConnectionHandler(It.IsAny <IIdentity>()) == Mock.Of <IConnectionHandler>());
            var       amqpConnection = Mock.Of <IAmqpConnection>(c => c.FindExtension <IClientConnectionsHandler>() == amqpClientConnectionsHandler);
            var       amqpSession    = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            IAmqpLink amqpLink       = isReceiver
                ? Mock.Of <IReceivingAmqpLink>(l => l.IsReceiver && l.Session == amqpSession)
                : Mock.Of <ISendingAmqpLink>(l => !l.IsReceiver && l.Session == amqpSession) as IAmqpLink;

            if (url.Contains("$cbs"))
            {
                Mock.Get(amqpConnection).Setup(c => c.FindExtension <ICbsNode>()).Returns(Mock.Of <ICbsNode>());
            }

            // Act
            ILinkHandler linkHandler = linkHandlerProvider.Create(amqpLink, uri);

            // Assert
            Assert.NotNull(linkHandler);
            Assert.IsType(expectedLinkHandlerType, linkHandler);
        }
Пример #3
0
        public void GetLinkHandlerTest(LinkType linkType, bool isReceiver, Type expectedLinkHandlerType)
        {
            // Arrange
            var messageConverter       = Mock.Of <IMessageConverter <AmqpMessage> >();
            var twinMessageConverter   = Mock.Of <IMessageConverter <AmqpMessage> >();
            var methodMessageConverter = Mock.Of <IMessageConverter <AmqpMessage> >();
            var linkHandlerProvider    = new LinkHandlerProvider(messageConverter, twinMessageConverter, methodMessageConverter);

            var       uri            = new Uri("amqps://foo.bar//abs/prq");
            var       amqpConnection = Mock.Of <IAmqpConnection>(c => c.FindExtension <IConnectionHandler>() == Mock.Of <IConnectionHandler>());
            var       amqpSession    = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            IAmqpLink amqpLink       = isReceiver
                ? Mock.Of <IReceivingAmqpLink>(l => l.IsReceiver && l.Session == amqpSession)
                : Mock.Of <ISendingAmqpLink>(l => !l.IsReceiver && l.Session == amqpSession) as IAmqpLink;

            if (linkType == LinkType.Cbs)
            {
                Mock.Get(amqpConnection).Setup(c => c.FindExtension <ICbsNode>()).Returns(Mock.Of <ICbsNode>());
            }

            // Act
            ILinkHandler linkHandler = linkHandlerProvider.GetLinkHandler(linkType, amqpLink, uri, new Dictionary <string, string>());

            // Assert
            Assert.NotNull(linkHandler);
            Assert.IsType(expectedLinkHandlerType, linkHandler);
        }
Пример #4
0
        public static ILinkHandler Create(IAmqpLink amqpLink, Uri requestUri)
        {
            var cbsNode = amqpLink.Session.Connection.FindExtension <ICbsNode>();

            if (cbsNode == null)
            {
                throw new InvalidOperationException("CbsNode not found in the AMQP connection");
            }

            cbsNode.RegisterLink(amqpLink);
            ILinkHandler cbsLinkHandler = new CbsLinkHandler(amqpLink, requestUri);

            Events.Created(amqpLink);
            return(cbsLinkHandler);
        }
Пример #5
0
 protected LinkHandler(
     IIdentity identity,
     IAmqpLink link,
     Uri requestUri,
     IDictionary <string, string> boundVariables,
     IConnectionHandler connectionHandler,
     IMessageConverter <AmqpMessage> messageConverter)
 {
     this.Identity         = Preconditions.CheckNotNull(identity, nameof(identity));
     this.MessageConverter = Preconditions.CheckNotNull(messageConverter, nameof(messageConverter));
     this.BoundVariables   = Preconditions.CheckNotNull(boundVariables, nameof(boundVariables));
     this.Link             = Preconditions.CheckNotNull(link, nameof(link));
     this.LinkUri          = Preconditions.CheckNotNull(requestUri, nameof(requestUri));
     this.Link.SafeAddClosed(this.OnLinkClosed);
     this.connectionHandler = Preconditions.CheckNotNull(connectionHandler, nameof(connectionHandler));
 }
Пример #6
0
        protected LinkHandler(IAmqpLink link, Uri requestUri,
                              IDictionary <string, string> boundVariables, IMessageConverter <AmqpMessage> messageConverter)
        {
            // TODO: IoT Hub periodically validates that the authorization is still valid in this
            // class using a timer (except when the concrete sub-class is CbsLinkHandler or EventHubReceiveRedirectLinkHandler.
            // We need to evaluate whether it makes sense to do that in Edge Hub too. See the implementation in
            // AmqpGatewayProtocolHead.LinkHandler.IotHubStatusTimerCallback in service code.

            this.MessageConverter = Preconditions.CheckNotNull(messageConverter, nameof(messageConverter));
            this.BoundVariables   = Preconditions.CheckNotNull(boundVariables, nameof(boundVariables));
            this.Link             = Preconditions.CheckNotNull(link, nameof(link));
            this.LinkUri          = Preconditions.CheckNotNull(requestUri, nameof(requestUri));
            this.Link.SafeAddClosed(this.OnLinkClosed);
            this.ConnectionHandler = this.Link.Session.Connection.FindExtension <IConnectionHandler>();
            this.DeviceId          = this.BoundVariables.ContainsKey(Templates.DeviceIdTemplateParameterName) ? this.BoundVariables[Templates.DeviceIdTemplateParameterName] : string.Empty;
            this.ModuleId          = this.BoundVariables.ContainsKey(Templates.ModuleIdTemplateParameterName) ? this.BoundVariables[Templates.ModuleIdTemplateParameterName] : string.Empty;
        }
Пример #7
0
 public void RegisterLink(IAmqpLink link)
 {
     if (link.IsReceiver)
     {
         lock (this.receivingLinkSyncLock)
         {
             this.receivingLink = (EdgeReceivingAmqpLink)link;
             this.receivingLink.RegisterMessageListener(this.OnMessageReceived);
         }
     }
     else
     {
         lock (this.sendingLinkSyncLock)
         {
             this.sendingLink = (EdgeSendingAmqpLink)link;
         }
     }
     Events.LinkRegistered(link);
 }
Пример #8
0
        public void CreateTest()
        {
            // Arrange
            IAmqpLink registeredLink = null;
            var       cbsNode        = new Mock <ICbsNode>();

            cbsNode.Setup(c => c.RegisterLink(It.IsAny <IAmqpLink>())).Callback <IAmqpLink>(l => registeredLink = l);
            var amqpConnection = Mock.Of <IAmqpConnection>(c => c.FindExtension <ICbsNode>() == cbsNode.Object);
            var amqpSession    = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var amqpLink       = Mock.Of <IAmqpLink>(l => l.Session == amqpSession && l.IsReceiver == false);

            var requestUri = new Uri("amqps://foo.bar/$cbs");

            // Act
            ILinkHandler linkHandler = CbsLinkHandler.Create(amqpLink, requestUri);

            // Assert
            Assert.Equal(registeredLink, amqpLink);
            Assert.NotNull(linkHandler);
            Assert.IsType <CbsLinkHandler>(linkHandler);
        }
Пример #9
0
        public static string GetCorrelationId(IAmqpLink link)
        {
            Preconditions.CheckNotNull(link, nameof(link));

            if (link.Settings?.Properties == null)
            {
                throw new ArgumentException("AmqpLink.Settings.Properties should not be null");
            }

            if (link.Settings.Properties.TryGetValue(IotHubAmqpProperty.ChannelCorrelationId, out object cid))
            {
                string cidString      = cid.ToString();
                int    separatorIndex = cidString.IndexOf(":", StringComparison.OrdinalIgnoreCase);
                if (separatorIndex > 0)
                {
                    string correlationId = cidString.Substring(separatorIndex + 1);
                    return(correlationId);
                }
            }
            return(string.Empty);
        }
Пример #10
0
 public static void LinkRegistered(IAmqpLink link)
 {
     Log.LogDebug((int)EventIds.LinkRegistered, "Cbs {0} link registered".FormatInvariant(link.IsReceiver ? "receiver" : "sender"));
 }
Пример #11
0
 public static void Closing(IAmqpLink amqpLink)
 {
     Log.LogDebug((int)EventIds.Closing, "Closing CBS {0} link".FormatInvariant(amqpLink.IsReceiver ? "receiver" : "sender"));
 }
Пример #12
0
 CbsLinkHandler(IAmqpLink link, Uri linkUri)
 {
     this.LinkUri = Preconditions.CheckNotNull(linkUri, nameof(linkUri));
     this.Link    = Preconditions.CheckNotNull(link, nameof(link));
 }