Пример #1
0
    public async Task Dispose_WaitsDefinedTimeout_WhenPendingTasksTakeLonger()
    {
        // arrange
        var startedHandle = new ManualResetEvent(false);

        _handlerActivator.AddHandlerWithBusTemporarilyStopped <string>(async str =>
        {
            startedHandle.Set();

            await Task.Delay(TimeSpan.FromSeconds(10));
        });

        // act
        await _bus.Send("something");

        startedHandle.WaitOne();

        var timer = Stopwatch.StartNew();

        _bus.Dispose();

        timer.Stop();

        // assert

        Assert.That(timer.Elapsed, Is.GreaterThan(TimeSpan.FromSeconds(4)).And.LessThan(TimeSpan.FromSeconds(6)));
    }
Пример #2
0
    public void CorrelationSequenceIsIncremented()
    {
        var correlationSequenceNumbers = new List <int>();
        var counter = new SharedCounter(1);

        _activator1.AddHandlerWithBusTemporarilyStopped <string>(async(bus, ctx, str) =>
        {
            correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
            await bus.Advanced.Routing.Send("bus2", "hej!");
        });
        _activator2.AddHandlerWithBusTemporarilyStopped <string>(async(bus, ctx, str) =>
        {
            correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
            await bus.Advanced.Routing.Send("bus3", "hej!");
        });
        _activator3.AddHandlerWithBusTemporarilyStopped <string>(async(bus, ctx, str) =>
        {
            correlationSequenceNumbers.Add(int.Parse(ctx.Headers[Headers.CorrelationSequence]));
            counter.Decrement();
        });

        _activator1.Bus.SendLocal("heeeej!").Wait();

        counter.WaitForResetEvent();

        Assert.That(correlationSequenceNumbers, Is.EqualTo(new[] { 0, 1, 2 }));
    }
        public async Task DeferringRequestDoesNotBreakAbilityToReply_DeferWithMessageApi()
        {
            _service.AddHandlerWithBusTemporarilyStopped <string>(async(bus, context, str) =>
            {
                const string deferredMessageHeader = "this message was already deferred";

                if (!context.TransportMessage.Headers.ContainsKey(deferredMessageHeader))
                {
                    var extraHeaders = new Dictionary <string, string>
                    {
                        { deferredMessageHeader, "" },
                        { Headers.ReturnAddress, context.Headers[Headers.ReturnAddress] }
                    };

                    Console.WriteLine($"SERVICE deferring '{str}' 1 second (elapsed: {_stopwatch.Elapsed.TotalSeconds:0.# s})");
                    await bus.Defer(TimeSpan.FromSeconds(1), str, extraHeaders);
                    return;
                }

                const string reply = "yeehaa!";
                Console.WriteLine($"SERVICE replying '{reply}'  (elapsed: {_stopwatch.Elapsed.TotalSeconds:0.# s})");
                await bus.Reply(reply);
            });

            await RunDeferTest();
        }
Пример #4
0
        public async Task IncomingMessageHasNoHeaders()
        {
            var gotMessage = false;

            _adapter.AddHandlerWithBusTemporarilyStopped <string>(async str => gotMessage = true);

            var body = BodyWith("hej med dig min ven");
            var headersWithoutMessageId = new Dictionary <string, string>();

            _network.Deliver("test", new TransportMessage(headersWithoutMessageId, body).ToInMemTransportMessage());

            await Task.Delay(1000);

            PrintLogs();

            Assert.That(gotMessage, Is.False, "Did not expect to receive the message");

            var loggedErrors = _listLoggerFactory
                               .Where(l => l.Level == LogLevel.Error)
                               .ToList();

            Assert.That(loggedErrors.Count, Is.EqualTo(1));

            var errorLogLine = loggedErrors.Single(e => e.Level == LogLevel.Error);

            Assert.That(errorLogLine.Text, Contains.Substring(
                            $"Received message with empty or absent '{Headers.MessageId}' header"));
        }
Пример #5
0
    public void CanDoItSyncWithoutBlocking()
    {
        var messageWasProperlyHandled = new ManualResetEvent(false);
        var bus = _activator.Bus.Advanced.SyncBus;

        _activator.AddHandlerWithBusTemporarilyStopped <string>(async str => messageWasProperlyHandled.Set());

        var thread = new Thread(() =>
        {
            bus.SendLocal("ey det virker");
        });

        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();

        Assert.That(thread.Join(1000), Is.True, "thread did not finish within timeout");

        messageWasProperlyHandled.WaitOrDie(timeout: TimeSpan.FromSeconds(2));
    }
        public void CanForwardMessageToErrorQueue()
        {
            var sharedCounter = new SharedCounter(1)
            {
                Delay = TimeSpan.FromSeconds(0.1)
            };

            Using(sharedCounter);

            _forwarderActivator.AddHandlerWithBusTemporarilyStopped <string>(async(bus, str) =>
            {
                await bus.Advanced.TransportMessage.Forward(ForwardedMessagesQueue, new Dictionary <string, string> {
                    { "testheader", "OK" }
                });
            });

            _receiverActivator.AddHandlerWithBusTemporarilyStopped <string>(async(bus, context, str) =>
            {
                var headers = context.TransportMessage.Headers;

                if (!headers.ContainsKey("testheader"))
                {
                    sharedCounter.Fail("Could not find 'testheader' header!");
                    return;
                }

                var headerValue = headers["testheader"];
                if (headerValue != "OK")
                {
                    sharedCounter.Fail("'testheader' header had value {0}", headerValue);
                    return;
                }

                sharedCounter.Decrement();
            });

            _forwarderActivator.Bus.SendLocal("hej med dig min ven!!!").Wait();

            sharedCounter.WaitForResetEvent();
        }
Пример #7
0
    public async Task CanDeferMessage_ToSelf()
    {
        var messageReceived = new ManualResetEvent(false);
        var deliveryTime    = DateTime.MaxValue;

        _server.AddHandlerWithBusTemporarilyStopped <string>(async s =>
        {
            deliveryTime = DateTime.UtcNow;
            messageReceived.Set();
        });

        var sendTime = DateTime.UtcNow;
        var delay    = TimeSpan.FromSeconds(5);

        await _server.Bus.DeferLocal(delay, "hej med dig!");

        messageReceived.WaitOrDie(TimeSpan.FromSeconds(8));

        var timeToBeDelivered = deliveryTime - sendTime;

        Assert.That(timeToBeDelivered, Is.GreaterThanOrEqualTo(delay));
    }
Пример #8
0
        public async Task ItWorks()
        {
            const int numberOfRetries = 5;

            InitializeBus(numberOfRetries);

            var attemptedDeliveries = 0;

            _handlerActivator.AddHandlerWithBusTemporarilyStopped <string>(async _ =>
            {
                Interlocked.Increment(ref attemptedDeliveries);
                throw new RebusApplicationException("omgwtf!");
            });

            await _bus.Send("hej");

            var failedMessage = await _network.WaitForNextMessageFrom(ErrorQueueName);

            Assert.That(attemptedDeliveries, Is.EqualTo(numberOfRetries));
            Assert.That(failedMessage.Headers.GetValue(Headers.ErrorDetails), Contains.Substring("5 unhandled exceptions"));
            Assert.That(failedMessage.Headers.GetValue(Headers.SourceQueue), Is.EqualTo(InputQueueName));
        }
        async Task RunDeferTest()
        {
            var replyCounter = new SharedCounter(1);

            _client.AddHandlerWithBusTemporarilyStopped <string>(async reply =>
            {
                Console.WriteLine($"CLIENT got reply '{reply}'  (elapsed: {_stopwatch.Elapsed.TotalSeconds:0.# s})");
                replyCounter.Decrement();
            });

            await _client.Bus.Send("request");

            replyCounter.WaitForResetEvent();
        }
Пример #10
0
        public void CanDoItSyncWithoutBlocking()
        {
            var messageWasProperlyHandled = new ManualResetEvent(false);
            var bus = _activator.Bus.Advanced.SyncBus;

            _activator.AddHandlerWithBusTemporarilyStopped <string>(async str => messageWasProperlyHandled.Set());

            var thread = new Thread(() =>
            {
                bus.SendLocal("ey det virker");
            });

            // Setting ApartmentState is not supported in Net 5.0 and on Linux/OSX
            if (Environment.Version.Major ! >= 5 && !(RuntimeInformation.IsOSPlatform(OSPlatform.Linux)))
            {
                thread.SetApartmentState(ApartmentState.STA);
            }

            thread.Start();

            Assert.That(thread.Join(1000), Is.True, "thread did not finish within timeout");

            messageWasProperlyHandled.WaitOrDie(timeout: TimeSpan.FromSeconds(2));
        }
Пример #11
0
        protected override void SetUp()
        {
            var network         = new InMemNetwork();
            var subscriberStore = new InMemorySubscriberStore();

            _publisher = GetEndpoint(network, "publisher", c =>
            {
                c.Subscriptions(s => s.StoreInMemory(subscriberStore));
                c.Routing(r => r.TypeBased());
            });

            _client1GotTheEvent = new ManualResetEvent(false);
            _client1            = GetEndpoint(network, "client1", c =>
            {
                c.Routing(r => r.TypeBased().Map <SomeKindOfEvent>("publisher"));
            });
            _client1.AddHandlerWithBusTemporarilyStopped <SomeKindOfEvent>(async e => _client1GotTheEvent.Set());
        }
Пример #12
0
    public void DoesNotLogWarningsUnderNormalUse()
    {
        var counter = new SharedCounter(3);

        _activator.AddHandlerWithBusTemporarilyStopped <string>(async str => counter.Decrement());

        _activator.Bus.SendLocal("hej").Wait();
        _activator.Bus.SendLocal("med").Wait();
        _activator.Bus.SendLocal("dig").Wait();

        counter.WaitForResetEvent();

        CleanUpDisposables();

        var logLinesWarnLevelOrAbove = _logs.Where(l => l.Level >= LogLevel.Warn).ToList();

        Assert.That(logLinesWarnLevelOrAbove.Any(), Is.False, $@"Got the following log lines >= WARN:

{string.Join(Environment.NewLine, logLinesWarnLevelOrAbove)}");
    }
Пример #13
0
        public async Task ItWorksWithCovarianceToo()
        {
            var counter = new SharedCounter(1);

            Using(counter);

            _activator.AddHandlerWithBusTemporarilyStopped <BaseMessage>(async baseMessage => throw new RebusApplicationException("1st level!!"));

            _activator.AddHandlerWithBusTemporarilyStopped <IFailed <BaseMessage> >(async failed =>
            {
                if (failed.Message is ConcreteMessage)
                {
                    counter.Decrement();
                    return;
                }

                counter.Fail("Did not receive the expected message!");
            });

            await _bus.SendLocal(new ConcreteMessage());

            counter.WaitForResetEvent();
        }