Example #1
0
        public void GetIdentityTest()
        {
            // Arrange
            var amqpValue = new AmqpValue
            {
                Value = TokenHelper.CreateSasToken("edgehubtest1.azure-devices.net/devices/device1/modules/mod1")
            };
            AmqpMessage validAmqpMessage = AmqpMessage.Create(amqpValue);

            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Type]     = "azure-devices.net:sastoken";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Audience] = "iothub";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.Operation]         = CbsConstants.PutToken.OperationValue;

            var clientCredentials = Mock.Of <IClientCredentials>();
            var identityFactory   = new Mock <IClientCredentialsFactory>();

            identityFactory.Setup(i => i.GetWithSasToken(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()))
            .Returns(clientCredentials);

            string iotHubHostName = "edgehubtest1.azure-devices.net";
            var    authenticator  = new Mock <IAuthenticator>();
            var    cbsNode        = new CbsNode(identityFactory.Object, iotHubHostName, authenticator.Object, new NullCredentialsStore());

            // Act
            IClientCredentials receivedClientCredentials = cbsNode.GetClientCredentials(validAmqpMessage);

            // Assert
            Assert.NotNull(receivedClientCredentials);
            Assert.Equal(clientCredentials, receivedClientCredentials);
        }
Example #2
0
        public void ParseIdsTest()
        {
            string deviceId;
            string moduleId;

            // Arrange
            string audience = "edgehubtest1.azure-devices.net/devices/device1";

            // Act
            (deviceId, moduleId) = CbsNode.ParseIds(audience);
            // Assert
            Assert.Equal("device1", deviceId);
            Assert.Null(moduleId);

            // Arrange
            audience = "edgehubtest1.azure-devices.net/devices/device1/modules/mod1";
            // Act
            (deviceId, moduleId) = CbsNode.ParseIds(audience);
            // Assert
            Assert.Equal("device1", deviceId);
            Assert.Equal("mod1", moduleId);

            // Arrange
            audience = "edgehubtest1.azure-devices.net/device/device1/module/mod1";
            // Act/Assert
            Assert.Throws <InvalidOperationException>(() => CbsNode.ParseIds(audience));
        }
Example #3
0
        public void GetClientTokenTest()
        {
            // Arrange
            var amqpValue = new AmqpValue
            {
                Value = TokenHelper.CreateSasToken("edgehubtest1.azure-devices.net/devices/device1/modules/mod1")
            };
            AmqpMessage validAmqpMessage = AmqpMessage.Create(amqpValue);

            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Type]     = "azure-devices.net:sastoken";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Audience] = "edgehubtest1.azure-devices.net/devices/device1/modules/mod1";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.Operation]         = CbsConstants.PutToken.OperationValue;

            var    identityFactory = new Mock <IClientCredentialsFactory>();
            string iotHubHostName  = "edgehubtest1.azure-devices.net";
            var    authenticator   = new Mock <IAuthenticator>();
            var    cbsNode         = new CbsNode(identityFactory.Object, iotHubHostName, authenticator.Object, new NullCredentialsCache());

            // Act
            CbsNode.ClientToken clientToken = cbsNode.GetClientToken(validAmqpMessage);

            // Assert
            Assert.NotNull(clientToken);
            Assert.Equal("device1/mod1", clientToken.Id);
            Assert.Equal(amqpValue.Value, clientToken.Token);
        }
Example #4
0
        public void ValidateTestThrowsOnInvalidContents()
        {
            // Arrange
            AmqpMessage invalidAmqpMessage4 = AmqpMessage.Create(new AmqpValue {
                Value = "azure-devices.net:sastoken"
            });

            invalidAmqpMessage4.ApplicationProperties.Map[CbsConstants.PutToken.Type]     = "azure-devices.net:sastoken";
            invalidAmqpMessage4.ApplicationProperties.Map[CbsConstants.PutToken.Audience] = "iothub";
            invalidAmqpMessage4.ApplicationProperties.Map[CbsConstants.Operation]         = CbsConstants.PutToken.OperationValue;
            // Act/Assert
            Assert.Throws <InvalidOperationException>(() => CbsNode.ValidateAndParseMessage(IoTHubHostName, invalidAmqpMessage4));
        }
Example #5
0
        public void ValidateTestThrowsOnInvalidOperation()
        {
            // Arrange
            var amqpValue = new AmqpValue
            {
                Value = TokenHelper.CreateSasToken(IoTHubHostName)
            };
            AmqpMessage invalidAmqpMessage3 = AmqpMessage.Create(amqpValue);

            invalidAmqpMessage3.ApplicationProperties.Map[CbsConstants.PutToken.Type]     = "azure-devices.net:sastoken";
            invalidAmqpMessage3.ApplicationProperties.Map[CbsConstants.PutToken.Audience] = "iothub";
            invalidAmqpMessage3.ApplicationProperties.Map[CbsConstants.Operation]         = "foobar";
            // Act/Assert
            Assert.Throws <InvalidOperationException>(() => CbsNode.ValidateAndParseMessage(IoTHubHostName, invalidAmqpMessage3));
        }
Example #6
0
        public async Task OnBehalfOfAuthTest()
        {
            // Arrange
            var amqpValue = new AmqpValue
            {
                Value = TokenHelper.CreateSasToken("edgehubtest1.azure-devices.net/devices/edge1/modules/$edgeHub")
            };
            AmqpMessage validAmqpMessage = AmqpMessage.Create(amqpValue);

            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Type]     = "azure-devices.net:sastoken";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Audience] = "edgehubtest1.azure-devices.net/devices/edge1/modules/$edgeHub";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.Operation]         = CbsConstants.PutToken.OperationValue;
            Option <string> authChain = Option.Some("device1;edge1");

            var actorEdgeHubIdentity     = Mock.Of <IIdentity>(i => i.Id == "edge1/$edgeHub");
            var clientCredentials        = Mock.Of <IClientCredentials>(c => c.Identity == actorEdgeHubIdentity && c.AuthChain == authChain);
            var clientCredentialsFactory = new Mock <IClientCredentialsFactory>();

            clientCredentialsFactory.Setup(i => i.GetWithSasToken(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), true, It.IsAny <Option <string> >(), It.Is <Option <string> >(chain => chain == authChain)))
            .Returns(clientCredentials);

            string iotHubHostName = "edgehubtest1.azure-devices.net";
            var    authenticator  = new Mock <IAuthenticator>();

            authenticator.Setup(a => a.AuthenticateAsync(It.Is <IClientCredentials>(cred => cred == clientCredentials))).ReturnsAsync(true);
            var cbsNode = new CbsNode(clientCredentialsFactory.Object, iotHubHostName, authenticator.Object, new NullCredentialsCache());

            // Act
            (AmqpResponseStatusCode statusCode, string description) = await cbsNode.UpdateCbsToken(validAmqpMessage);

            bool isAuthenticated = await cbsNode.AuthenticateAsync("device1", Option.None <string>(), authChain);

            // Auth again, we should still succeed even with the wrong credentials due to cached auth state
            (statusCode, description) = await cbsNode.UpdateCbsToken(validAmqpMessage);

            bool isReauthenticated = await cbsNode.AuthenticateAsync("device1", Option.None <string>(), Option.Some("not;valid;authchain"));

            // Assert
            Assert.True(isAuthenticated);
            Assert.Equal(AmqpResponseStatusCode.OK, statusCode);
            Assert.Equal(AmqpResponseStatusCode.OK.ToString(), description);
        }
Example #7
0
        public void ValidateTestSucceeds()
        {
            // Arrange
            string sasToken  = TokenHelper.CreateSasToken(IoTHubHostName);
            var    amqpValue = new AmqpValue
            {
                Value = sasToken
            };
            AmqpMessage validAmqpMessage = AmqpMessage.Create(amqpValue);

            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Type]     = "azure-devices.net:sastoken";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Audience] = "iothub";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.Operation]         = CbsConstants.PutToken.OperationValue;

            // Act
            (string token, string audience) = CbsNode.ValidateAndParseMessage(IoTHubHostName, validAmqpMessage);

            // Assert
            Assert.Equal(sasToken, token);
            Assert.Equal(IoTHubHostName, audience);
        }
Example #8
0
        public async Task UpdateCbsTokenTest()
        {
            // Arrange
            var amqpValue = new AmqpValue
            {
                Value = TokenHelper.CreateSasToken("edgehubtest1.azure-devices.net/devices/device1/modules/mod1")
            };
            AmqpMessage validAmqpMessage = AmqpMessage.Create(amqpValue);

            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Type]     = "azure-devices.net:sastoken";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.PutToken.Audience] = "iothub";
            validAmqpMessage.ApplicationProperties.Map[CbsConstants.Operation]         = CbsConstants.PutToken.OperationValue;

            var identity                 = Mock.Of <IIdentity>(i => i.Id == "device1/mod1");
            var clientCredentials        = Mock.Of <IClientCredentials>(c => c.Identity == identity);
            var clientCredentialsFactory = new Mock <IClientCredentialsFactory>();

            clientCredentialsFactory.Setup(i => i.GetWithSasToken(It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>(), It.IsAny <string>()))
            .Returns(clientCredentials);

            string iotHubHostName = "edgehubtest1.azure-devices.net";
            var    authenticator  = new Mock <IAuthenticator>();

            authenticator.Setup(a => a.AuthenticateAsync(It.IsAny <IClientCredentials>())).ReturnsAsync(true);
            var cbsNode = new CbsNode(clientCredentialsFactory.Object, iotHubHostName, authenticator.Object, new NullCredentialsStore());

            // Act
            (AmqpAuthentication amqpAuthentication, AmqpResponseStatusCode statusCode, string description) = await cbsNode.UpdateCbsToken(validAmqpMessage);

            // Assert
            Assert.Equal(true, amqpAuthentication.IsAuthenticated);
            Assert.True(amqpAuthentication.ClientCredentials.HasValue);
            Assert.Equal(identity, amqpAuthentication.ClientCredentials.OrDefault().Identity);
            Assert.Equal(AmqpResponseStatusCode.OK, statusCode);
            Assert.Equal(AmqpResponseStatusCode.OK.ToString(), description);
        }
Example #9
0
 public CbsCacheEntry(CbsNode cbsNode, int agentIndex)
 {
     this.cbsNode    = cbsNode;
     this.agentIndex = agentIndex;
     Trace.Assert(cbsNode.cbs.mergeThreshold == -1, "When agents are merged it affects their paths without explicit constraints");
 }