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()); }
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(); }
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"); }
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(); }
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); }
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"); }
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"); }