Ejemplo n.º 1
0
        public void OnMsg(PropertyMsg queryMsg)
        {
            PropertyMsg replyMsg;

            switch (queryMsg._Get("cmd"))
            {
            case "reply":

                replyMsg          = new PropertyMsg();
                replyMsg["value"] = queryMsg["value"];

                router.ReplyTo(queryMsg, replyMsg);
                break;

            case "delay-reply":

                Thread.Sleep(500);

                replyMsg          = new PropertyMsg();
                replyMsg["value"] = queryMsg["value"];

                router.ReplyTo(queryMsg, replyMsg);
                break;

            case "error":

                throw new Exception("Error: " + queryMsg["value"]);
            }
        }
Ejemplo n.º 2
0
        public void PropertyMsg_Clone()
        {
            PropertyMsg msg1, msg2;

            msg1            = new PropertyMsg();
            msg1._Version   = 66;
            msg1._ToEP      = "logical://to";
            msg1._FromEP    = "logical://from";
            msg1._TTL       = 77;
            msg1._ReceiptEP = "logical://receipt";
            msg1._SessionID = Helper.NewGuid();
            msg1._Flags    |= MsgFlag.Broadcast;
            msg1._MsgID     = Guid.Empty;
            msg1["foo"]     = "bar";

            msg2 = (PropertyMsg)msg1.Clone();
            Assert.AreEqual(msg1._Version, msg2._Version);
            Assert.AreEqual(msg1._ToEP, msg2._ToEP);
            Assert.AreEqual(msg1._FromEP, msg2._FromEP);
            Assert.AreEqual(msg1._TTL, msg2._TTL);
            Assert.AreEqual(msg1._ReceiptEP, msg2._ReceiptEP);
            Assert.AreEqual(msg1._SessionID, msg2._SessionID);
            Assert.AreEqual(msg1._Flags, msg2._Flags);
            Assert.AreEqual(msg1._MsgID, msg2._MsgID);
            Assert.AreEqual("bar", msg2["foo"]);

            msg1._MsgID = Helper.NewGuid();
            msg2        = (PropertyMsg)msg1.Clone();
            Assert.AreNotEqual(msg2._MsgID, msg1._MsgID);
        }
Ejemplo n.º 3
0
        public void ParallelQuerySession_WaitAll_SingleError()
        {
            // Test a single error query just to make sure it actually works.

            try
            {
                router = new LeafRouter();
                router.Start();
                router.Dispatcher.AddTarget(this);

                Thread.Sleep(1000);

                var parallelQuery = new ParallelQuery();
                var queryMsg1     = new PropertyMsg();

                queryMsg1["cmd"]   = "error";
                queryMsg1["value"] = "1";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg1));

                router.ParallelQuery(parallelQuery);

                Assert.IsNotNull(parallelQuery.Operations[0].Error);
            }
            finally
            {
                if (router != null)
                {
                    router.Stop();
                    router = null;
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 4
0
        private void TestBaseCloning(PropertyMsg msg1)
        {
            PropertyMsg msg2;

            msg1._Version   = 66;
            msg1._ToEP      = "logical://to";
            msg1._FromEP    = "logical://from";
            msg1._TTL       = 77;
            msg1._ReceiptEP = "logical://receipt";
            msg1._SessionID = Helper.NewGuid();
            msg1._Flags    |= MsgFlag.Broadcast;
            msg1._MsgID     = Guid.Empty;

            msg2 = (PropertyMsg)msg1.Clone();
            Assert.AreEqual(msg1._Version, msg2._Version);
            Assert.AreEqual(msg1._ToEP, msg2._ToEP);
            Assert.AreEqual(msg1._FromEP, msg2._FromEP);
            Assert.AreEqual(msg1._TTL, msg2._TTL);
            Assert.AreEqual(msg1._ReceiptEP, msg2._ReceiptEP);
            Assert.AreEqual(msg1._SessionID, msg2._SessionID);
            Assert.AreEqual(msg1._Flags, msg2._Flags);
            Assert.AreEqual(msg1._MsgID, msg2._MsgID);

            msg1._MsgID = Helper.NewGuid();
            msg2        = (PropertyMsg)msg1.Clone();
            Assert.AreNotEqual(msg2._MsgID, msg1._MsgID);
        }
Ejemplo n.º 5
0
        public void PropertyMsg_Serialize()
        {
            PropertyMsg          msgOut, msgIn;
            EnhancedMemoryStream ms = new EnhancedMemoryStream();

            Msg.ClearTypes();
            Msg.LoadTypes(Assembly.GetExecutingAssembly());

            msgOut = new PropertyMsg();
            msgOut._Set("string", "hello");
            msgOut._Set("bool", true);
            msgOut._Set("int", 10);
            msgOut._Set("timespan", new TimeSpan(0, 0, 0, 0, 55));
            msgOut._Set("endpoint", new IPEndPoint(IPAddress.Parse("127.0.0.1"), 56));
            msgOut._Set("bytes", new byte[] { 5, 6, 7, 8 });
            msgOut._Set("address", IPAddress.Parse("10.20.30.40"));

            Msg.Save(ms, msgOut);

            ms.Seek(0, SeekOrigin.Begin);
            msgIn = (PropertyMsg)Msg.Load(ms);

            Assert.AreEqual(msgOut["string"], msgIn["string"]);
            Assert.AreEqual(msgOut["bool"], msgIn["bool"]);
            Assert.AreEqual(msgOut["int"], msgIn["int"]);
            Assert.AreEqual(msgOut["timespan"], msgIn["timespan"]);
            Assert.AreEqual(msgOut["endpoint"], msgIn["endpoint"]);
            Assert.AreEqual(msgOut["bytes"], msgIn["bytes"]);
            Assert.AreEqual(msgOut["address"], msgIn["address"]);
        }
Ejemplo n.º 6
0
        public void ReliableMessengerMsgs_DeliveryMsg_Serialize()
        {
            DeliveryMsg    msgIn, msgOut;
            EnhancedStream es  = new EnhancedMemoryStream();
            DateTime       now = Helper.UtcNowRounded;
            Guid           id  = Helper.NewGuid();
            PropertyMsg    query;
            PropertyMsg    response;

            Msg.ClearTypes();
            Msg.LoadTypes(Assembly.GetExecutingAssembly());

            query           = new PropertyMsg();
            query["hello"]  = "world";
            response        = new PropertyMsg();
            response["foo"] = "bar";

            msgOut = new DeliveryMsg(DeliveryOperation.Attempt, now, "logical://foo", "logical://bar", query, id,
                                     "clusterInfo", "clusterParam", new TimeoutException("Timeout"), response);
            Msg.Save(es, msgOut);
            es.Seek(0, SeekOrigin.Begin);
            msgIn = (DeliveryMsg)Msg.Load(es);

            Assert.IsNotNull(msgIn);
            Assert.AreEqual(DeliveryOperation.Attempt, msgIn.Operation);
            Assert.AreEqual(now, msgIn.Timestamp);
            Assert.AreEqual(MsgEP.Parse("logical://foo"), msgIn.TargetEP);
            Assert.AreEqual(MsgEP.Parse("logical://bar"), msgIn.ConfirmEP);
            Assert.IsInstanceOfType(msgIn.Query, typeof(PropertyMsg));
            Assert.AreEqual("world", ((PropertyMsg)msgIn.Query)["hello"]);
            Assert.AreEqual(id, msgIn.TopologyID);
            Assert.AreEqual("clusterInfo", msgIn.TopologyInfo);
            Assert.AreEqual("clusterParam", msgIn.TopologyParam);
            Assert.IsInstanceOfType(msgIn.Exception, typeof(TimeoutException));
            Assert.AreEqual("Timeout", msgIn.Exception.Message);
            Assert.IsInstanceOfType(msgIn.Response, typeof(PropertyMsg));
            Assert.AreEqual("bar", ((PropertyMsg)msgIn.Response)["foo"]);

            msgOut = new DeliveryMsg(DeliveryOperation.Confirmation, now, "logical://foo", null, query, id,
                                     null, null, new ArgumentException("Test"), null);
            es.SetLength(0);
            Msg.Save(es, msgOut);
            es.Seek(0, SeekOrigin.Begin);
            msgIn = (DeliveryMsg)Msg.Load(es);

            Assert.IsNotNull(msgIn);
            Assert.AreEqual(DeliveryOperation.Confirmation, msgIn.Operation);
            Assert.AreEqual(now, msgIn.Timestamp);
            Assert.AreEqual(MsgEP.Parse("logical://foo"), msgIn.TargetEP);
            Assert.IsNull(msgIn.ConfirmEP);
            Assert.IsInstanceOfType(msgIn.Query, typeof(PropertyMsg));
            Assert.AreEqual("world", ((PropertyMsg)msgIn.Query)["hello"]);
            Assert.AreEqual(id, msgIn.TopologyID);
            Assert.IsNull(msgIn.TopologyInfo);
            Assert.IsNull(msgIn.TopologyParam);
            Assert.IsInstanceOfType(msgIn.Exception, typeof(SessionException));
            Assert.AreEqual("Test", msgIn.Exception.Message);
            Assert.IsNull(msgIn.Response);
        }
Ejemplo n.º 7
0
        public void LazyMessenger_DeliverTo_Cluster_Exception()
        {
            MsgRouter     router    = null;
            BasicTopology cluster   = null;
            LazyMessenger messenger = null;
            DateTime      start     = DateTime.UtcNow;
            PropertyMsg   query;

            try
            {
                router = CreateLeaf("detached", "hub", group);
                router.Dispatcher.AddTarget(this);

                cluster = new BasicTopology();
                cluster.OpenClient(router, "logical://foo", null);

                messenger = new LazyMessenger();
                messenger.OpenClient(router, "logical://confirm", null, new DeliveryConfirmCallback(OnDeliveryConfirmation));

                Thread.Sleep(wait);

                query = new PropertyMsg();
                query["operation"] = "exception";
                query["data"]      = "Hello World!";
                query["query"]     = "yes";

                confirmation = null;

                try
                {
                    messenger.Deliver(cluster, null, query, true);
                    Assert.Fail("Exception expected");
                }
                catch (Exception e)
                {
                    Assert.AreEqual("Test Exception", e.Message);
                }
            }
            finally
            {
                if (messenger != null)
                {
                    messenger.Close();
                }

                if (cluster != null)
                {
                    cluster.Close();
                }

                if (router != null)
                {
                    router.Stop();
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 8
0
            public void OnMsg(BlobPropertyMsg msg)
            {
                PropertyMsg reply = new PropertyMsg();

                lock (counts)
                    counts[index]++;

                reply["value"] = "B";
                ReplyTo(msg, reply);
            }
Ejemplo n.º 9
0
        public void ParallelQuerySession_WaitAll_PartialFail()
        {
            // Test 4 parallel queries where 2 succeed and two fail.

            try
            {
                router = new LeafRouter();
                router.Start();
                router.Dispatcher.AddTarget(this);

                Thread.Sleep(1000);

                var parallelQuery = new ParallelQuery();
                var queryMsg1     = new PropertyMsg();
                var queryMsg2     = new PropertyMsg();
                var queryMsg3     = new PropertyMsg();
                var queryMsg4     = new PropertyMsg();

                queryMsg1["cmd"]   = "reply";
                queryMsg1["value"] = "1";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg1));

                queryMsg2["cmd"]   = "error";
                queryMsg2["value"] = "2";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg2));

                queryMsg3["cmd"]   = "reply";
                queryMsg3["value"] = "3";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg3));

                queryMsg4["cmd"]   = "error";
                queryMsg4["value"] = "4";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg4));

                router.ParallelQuery(parallelQuery);

                Assert.AreEqual("1", ((PropertyMsg)parallelQuery.Operations[0].ReplyMsg)["value"]);
                Assert.AreEqual("3", ((PropertyMsg)parallelQuery.Operations[2].ReplyMsg)["value"]);

                Assert.AreEqual("Error: 2", parallelQuery.Operations[1].Error.Message);
                Assert.AreEqual("Error: 4", parallelQuery.Operations[3].Error.Message);
            }
            finally
            {
                if (router != null)
                {
                    router.Stop();
                    router = null;
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 10
0
        public void LazyMessenger_DeliverTo_Cluster_NoConfirm2()
        {
            MsgRouter     router    = null;
            BasicTopology cluster   = null;
            LazyMessenger messenger = null;
            DateTime      start     = DateTime.UtcNow;
            PropertyMsg   query;

            try
            {
                router = CreateLeaf("detached", "hub", group);
                router.Dispatcher.AddTarget(this);

                cluster = new BasicTopology();
                cluster.OpenClient(router, "logical://foo", null);

                messenger = new LazyMessenger();
                messenger.OpenClient(router, "logical://confirm", null, null);

                Thread.Sleep(wait);

                query          = new PropertyMsg();
                query["data"]  = "Hello World!";
                query["query"] = "yes";

                confirmation = null;
                messenger.Deliver(cluster, null, query, true);
                Thread.Sleep(wait);

                Assert.IsNull(confirmation);
            }
            finally
            {
                if (messenger != null)
                {
                    messenger.Close();
                }

                if (cluster != null)
                {
                    cluster.Close();
                }

                if (router != null)
                {
                    router.Stop();
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 11
0
        public void LazyMessenger_DeliverTo_Endpoint_Timeout()
        {
            MsgRouter     router    = null;
            LazyMessenger messenger = null;
            DateTime      start     = DateTime.UtcNow;
            PropertyMsg   query;

            try
            {
                router    = CreateLeaf("detached", "hub", group);
                messenger = new LazyMessenger();
                messenger.OpenClient(router, "logical://confirm", null, new DeliveryConfirmCallback(OnDeliveryConfirmation));
                router.Dispatcher.AddTarget(this);
                Thread.Sleep(wait);

                query = new PropertyMsg();
                query["operation"] = "timeout";
                query["data"]      = "Hello World!";
                query["query"]     = "yes";

                confirmation = null;
                try
                {
                    messenger.Deliver("logical://foo", query, true);
                    Assert.Fail("TimeoutException expected.");
                }
                catch (Exception e)
                {
                    Assert.IsInstanceOfType(e, typeof(TimeoutException));
                }
            }
            finally
            {
                if (messenger != null)
                {
                    messenger.Close();
                }

                if (router != null)
                {
                    router.Stop();
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 12
0
        public void LazyMessenger_DeliverTo_Endpoint()
        {
            MsgRouter     router    = null;
            LazyMessenger messenger = null;
            DateTime      start     = DateTime.UtcNow;
            PropertyMsg   query;

            try
            {
                router    = CreateLeaf("detached", "hub", group);
                messenger = new LazyMessenger();
                messenger.OpenClient(router, "logical://confirm", null, new DeliveryConfirmCallback(OnDeliveryConfirmation));
                router.Dispatcher.AddTarget(this);
                Thread.Sleep(wait);

                query          = new PropertyMsg();
                query["data"]  = "Hello World!";
                query["query"] = "yes";

                confirmation = null;
                messenger.Deliver("logical://foo", query, true);
                Thread.Sleep(wait);

                Assert.IsNotNull(confirmation);
                Assert.IsTrue(confirmation.Timestamp >= start);
                Assert.IsTrue(confirmation.Timestamp <= DateTime.UtcNow);
                Assert.AreEqual(MsgEP.Parse("logical://foo"), confirmation.TargetEP);
                Assert.IsInstanceOfType(confirmation.Query, typeof(PropertyMsg));
                Assert.AreEqual("yes", ((PropertyMsg)confirmation.Query)["query"]);
                Assert.IsInstanceOfType(confirmation.Response, typeof(PropertyMsg));
                Assert.AreEqual(query["data"], ((PropertyMsg)confirmation.Response)["data"]);
                Assert.IsNull(confirmation.Exception);
            }
            finally
            {
                if (messenger != null)
                {
                    messenger.Close();
                }

                router.Stop();

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 13
0
        public void OnQuery(PropertyMsg query)
        {
            string operation = query["operation"];

            if (operation != null)
            {
                switch (operation)
                {
                case "timeout": return;

                case "exception": throw new Exception("Test Exception");
                }
            }

            PropertyMsg response;

            response         = new PropertyMsg();
            response["data"] = query["data"];

            query._Session.Router.ReplyTo(query, response);
        }
Ejemplo n.º 14
0
        public void ParallelQuerySession_WaitAny_SingleSuccess()
        {
            // Test a single successful query just to make sure it actually works.

            try
            {
                router = new LeafRouter();
                router.Start();
                router.Dispatcher.AddTarget(this);

                Thread.Sleep(1000);

                var parallelQuery = new ParallelQuery()
                {
                    WaitMode = ParallelWait.ForAny
                };
                var queryMsg1 = new PropertyMsg();

                queryMsg1["cmd"]   = "reply";
                queryMsg1["value"] = "1";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg1));

                router.ParallelQuery(parallelQuery);

                Assert.AreEqual("1", ((PropertyMsg)parallelQuery.Operations[0].ReplyMsg)["value"]);
            }
            finally
            {
                if (router != null)
                {
                    router.Stop();
                    router = null;
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 15
0
        public void PropertyMsg_Access()
        {
            PropertyMsg msg = new PropertyMsg();

            msg._Set("string", "hello");
            msg._Set("bool", true);
            msg._Set("int", 10);
            msg._Set("timespan", new TimeSpan(0, 0, 0, 0, 55));
            msg._Set("endpoint", new IPEndPoint(IPAddress.Parse("127.0.0.1"), 56));
            msg._Set("bytes", new byte[] { 5, 6, 7, 0x1F });
            msg._Set("address", IPAddress.Parse("1.2.3.4"));

            Assert.AreEqual("hello", msg._Get("string"));
            Assert.AreEqual("hello", msg["string"]);
            Assert.AreEqual("hello", msg["STRING"]);
            Assert.IsNull(msg["foobar"]);
            Assert.AreEqual("foobar", msg._Get("foobar", "foobar"));
            Assert.AreEqual(IPAddress.Parse("1.2.3.4"), msg._Get("address", IPAddress.Any));

            msg["test"] = "test";
            Assert.AreEqual("test", msg["test"]);
            msg["test"] = "test #2";
            Assert.AreEqual("test #2", msg["test"]);

            Assert.IsTrue(msg._Get("bool", false));
            Assert.IsFalse(msg._Get("foobar", false));
            Assert.AreEqual("1", msg["bool"]);
            msg._Set("bool", false);
            Assert.IsFalse(msg._Get("bool", true));
            Assert.AreEqual("0", msg["bool"]);
            Assert.IsTrue(msg._Get("test", true));

            Assert.AreEqual(10, msg._Get("int", 0));
            Assert.AreEqual(20, msg._Get("foobar", 20));
            msg._Set("int", -566);
            Assert.AreEqual(-566, msg._Get("int", 0));
            Assert.AreEqual("-566", msg["int"]);
            Assert.AreEqual(666, msg._Get("test", 666));

            Assert.AreEqual(new TimeSpan(0, 0, 0, 0, 55), msg._Get("timespan", TimeSpan.FromSeconds(60)));
            Assert.AreEqual(new TimeSpan(0, 0, 0, 60), msg._Get("foobar", TimeSpan.FromSeconds(60)));
            msg._Set("timespan", TimeSpan.FromSeconds(77));
            Assert.AreEqual(TimeSpan.FromSeconds(77), LillTek.Common.Serialize.Parse(msg["timespan"], TimeSpan.Zero));
            Assert.AreEqual(TimeSpan.FromSeconds(1), msg._Get("test", TimeSpan.FromSeconds(1)));

            msg._Set("bad-ip", "10.");
            Assert.AreEqual(IPAddress.Parse("10.20.30.40"), msg._Get("bad_ip", IPAddress.Parse("10.20.30.40")));

            Assert.AreEqual(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 56), msg._Get("endpoint", (IPEndPoint)null));
            Assert.AreEqual("127.0.0.1:56", msg["endpoint"]);
            Assert.AreEqual(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 57), msg._Get("foobar", new IPEndPoint(IPAddress.Parse("127.0.0.1"), 57)));
            msg._Set("endpoint", new IPEndPoint(IPAddress.Parse("127.0.0.1"), 58));
            Assert.AreEqual(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 58), msg._Get("endpoint", (IPEndPoint)null));
            Assert.AreEqual(new IPEndPoint(IPAddress.Parse("127.0.0.1"), 58), msg._Get("test", new IPEndPoint(IPAddress.Parse("127.0.0.1"), 58)));

            CollectionAssert.AreEqual(new byte[] { 5, 6, 7, 0x1F }, msg._Get("bytes", (byte[])null));
            CollectionAssert.AreEqual(new byte[] { 10, 11 }, msg._Get("foobar", new byte[] { 10, 11 }));
            Assert.AreEqual("0506071f", msg["bytes"]);
            msg._Set("bytes", new byte[] { 0x0a, 0x1b, 0x2c, 0x3d, 0x4e, 0x5f });
            CollectionAssert.AreEqual(new byte[] { 0x0a, 0x1b, 0x2c, 0x3d, 0x4e, 0x5f }, msg._Get("bytes", (byte[])null));
            CollectionAssert.AreEqual(new byte[] { 10 }, msg._Get("test", new byte[] { 10 }));

            var id = Helper.NewGuid();

            msg._Set("id", id);
            Assert.AreEqual(id, msg._Get("id", Guid.Empty));
            Assert.AreEqual(Guid.Empty, msg._Get("_id", Guid.Empty));
            msg._Set("_id", "sss s s s");
            Assert.AreEqual(Guid.Empty, msg._Get("_id", Guid.Empty));

            var now = Helper.UtcNowRounded;

            msg._Set("date", now);
            Assert.AreEqual(now, msg._Get("date", DateTime.MaxValue));
        }
Ejemplo n.º 16
0
        public void ParallelQuerySession_WaitAny_MultipleFail()
        {
            // Test 4 parallel queries where all fail and verify that we got
            // all of the error responses.

            try
            {
                router = new LeafRouter();
                router.Start();
                router.Dispatcher.AddTarget(this);

                Thread.Sleep(1000);

                var parallelQuery = new ParallelQuery()
                {
                    WaitMode = ParallelWait.ForAny
                };
                var queryMsg1 = new PropertyMsg();
                var queryMsg2 = new PropertyMsg();
                var queryMsg3 = new PropertyMsg();
                var queryMsg4 = new PropertyMsg();

                queryMsg1["cmd"]   = "error";
                queryMsg1["value"] = "1";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg1));

                queryMsg2["cmd"]   = "error";
                queryMsg2["value"] = "2";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg2));

                queryMsg3["cmd"]   = "error";
                queryMsg3["value"] = "3";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg3));

                queryMsg4["cmd"]   = "error";
                queryMsg4["value"] = "4";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg4));

                router.ParallelQuery(parallelQuery);

                int cCompleted = 0;

                for (int i = 0; i < 4; i++)
                {
                    var operation = parallelQuery.Operations[i];

                    if (operation.IsComplete)
                    {
                        cCompleted++;
                        Assert.AreEqual("Error: " + (i + 1).ToString(), parallelQuery.Operations[i].Error.Message);
                    }
                }

                Assert.AreEqual(4, cCompleted);
            }
            finally
            {
                if (router != null)
                {
                    router.Stop();
                    router = null;
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 17
0
        public void ParallelQuerySession_WaitAny_PartialSuccess()
        {
            // Test 4 parallel queries where two succeed (after a bit of a delay) and
            // two fail immediately and verify that the two failures were recorded and
            // we have a single successful response.

            try
            {
                router = new LeafRouter();
                router.Start();
                router.Dispatcher.AddTarget(this);

                Thread.Sleep(1000);

                var parallelQuery = new ParallelQuery()
                {
                    WaitMode = ParallelWait.ForAny
                };
                var queryMsg1 = new PropertyMsg();
                var queryMsg2 = new PropertyMsg();
                var queryMsg3 = new PropertyMsg();
                var queryMsg4 = new PropertyMsg();

                queryMsg1["cmd"]   = "delay-reply";
                queryMsg1["value"] = "1";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg1));

                queryMsg2["cmd"]   = "delay-reply";
                queryMsg2["value"] = "2";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg2));

                queryMsg3["cmd"]   = "error";
                queryMsg3["value"] = "3";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg3));

                queryMsg4["cmd"]   = "error";
                queryMsg4["value"] = "4";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg4));

                router.ParallelQuery(parallelQuery);

                int cCompleted = 0;

                for (int i = 0; i < 2; i++)
                {
                    var operation = parallelQuery.Operations[i];

                    if (operation.IsComplete)
                    {
                        cCompleted++;
                        Assert.AreEqual((i + 1).ToString(), ((PropertyMsg)parallelQuery.Operations[i].ReplyMsg)["value"]);
                    }
                }

                Assert.AreEqual(1, cCompleted);
                Assert.AreEqual("Error: 3", parallelQuery.Operations[2].Error.Message);
                Assert.AreEqual("Error: 4", parallelQuery.Operations[3].Error.Message);
            }
            finally
            {
                if (router != null)
                {
                    router.Stop();
                    router = null;
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 18
0
        public void ParallelQuerySession_WaitAny_MultipleSuccess()
        {
            // Test 4 parallel queries that all succeed and verify that
            // only one result is actually returned.

            try
            {
                router = new LeafRouter();
                router.Start();
                router.Dispatcher.AddTarget(this);

                Thread.Sleep(1000);

                var parallelQuery = new ParallelQuery()
                {
                    WaitMode = ParallelWait.ForAny
                };
                var queryMsg1 = new PropertyMsg();
                var queryMsg2 = new PropertyMsg();
                var queryMsg3 = new PropertyMsg();
                var queryMsg4 = new PropertyMsg();

                queryMsg1["cmd"]   = "reply";
                queryMsg1["value"] = "1";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg1));

                queryMsg2["cmd"]   = "reply";
                queryMsg2["value"] = "2";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg2));

                queryMsg3["cmd"]   = "reply";
                queryMsg3["value"] = "3";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg3));

                queryMsg4["cmd"]   = "reply";
                queryMsg4["value"] = "4";
                parallelQuery.Operations.Add(new ParallelOperation("logical://parallel/test", queryMsg4));

                router.ParallelQuery(parallelQuery);

                int cCompleted = 0;

                for (int i = 0; i < 4; i++)
                {
                    var operation = parallelQuery.Operations[i];

                    if (operation.IsComplete)
                    {
                        cCompleted++;
                        Assert.AreEqual((i + 1).ToString(), ((PropertyMsg)parallelQuery.Operations[i].ReplyMsg)["value"]);
                    }
                }

                Assert.AreEqual(1, cCompleted);
            }
            finally
            {
                if (router != null)
                {
                    router.Stop();
                    router = null;
                }

                Config.SetConfig(null);
            }
        }
Ejemplo n.º 19
0
 public void OnMsg(PropertyMsg msg)
 {
     lock (counts)
         counts[index]++;
 }