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); }
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); }
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); }
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)); }
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; }
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); }
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); }
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); }
public static void LinkRegistered(IAmqpLink link) { Log.LogDebug((int)EventIds.LinkRegistered, "Cbs {0} link registered".FormatInvariant(link.IsReceiver ? "receiver" : "sender")); }
public static void Closing(IAmqpLink amqpLink) { Log.LogDebug((int)EventIds.Closing, "Closing CBS {0} link".FormatInvariant(amqpLink.IsReceiver ? "receiver" : "sender")); }
CbsLinkHandler(IAmqpLink link, Uri linkUri) { this.LinkUri = Preconditions.CheckNotNull(linkUri, nameof(linkUri)); this.Link = Preconditions.CheckNotNull(link, nameof(link)); }