Example #1
0
        public void MsgQueueSerialization_Test()
        {
            QueuedMsgInfo msgInfo;
            QueuedMsg     msg, msgTest;
            MsgQueueCmd   cmd;

            msg            = new QueuedMsg();
            msg.TargetEP   = "logical://target";
            msg.ResponseEP = "logical://response";
            msg.SessionID  = Helper.NewGuid();
            msg.SendTime   = new DateTime(2000, 1, 1);
            msg.ExpireTime = new DateTime(2000, 1, 2);
            msg.Body       = "Hello World!";

            cmd = new MsgQueueCmd(MsgQueueCmd.EnqueueCmd);
            cmd.MessageHeader = msg.GetMessageHeader(new MsgQueueSettings());
            cmd.MessageBody   = msg.GetMessageBody(Compress.None);

            msgTest = new QueuedMsg(cmd, true);
            Assert.AreEqual(msg, msgTest);
            Assert.AreEqual(msg.TargetEP, msgTest.TargetEP);
            Assert.AreEqual(msg.ResponseEP, msgTest.ResponseEP);
            Assert.AreEqual(msg.SessionID, msgTest.SessionID);
            Assert.AreEqual(msg.SendTime, msgTest.SendTime);
            Assert.AreEqual(msg.ExpireTime, msgTest.ExpireTime);
            Assert.AreEqual(msg.Body, msgTest.Body);

            msgInfo = new QueuedMsgInfo(null, msgTest);
            Assert.AreEqual(msg.TargetEP, msgInfo.TargetEP);
            Assert.AreEqual(msg.ResponseEP, msgInfo.ResponseEP);
            Assert.AreEqual(msg.SessionID, msgInfo.SessionID);
            Assert.AreEqual(msg.SendTime, msgInfo.SendTime);
            Assert.AreEqual(msg.ExpireTime, msgInfo.ExpireTime);
            Assert.AreEqual(msg.BodyRaw.Length, msgInfo.BodySize);
        }
Example #2
0
        public void MsgQueueMemoryStore_Basic()
        {
            MsgQueueMemoryStore store = null;
            int           count;
            QueuedMsgInfo msgInfo;
            QueuedMsg     msg, msgTest;
            object        persistID;

            try
            {
                store = new MsgQueueMemoryStore();
                store.Open();

                // Should initialize with no persisted messages

                Assert.AreEqual(0, store.Count);
                count = 0;
                foreach (QueuedMsgInfo i in store)
                {
                    count++;
                }
                Assert.AreEqual(0, store.Count);

                msg            = new QueuedMsg();
                msg.TargetEP   = "logical://target";
                msg.ResponseEP = "logical://response";
                msg.SessionID  = Helper.NewGuid();
                msg.SendTime   = new DateTime(2000, 1, 1);
                msg.ExpireTime = new DateTime(2000, 1, 2);
                msg.Body       = "Hello World!";

                msgInfo = new QueuedMsgInfo(null, msg);
                Assert.IsNull(store.GetPersistID(msg.ID));
                store.Add(msgInfo, msg);

                Assert.AreEqual(1, store.Count);
                count = 0;
                foreach (QueuedMsgInfo i in store)
                {
                    count++;
                }

                Assert.AreEqual(1, store.Count);

                persistID = store.GetPersistID(msg.ID);
                Assert.IsNotNull(persistID);

                msgTest = store.Get(persistID);
                msgTest.DeserializedBody();
                Assert.AreEqual(msg, msgTest);

                store.SetDeliveryAttempt(persistID, 10, new DateTime(2001, 1, 1));
                msgInfo = store.GetInfo(persistID);
                Assert.AreEqual(10, msgInfo.DeliveryAttempts);
                Assert.AreEqual(new DateTime(2001, 1, 1), msgInfo.DeliveryTime);

                store.SetPriority(persistID, DeliveryPriority.Low);
                msgInfo = store.GetInfo(persistID);
                Assert.AreEqual(DeliveryPriority.Low, msgInfo.Priority);
                msgTest = store.Get(persistID);
                msgTest.DeserializedBody();
                Assert.AreEqual(DeliveryPriority.Low, msgTest.Priority);

                store.Modify(persistID, "logical://target2", new DateTime(2002, 1, 1), new DateTime(2002, 1, 2), DeliveryStatus.Poison);
                msgInfo = store.GetInfo(persistID);
                Assert.AreEqual((MsgEP)"logical://target2", msgInfo.TargetEP);
                Assert.AreEqual(new DateTime(2002, 1, 1), msgInfo.DeliveryTime);
                Assert.AreEqual(new DateTime(2002, 1, 2), msgInfo.ExpireTime);
                Assert.AreEqual(DeliveryStatus.Poison, msgInfo.Status);
                msgTest = store.Get(persistID);
                msgTest.DeserializedBody();
                Assert.AreEqual(DeliveryPriority.Low, msgTest.Priority);
                Assert.AreEqual(new DateTime(2002, 1, 2), msgTest.ExpireTime);

                Assert.AreEqual((MsgEP)"logical://target2", msgTest.TargetEP);
                Assert.AreEqual(msg.ID, msgTest.ID);
                Assert.AreEqual(msg.SessionID, msgTest.SessionID);
                Assert.AreEqual(msg.SendTime, msgTest.SendTime);
                Assert.AreEqual(new DateTime(2002, 1, 2), msgTest.ExpireTime);
                Assert.AreEqual(msg.Body, msgTest.Body);

                store.Remove(persistID);
                Assert.AreEqual(0, store.Count);
                Assert.IsNull(store.GetPersistID(msg.ID));
                Assert.IsNull(store.Get(persistID));
                Assert.IsNull(store.GetInfo(persistID));
            }
            finally
            {
                if (store != null)
                {
                    store.Close();
                }
            }
        }
Example #3
0
        public void MsgQueueMemoryStore_Multiple()
        {
            MsgQueueMemoryStore store = null;
            int           count;
            QueuedMsgInfo msgInfo;
            QueuedMsg     msg;
            object        persistID;

            Guid[] ids;

            try
            {
                store = new MsgQueueMemoryStore();
                store.Open();

                ids = new Guid[MessageCount];

                for (int i = 0; i < MessageCount; i++)
                {
                    msg          = new QueuedMsg();
                    msg.TargetEP = "logical://test/" + i.ToString();
                    msg.Body     = i;
                    msgInfo      = new QueuedMsgInfo(null, msg);

                    store.Add(msgInfo, msg);
                    ids[i] = msg.ID;
                }

                Assert.AreEqual(MessageCount, store.Count);
                count = 0;
                foreach (QueuedMsgInfo i in store)
                {
                    count++;
                }

                Assert.AreEqual(MessageCount, count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }

                for (int i = 0; i < MessageCount; i++)
                {
                    persistID = store.GetPersistID(ids[i]);
                    Assert.IsNotNull(persistID);

                    store.Remove(persistID);
                    Assert.IsNull(store.GetPersistID(ids[i]));
                    Assert.IsNull(store.Get(persistID));
                    Assert.IsNull(store.GetInfo(persistID));
                }
            }
            finally
            {
                if (store != null)
                {
                    store.Close();
                }
            }
        }
Example #4
0
        public void MsgQueueFileStore_Corrupt_Messages()
        {
            MsgQueueFileStore store = null;
            int           count;
            QueuedMsgInfo msgInfo;
            QueuedMsg     msg;
            object        persistID;

            Guid[] ids;
            Dictionary <Guid, bool> corruptIDs;
            List <string>           corruptFiles;

            // Create a store with a bunch of messages then close
            // it and corrupt some of the message files.  Then attempt
            // to open the files and verify that the corrupted files
            // are detected.

            ClearFolders();

            try
            {
                store = new MsgQueueFileStore(root);
                store.Open();

                ids = new Guid[MessageCount];

                for (int i = 0; i < MessageCount; i++)
                {
                    msg          = new QueuedMsg();
                    msg.TargetEP = "logical://test/" + i.ToString();
                    msg.Body     = i;
                    msgInfo      = new QueuedMsgInfo(null, msg);

                    store.Add(msgInfo, msg);
                    ids[i] = msg.ID;
                }

                Assert.AreEqual(MessageCount, store.Count);
                count = 0;
                foreach (QueuedMsgInfo i in store)
                {
                    count++;
                }
                Assert.AreEqual(MessageCount, count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }

                // Corrupt 1/2 of the message files in various ways.

                corruptIDs   = new Dictionary <Guid, bool>();
                corruptFiles = new List <string>();

                for (int i = 0; i < MessageCount / 2; i++)
                {
                    corruptIDs.Add(ids[i], true);
                    corruptFiles.Add(store.GetMessagePath(ids[i], false));
                }

                int cbTruncate = 0;

                for (int i = 0; i < corruptFiles.Count; i++)
                {
                    string file = corruptFiles[i];

                    using (EnhancedFileStream fs = new EnhancedFileStream(file, FileMode.Open, FileAccess.ReadWrite))
                    {
                        if ((i & 1) == 0)
                        {
                            // Truncate the file by at least one byte

                            int cb;

                            cb = Math.Min((int)fs.Length - 1, cbTruncate++);
                            fs.SetLength(cb);
                        }
                        else
                        {
                            // Mess with a byte at random position in the file.

                            int  pos = Helper.Rand((int)fs.Length);
                            byte b;

                            fs.Position = pos;
                            b           = (byte)fs.ReadByte();
                            fs.Position = pos;
                            fs.WriteByte((byte)(~b));
                        }
                    }
                }

                // Load all of the message files and verify that the corrupt files
                // are detected.

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    if (corruptIDs.ContainsKey(id))
                    {
                        try
                        {
                            persistID = store.GetPersistID(id);
                            Assert.IsNotNull(persistID);

                            msgInfo = store.GetInfo(persistID);
                            Assert.IsNotNull(msgInfo);
                            Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                            msg = store.Get(persistID);
                            Assert.Fail("Exception expected");
                        }
                        catch
                        {
                            // Expecting an exception
                        }
                    }
                    else
                    {
                        persistID = store.GetPersistID(id);
                        Assert.IsNotNull(persistID);

                        msgInfo = store.GetInfo(persistID);
                        Assert.IsNotNull(msgInfo);
                        Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                        msg = store.Get(persistID);
                        msg.DeserializedBody();
                        Assert.AreEqual(i, (int)msg.Body);
                    }
                }
            }
            finally
            {
                if (store != null)
                {
                    store.Close();
                }
            }
        }
Example #5
0
        public void MsgQueueFileStore_Corrupt_ExtraMessage()
        {
            MsgQueueFileStore store = null;
            int           count;
            QueuedMsgInfo msgInfo;
            QueuedMsg     msg;
            object        persistID;

            Guid[] ids;

            // Create a store with a bunch of messages then close
            // it and explicitly add a message file.  Then reopen
            // the store and verify that it loaded the metadata
            // for the new message.

            ClearFolders();

            try
            {
                store = new MsgQueueFileStore(root);
                store.Open();

                ids = new Guid[MessageCount];

                for (int i = 0; i < MessageCount; i++)
                {
                    msg          = new QueuedMsg();
                    msg.TargetEP = "logical://test/" + i.ToString();
                    msg.Body     = i;
                    msgInfo      = new QueuedMsgInfo(null, msg);

                    store.Add(msgInfo, msg);
                    ids[i] = msg.ID;
                }

                Assert.AreEqual(MessageCount, store.Count);
                count = 0;
                foreach (QueuedMsgInfo i in store)
                {
                    count++;
                }

                Assert.AreEqual(MessageCount, count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }

                // Close the store and explicitly create a new message file.

                Guid   newID   = Helper.NewGuid();
                string newPath = store.GetMessagePath(newID, true);

                msg          = new QueuedMsg();
                msg.ID       = newID;
                msg.TargetEP = "logical://foo/bar";
                msg.Body     = "Hello World!";
                msgInfo      = new QueuedMsgInfo(null, msg);

                store.WriteMessage(newPath, msg, msgInfo);      // I'm calling this internal write method
                                                                // so that the metadata won't be saved to the index.
                store.Close();

                // Reopen the store and verify that it loaded the metadata
                // for the new message and that the other message metadata is
                // still intact.

                store.Open();
                Assert.AreEqual(MessageCount + 1, store.Count);

                persistID = store.GetPersistID(newID);
                Assert.IsNotNull(persistID);

                msgInfo = store.GetInfo(persistID);
                Assert.IsNotNull(msgInfo);
                Assert.AreEqual((MsgEP)"logical://foo/bar", msgInfo.TargetEP);

                msg = store.Get(persistID);
                msg.DeserializedBody();
                Assert.AreEqual("Hello World!", (string)msg.Body);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }
            }
            finally
            {
                if (store != null)
                {
                    store.Close();
                }
            }
        }
Example #6
0
        public void MsgQueueFileStore_Corrupt_MissingMessage()
        {
            MsgQueueFileStore store = null;
            int           count;
            QueuedMsgInfo msgInfo;
            QueuedMsg     msg;
            object        persistID;

            Guid[] ids;
            Dictionary <Guid, bool> deletedIDs;
            List <string>           deletedFiles;

            // Create a store with a bunch of messages then close
            // it and delete some of the message files.  Then reopen
            // the store and verify that it deleted metadata entries
            // for the removed messages.

            ClearFolders();

            try
            {
                store = new MsgQueueFileStore(root);
                store.Open();

                ids = new Guid[MessageCount];

                for (int i = 0; i < MessageCount; i++)
                {
                    msg          = new QueuedMsg();
                    msg.TargetEP = "logical://test/" + i.ToString();
                    msg.Body     = i;
                    msgInfo      = new QueuedMsgInfo(null, msg);

                    store.Add(msgInfo, msg);
                    ids[i] = msg.ID;
                }

                Assert.AreEqual(MessageCount, store.Count);
                count = 0;
                foreach (QueuedMsgInfo i in store)
                {
                    count++;
                }

                Assert.AreEqual(MessageCount, count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }

                // Close the store and then delete 1/2 of the message files.

                deletedIDs   = new Dictionary <Guid, bool>();
                deletedFiles = new List <string>();

                for (int i = 0; i < MessageCount / 2; i++)
                {
                    deletedIDs.Add(ids[i], true);
                    deletedFiles.Add(store.GetMessagePath(ids[i], false));
                }

                store.Close();

                foreach (string file in deletedFiles)
                {
                    File.Delete(file);
                }

                // Reopen the store and verify that it noticed the deleted files
                // and that their metadata was deleted from the index and remaining message
                // metadata is still intact.

                store.Open();
                Assert.AreEqual(MessageCount - MessageCount / 2, store.Count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    if (deletedIDs.ContainsKey(id))
                    {
                        Assert.IsNull(store.GetPersistID(id));
                    }
                    else
                    {
                        persistID = store.GetPersistID(id);
                        Assert.IsNotNull(persistID);

                        msgInfo = store.GetInfo(persistID);
                        Assert.IsNotNull(msgInfo);
                        Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                        msg = store.Get(persistID);
                        msg.DeserializedBody();
                        Assert.AreEqual(i, (int)msg.Body);
                    }
                }
            }
            finally
            {
                if (store != null)
                {
                    store.Close();
                }
            }
        }
Example #7
0
        public void MsgQueueFileStore_Corrupt_MissingIndex()
        {
            MsgQueueFileStore store = null;
            int           count;
            QueuedMsgInfo msgInfo;
            QueuedMsg     msg;
            object        persistID;

            Guid[] ids;

            // Create a store with a bunch of messages, close it, and
            // then delete the index file.  Then open the store and
            // verify that it rebuilds the index.

            ClearFolders();

            try
            {
                store = new MsgQueueFileStore(root);
                store.Open();

                ids = new Guid[MessageCount];

                for (int i = 0; i < MessageCount; i++)
                {
                    msg          = new QueuedMsg();
                    msg.TargetEP = "logical://test/" + i.ToString();
                    msg.Body     = i;
                    msgInfo      = new QueuedMsgInfo(null, msg);

                    store.Add(msgInfo, msg);
                    ids[i] = msg.ID;
                }

                Assert.AreEqual(MessageCount, store.Count);
                count = 0;
                foreach (QueuedMsgInfo i in store)
                {
                    count++;
                }

                Assert.AreEqual(MessageCount, count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }

                // Close the store, delete the index, then reopen the store and
                // verify that it rebuilt the index.

                store.Close();
                File.Delete(root + "\\messages.index");
                store.Open();
                Assert.AreEqual(MessageCount, store.Count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }
            }
            finally
            {
                if (store != null)
                {
                    store.Close();
                }
            }
        }
Example #8
0
        public void MsgQueueFileStore_Multiple()
        {
            MsgQueueFileStore store = null;
            int           count;
            QueuedMsgInfo msgInfo;
            QueuedMsg     msg;
            object        persistID;

            Guid[] ids;

            ClearFolders();

            try
            {
                store = new MsgQueueFileStore(root);
                store.Open();

                ids = new Guid[MessageCount];

                for (int i = 0; i < MessageCount; i++)
                {
                    msg          = new QueuedMsg();
                    msg.TargetEP = "logical://test/" + i.ToString();
                    msg.Body     = i;
                    msgInfo      = new QueuedMsgInfo(null, msg);

                    store.Add(msgInfo, msg);
                    ids[i] = msg.ID;
                }

                Assert.AreEqual(MessageCount, store.Count);
                count = 0;
                foreach (QueuedMsgInfo i in store)
                {
                    count++;
                }

                Assert.AreEqual(MessageCount, count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }

                // Close and reopen the store, making sure that all of the
                // messages are still there.

                store.Close();
                store.Open();
                Assert.AreEqual(MessageCount, store.Count);

                for (int i = 0; i < ids.Length; i++)
                {
                    Guid id = ids[i];

                    persistID = store.GetPersistID(id);
                    Assert.IsNotNull(persistID);

                    msgInfo = store.GetInfo(persistID);
                    Assert.IsNotNull(msgInfo);
                    Assert.AreEqual((MsgEP)("logical://test/" + i.ToString()), msgInfo.TargetEP);

                    msg = store.Get(persistID);
                    msg.DeserializedBody();
                    Assert.AreEqual(i, (int)msg.Body);
                }

                // Remove all of the messges and verify that they're gone

                for (int i = 0; i < MessageCount; i++)
                {
                    persistID = store.GetPersistID(ids[i]);
                    Assert.IsNotNull(persistID);

                    store.Remove(persistID);
                    Assert.IsNull(store.GetPersistID(ids[i]));
                    Assert.IsNull(store.Get(persistID));
                    Assert.IsNull(store.GetInfo(persistID));
                }

                // Close and reopen the store and verify that there are no messages.

                store.Close();
                store.Open();

                Assert.AreEqual(0, store.Count);
            }
            finally
            {
                if (store != null)
                {
                    store.Close();
                }
            }
        }