コード例 #1
0
        public void WhenRequestMessageSerializedThenDeserializeGivesSameObject()
        {
            // arrange
            var r          = new RequestA();
            var rid        = "1";
            var replyTo    = "some_topic";
            var expires    = DateTimeOffset.UtcNow.AddMinutes(2);
            var reqMessage = new MessageWithHeaders();

            reqMessage.SetHeader(ReqRespMessageHeaders.ReplyTo, replyTo);
            reqMessage.SetHeader(ReqRespMessageHeaders.RequestId, rid);
            reqMessage.SetHeader(ReqRespMessageHeaders.Expires, expires);

            // act
            var payload = Bus.SerializeRequest(typeof(RequestA), r, reqMessage, new Mock <ProducerSettings>().Object);

            Bus.DeserializeRequest(typeof(RequestA), payload, out var resMessage);

            // assert
            resMessage.Headers[ReqRespMessageHeaders.RequestId].Should().Be(rid);
            resMessage.Headers[ReqRespMessageHeaders.ReplyTo].Should().Be(replyTo);
            resMessage.TryGetHeader(ReqRespMessageHeaders.Expires, out DateTimeOffset? resExpires);

            resExpires.HasValue.Should().BeTrue();
            resExpires.Value.ToFileTime().Should().Be(expires.ToFileTime());
        }
コード例 #2
0
        public async Task WhenCancellationTokenCancelledThenCancellsPendingRequest()
        {
            // arrange
            var r1 = new RequestA();
            var r2 = new RequestA();

            var cts1 = new CancellationTokenSource();
            var cts2 = new CancellationTokenSource();

            cts2.Cancel();
            var r1Task = Bus.Send(r1, cts1.Token);
            var r2Task = Bus.Send(r2, cts2.Token);

            // act
            Bus.TriggerPendingRequestCleanup();
            await Task.WhenAny(r1Task, r2Task);

            // assert
            r1Task.IsCompleted.Should().BeFalse("Request 1 is still pending");

            r2Task.IsCanceled.Should().BeTrue("Request 2 was canceled");
            r2Task.IsFaulted.Should().BeFalse("Request 2 was canceled");

            cts1.Dispose();
            cts2.Dispose();
        }
コード例 #3
0
        public void WhenResponseArrivesThenResolvesPendingRequest()
        {
            // arrange
            var r = new RequestA();

            Bus.OnReply = (type, topic, request) =>
            {
                if (topic == "a-requests")
                {
                    var req = (RequestA)request;
                    return(new ResponseA {
                        Id = req.Id
                    });
                }
                return(null);
            };

            // act
            var rTask = Bus.Send(r);

            WaitForTasks(2000, rTask);
            Bus.TriggerPendingRequestCleanup();

            // assert
            rTask.IsCompleted.Should().BeTrue("Response should be completed");
            r.Id.Should().Be(rTask.Result.Id);

            Bus.PendingRequestsCount.Should().Be(0, "There should be no pending requests");
        }
コード例 #4
0
        public void WhenNoTimeoutProvidedThenTakesDefaultTimeoutForRequestType()
        {
            // arrange
            var ra = new RequestA();
            var rb = new RequestB();

            // act
            var raTask = Bus.Send(ra);
            var rbTask = Bus.Send(rb);

            WaitForTasks(2000, raTask, rbTask);

            // after 10 seconds
            _timeNow = _timeZero.AddSeconds(TimeoutForA10 + 1);
            Bus.TriggerPendingRequestCleanup();

            // assert
            raTask.IsCanceled.Should().BeTrue();
            rbTask.IsCanceled.Should().BeFalse();

            // adter 20 seconds
            _timeNow = _timeZero.AddSeconds(TimeoutDefault20 + 1);
            Bus.TriggerPendingRequestCleanup();

            // assert
            rbTask.IsCanceled.Should().BeTrue();
        }
コード例 #5
0
        public void SerializedRequestMessage_Property()
        {
            // arrange
            var r       = new RequestA();
            var rid     = "1";
            var replyTo = "some_topic";
            var expires = DateTimeOffset.UtcNow.AddMinutes(2);

            // act
            var p = _bus.SerializeRequest(typeof(RequestA), r, rid, replyTo, expires);

            _bus.DeserializeRequest(typeof(RequestA), p, out string rid2, out string replyTo2, out DateTimeOffset? expires2);

            // assert
            rid2.ShouldBeEquivalentTo(rid);
            replyTo2.ShouldBeEquivalentTo(replyTo);
            expires2.HasValue.Should().BeTrue();
            expires2.Value.Subtract(expires).TotalSeconds.Should().BeLessOrEqualTo(1);
        }
コード例 #6
0
        public void WhenResponseArrivesTooLate_ExpiresPendingRequest()
        {
            // arrange
            var r1 = new RequestA();
            var r2 = new RequestA();
            var r3 = new RequestA();

            _bus.OnReply = (type, topic, request) =>
            {
                if (topic == "a-requests")
                {
                    var req = (RequestA)request;
                    // resolve only r1 request
                    if (req.Id == r1.Id)
                    {
                        return(new ResponseA {
                            Id = req.Id
                        });
                    }
                }
                return(null);
            };

            // act

            var r1Task = _bus.Send(r1);
            var r2Task = _bus.Send(r2, TimeSpan.FromSeconds(1));
            var r3Task = _bus.Send(r3);

            try
            {
                Task.WaitAll(new Task[] { r1Task, r2Task, r3Task }, 3000);
            }
            catch (AggregateException e)
            {
            }

            // assert
            r1Task.IsCompleted.Should().BeTrue("Response 1 should be completed");
            r2Task.IsCanceled.Should().BeTrue("Response 2 should be canceled");
            (!r3Task.IsCanceled && !r3Task.IsCompleted).Should().BeTrue("Response 3 should still be pending");
            _bus.PendingRequestsCount.Should().Be(1, "There should be only 1 pending request");
        }
コード例 #7
0
        public void WhenResponseArrivesTooLate_ExpiresPendingRequest()
        {
            // arrange
            var r1 = new RequestA();
            var r2 = new RequestA();
            var r3 = new RequestA();

            _bus.OnReply = (type, topic, request) =>
            {
                if (topic == "a-requests")
                {
                    var req = (RequestA)request;
                    // resolve only r1 request
                    if (req.Id == r1.Id)
                    {
                        return(new ResponseA {
                            Id = req.Id
                        });
                    }
                }
                return(null);
            };

            // act
            var r1Task = _bus.Send(r1);
            var r2Task = _bus.Send(r2, TimeSpan.FromSeconds(1));
            var r3Task = _bus.Send(r3);

            // 2 seconds later
            _timeNow = _timeZero.AddSeconds(2);
            _bus.CleanPendingRequests();

            WaitForTasks(2000, r1Task, r2Task, r3Task);

            // assert
            r1Task.IsCompleted.Should().BeTrue("Response 1 should be completed");
            r2Task.IsCanceled.Should().BeTrue("Response 2 should be canceled");
            r3Task.IsCompleted.Should().BeFalse("Response 3 should still be pending");
            _bus.PendingRequestsCount.Should().Be(1, "There should be only 1 pending request");
        }