public async void Should_Be_Able_To_Subscribe_To_Generic_Message()
        {
            using (var subscriber = ZyRabbitFactory.CreateTestClient())
                using (var publisher = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var doneTsc = new TaskCompletionSource <GenericMessage <int> >();
                    var message = new GenericMessage <int>
                    {
                        Prop = 7
                    };
                    await subscriber.SubscribeAsync <GenericMessage <int> >(received =>
                    {
                        doneTsc.TrySetResult(received);
                        return(Task.FromResult(0));
                    }
                                                                            );

                    /* Test */
                    await publisher.PublishAsync(message);

                    await doneTsc.Task;

                    /* Assert */
                    Assert.Equal(doneTsc.Task.Result.Prop, message.Prop);
                }
        }
        public async Task Should_Execute_Sequence_With_Multiple_Whens()
        {
            /* Setup */
            using (var client = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions
            {
                Plugins = p => p
                          .UseStateMachine()
                          .UseGlobalExecutionId()
            }))
            {
                var secondTcs = new TaskCompletionSource <SecondMessage>();
                var thirdTsc  = new TaskCompletionSource <ThirdMessage>();
                var forthTcs  = new TaskCompletionSource <ForthMessage>();
                await client.SubscribeAsync <FirstMessage, MessageContext>((request, context) =>
                                                                           client.PublishAsync(new SecondMessage())
                                                                           );

                await client.SubscribeAsync <SecondMessage, MessageContext>((request, context) =>
                                                                            client.PublishAsync(new ThirdMessage())
                                                                            );

                await client.SubscribeAsync <ThirdMessage, MessageContext>((request, context) =>
                                                                           client.PublishAsync(new ForthMessage())
                                                                           );

                await client.SubscribeAsync <ForthMessage, MessageContext>((request, context) =>
                                                                           client.PublishAsync(new FifthMessage())
                                                                           );

                /* Test */
                var chain = client.ExecuteSequence(c => c
                                                   .PublishAsync <FirstMessage>()
                                                   .When <SecondMessage, MessageContext>((message, context) =>
                {
                    secondTcs.TrySetResult(message);
                    return(Task.FromResult(0));
                })
                                                   .When <ThirdMessage, MessageContext>((message, context) =>
                {
                    thirdTsc.TrySetResult(message);
                    return(Task.FromResult(0));
                })
                                                   .When <ForthMessage, MessageContext>((message, context) =>
                {
                    forthTcs.TrySetResult(message);
                    return(Task.FromResult(0));
                })
                                                   .Complete <FifthMessage>()
                                                   );

                await chain.Task;
                await secondTcs.Task;
                await thirdTsc.Task;
                await forthTcs.Task;

                /* Assert */
                Assert.NotNull(secondTcs.Task.Result);
                Assert.True(true, "Received Response");
            }
        }
        public async Task Should_Work_With_Generic_Messages()
        {
            using (var client = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions
            {
                Plugins = p => p
                          .UseStateMachine()
                          .UseMessageContext(context => new MessageContext {
                    GlobalRequestId = Guid.NewGuid()
                })
                          .UseContextForwarding()
                          .UseGlobalExecutionId()
            }))
            {
                /* Setup */
                var guidMsg = new GenericMessage <Guid> {
                    Prop = Guid.NewGuid()
                };
                await client.SubscribeAsync <GenericMessage <string> >(message =>
                                                                       client.PublishAsync(guidMsg)
                                                                       );

                /* Test */
                var sequence = client.ExecuteSequence(s => s
                                                      .PublishAsync(new GenericMessage <string>())
                                                      .Complete <GenericMessage <Guid> >()
                                                      );

                /* Assert */
                Assert.Equal(sequence.Task.Result.Prop, guidMsg.Prop);
            }
        }
Example #4
0
        public async Task Should_Be_Able_To_Retry_Multiple_Times()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var subscriber = ZyRabbitFactory.CreateTestClient(p => p.UseRetryLater()))
                {
                    /* Setup */
                    var firstTsc  = new TaskCompletionSource <DateTime>();
                    var secondTsc = new TaskCompletionSource <DateTime>();
                    var thirdTsc  = new TaskCompletionSource <DateTime>();
                    await subscriber.SubscribeAsync <BasicMessage>(async received =>
                    {
                        var receivedAt = DateTime.Now;
                        if (firstTsc.TrySetResult(receivedAt))
                        {
                            return(Retry.In(TimeSpan.FromSeconds(1)));
                        }
                        if (secondTsc.TrySetResult(receivedAt))
                        {
                            return(Retry.In(TimeSpan.FromSeconds(1)));
                        }
                        thirdTsc.TrySetResult(receivedAt);
                        return(new Ack());
                    });

                    /* Test */
                    await publisher.PublishAsync(new BasicMessage { Prop = "Hello, world!" });

                    Task.WaitAll(firstTsc.Task, secondTsc.Task, thirdTsc.Task);

                    /* Assert */
                    Assert.Equal(1, (secondTsc.Task.Result - firstTsc.Task.Result).Seconds);
                    Assert.Equal(1, (thirdTsc.Task.Result - secondTsc.Task.Result).Seconds);
                }
        }
Example #5
0
        public async Task Should_Be_Able_To_Return_Nack_Without_Requeue()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var firstSubscriber = ZyRabbitFactory.CreateTestClient())
                    using (var secondSubscriber = ZyRabbitFactory.CreateTestClient())
                    {
                        /* Setup */
                        var firstTsc  = new TaskCompletionSource <BasicMessage>();
                        var secondTsc = new TaskCompletionSource <BasicMessage>();
                        await firstSubscriber.SubscribeAsync <BasicMessage>(async received =>
                        {
                            firstTsc.TrySetResult(received);
                            return(new Nack(requeue: false));
                        });

                        await secondSubscriber.SubscribeAsync <BasicMessage>(async received =>
                        {
                            secondTsc.TrySetResult(received);
                            return(new Nack(requeue: false));
                        });

                        var message = new BasicMessage {
                            Prop = "Hello, world!"
                        };

                        /* Test */
                        await publisher.PublishAsync(message);

                        Task.WaitAll(new [] { firstTsc.Task, secondTsc.Task }, TimeSpan.FromMilliseconds(200));

                        /* Assert */
                        Assert.Equal(message.Prop, firstTsc.Task.Result.Prop);
                        Assert.False(secondTsc.Task.IsCompleted);
                    }
        }
        public async Task Should_Be_Able_To_Perform_Multiple_Concurrent_Publishes()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var subscriber = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var       receivedCount = 0;
                    const int sendCount     = 2000;
                    var       publishTasks  = new Task[sendCount];
                    var       receivedTcs   = new TaskCompletionSource <int>();
                    await subscriber.SubscribeAsync <BasicMessage>(received =>
                    {
                        Interlocked.Increment(ref receivedCount);
                        if (receivedCount == sendCount)
                        {
                            receivedTcs.TrySetResult(receivedCount);
                        }
                        return(Task.FromResult(true));
                    });

                    /* Test */
                    for (var i = 0; i < sendCount; i++)
                    {
                        publishTasks[i] = publisher.PublishAsync(new BasicMessage());
                    }
                    Task.WaitAll(publishTasks);
                    await receivedTcs.Task;
                    /* Assert */
                    Assert.Equal(receivedTcs.Task.Result, sendCount);
                }
        }
Example #7
0
        public async Task Should_Be_Able_To_Return_Reject_With_Requeue_From_Subscriber_With_Context()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var firstSubscriber = ZyRabbitFactory.CreateTestClient())
                    using (var secondSubscriber = ZyRabbitFactory.CreateTestClient())
                    {
                        /* Setup */
                        var firstTsc  = new TaskCompletionSource <BasicMessage>();
                        var secondTsc = new TaskCompletionSource <BasicMessage>();
                        await firstSubscriber.SubscribeAsync <BasicMessage, MessageContext>(async (received, context) =>
                        {
                            firstTsc.TrySetResult(received);
                            return(new Reject());
                        });

                        await secondSubscriber.SubscribeAsync <BasicMessage, MessageContext>(async (received, context) =>
                        {
                            secondTsc.TrySetResult(received);
                            return(new Ack());
                        });

                        var message = new BasicMessage {
                            Prop = "Hello, world!"
                        };

                        /* Test */
                        await publisher.PublishAsync(message);

                        Task.WaitAll(firstTsc.Task, secondTsc.Task);

                        /* Assert */
                        Assert.Equal(message.Prop, firstTsc.Task.Result.Prop);
                        Assert.Equal(message.Prop, secondTsc.Task.Result.Prop);
                    }
        }
Example #8
0
        public async Task Should_Be_Able_To_Publish_With_Custom_Header()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var subscriber = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var receivedTcs = new TaskCompletionSource <BasicDeliverEventArgs>();
                    await subscriber.SubscribeAsync <BasicMessage, BasicDeliverEventArgs>((received, args) =>
                    {
                        receivedTcs.TrySetResult(args);
                        return(Task.FromResult(true));
                    }, ctx => ctx.UseMessageContext(c => c.GetDeliveryEventArgs()));

                    var message = new BasicMessage {
                        Prop = "Hello, world!"
                    };

                    /* Test */
                    await publisher.PublishAsync(message, ctx => ctx
                                                 .UsePublishConfiguration(cfg => cfg
                                                                          .WithProperties(props => props.Headers.Add("foo", "bar"))));

                    await receivedTcs.Task;

                    /* Assert */
                    Assert.True(receivedTcs.Task.Result.BasicProperties.Headers.ContainsKey("foo"));
                }
        }
Example #9
0
        public async Task Should_Honor_Exchange_Name_Configuration()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var subscriber = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var receivedTcs = new TaskCompletionSource <BasicMessage>();
                    await subscriber.SubscribeAsync <BasicMessage>(received =>
                    {
                        receivedTcs.TrySetResult(received);
                        return(Task.FromResult(true));
                    }, ctx => ctx
                                                                   .UseSubscribeConfiguration(cfg => cfg
                                                                                              .OnDeclaredExchange(e => e
                                                                                                                  .WithName("custom_exchange")
                                                                                                                  ))
                                                                   );

                    var message = new BasicMessage {
                        Prop = "Hello, world!"
                    };

                    /* Test */
                    await publisher.PublishAsync(message, ctx => ctx.UsePublishConfiguration(cfg => cfg.OnExchange("custom_exchange")));

                    await receivedTcs.Task;

                    /* Assert */
                    Assert.Equal(message.Prop, receivedTcs.Task.Result.Prop);
                }
        }
Example #10
0
        public async Task Should_Not_Throw_Exception_When_Queue_Name_Is_Long()
        {
            using (var subscriber = ZyRabbitFactory.CreateTestClient())
                using (var publisher = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var msgTcs  = new TaskCompletionSource <BasicMessage>();
                    var message = new BasicMessage {
                        Prop = "I'm delivered to queue with truncated name"
                    };
                    var queueName = string.Empty;
                    while (queueName.Length < 254)
                    {
                        queueName = queueName + "this_is_part_of_a_long_queue_name";
                    }
                    await subscriber.SubscribeAsync <BasicMessage>(msg =>
                    {
                        msgTcs.TrySetResult(msg);
                        return(Task.FromResult(0));
                    }, ctx => ctx
                                                                   .UseSubscribeConfiguration(cfg => cfg
                                                                                              .FromDeclaredQueue(q => q.WithName(queueName).WithAutoDelete())
                                                                                              )
                                                                   );

                    /* Test */
                    await publisher.PublishAsync(message);

                    await msgTcs.Task;

                    /* Assert */
                    Assert.Equal(message.Prop, msgTcs.Task.Result.Prop);
                }
        }
Example #11
0
        public async Task Should_Consume_Message_Already_In_Queue()
        {
            using (var subscriber = ZyRabbitFactory.CreateTestClient())
                using (var publisher = ZyRabbitFactory.CreateTestClient())
                {
                    var msgTcs = new TaskCompletionSource <BasicMessage>();
                    var msg    = new BasicMessage {
                        Prop = Guid.NewGuid().ToString()
                    };
                    await subscriber.DeclareQueueAsync <BasicMessage>();

                    await subscriber.DeclareExchangeAsync <BasicMessage>();

                    await subscriber.BindQueueAsync <BasicMessage>();

                    await publisher.PublishAsync(msg);

                    await subscriber.SubscribeAsync <BasicMessage>(message =>
                    {
                        msgTcs.TrySetResult(message);
                        return(Task.FromResult(true));
                    });

                    await msgTcs.Task;
                    Assert.Equal(msg.Prop, msgTcs.Task.Result.Prop);
                }
        }
Example #12
0
        public async Task Should_Work_Without_Any_Additional_Configuration()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var subscriber = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var receivedTcs = new TaskCompletionSource <BasicMessage>();
                    await subscriber.SubscribeAsync <BasicMessage>(received =>
                    {
                        receivedTcs.TrySetResult(received);
                        return(Task.FromResult(true));
                    });

                    var message = new BasicMessage {
                        Prop = "Hello, world!"
                    };

                    /* Test */
                    await publisher.PublishAsync(message);

                    await receivedTcs.Task;

                    /* Assert */
                    Assert.Equal(message.Prop, receivedTcs.Task.Result.Prop);
                }
        }
Example #13
0
        public async Task Should_Be_Able_To_Create_Unique_Queue_With_Custom_Suffix()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var firstClient = ZyRabbitFactory.CreateTestClient())
                    using (var secondClient = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions
                    {
                        Plugins = p => p.UseCustomQueueSuffix("custom")
                    }))
                    {
                        /* Setup */
                        var firstTsc  = new TaskCompletionSource <BasicMessage>();
                        var secondTsc = new TaskCompletionSource <BasicMessage>();
                        await firstClient.SubscribeAsync <BasicMessage>(message =>
                        {
                            firstTsc.TrySetResult(message);
                            return(Task.FromResult(0));
                        });

                        await secondClient.SubscribeAsync <BasicMessage>(message =>
                        {
                            secondTsc.TrySetResult(message);
                            return(Task.FromResult(0));
                        });

                        /* Test */
                        await publisher.PublishAsync(new BasicMessage());

                        await firstTsc.Task;
                        await secondTsc.Task;

                        /* Assert */
                        Assert.True(true, "Should be delivered to both subscribers");
                    }
        }
        public async Task Should_Not_Use_Timeout_If_Cancellation_Token_Is_Provided()
        {
            using (var requester = ZyRabbitFactory.CreateTestClient())
            {
                /* Setup */
                var timeout   = TimeSpan.FromMilliseconds(300);
                var timeoutCs = new CancellationTokenSource();

                /* Test */
                /* Assert */
                var requestTask = requester.RequestAsync <BasicRequest, BasicResponse>(
                    message: new BasicRequest(),
                    context: ctx => ctx.UseRequestTimeout(timeout),
                    ct: timeoutCs.Token
                    );

                await Task.Delay(timeout.Add(TimeSpan.FromMilliseconds(100)));

                Assert.False(requestTask.IsFaulted);
                Assert.False(requestTask.IsCanceled);
                Assert.False(requestTask.IsCompleted);

                timeoutCs.Cancel();
                await Task.Delay(timeout.Add(TimeSpan.FromMilliseconds(50)));

                Assert.True(requestTask.IsCanceled);
            }
        }
Example #15
0
        public async Task Should_Work_For_Subscribe()
        {
            using (var subscriber = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions {
                Plugins = plugin => plugin.UseAttributeRouting()
            }))
                using (var publisher = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var receivedTcs = new TaskCompletionSource <AttributedMessage>();
                    await subscriber.SubscribeAsync <AttributedMessage>(received =>
                    {
                        receivedTcs.TrySetResult(received);
                        return(Task.FromResult(true));
                    });

                    /* Test */
                    await publisher.PublishAsync(new AttributedMessage(), ctx => ctx
                                                 .UsePublishConfiguration(cfg => cfg
                                                                          .OnDeclaredExchange(e => e
                                                                                              .WithName("my_topic")
                                                                                              .WithType(ExchangeType.Topic))
                                                                          .WithRoutingKey("my_key")
                                                                          ));

                    await receivedTcs.Task;

                    /* Assert */
                    Assert.True(true, "Routing successful");
                }
        }
Example #16
0
        public static async Task Main()
        {
            Log.Logger = new LoggerConfiguration()
                         .WriteTo.Console()
                         .CreateLogger();

            _client = ZyRabbitFactory.CreateSingleton(new ZyRabbitOptions
            {
                ClientConfiguration = new ConfigurationBuilder()
                                      .AddJsonFile("zyrabbit.json")
                                      .Build()
                                      .Get <ZyRabbitConfiguration>(),
                Plugins = p => p
                          .UseGlobalExecutionId()
                          .UseMessageContext <MessageContext>(),
                DependencyInjection = register =>
                {
                    register.AddSingleton(typeof(ILogger <>), typeof(SerilogLogger <>));
                    register.AddSingleton <Microsoft.Extensions.Logging.ILogger, SerilogLogger <object> >(resolver => new SerilogLogger <object>());
                }
            });

            await _client.SubscribeAsync <ValuesRequested, MessageContext>((requested, ctx) => ServerValuesAsync(requested, ctx));

            await _client.RespondAsync <ValueRequest, ValueResponse>(request => SendValuesThoughRpcAsync(request));

            Console.ReadKey();
        }
Example #17
0
        public async Task Should_Work_For_Request()
        {
            using (var requester = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions
            {
                Plugins = plugin => plugin.UseAttributeRouting()
            }
                                                                    ))
                using (var responder = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var receivedTcs = new TaskCompletionSource <AttributedRequest>();
                    await responder.RespondAsync <AttributedRequest, AttributedResponse>(received =>
                    {
                        receivedTcs.TrySetResult(received);
                        return(Task.FromResult(new AttributedResponse()));
                    }, ctx => ctx.UseRespondConfiguration(cfg => cfg
                                                          .Consume(c => c
                                                                   .WithRoutingKey("my_request_key"))
                                                          .OnDeclaredExchange(e => e
                                                                              .WithName("rpc_exchange")
                                                                              .WithType(ExchangeType.Topic))
                                                          ));

                    /* Test */
                    await requester.RequestAsync <AttributedRequest, AttributedResponse>(new AttributedRequest());

                    await receivedTcs.Task;

                    /* Assert */
                    Assert.True(true, "Routing successful");
                }
        }
Example #18
0
        public async Task Should_Be_Able_To_Ack_Messages_And_Then_Full_List()
        {
            using (var client = ZyRabbitFactory.CreateTestClient())
            {
                /* Setup */
                var message = new BasicMessage {
                    Prop = "Get me, get it?"
                };
                var conventions  = new NamingConventions();
                var exchangeName = conventions.ExchangeNamingConvention(message.GetType());
                TestChannel.QueueDeclare(conventions.QueueNamingConvention(message.GetType()), true, false, false, null);
                TestChannel.ExchangeDeclare(conventions.ExchangeNamingConvention(message.GetType()), ExchangeType.Topic);
                TestChannel.QueueBind(conventions.QueueNamingConvention(message.GetType()), exchangeName, conventions.RoutingKeyConvention(message.GetType()) + ".#");

                await client.PublishAsync(message, ctx => ctx.UsePublishConfiguration(cfg => cfg.OnExchange(exchangeName)));

                await client.PublishAsync(message, ctx => ctx.UsePublishConfiguration(cfg => cfg.OnExchange(exchangeName)));

                await client.PublishAsync(message, ctx => ctx.UsePublishConfiguration(cfg => cfg.OnExchange(exchangeName)));

                /* Test */
                var ackable = await client.GetManyAsync <BasicMessage>(3);

                ackable.Content[1].Ack();
                ackable.Ack();
                TestChannel.QueueDelete(conventions.QueueNamingConvention(message.GetType()));
                TestChannel.ExchangeDelete(exchangeName);

                /* Assert */
                Assert.True(true);
            }
        }
Example #19
0
        public async Task Should_Honor_Task_Cancellation()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var subscriber = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var message = new BasicMessage {
                        Prop = Guid.NewGuid().ToString()
                    };
                    var receivedTcs = new TaskCompletionSource <BasicMessage>();
                    var sendCts     = new CancellationTokenSource();
                    await subscriber.SubscribeAsync <BasicMessage>(received =>
                    {
                        if (received.Prop == message.Prop)
                        {
                            receivedTcs.TrySetResult(received);
                        }
                        return(Task.FromResult(true));
                    });

                    /* Test */
                    sendCts.CancelAfter(TimeSpan.FromTicks(400));
                    var publishTask = publisher.PublishAsync(new BasicMessage(), token: sendCts.Token);
                    receivedTcs.Task.Wait(100);

                    /* Assert */
                    Assert.False(receivedTcs.Task.IsCompleted, "Message was sent, even though execution was cancelled.");
                    Assert.True(publishTask.IsCanceled, "The publish task should be cancelled.");
                }
        }
Example #20
0
        public async Task Should_Be_Able_To_Get_Message_When_Batch_Size_Is_Smaller_Than_Queue_Length()
        {
            using (var client = ZyRabbitFactory.CreateTestClient())
            {
                /* Setup */
                var message = new BasicMessage {
                    Prop = "Get me, get it?"
                };
                var conventions  = new NamingConventions();
                var exchangeName = conventions.ExchangeNamingConvention(message.GetType());
                TestChannel.QueueDeclare(conventions.QueueNamingConvention(message.GetType()), true, false, false, null);
                TestChannel.ExchangeDeclare(conventions.ExchangeNamingConvention(message.GetType()), ExchangeType.Topic);
                TestChannel.QueueBind(conventions.QueueNamingConvention(message.GetType()), conventions.ExchangeNamingConvention(message.GetType()), conventions.RoutingKeyConvention(message.GetType()) + ".#");

                await client.PublishAsync(message, ctx => ctx.UsePublishConfiguration(cfg => cfg.OnExchange(exchangeName)));

                await client.PublishAsync(message, ctx => ctx.UsePublishConfiguration(cfg => cfg.OnExchange(exchangeName)));

                await client.PublishAsync(message, ctx => ctx.UsePublishConfiguration(cfg => cfg.OnExchange(exchangeName)));

                /* Test */
                var ackable = await client.GetManyAsync <BasicMessage>(2);

                TestChannel.QueueDelete(conventions.QueueNamingConvention(message.GetType()));
                TestChannel.ExchangeDelete(exchangeName);

                /* Assert */
                Assert.NotNull(ackable);
                Assert.Equal(ackable.Content.Count, 2);
            }
        }
Example #21
0
        public async Task Should_Be_Able_To_Return_Retry_From_Subscriber_With_Context()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var firstSubscriber = ZyRabbitFactory.CreateTestClient(p => p.UseRetryLater()))
                    using (var secondSubscriber = ZyRabbitFactory.CreateTestClient())
                    {
                        /* Setup */
                        var firstTsc  = new TaskCompletionSource <DateTime>();
                        var secondTsc = new TaskCompletionSource <DateTime>();
                        await firstSubscriber.SubscribeAsync <BasicMessage, MessageContext>(async (received, context) =>
                        {
                            firstTsc.TrySetResult(DateTime.Now);
                            return(Retry.In(TimeSpan.FromSeconds(1)));
                        });

                        await secondSubscriber.SubscribeAsync <BasicMessage, MessageContext>(async (received, context) =>
                        {
                            secondTsc.TrySetResult(DateTime.Now);
                            return(new Ack());
                        });

                        var message = new BasicMessage {
                            Prop = "Hello, world!"
                        };

                        /* Test */
                        await publisher.PublishAsync(message);

                        Task.WaitAll(firstTsc.Task, secondTsc.Task);

                        /* Assert */
                        Assert.Equal(1, (secondTsc.Task.Result - firstTsc.Task.Result).Seconds);
                    }
        }
        public async Task Should_Not_Invoke_Mandatory_Callback_If_Message_Is_Undelivered()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var subscriber = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var deliveredTcs = new TaskCompletionSource <BasicMessage>();
                    var callbackTcs  = new TaskCompletionSource <BasicReturnEventArgs>();
                    await subscriber.SubscribeAsync <BasicMessage>(message =>
                    {
                        deliveredTcs.TrySetResult(message);
                        return(Task.FromResult(0));
                    });

                    /* Test */
                    await publisher.PublishAsync(new BasicMessage { Prop = "Hello, world!" }, ctx => ctx
                                                 .UsePublishConfiguration(cfg => cfg
                                                                          .WithReturnCallback(args =>
                    {
                        callbackTcs.TrySetResult(args);
                    })
                                                                          ));

                    await deliveredTcs.Task;
                    callbackTcs.Task.Wait(TimeSpan.FromMilliseconds(200));

                    /* Assert */
                    Assert.False(callbackTcs.Task.IsCompleted);
                }
        }
Example #23
0
        public async Task Should_Be_Able_To_Return_Ack_From_Subscriber_With_Context()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient())
                using (var subscriber = ZyRabbitFactory.CreateTestClient())
                {
                    /* Setup */
                    var receivedTcs = new TaskCompletionSource <BasicMessage>();
                    await subscriber.SubscribeAsync <BasicMessage, MessageContext>(async (received, context) =>
                    {
                        receivedTcs.TrySetResult(received);
                        return(new Ack());
                    });

                    var message = new BasicMessage {
                        Prop = "Hello, world!"
                    };

                    /* Test */
                    await publisher.PublishAsync(message);

                    await receivedTcs.Task;

                    /* Assert */
                    Assert.Equal(message.Prop, receivedTcs.Task.Result.Prop);
                }
        }
Example #24
0
        public async Task Should_Deliver_And_Reiieve_Messages_Serialized_With_Protobuf()
        {
            using (var client = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions {
                Plugins = p => p.UseProtobuf()
            }))
            {
                /** Setup **/
                var tcs     = new TaskCompletionSource <ProtoMessage>();
                var message = new ProtoMessage
                {
                    Member = "Straight into bytes",
                    Id     = Guid.NewGuid()
                };
                await client.SubscribeAsync <ProtoMessage>(msg =>
                {
                    tcs.TrySetResult(msg);
                    return(Task.CompletedTask);
                });

                /** Test **/
                await client.PublishAsync(message);

                await tcs.Task;

                /** Assert **/
                Assert.Equal(tcs.Task.Result.Id, message.Id);
                Assert.Equal(tcs.Task.Result.Member, message.Member);
            }
        }
Example #25
0
        public async Task Should_Publish_And_Subscribe_with_Zero_Formatter()
        {
            using (var client = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions {
                Plugins = p => p.UseMessagePack()
            }))
            {
                /** Setup **/
                var tcs     = new TaskCompletionSource <MessagePackMessage>();
                var message = new MessagePackMessage
                {
                    TagLine = "Extremely Fast MessagePack Serializer for C#"
                };
                await client.SubscribeAsync <MessagePackMessage>(msg =>
                {
                    tcs.TrySetResult(msg);
                    return(Task.CompletedTask);
                });

                /** Test **/
                await client.PublishAsync(message);

                await tcs.Task;

                /** Assert **/
                Assert.Equal(tcs.Task.Result.TagLine, message.TagLine);
            }
        }
Example #26
0
        public async Task Should_Work_For_Full_Rpc()
        {
            using (var responder = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions {
                Plugins = plugin => plugin.UseAttributeRouting()
            }))
                using (var requester = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions {
                    Plugins = plugin => plugin.UseAttributeRouting()
                }))
                {
                    /* Setup */
                    var receivedTcs = new TaskCompletionSource <AttributedRequest>();
                    await responder.RespondAsync <AttributedRequest, AttributedResponse>(received =>
                    {
                        receivedTcs.TrySetResult(received);
                        return(Task.FromResult(new AttributedResponse()));
                    });

                    /* Test */
                    await requester.RequestAsync <AttributedRequest, AttributedResponse>(new AttributedRequest());

                    await receivedTcs.Task;

                    /* Assert */
                    Assert.True(true, "Routing successful");
                }
        }
        public async Task Should_Create_Simple_Chain_Of_One_Send_And_Final_Receive()
        {
            /* Setup */
            using (var client = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions
            {
                Plugins = p => p
                          .UseGlobalExecutionId()
                          .UseStateMachine()
            }))
            {
                await client.SubscribeAsync <BasicRequest, MessageContext>((request, context) =>
                                                                           client.PublishAsync(new BasicResponse())
                                                                           );

                /* Test */
                var chain = client.ExecuteSequence(c => c
                                                   .PublishAsync <BasicRequest>()
                                                   .Complete <BasicResponse>()
                                                   );

                await chain.Task;

                /* Assert */
                Assert.True(true, "Received Response");
            }
        }
Example #28
0
        public async Task Should_Work_For_Pub_Sub()
        {
            using (var publisher = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions {
                Plugins = plugin => plugin.UseAttributeRouting()
            }))
                using (var subscriber = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions {
                    Plugins = plugin => plugin.UseAttributeRouting()
                }))
                {
                    /* Setup */
                    var receivedTcs = new TaskCompletionSource <AttributedMessage>();
                    await subscriber.SubscribeAsync <AttributedMessage>(received =>
                    {
                        receivedTcs.TrySetResult(received);
                        return(Task.FromResult(new AttributedResponse()));
                    });

                    /* Test */
                    await publisher.PublishAsync(new AttributedMessage());

                    await receivedTcs.Task;

                    /* Assert */
                    Assert.True(true, "Routing successful");
                }
        }
        public async Task Should_Abort_Execution_If_Configured_To()
        {
            /* Setup */
            using (var client = ZyRabbitFactory.CreateTestClient(new ZyRabbitOptions
            {
                Plugins = p => p
                          .UseStateMachine()
                          .UseGlobalExecutionId()
            }))
            {
                var secondTcs = new TaskCompletionSource <SecondMessage>();
                await client.SubscribeAsync <FirstMessage, MessageContext>((request, context) =>
                                                                           client.PublishAsync(new SecondMessage())
                                                                           );

                /* Test */
                var chain = client.ExecuteSequence(c => c
                                                   .PublishAsync <FirstMessage>()
                                                   .When <SecondMessage, MessageContext>((message, context) =>
                {
                    secondTcs.TrySetResult(message);
                    return(Task.FromResult(0));
                }, it => it.AbortsExecution())
                                                   .Complete <ThirdMessage>()
                                                   );

                await chain.Task;
                await secondTcs.Task;

                /* Assert */
                Assert.NotNull(secondTcs.Task.Result);
                Assert.True(chain.Aborted);
            }
        }
Example #30
0
        public async Task Should_Be_Able_To_Get_BasicGetResult_Message()
        {
            using (var client = ZyRabbitFactory.CreateTestClient())
            {
                /* Setup */
                var message = new BasicMessage {
                    Prop = "Get me, get it?"
                };
                var conventions  = new NamingConventions();
                var exchangeName = conventions.ExchangeNamingConvention(message.GetType());
                var queueName    = conventions.QueueNamingConvention(message.GetType());
                TestChannel.QueueDeclare(queueName, true, false, false, null);
                TestChannel.ExchangeDeclare(exchangeName, ExchangeType.Topic);
                TestChannel.QueueBind(queueName, exchangeName, conventions.RoutingKeyConvention(message.GetType()) + ".#");

                await client.PublishAsync(message, ctx => ctx.UsePublishConfiguration(cfg => cfg.OnExchange(exchangeName)));

                /* Test */
                var ackable = await client.GetAsync(cfg => cfg.FromQueue(queueName));

                /* Assert */
                Assert.NotNull(ackable);
                Assert.NotEmpty(ackable.Content.Body);
                TestChannel.QueueDelete(queueName);
                TestChannel.ExchangeDelete(exchangeName);
            }
        }