public void CloseRequest_ExistingEntries_ShouldAlterQueueAppropriate() { var sut = new TitanicMemoryIO (); for (var i = 0; i < 10; i++) sut.SaveRequestEntry (i % 3 == 0 ? new RequestEntry { RequestId = Guid.NewGuid (), State = RequestEntry.Is_Closed } : new RequestEntry { RequestId = Guid.NewGuid () }); sut.NumberOfRequests.Should ().Be (10); var result = sut.GetRequestEntries (e => e.State == RequestEntry.Is_Closed); result.Count ().Should ().Be (4); foreach (var requestEntry in result) sut.CloseRequest (requestEntry.RequestId); sut.NumberOfRequests.Should ().Be (6); }
public void Run_RequestReply_ShouldWriteQueueAndReplyCorrect () { var io = new TitanicMemoryIO (); using (var reqWorker = new FakeRequestMDPWorker ()) using (var repWorker = new FakeReplyMDPWorker ()) using (var closeWorker = new FakeCloseMDPWorker ()) using (var dispatchClient = new FakeDispatchMDPClient ()) using (var sut = new TitanicBroker (io)) { // 1. Request // 2. Reply -> test reqWorker.Request = new NetMQMessage (); reqWorker.Request.Push ("Request Data"); reqWorker.Request.Push ("echo"); // start the process chain - worker & client should only run until they hit an AutoResetEvent Task.Factory.StartNew (() => sut.Run (reqWorker, repWorker, closeWorker, dispatchClient)); // give system time to act Thread.Sleep (_sleep_for); // get reply id for further processing var s = reqWorker.Reply.Last.ConvertToString (); Guid id; Guid.TryParse (s, out id).Should ().BeTrue (); // inject to repWorker who is waiting to proceed and prepare request repWorker.Request = new NetMQMessage (); repWorker.Request.Push (s); // get RequestEntry from queue and mark as processed var entry = io.GetRequestEntry (id); io.SaveProcessedRequestEntry (entry); // signal to proceed to send prepared request repWorker.waitHandle.Set (); Thread.Sleep (_sleep_for); // TEST COMMUNICATION repWorker.Reply.FrameCount.Should ().Be (3, "because a 3 frame message is expected. ({0})", repWorker.Reply); repWorker.Reply.First.ConvertToString ().Should ().Be ("Ok"); // should be identical since it is an "echo" service we are simulating :-) repWorker.Reply.Should ().Equal (entry.Request); // TEST QUEUE io.NumberOfRequests.Should ().Be (1); io.GetRequestEntries (e => e.RequestId == id).Count ().Should ().Be (1); var queueEntry = io.GetRequestEntry (id); queueEntry.State.Should ().Be (RequestEntry.Is_Processed); io.ExistsMessage (TitanicOperation.Close, id).Should ().BeFalse (); } }
public void TitanicReply_RequestReplyPending_ShouldSentCorrectReply () { var io = new TitanicMemoryIO (); using (var reqWorker = new FakeRequestMDPWorker ()) using (var repWorker = new FakeReplyMDPWorker ()) using (var closeWorker = new FakeCloseMDPWorker ()) using (var dispatchClient = new FakeDispatchMDPClient ()) using (var sut = new TitanicBroker (io)) { // setup the queue with a request var guid = Guid.NewGuid (); var msg = new NetMQMessage (); msg.Push (guid.ToString ()); // queue is setup with a request pending io.SaveNewRequestEntry (guid, msg); // setup the fake replyWorker's request repWorker.Request = new NetMQMessage (); repWorker.Request.Push (guid.ToString ()); // start the process chain - worker & client should only run until they hit an AutoResetEvent Task.Factory.StartNew (() => sut.Run (reqWorker, repWorker, closeWorker, dispatchClient)); // signal worker to go ahead repWorker.waitHandle.Set (); // give everything some time to process Thread.Sleep (_sleep_for); // TEST COMMUNICATION repWorker.Reply.FrameCount.Should ().Be (1, "because a 1 frame message is expected. ({0})", repWorker.Reply); repWorker.Reply.First.ConvertToString ().Should ().Be ("Pending"); // TEST QUEUE io.GetRequestEntries (e => e.RequestId == guid).Count ().Should ().Be (1); var queueEntry = io.GetRequestEntry (guid); queueEntry.State.Should ().Be (RequestEntry.Is_Pending); io.ExistsMessage (TitanicOperation.Request, guid).Should ().BeTrue (); io.ExistsMessage (TitanicOperation.Reply, guid).Should ().BeFalse (); io.ExistsMessage (TitanicOperation.Close, guid).Should ().BeFalse (); } }
public void GetRequestEntries_ExistingEntriesNoResultPredicate_ShouldReturnDefaultSequence () { var sut = new TitanicMemoryIO (); for (var i = 0; i < 10; i++) sut.SaveRequestEntry (i % 2 == 0 ? new RequestEntry { RequestId = Guid.NewGuid (), State = RequestEntry.Is_Processed } : new RequestEntry { RequestId = Guid.NewGuid () }); sut.NumberOfRequests.Should ().Be (10); var result = sut.GetRequestEntries (e => e.State == RequestEntry.Is_Closed); result.Should ().BeOfType (typeof (RequestEntry[])); result.Count ().Should ().Be (0); }
public void GetRequestEntries_ExistingEntriesCorrectPredicate_ShouldReturnCorrectSequence () { var sut = new TitanicMemoryIO (); for (var i = 0; i < 10; i++) sut.SaveRequestEntry (i % 2 == 0 ? new RequestEntry { RequestId = Guid.NewGuid (), State = RequestEntry.Is_Processed } : new RequestEntry { RequestId = Guid.NewGuid () }); var result = sut.GetRequestEntries (e => e.State == RequestEntry.Is_Processed); result.Should ().BeOfType (typeof (RequestEntry[])); result.Count ().Should ().Be (5); result.All (e => e.State == RequestEntry.Is_Processed).Should ().BeTrue (); }
public void GetRequestEntries_NotExistingEntries_ShouldReturnDefaultObject () { var sut = new TitanicMemoryIO (); var id = Guid.NewGuid (); sut.GetRequestEntries (e => e.RequestId == id).ShouldAllBeEquivalentTo (default (IEnumerable<RequestEntry>)); }