示例#1
0
        public async Task HandlesTwinTopics(string topic)
        {
            var publishInfo = new MqttPublishInfo(topic, new byte[0]);

            var(connectionRegistry, identityProvider) = GetHandlerDependencies();

            var sut = new TwinHandler(connectionRegistry, identityProvider);

            var isHandled = await sut.HandleAsync(publishInfo);

            Assert.True(isHandled);
        }
示例#2
0
        public async Task CapturesTwinReportedContentFromBody()
        {
            var milestone       = new SemaphoreSlim(0, 1);
            var listenerCapture = new DeviceListenerCapture();
            var publishInfo     = new MqttPublishInfo("$edgehub/device_id/twin/reported/?$rid=123", new byte[] { 1, 2, 3 });

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

            var sut = new TwinHandler(connectionRegistry, identityProvider);

            _ = await sut.HandleAsync(publishInfo);

            await milestone.WaitAsync();

            Assert.Equal(new byte [] { 1, 2, 3 }, listenerCapture.Captured.CapturedMessage.Body);
        }
示例#3
0
        public async Task CapturesTwinGetRidFromTopic()
        {
            var milestone       = new SemaphoreSlim(0, 1);
            var listenerCapture = new DeviceListenerCapture();
            var publishInfo     = new MqttPublishInfo("$edgehub/device_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.Equal("123", listenerCapture.Captured.CapturedCorrelationId);
        }
示例#4
0
        public async Task DesiredUpdateRequiresVersion()
        {
            var(connectionRegistry, identityProvider) = GetHandlerDependencies();
            var connector = GetConnector();

            var identity = new DeviceIdentity("hub", "device_id");
            var twin     = new EdgeMessage.Builder(new byte[] { 1, 2, 3 }).Build();

            var sut = new TwinHandler(connectionRegistry, identityProvider);

            sut.SetConnector(connector);

            await sut.SendDesiredPropertiesUpdate(twin, identity, true);

            Mock.Get(connector)
            .Verify(c => c.SendAsync(It.IsAny <string>(), It.IsAny <byte[]>()), Times.Never());
        }
示例#5
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);
        }
示例#6
0
        public async Task TwinUpdateRequiresMessageCorrelationId()
        {
            var(connectionRegistry, identityProvider) = GetHandlerDependencies();
            var connector = GetConnector();

            var identity = new DeviceIdentity("hub", "device_id");
            var twin     = new EdgeMessage.Builder(new byte[] { 1, 2, 3 })
                           .SetSystemProperties(new Dictionary <string, string>()
            {
                [SystemProperties.StatusCode] = "200"
            })
                           .Build();

            var sut = new TwinHandler(connectionRegistry, identityProvider);

            sut.SetConnector(connector);

            await sut.SendTwinUpdate(twin, identity, true);

            Mock.Get(connector)
            .Verify(c => c.SendAsync(It.IsAny <string>(), It.IsAny <byte[]>()), Times.Never());
        }
示例#7
0
        public async Task DesiredUpdateEncodesVersionAndIdentityInTopic()
        {
            var sendCapture = new SendCapture();

            var(connectionRegistry, identityProvider) = GetHandlerDependencies();
            var connector = GetConnector(sendCapture);

            var identity = new DeviceIdentity("hub", "device_id");
            var twin     = new EdgeMessage.Builder(new byte[] { 1, 2, 3 })
                           .SetSystemProperties(new Dictionary <string, string>()
            {
                [SystemProperties.Version] = "123"
            })
                           .Build();

            var sut = new TwinHandler(connectionRegistry, identityProvider);

            sut.SetConnector(connector);

            await sut.SendDesiredPropertiesUpdate(twin, identity, true);

            Assert.Equal("$edgehub/device_id/twin/desired/?$version=123", sendCapture.Topic);
        }
示例#8
0
        public async Task TwinUpdateSendsMessageBody()
        {
            var sendCapture = new SendCapture();

            var(connectionRegistry, identityProvider) = GetHandlerDependencies();
            var connector = GetConnector(sendCapture);

            var identity = new DeviceIdentity("hub", "device_id");
            var twin     = new EdgeMessage.Builder(new byte[] { 1, 2, 3 })
                           .SetSystemProperties(new Dictionary <string, string>()
            {
                [SystemProperties.StatusCode]    = "200",
                [SystemProperties.CorrelationId] = "123"
            })
                           .Build();

            var sut = new TwinHandler(connectionRegistry, identityProvider);

            sut.SetConnector(connector);

            await sut.SendTwinUpdate(twin, identity, true);

            Assert.Equal(new byte[] { 1, 2, 3 }, sendCapture.Content);
        }
示例#9
0
        public async Task TwinUpdateEncodesPropertiesAndIdentityInTopic()
        {
            var sendCapture = new SendCapture();

            var(connectionRegistry, identityProvider) = GetHandlerDependencies();
            var connector = GetConnector(sendCapture);

            var identity = new DeviceIdentity("hub", "device_id");
            var twin     = new EdgeMessage.Builder(new byte[] { 1, 2, 3 })
                           .SetSystemProperties(new Dictionary <string, string>()
            {
                [SystemProperties.StatusCode]    = "200",
                [SystemProperties.CorrelationId] = "123"
            })
                           .Build();

            var sut = new TwinHandler(connectionRegistry, identityProvider);

            sut.SetConnector(connector);

            await sut.SendTwinUpdate(twin, identity);

            Assert.Equal("$edgehub/device_id/twin/res/200/?$rid=123", sendCapture.Topic);
        }
示例#10
0
        async Task <(IMessageConsumer, IMessageConsumer, NullBrokerConnector)> SetupEnvironment()
        {
            Routing.UserMetricLogger    = NullRoutingUserMetricLogger.Instance;
            Routing.PerfCounter         = NullRoutingPerfCounter.Instance;
            Routing.UserAnalyticsLogger = NullUserAnalyticsLogger.Instance;

            var defaultRetryStrategy   = new FixedInterval(5, TimeSpan.FromSeconds(5));
            var defaultRevivePeriod    = TimeSpan.FromHours(1);
            var defaultTimeout         = TimeSpan.FromSeconds(60);
            var endpointExecutorConfig = new EndpointExecutorConfig(defaultTimeout, defaultRetryStrategy, defaultRevivePeriod, true);

            var cloudProxyDispatcher    = new BrokeredCloudProxyDispatcher();
            var cloudConnectionProvider = new BrokeredCloudConnectionProvider(cloudProxyDispatcher);

            var identityProvider          = new IdentityProvider(iotHubName);
            var deviceConnectivityManager = new BrokeredDeviceConnectivityManager(cloudProxyDispatcher);

            var connectionManager = new ConnectionManager(cloudConnectionProvider, Mock.Of <ICredentialsCache>(), new IdentityProvider(iotHubName), deviceConnectivityManager);

            var routingMessageConverter = new RoutingMessageConverter();
            var routeFactory            = new EdgeRouteFactory(new EndpointFactory(connectionManager, routingMessageConverter, edgeDeviceId, 10, 10));
            var routesList   = new[] { routeFactory.Create("FROM /messages INTO $upstream") };
            var endpoints    = routesList.Select(r => r.Endpoint);
            var routerConfig = new RouterConfig(endpoints, routesList);

            var dbStoreProvider         = new InMemoryDbStoreProvider();
            var storeProvider           = new StoreProvider(dbStoreProvider);
            var messageStore            = new MessageStore(storeProvider, CheckpointStore.Create(storeProvider), TimeSpan.MaxValue, false, 1800);
            var endpointExecutorFactory = new StoringAsyncEndpointExecutorFactory(endpointExecutorConfig, new AsyncEndpointExecutorOptions(1, TimeSpan.FromMilliseconds(10)), messageStore);

            var router = await Router.CreateAsync(Guid.NewGuid().ToString(), iotHubName, routerConfig, endpointExecutorFactory);

            var messageConverterProvider = new MessageConverterProvider(
                new Dictionary <Type, IMessageConverter>()
            {
                { typeof(Twin), new TwinMessageConverter() },
                { typeof(TwinCollection), new TwinCollectionMessageConverter() }
            });

            var twinManager           = TwinManager.CreateTwinManager(connectionManager, messageConverterProvider, Option.None <IStoreProvider>());
            var invokeMethodHandler   = Mock.Of <IInvokeMethodHandler>();
            var subscriptionProcessor = new SubscriptionProcessor(connectionManager, invokeMethodHandler, deviceConnectivityManager);

            var edgeHub = new RoutingEdgeHub(router, routingMessageConverter, connectionManager, twinManager, edgeDeviceId, edgeModuleName, invokeMethodHandler, subscriptionProcessor, Mock.Of <IDeviceScopeIdentitiesCache>());

            var brokerConnector = new NullBrokerConnector(cloudProxyDispatcher);

            cloudProxyDispatcher.SetConnector(brokerConnector);
            cloudProxyDispatcher.BindEdgeHub(edgeHub);

            var connectionProvider = new ConnectionProvider(connectionManager, edgeHub, TimeSpan.FromSeconds(30));
            var authenticator      = new NullAuthenticator();

            var edgeHubIdentity         = new ModuleIdentity(iotHubName, edgeDeviceId, edgeModuleName);
            var tokenCredentials        = new TokenCredentials(edgeHubIdentity, "qwerty", "test-product", Option.Some("test-model"), Option.None <string>(), false);
            var systemComponentProvider = new SystemComponentIdProvider(tokenCredentials);

            var connectionHandler = default(ConnectionHandler);

            connectionHandler = new ConnectionHandler(
                Task.FromResult <IConnectionProvider>(connectionProvider),
                Task.FromResult <IAuthenticator>(authenticator),
                identityProvider,
                systemComponentProvider,
                DeviceProxyFactory);

            DeviceProxy DeviceProxyFactory(IIdentity identity, bool isDirectClient)
            {
                return(new DeviceProxy(identity, isDirectClient, connectionHandler, Mock.Of <ITwinHandler>(), Mock.Of <IModuleToModuleMessageHandler>(), Mock.Of <ICloud2DeviceMessageHandler>(), Mock.Of <IDirectMethodHandler>()));
            }

            var cloud2DeviceMessageHandler   = new Cloud2DeviceMessageHandler(connectionHandler);
            var moduleToModuleMessageHandler = new ModuleToModuleMessageHandler(connectionHandler, identityProvider, new ModuleToModuleResponseTimeout(TimeSpan.FromSeconds(10)));
            var directMethodHandler          = new DirectMethodHandler(connectionHandler, identityProvider);
            var twinHandler = new TwinHandler(connectionHandler, identityProvider);

            var subscriptionChangeHandler = new SubscriptionChangeHandler(
                cloud2DeviceMessageHandler,
                moduleToModuleMessageHandler,
                directMethodHandler,
                twinHandler,
                connectionHandler,
                identityProvider);

            return(subscriptionChangeHandler, cloudProxyDispatcher, brokerConnector);
        }