Example #1
0
        public async Task CapturesModuleIdentityFromTopic()
        {
            var milestone       = new SemaphoreSlim(0, 1);
            var listenerCapture = new DeviceListenerCapture();
            var publishInfo     = new MqttPublishInfo("$edgehub/captured_device_id/captured_module_id/twin/get/?$rid=123", new byte[0]);

            var(connectionRegistry, identityProvider) = GetHandlerDependencies(listenerCapture, milestone);

            var sut = new TwinHandler(connectionRegistry, identityProvider);

            _ = await sut.HandleAsync(publishInfo);

            await milestone.WaitAsync();

            Assert.IsType <ModuleIdentity>(listenerCapture.Captured.Identity);
            Assert.Equal("captured_device_id", ((ModuleIdentity)listenerCapture.Captured.Identity).DeviceId);
            Assert.Equal("captured_module_id", ((ModuleIdentity)listenerCapture.Captured.Identity).ModuleId);
        }
Example #2
0
        public async Task AddsSystemPropertiesToMessage()
        {
            var listenerCapture = new DeviceListenerCapture();
            var publishInfo     = new MqttPublishInfo("$edgehub/device_id/module_id/methods/res/200/?$rid=abcde", new byte[0]);

            var(connectionRegistry, identityProvider) = GetHandlerDependencies(listenerCapture);

            var sut = new DirectMethodHandler(connectionRegistry, identityProvider);

            await sut.HandleAsync(publishInfo);

            var message = listenerCapture.Captured.CapturedMessage;

            Assert.Contains(SystemProperties.CorrelationId, message.Properties);
            Assert.Equal("abcde", message.Properties[SystemProperties.CorrelationId]);
            Assert.Contains(SystemProperties.StatusCode, message.Properties);
            Assert.Equal("200", message.Properties[SystemProperties.StatusCode]);
        }
        public async Task HandlesSubscriptionTopics(string topic)
        {
            var publishInfo = new MqttPublishInfo(topic, new byte[0]);

            var(cloud2DeviceMessageHandler, moduleToModuleMessageHandler, directMethodHandler, twinHandler) = GetSubscriptionWatchers();
            var(connectionRegistry, identityProvider) = GetHandlerDependencies();

            var sut = new SubscriptionChangeHandler(
                cloud2DeviceMessageHandler,
                moduleToModuleMessageHandler,
                directMethodHandler,
                twinHandler,
                connectionRegistry,
                identityProvider);

            var isHandled = await sut.HandleAsync(publishInfo);

            Assert.True(isHandled);
        }
Example #4
0
        public async Task CapturesModuleIdentityFromTopicForDirectClient()
        {
            var publishInfo = new MqttPublishInfo("$edgehub/captured_device_id/captured_module_id/subscriptions", Encoding.UTF8.GetBytes(@"[""$edgehub/captured_device_id/captured_module_id/methods/post/#""]"));

            var(cloud2DeviceMessageHandler, moduleToModuleMessageHandler, _, twinHandler) = GetSubscriptionWatchers();
            var(connectionRegistry, _) = GetHandlerDependencies();
            var identityProvider = Mock.Of <IIdentityProvider>();

            var directMethodHandler = Mock.Of <IDirectMethodHandler>();

            Mock.Get(directMethodHandler)
            .Setup(sw => sw.WatchedSubscriptions)
            .Returns(() => new List <SubscriptionPattern>()
            {
                new SubscriptionPattern(@"^((?<dialect>(\$edgehub)|(\$iothub)))/(?<id1>[^/\+\#]+)(/(?<id2>[^/\+\#]+))?/methods/post/\#$", DeviceSubscription.Methods)
            });

            string passedDeviceId = null;
            string passedModuleId = null;

            Mock.Get(identityProvider)
            .Setup(ip => ip.Create(It.IsAny <string>(), It.IsAny <string>()))
            .Returns((string device_id, string module_id) =>
            {
                passedDeviceId = device_id;
                passedModuleId = module_id;
                return(new DeviceIdentity("host", device_id));
            });

            var sut = new SubscriptionChangeHandler(
                cloud2DeviceMessageHandler,
                moduleToModuleMessageHandler,
                directMethodHandler,
                twinHandler,
                connectionRegistry,
                identityProvider);

            _ = await sut.HandleAsync(publishInfo);

            Assert.Equal("captured_device_id", passedDeviceId);
            Assert.Equal("captured_module_id", passedModuleId);
        }
Example #5
0
        public async Task InternalMessageCapturesBody()
        {
            var deviceListenerCapture = new DeviceListenerCapture();

            var publishInfo = new MqttPublishInfo("$edgehub/device_id/messages/events/prop1=val1&prop2=val2", new byte[] { 0x01, 0x02, 0x03 });

            var(connectionRegistry, identityProvider) = GetHandlerDependencies(listenerCapture: deviceListenerCapture);

            var sut = new TelemetryHandler(connectionRegistry, identityProvider);

            var isHandled = await sut.HandleAsync(publishInfo);

            Assert.True(isHandled);
            Assert.NotNull(deviceListenerCapture.Captured);
            Assert.NotNull(deviceListenerCapture.Captured.LastCapturedMessage);

            var capturedMessage = deviceListenerCapture.Captured.LastCapturedMessage;

            Assert.Equal(new byte[] { 0x01, 0x02, 0x03 }, capturedMessage.Body);
        }
Example #6
0
        public async Task TurnsOnOffSubscriptionsForMixedIdentities()
        {
            var listenerCapture = new MultiDeviceListenerCapture();

            var publishInfo = new MqttPublishInfo("$edgehub/device_id/module_id/subscriptions", Encoding.UTF8.GetBytes("[\"$edgehub/device_id/module_id/MatchingPattern\", \"$edgehub/device_id/module_id_2/MatchingPattern\"]"));

            var(_, moduleToModuleMessageHandler, directMethodHandler, twinHandler) = GetSubscriptionWatchers();

            var cloud2DeviceMessageHandler = Mock.Of <ICloud2DeviceMessageHandler>();

            Mock.Get(cloud2DeviceMessageHandler)
            .Setup(sw => sw.WatchedSubscriptions)
            .Returns(() => new List <SubscriptionPattern>()
            {
                new SubscriptionPattern(@"(?<id1>[^/\+\#]+)(/(?<id2>[^/\+\#]+))?/patternX", DeviceSubscription.Methods),
                new SubscriptionPattern(@"(?<id1>[^/\+\#]+)(/(?<id2>[^/\+\#]+))?/MatchingPattern", DeviceSubscription.C2D),
            });

            var(connectionRegistry, identityProvider) = GetHandlerDependencies(listenerCapture: listenerCapture);

            var sut = new SubscriptionChangeHandler(
                cloud2DeviceMessageHandler,
                moduleToModuleMessageHandler,
                directMethodHandler,
                twinHandler,
                connectionRegistry,
                identityProvider);

            _ = await sut.HandleAsync(publishInfo);

            var listener = listenerCapture.Captured.Where(l => l.Identity.Id == "device_id/module_id").First();

            Assert.Equal(DeviceSubscription.C2D, listener.AddedSubscription);
            Assert.Equal(DeviceSubscription.Methods, listener.RemovedSubscription);

            listener = listenerCapture.Captured.Where(l => l.Identity.Id == "device_id/module_id_2").First();

            Assert.Equal(DeviceSubscription.C2D, listener.AddedSubscription);
            Assert.Equal(DeviceSubscription.Methods, listener.RemovedSubscription);
        }
        public async Task TurnsOnOffSubscriptionsForIndirectClients()
        {
            var listenerCapture = new DeviceListenerCapture();

            var publishInfo = new MqttPublishInfo("$edgehub/somedevice/$edgeHub/subscriptions", Encoding.UTF8.GetBytes("[\"$edgehub/device_id/module_id/MatchingPattern\"]"));

            var(_, moduleToModuleMessageHandler, directMethodHandler, twinHandler) = GetSubscriptionWatchers();

            var cloud2DeviceMessageHandler = Mock.Of <ICloud2DeviceMessageHandler>();

            Mock.Get(cloud2DeviceMessageHandler)
            .Setup(sw => sw.WatchedSubscriptions)
            .Returns(() => new List <SubscriptionPattern>()
            {
                new SubscriptionPattern(@"(?<id1>[^/\+\#]+)(/(?<id2>[^/\+\#]+))?/patternX", DeviceSubscription.Methods),
                new SubscriptionPattern(@"(?<id1>[^/\+\#]+)(/(?<id2>[^/\+\#]+))?/MatchingPattern", DeviceSubscription.C2D),
            });

            var(connectionRegistry, identityProvider) = GetHandlerDependencies(listenerCapture: listenerCapture);

            Mock.Get(connectionRegistry)
            .Setup(cr => cr.GetNestedConnectionsAsync())
            .Returns(() => Task.FromResult <IReadOnlyList <IIdentity> >(new List <IIdentity>()
            {
                (IIdentity) new ModuleIdentity("host", "device_id", "module_id")
            }));

            var sut = new SubscriptionChangeHandler(
                cloud2DeviceMessageHandler,
                moduleToModuleMessageHandler,
                directMethodHandler,
                twinHandler,
                connectionRegistry,
                identityProvider);

            _ = await sut.HandleAsync(publishInfo);

            Assert.Equal(DeviceSubscription.C2D, listenerCapture.Captured.AddedSubscription);
            Assert.Equal(DeviceSubscription.Methods, listenerCapture.Captured.RemovedSubscription);
        }
Example #8
0
        public async Task CapturesDeviceIdentityFromTopic()
        {
            var publishInfo = new MqttPublishInfo("$edgehub/captured_device_id/messages/events/prop1=val1&prop2=val2", new byte[0]);

            var(connectionRegistry, _) = GetHandlerDependencies();
            var identityProvider = Mock.Of <IIdentityProvider>();

            string passedDeviceId = null;

            Mock.Get(identityProvider)
            .Setup(ip => ip.Create(It.IsAny <string>()))
            .Returns((string device_id) =>
            {
                passedDeviceId = device_id;
                return(new DeviceIdentity("host", device_id));
            });

            var sut = new TelemetryHandler(connectionRegistry, identityProvider);

            _ = await sut.HandleAsync(publishInfo);

            Assert.Equal("captured_device_id", passedDeviceId);
        }
Example #9
0
        public async Task InternalMessageCapturesSystemProperties()
        {
            var deviceListenerCapture = new DeviceListenerCapture();

            var publishInfo = new MqttPublishInfo("$edgehub/device_id/messages/events/%24.uid=userid&%24.cid=corrid", new byte[] { 0x01, 0x02, 0x03 });

            var(connectionRegistry, _) = GetHandlerDependencies(listenerCapture: deviceListenerCapture);
            var identityProvider = Mock.Of <IIdentityProvider>();

            string passedDeviceId = null;

            Mock.Get(identityProvider)
            .Setup(ip => ip.Create(It.IsAny <string>()))
            .Returns((string device_id) =>
            {
                passedDeviceId = device_id;
                return(new DeviceIdentity("host", device_id));
            });

            var sut = new TelemetryHandler(connectionRegistry, identityProvider);

            var isHandled = await sut.HandleAsync(publishInfo);

            Assert.True(isHandled);
            Assert.NotNull(deviceListenerCapture.Captured);
            Assert.NotNull(deviceListenerCapture.Captured.LastCapturedMessage);

            var capturedMessage    = deviceListenerCapture.Captured.LastCapturedMessage;
            var expectedProperties = new Dictionary <string, string>()
            {
                ["userId"]             = "userid",
                ["cid"]                = "corrid",
                ["connectionDeviceId"] = passedDeviceId
            };

            Assert.Equal(expectedProperties, capturedMessage.SystemProperties);
        }
 public Task <bool> HandleAsync(MqttPublishInfo publishInfo)
 {
     this.PacketsToHandle.Add(publishInfo);
     this.Handler(publishInfo);
     return(Task.FromResult(this.ShouldHandle));
 }
 async Task SignalConnectionEvent(BrokeredCloudProxyDispatcher brokeredCloudProxyDispatcher, string status)
 {
     var packet = new MqttPublishInfo(ConnectivityTopic, Encoding.UTF8.GetBytes("{\"status\":\"" + status + "\"}"));
     await brokeredCloudProxyDispatcher.HandleAsync(packet);
 }