Beispiel #1
0
        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);
        }
Beispiel #2
0
        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 ();

            }
        }
Beispiel #3
0
        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 ();
            }
        }
Beispiel #4
0
        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);
        }
Beispiel #5
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 ();
        }
Beispiel #6
0
        public void GetRequestEntries_NotExistingEntries_ShouldReturnDefaultObject ()
        {
            var sut = new TitanicMemoryIO ();
            var id = Guid.NewGuid ();

            sut.GetRequestEntries (e => e.RequestId == id).ShouldAllBeEquivalentTo (default (IEnumerable<RequestEntry>));
        }