Example #1
0
 public RabbitMQMessagePublisher(IRabbitMQConnectionFactory connectionFactory,
                                 IOptions <RabbitMQPublisherOptions <T> > config, ICloudEventFormatter cloudEventFormatter)
 {
     _connectionFactory   = connectionFactory;
     _cloudEventFormatter = cloudEventFormatter;
     _options             = config.Value;
 }
    public void UpdateAndExtractCloudEvent_V0_6_0Header_ExtensionsAddedToCloudEvent()
    {
        var channel                      = _fixture.Connection.CreateModel();
        var basicProperties              = channel.CreateBasicProperties();
        var publisherOptions             = new RabbitMQPublisherOptions <byte[]>();
        var content                      = new byte[] { 1, 2, 3 };
        var inputCloudEvent              = MotorCloudEvent.CreateTestCloudEvent(content);
        var mockedApplicationNameService = Mock.Of <IApplicationNameService>();

        basicProperties.SetPriority(inputCloudEvent, publisherOptions);
        basicProperties.WriteCloudEventIntoHeader(inputCloudEvent);
        // manipulate basic properties to simulate outdated version
        basicProperties.Headers.Remove($"{BasicPropertiesExtensions.CloudEventPrefix}{MotorVersionExtension.MotorVersionAttribute.Name}");
        basicProperties.ContentEncoding = null;
        basicProperties.Headers.Add(
            $"{BasicPropertiesExtensions.CloudEventPrefix}{CloudEventsSpecVersion.V1_0.DataContentTypeAttribute.Name}",
            Encoding.UTF8.GetBytes($"{basicProperties.ContentType}"));
        foreach (var(key, value) in basicProperties.Headers)
        {
            if (value is byte[] byteValue)
            {
                basicProperties.Headers[key] = EscapeWithQuotes(byteValue);
            }
        }

        var outputCloudEvent = basicProperties.ExtractCloudEvent(mockedApplicationNameService,
                                                                 new ReadOnlyMemory <byte>(content));

        Assert.Equal(MotorCloudEventInfo.RequiredAttributes(Version.Parse("0.6.0.0")).Count(),
                     outputCloudEvent.GetPopulatedAttributes().Count());
        foreach (var requiredAttribute in MotorCloudEventInfo.RequiredAttributes(Version.Parse("0.6.0.0")))
        {
            Assert.Equal(inputCloudEvent[requiredAttribute], outputCloudEvent[requiredAttribute]);
        }
    }
Example #3
0
        public static void Update <T>(this IBasicProperties self, MotorCloudEvent <byte[]> cloudEvent,
                                      RabbitMQPublisherOptions <T> options, ICloudEventFormatter cloudEventFormatter)
        {
            var messagePriority = cloudEvent.Extension <RabbitMQPriorityExtension>()?.Priority ??
                                  options.DefaultPriority;

            if (messagePriority.HasValue)
            {
                self.Priority = messagePriority.Value;
            }
            var dictionary = new Dictionary <string, object>();

            foreach (var attr in cloudEvent.GetAttributes())
            {
                if (string.Equals(attr.Key, CloudEventAttributes.DataAttributeName(cloudEvent.SpecVersion)) ||
                    string.Equals(attr.Key,
                                  CloudEventAttributes.DataContentTypeAttributeName(cloudEvent.SpecVersion)) ||
                    string.Equals(attr.Key, RabbitMQPriorityExtension.PriorityAttributeName) ||
                    string.Equals(attr.Key, RabbitMQBindingExtension.ExchangeAttributeName) ||
                    string.Equals(attr.Key, RabbitMQBindingExtension.RoutingKeyAttributeName))
                {
                    continue;
                }
                dictionary.Add($"{CloudEventPrefix}{attr.Key}",
                               cloudEventFormatter.EncodeAttribute(cloudEvent.SpecVersion, attr.Key, attr.Value,
                                                                   cloudEvent.GetExtensions().Values));
            }

            self.Headers = dictionary;
        }
    public void Update_NoExtensions_OnlyRequiredAttributesInHeader()
    {
        var channel          = _fixture.Connection.CreateModel();
        var basicProperties  = channel.CreateBasicProperties();
        var publisherOptions = new RabbitMQPublisherOptions <byte[]>();
        var cloudEvent       = MotorCloudEvent.CreateTestCloudEvent(Array.Empty <byte>());

        basicProperties.SetPriority(cloudEvent, publisherOptions);
        basicProperties.WriteCloudEventIntoHeader(cloudEvent);

        VerifyPresenceOfRequiredAttributes(basicProperties, cloudEvent);
    }
Example #5
0
 public RabbitMQMessagePublisher(
     IRabbitMQConnectionFactory <TOutput> connectionFactory,
     IOptions <RabbitMQPublisherOptions <TOutput> > config,
     IOptions <PublisherOptions> publisherOptions,
     CloudEventFormatter cloudEventFormatter
     )
 {
     ConnectionFactory    = connectionFactory;
     _options             = config.Value;
     _publisherOptions    = publisherOptions.Value;
     _cloudEventFormatter = cloudEventFormatter;
 }
    public void BindPublisherOptions_ConfigWithTarget_ContainsPublishingTarget()
    {
        var options          = GetJsonOptions("publisher-with-target");
        var publisherOptions = new RabbitMQPublisherOptions <string>();

        options.Bind(publisherOptions);

        Assert.NotNull(publisherOptions.PublishingTarget);
        Assert.Equal("exchange", publisherOptions.PublishingTarget.Exchange);
        Assert.Equal("routing", publisherOptions.PublishingTarget.RoutingKey);
        Assert.Equal("teststring", publisherOptions.PublishingTarget.Arguments["string"]);
    }
        private ITypedMessagePublisher <byte[]> GetPublisher(
            IRabbitMQConnectionFactory connectionFactory = null,
            RabbitMQPublisherOptions <string> options    = null)
        {
            connectionFactory ??= GetDefaultConnectionFactoryMock().Object;
            options ??= GetConfig();

            var configMock = new Mock <IOptions <RabbitMQPublisherOptions <string> > >();

            configMock.Setup(x => x.Value).Returns(options);
            return(new RabbitMQMessagePublisher <string>(connectionFactory, configMock.Object, new JsonEventFormatter()));
        }
    public void BindPublisherOptions_ConfigWithoutQueue_ContainsAllValues()
    {
        var config          = GetJsonOptions("publisher-no-target");
        var publisherConfig = new RabbitMQPublisherOptions <string>();

        config.Bind(publisherConfig);

        Assert.Equal("hostname", publisherConfig.Host);
        Assert.Equal(10000, publisherConfig.Port);
        Assert.Equal("username", publisherConfig.User);
        Assert.Equal("password", publisherConfig.Password);
        Assert.Equal("vhost", publisherConfig.VirtualHost);
    }
Example #9
0
        public void FromPublisherConfig_NullPublishingTarget_Throws()
        {
            var factory = new RabbitMQConnectionFactory();
            var cfg = new RabbitMQPublisherOptions<string>
            {
                Host = "host",
                User = "******",
                Password = "******",
                VirtualHost = "vHost",
                PublishingTarget = null
            };

            Assert.Throws<ArgumentException>(() => factory.From(cfg));
        }
    public void Update_EncodingExtension_EncodingNotInHeaderInProperties()
    {
        var          channel          = _fixture.Connection.CreateModel();
        var          basicProperties  = channel.CreateBasicProperties();
        var          publisherOptions = new RabbitMQPublisherOptions <byte[]>();
        var          cloudEvent       = MotorCloudEvent.CreateTestCloudEvent(Array.Empty <byte>());
        const string encoding         = "someEncoding";

        cloudEvent.SetEncoding(encoding);

        basicProperties.SetPriority(cloudEvent, publisherOptions);
        basicProperties.WriteCloudEventIntoHeader(cloudEvent);

        Assert.Equal(encoding, basicProperties.ContentEncoding);
        VerifyPresenceOfRequiredAttributes(basicProperties, cloudEvent);
    }
    public void UpdateAndExtractCloudEvent_NoExtensions_CloudEventWithRequiredExtensions()
    {
        var channel                      = _fixture.Connection.CreateModel();
        var basicProperties              = channel.CreateBasicProperties();
        var publisherOptions             = new RabbitMQPublisherOptions <byte[]>();
        var content                      = new byte[] { 1, 2, 3 };
        var inputCloudEvent              = MotorCloudEvent.CreateTestCloudEvent(content);
        var mockedApplicationNameService = Mock.Of <IApplicationNameService>();

        basicProperties.SetPriority(inputCloudEvent, publisherOptions);
        basicProperties.WriteCloudEventIntoHeader(inputCloudEvent);
        var outputCloudEvent = basicProperties.ExtractCloudEvent(mockedApplicationNameService,
                                                                 new ReadOnlyMemory <byte>(content));

        foreach (var requiredAttribute in MotorCloudEventInfo.RequiredAttributes(CurrentMotorVersion))
        {
            Assert.Equal(inputCloudEvent[requiredAttribute], outputCloudEvent[requiredAttribute]);
        }
    }
Example #12
0
    private IRawMessagePublisher <string> GetPublisher(
        IRabbitMQConnectionFactory <string>?factory = null,
        RabbitMQPublisherOptions <string>?options   = null,
        bool overwriteExchange            = false,
        CloudEventFormat cloudEventFormat = CloudEventFormat.Protocol)
    {
        options ??= GetConfig(overwriteExchange);
        factory ??= GetDefaultConnectionFactoryMock <string>().Object;

        var optionsMock = Options.Create(options);

        return(new RabbitMQMessagePublisher <string>(
                   factory,
                   optionsMock,
                   Options.Create(new PublisherOptions {
            CloudEventFormat = cloudEventFormat
        }),
                   new JsonEventFormatter()
                   ));
    }
    public void UpdateAndExtractCloudEvent_NoExtensions_CloudEventWithoutSpecificExtensions()
    {
        var channel                      = _fixture.Connection.CreateModel();
        var basicProperties              = channel.CreateBasicProperties();
        var publisherOptions             = new RabbitMQPublisherOptions <byte[]>();
        var content                      = new byte[] { 1, 2, 3 };
        var inputCloudEvent              = MotorCloudEvent.CreateTestCloudEvent(content);
        var mockedApplicationNameService = Mock.Of <IApplicationNameService>();

        basicProperties.SetPriority(inputCloudEvent, publisherOptions);
        basicProperties.WriteCloudEventIntoHeader(inputCloudEvent);
        var outputCloudEvent = basicProperties.ExtractCloudEvent(mockedApplicationNameService,
                                                                 new ReadOnlyMemory <byte>(content));

        var rabbitSpecificAttributes =
            RabbitMQBindingExtension.AllAttributes.Concat(RabbitMQPriorityExtension.AllAttributes);

        foreach (var rabbitSpecificAttribute in rabbitSpecificAttributes)
        {
            Assert.DoesNotContain(rabbitSpecificAttribute, outputCloudEvent.GetPopulatedAttributes().Select(a => a.Key));
        }
    }
Example #14
0
 private void ThrowIfConfigInvalid <T>(RabbitMQPublisherOptions <T> options)
 {
     ThrowIfInvalid(options);
     ThrowIfInvalid(options.PublishingTarget);
 }
Example #15
0
 public IConnectionFactory From <T>(RabbitMQPublisherOptions <T> publisherOptions)
 {
     ThrowIfConfigInvalid(publisherOptions);
     return(FromConfig(publisherOptions));
 }