public async Task SendMessageWithFeedbackExactlyOnceModeTest()
        {
            // Arrange
            var feedbackStatus = FeedbackStatus.Abandon;
            var deviceListener = new Mock <IDeviceListener>();

            deviceListener.Setup(d => d.ProcessMessageFeedbackAsync(It.IsAny <string>(), It.IsAny <FeedbackStatus>()))
            .Callback <string, FeedbackStatus>((m, s) => feedbackStatus = s)
            .Returns(Task.CompletedTask);
            AmqpMessage receivedAmqpMessage = null;
            var         identity            = Mock.Of <IIdentity>(i => i.Id == "d1");
            var         connectionHandler   = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener.Object));
            var         amqpAuthenticator   = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1")).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession      = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var amqpLinkSettings = new AmqpLinkSettings();
            var sendingLink      = Mock.Of <ISendingAmqpLink>(l => l.Session == amqpSession && !l.IsReceiver && l.Settings == amqpLinkSettings && l.State == AmqpObjectState.Opened);

            Mock.Get(sendingLink).Setup(s => s.SendMessageNoWait(It.IsAny <AmqpMessage>(), It.IsAny <ArraySegment <byte> >(), It.IsAny <ArraySegment <byte> >()))
            .Callback <AmqpMessage, ArraySegment <byte>, ArraySegment <byte> >((m, d, t) => { receivedAmqpMessage = m; });

            var requestUri     = new Uri("amqps://foo.bar/devices/d1");
            var boundVariables = new Dictionary <string, string> {
                { "deviceid", "d1" }
            };
            var messageConverter = new AmqpMessageConverter();

            var      sendingLinkHandler = new TestSendingLinkHandler(identity, sendingLink, requestUri, boundVariables, connectionHandler, messageConverter, QualityOfService.ExactlyOnce);
            var      body          = new byte[] { 0, 1, 2, 3 };
            IMessage message       = new EdgeMessage.Builder(body).Build();
            var      deliveryState = new Mock <DeliveryState>(new AmqpSymbol(string.Empty), AmqpConstants.AcceptedOutcome.DescriptorCode);
            var      delivery      = Mock.Of <Delivery>(
                d => d.State == deliveryState.Object &&
                d.DeliveryTag == new ArraySegment <byte>(Guid.NewGuid().ToByteArray()));

            // Act
            await sendingLinkHandler.OpenAsync(TimeSpan.FromSeconds(5));

            await sendingLinkHandler.SendMessage(message);

            // Assert
            Assert.NotNull(receivedAmqpMessage);
            Assert.Equal(body, receivedAmqpMessage.GetPayloadBytes());

            // Act
            sendingLinkHandler.DispositionListener(delivery);
            await Task.Delay(TimeSpan.FromSeconds(5));

            // Assert
            Assert.Equal(feedbackStatus, FeedbackStatus.Complete);
            Assert.Equal(null, amqpLinkSettings.SndSettleMode);
            Assert.Equal((byte)ReceiverSettleMode.Second, amqpLinkSettings.RcvSettleMode);
        }
        public async Task SendLargeMessageThrowsTest()
        {
            // Arrange
            bool disposeMessageCalled = true;
            var  identity             = Mock.Of <IIdentity>(i => i.Id == "d1");

            var deviceListener = Mock.Of <IDeviceListener>();

            Mock.Get(deviceListener).Setup(d => d.ProcessDeviceMessageBatchAsync(It.IsAny <IEnumerable <IMessage> >()))
            .Returns(Task.CompletedTask);

            var connectionHandler = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener));
            var amqpAuthenticator = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1")).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var amqpLink    = Mock.Of <IReceivingAmqpLink>(l => l.Session == amqpSession && l.IsReceiver && l.Settings == new AmqpLinkSettings() && l.State == AmqpObjectState.Opened);

            Action <AmqpMessage> onMessageCallback = null;

            Mock.Get(amqpLink).Setup(l => l.RegisterMessageListener(It.IsAny <Action <AmqpMessage> >())).Callback <Action <AmqpMessage> >(a => onMessageCallback = a);
            Mock.Get(amqpLink).SetupGet(l => l.Settings).Returns(new AmqpLinkSettings());
            Mock.Get(amqpLink).Setup(l => l.SafeAddClosed(It.IsAny <EventHandler>()));
            Mock.Get(amqpLink).Setup(l => l.DisposeMessage(It.IsAny <AmqpMessage>(), It.IsAny <Outcome>(), It.IsAny <bool>(), It.IsAny <bool>()))
            .Callback(() => disposeMessageCalled = true);

            var productInfoStore = Mock.Of <IProductInfoStore>();
            var modelIdStore     = Mock.Of <IModelIdStore>();
            var requestUri       = new Uri("amqps://foo.bar/devices/d1/messages/events");
            var boundVariables   = new Dictionary <string, string> {
                { "deviceid", "d1" }
            };
            var messageConverter = new AmqpMessageConverter();

            using (AmqpMessage amqpMessage = AmqpMessage.Create(new MemoryStream(new byte[800000]), false))
            {
                amqpMessage.ApplicationProperties.Map["LargeProp"] = new int[600000];
                ILinkHandler linkHandler = new EventsLinkHandler(identity, amqpLink, requestUri, boundVariables, connectionHandler, messageConverter, productInfoStore, modelIdStore);

                // Act
                await linkHandler.OpenAsync(TimeSpan.FromSeconds(30));

                // Assert
                Assert.NotNull(onMessageCallback);

                // Act
                onMessageCallback.Invoke(amqpMessage);

                // Assert
                await WaitAndAssert(() => disposeMessageCalled, TimeSpan.FromSeconds(5));
            }
        }
        public async Task SetModelIdTest()
        {
            // Arrange
            string modelId       = "com:microsoft:model-id:testModelId";
            string clientVersion = $"TestClientVersion{Guid.NewGuid().ToString()}";
            var    identity      = Mock.Of <IDeviceIdentity>(i => i.Id == "d1" && i.DeviceId == "d1");

            var deviceListener = Mock.Of <IDeviceListener>();

            var connectionHandler = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener));
            var amqpAuthenticator = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1")).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var amqpLink    = Mock.Of <IReceivingAmqpLink>(l => l.Session == amqpSession && l.IsReceiver && l.Settings == new AmqpLinkSettings() && l.State == AmqpObjectState.Opened);

            var linkSettings = new AmqpLinkSettings
            {
                Properties = new Fields()
                {
                    { IotHubAmqpProperty.ClientVersion, clientVersion },
                    { IotHubAmqpProperty.ModelId, modelId }
                }
            };

            Mock.Get(amqpLink).SetupGet(l => l.Settings).Returns(linkSettings);

            var requestUri     = new Uri("amqps://foo.bar/devices/d1/messages/events");
            var boundVariables = new Dictionary <string, string> {
                { "deviceid", "d1" }
            };
            var messageConverter = new AmqpMessageConverter();

            var storeProvider = new StoreProvider(new InMemoryDbStoreProvider());
            IEntityStore <string, string> store = storeProvider.GetEntityStore <string, string>("modelId");
            var productInfoStore = Mock.Of <IProductInfoStore>();
            var modelIdStore     = new ModelIdStore(store);

            ILinkHandler linkHandler = new EventsLinkHandler(identity, amqpLink, requestUri, boundVariables, connectionHandler, messageConverter, productInfoStore, modelIdStore);

            // Act
            await linkHandler.OpenAsync(TimeSpan.FromSeconds(1));

            // Assert
            Option <string> modelIdFromStore = await modelIdStore.GetModelId(identity.Id);

            string deviceEdgeProductInfo = await productInfoStore.GetEdgeProductInfo(identity.Id);

            Assert.True(modelIdFromStore.HasValue);
            modelIdFromStore.ForEach(m => Assert.Equal(modelId, m));
        }
Beispiel #4
0
        public async Task SetProductInfoTest()
        {
            // Arrange
            string edgeProductInfo = "IoTEdge 1.0.7";
            string clientVersion   = $"TestClientVersion{Guid.NewGuid().ToString()}";
            var    identity        = Mock.Of <IDeviceIdentity>(i => i.Id == "d1" && i.DeviceId == "d1");

            var deviceListener = Mock.Of <IDeviceListener>();

            var connectionHandler = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener));
            var amqpAuthenticator = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1", Option.None <string>())).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var amqpLink    = Mock.Of <IReceivingAmqpLink>(l => l.Session == amqpSession && l.IsReceiver && l.Settings == new AmqpLinkSettings() && l.State == AmqpObjectState.Opened);

            var linkSettings = new AmqpLinkSettings
            {
                Properties = new Fields()
                {
                    { IotHubAmqpProperty.ClientVersion, clientVersion }
                }
            };

            Mock.Get(amqpLink).SetupGet(l => l.Settings).Returns(linkSettings);

            var requestUri     = new Uri("amqps://foo.bar/devices/d1/messages/events");
            var boundVariables = new Dictionary <string, string> {
                { "deviceid", "d1" }
            };
            var messageConverter = new AmqpMessageConverter();

            var storeProvider = new StoreProvider(new InMemoryDbStoreProvider());
            IEntityStore <string, string> store = storeProvider.GetEntityStore <string, string>("productInfo");
            var metadataStore = new MetadataStore(store, edgeProductInfo);

            ILinkHandler linkHandler = new EventsLinkHandler(identity, amqpLink, requestUri, boundVariables, connectionHandler, messageConverter, metadataStore);

            // Act
            await linkHandler.OpenAsync(TimeSpan.FromSeconds(1));

            // Assert
            ConnectionMetadata connectionMetadata = await metadataStore.GetMetadata(identity.Id);

            string productInfo           = connectionMetadata.ProductInfo;
            string deviceEdgeProductInfo = connectionMetadata.EdgeProductInfo;

            Assert.Equal(clientVersion, productInfo);
            Assert.Equal($"{clientVersion} {edgeProductInfo}", deviceEdgeProductInfo);
        }
        public async Task SendMessageWithNoFeedbackTest()
        {
            // Arrange
            var productInfoStore = Mock.Of <IProductInfoStore>();
            var modelIdStore     = Mock.Of <IModelIdStore>();
            var identity         = Mock.Of <IIdentity>(i => i.Id == "d1");
            var deviceListener   = new Mock <IDeviceListener>();

            deviceListener.Setup(d => d.ProcessMessageFeedbackAsync(It.IsAny <string>(), It.IsAny <FeedbackStatus>()))
            .Returns(Task.CompletedTask);
            AmqpMessage receivedAmqpMessage = null;
            var         connectionHandler   = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener.Object));
            var         amqpAuthenticator   = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1")).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession      = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var amqpLinkSettings = new AmqpLinkSettings();
            var sendingLink      = Mock.Of <ISendingAmqpLink>(l => l.Session == amqpSession && !l.IsReceiver && l.Settings == amqpLinkSettings && l.State == AmqpObjectState.Opened);

            Mock.Get(sendingLink).Setup(s => s.SendMessageAsync(It.IsAny <AmqpMessage>(), It.IsAny <ArraySegment <byte> >(), It.IsAny <ArraySegment <byte> >(), It.IsAny <TimeSpan>()))
            .Callback <AmqpMessage, ArraySegment <byte>, ArraySegment <byte>, TimeSpan>((m, d, t, ts) => { receivedAmqpMessage = m; })
            .Returns(Task.CompletedTask);

            var requestUri     = new Uri("amqps://foo.bar/devices/d1");
            var boundVariables = new Dictionary <string, string> {
                { "deviceid", "d1" }
            };
            var messageConverter = new AmqpMessageConverter();

            var      sendingLinkHandler = new TestSendingLinkHandler(identity, sendingLink, requestUri, boundVariables, connectionHandler, messageConverter, QualityOfService.AtMostOnce, productInfoStore, modelIdStore);
            var      body    = new byte[] { 0, 1, 2, 3 };
            IMessage message = new EdgeMessage.Builder(body).Build();

            // Act
            await sendingLinkHandler.OpenAsync(TimeSpan.FromSeconds(5));

            await sendingLinkHandler.SendMessage(message);

            // Assert
            Assert.NotNull(receivedAmqpMessage);
            Assert.Equal(body, receivedAmqpMessage.GetPayloadBytes());
            Assert.Equal((byte)SenderSettleMode.Settled, amqpLinkSettings.SndSettleMode);
            Assert.Equal((byte)ReceiverSettleMode.First, amqpLinkSettings.RcvSettleMode);
        }
        public async Task ProcessDeleteOperationMessageTest()
        {
            // Arrange
            string receivedCorrelationId = null;
            var    deviceListener        = new Mock <IDeviceListener>();

            deviceListener.Setup(d => d.RemoveDesiredPropertyUpdatesSubscription(It.IsAny <string>()))
            .Callback <string>(c => receivedCorrelationId = c)
            .Returns(Task.CompletedTask);
            var connectionHandler = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener.Object));
            var amqpAuthenticator = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1")).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession   = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var receivingLink = Mock.Of <IReceivingAmqpLink>(l => l.Session == amqpSession && l.IsReceiver && l.Settings == new AmqpLinkSettings() && l.State == AmqpObjectState.Opened);

            var requestUri     = new Uri("amqps://foo.bar/devices/d1/twin");
            var boundVariables = new Dictionary <string, string> {
                { "deviceid", "d1" }
            };
            var messageConverter         = Mock.Of <IMessageConverter <AmqpMessage> >();
            var identity                 = Mock.Of <IIdentity>(i => i.Id == "d1");
            var productInfoStore         = Mock.Of <IProductInfoStore>();
            var modelIdStore             = Mock.Of <IModelIdStore>();
            var twinReceivingLinkHandler = new TwinReceivingLinkHandler(identity, receivingLink, requestUri, boundVariables, connectionHandler, messageConverter, productInfoStore, modelIdStore);

            string      correlationId = Guid.NewGuid().ToString();
            AmqpMessage amqpMessage   = AmqpMessage.Create();

            amqpMessage.MessageAnnotations.Map["operation"] = "DELETE";
            amqpMessage.Properties.CorrelationId            = correlationId;

            // Act
            await twinReceivingLinkHandler.OpenAsync(TimeSpan.FromSeconds(60));

            await twinReceivingLinkHandler.ProcessMessageAsync(amqpMessage);

            // Assert
            Assert.NotNull(receivedCorrelationId);
            Assert.Equal(correlationId, receivedCorrelationId);
            deviceListener.VerifyAll();
        }
Beispiel #7
0
        public async Task ReceiveMessageTest()
        {
            // Arrange
            var deviceListener    = new Mock <IDeviceListener>();
            var connectionHandler = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener.Object));
            var amqpAuthenticator = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1")).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession   = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var receivingLink = Mock.Of <IReceivingAmqpLink>(l => l.Session == amqpSession && l.IsReceiver && l.Settings == new AmqpLinkSettings() && l.State == AmqpObjectState.Opened);

            var requestUri     = new Uri("amqps://foo.bar/devices/d1");
            var boundVariables = new Dictionary <string, string> {
                { "deviceid", "d1" }
            };
            var         messageConverter = new AmqpMessageConverter();
            var         body             = new byte[] { 0, 1, 2, 3 };
            AmqpMessage message          = AmqpMessage.Create(new Data {
                Value = new ArraySegment <byte>(body)
            });
            var identity         = Mock.Of <IIdentity>(i => i.Id == "d1");
            var productInfoStore = Mock.Of <IProductInfoStore>();
            var modelIdStore     = Mock.Of <IModelIdStore>();

            // Act
            var receivingLinkHandler = new TestReceivingLinkHandler(identity, receivingLink, requestUri, boundVariables, connectionHandler, messageConverter, productInfoStore, modelIdStore);
            await receivingLinkHandler.OpenAsync(Constants.DefaultTimeout);

            await receivingLinkHandler.ProcessMessageAsync(message);

            // Assert
            await Task.Delay(TimeSpan.FromSeconds(3));

            Assert.Equal(1, receivingLinkHandler.ReceivedMessages.Count);
            Assert.Equal(body, receivingLinkHandler.ReceivedMessages[0].GetPayloadBytes());
        }
Beispiel #8
0
        public async Task SendMessageTest()
        {
            // Arrange
            var identity = Mock.Of <IDeviceIdentity>(i => i.Id == "d1" && i.DeviceId == "d1");

            IEnumerable <IMessage> receivedMessages = null;
            var deviceListener = Mock.Of <IDeviceListener>();

            Mock.Get(deviceListener).Setup(d => d.ProcessDeviceMessageBatchAsync(It.IsAny <IEnumerable <IMessage> >())).Callback <IEnumerable <IMessage> >(m => receivedMessages = m);

            var connectionHandler = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener));
            var amqpAuthenticator = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1", Option.None <string>())).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var amqpLink    = Mock.Of <IReceivingAmqpLink>(l => l.Session == amqpSession && l.IsReceiver && l.Settings == new AmqpLinkSettings() && l.State == AmqpObjectState.Opened);

            Action <AmqpMessage> onMessageCallback = null;

            Mock.Get(amqpLink).Setup(l => l.RegisterMessageListener(It.IsAny <Action <AmqpMessage> >())).Callback <Action <AmqpMessage> >(a => onMessageCallback = a);
            Mock.Get(amqpLink).SetupGet(l => l.Settings).Returns(new AmqpLinkSettings());
            Mock.Get(amqpLink).Setup(l => l.SafeAddClosed(It.IsAny <EventHandler>()));
            var metadataStore  = Mock.Of <IMetadataStore>();
            var requestUri     = new Uri("amqps://foo.bar/devices/d1/messages/events");
            var boundVariables = new Dictionary <string, string> {
                { "deviceid", "d1" }
            };
            var messageConverter = new AmqpMessageConverter();

            using (AmqpMessage amqpMessage = AmqpMessage.Create(new MemoryStream(new byte[] { 1, 2, 3, 4 }), false))
            {
                amqpMessage.ApplicationProperties.Map["Prop1"] = "Value1";
                amqpMessage.ApplicationProperties.Map["Prop2"] = "Value2";
                amqpMessage.Properties.ContentType             = "application/json";
                amqpMessage.Properties.ContentEncoding         = "utf-8";

                ILinkHandler linkHandler = new EventsLinkHandler(identity, amqpLink, requestUri, boundVariables, connectionHandler, messageConverter, metadataStore);

                // Act
                await linkHandler.OpenAsync(TimeSpan.FromSeconds(30));

                // Assert
                Assert.NotNull(onMessageCallback);

                // Act
                onMessageCallback.Invoke(amqpMessage);

                // Assert
                await WaitAndAssert(
                    () =>
                {
                    if (receivedMessages == null)
                    {
                        return(false);
                    }

                    IList <IMessage> receivedMessagesList = receivedMessages.ToList();
                    Assert.Equal(1, receivedMessagesList.Count);
                    Assert.Equal("Value1", receivedMessagesList[0].Properties["Prop1"]);
                    Assert.Equal("Value2", receivedMessagesList[0].Properties["Prop2"]);
                    Assert.Equal("utf-8", receivedMessagesList[0].SystemProperties[SystemProperties.ContentEncoding]);
                    Assert.Equal("application/json", receivedMessagesList[0].SystemProperties[SystemProperties.ContentType]);
                    Assert.Equal("d1", receivedMessagesList[0].SystemProperties[SystemProperties.ConnectionDeviceId]);
                    Assert.Equal(receivedMessagesList[0].Body, new byte[] { 1, 2, 3, 4 });
                    return(true);
                },
                    TimeSpan.FromSeconds(5));
            }
        }
Beispiel #9
0
        public async Task SendMessageBatchTest()
        {
            // Arrange
            var identity = Mock.Of <IIdentity>(i => i.Id == "d1");

            IEnumerable <IMessage> receivedMessages = null;
            var deviceListener = Mock.Of <IDeviceListener>();

            Mock.Get(deviceListener).Setup(d => d.ProcessDeviceMessageBatchAsync(It.IsAny <IEnumerable <IMessage> >()))
            .Callback <IEnumerable <IMessage> >(m => receivedMessages = m)
            .Returns(Task.CompletedTask);

            var connectionHandler = Mock.Of <IConnectionHandler>(c => c.GetDeviceListener() == Task.FromResult(deviceListener));
            var amqpAuthenticator = new Mock <IAmqpAuthenticator>();

            amqpAuthenticator.Setup(c => c.AuthenticateAsync("d1", Option.None <string>())).ReturnsAsync(true);
            Mock <ICbsNode> cbsNodeMock    = amqpAuthenticator.As <ICbsNode>();
            ICbsNode        cbsNode        = cbsNodeMock.Object;
            var             amqpConnection = Mock.Of <IAmqpConnection>(
                c =>
                c.FindExtension <IConnectionHandler>() == connectionHandler &&
                c.FindExtension <ICbsNode>() == cbsNode);
            var amqpSession   = Mock.Of <IAmqpSession>(s => s.Connection == amqpConnection);
            var amqpLink      = Mock.Of <IReceivingAmqpLink>(l => l.Session == amqpSession && l.IsReceiver && l.Settings == new AmqpLinkSettings() && l.State == AmqpObjectState.Opened);
            var metadataStore = Mock.Of <IMetadataStore>();
            Action <AmqpMessage> onMessageCallback = null;

            Mock.Get(amqpLink).Setup(l => l.RegisterMessageListener(It.IsAny <Action <AmqpMessage> >())).Callback <Action <AmqpMessage> >(a => onMessageCallback = a);
            Mock.Get(amqpLink).SetupGet(l => l.Settings).Returns(new AmqpLinkSettings());
            Mock.Get(amqpLink).Setup(l => l.SafeAddClosed(It.IsAny <EventHandler>()));

            var requestUri     = new Uri("amqps://foo.bar/devices/d1/messages/events");
            var boundVariables = new Dictionary <string, string>
            {
                { "deviceid", "d1" }
            };
            var messageConverter = new AmqpMessageConverter();

            string content1 = "Message1 Contents ABC";
            string content2 = "Message2 Contents PQR";
            string content3 = "Message3 Contents XYZ";
            var    contents = new List <string>
            {
                content1,
                content2,
                content3
            };

            using (AmqpMessage amqpMessage = GetBatchedMessage(contents))
            {
                amqpMessage.MessageFormat = AmqpConstants.AmqpBatchedMessageFormat;
                ILinkHandler linkHandler = new EventsLinkHandler(identity, amqpLink, requestUri, boundVariables, connectionHandler, messageConverter, metadataStore);

                // Act
                await linkHandler.OpenAsync(TimeSpan.FromSeconds(30));

                // Assert
                Assert.NotNull(onMessageCallback);

                // Act
                onMessageCallback.Invoke(amqpMessage);

                // Assert
                await WaitAndAssert(
                    () =>
                {
                    if (receivedMessages == null)
                    {
                        return(false);
                    }

                    IList <IMessage> receivedMessagesList = receivedMessages.ToList();
                    Assert.Equal(contents.Count, receivedMessagesList.Count);

                    for (int i = 0; i < receivedMessagesList.Count; i++)
                    {
                        IMessage receivedMessage = receivedMessagesList[i];
                        string actualContents    = Encoding.UTF8.GetString(receivedMessage.Body);

                        Assert.Equal(contents[i], actualContents);
                        Assert.Equal($"{i}", receivedMessage.SystemProperties[SystemProperties.MessageId]);
                        Assert.Equal($"{i}", receivedMessage.Properties["MsgCnt"]);
                        Assert.Equal(contents[i], receivedMessage.Properties["MsgData"]);
                    }

                    return(true);
                },
                    TimeSpan.FromSeconds(5));
            }
        }