Пример #1
0
        public void Enqueue_and_dequeue_million_items_restart_queue()
        {
            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int i = 0; i < largeCount; i++)
                    {
                        session.Enqueue(Guid.NewGuid().ToByteArray());
                    }
                    session.Flush();
                }
            }

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int i = 0; i < largeCount; i++)
                    {
                        Ignore(new Guid(session.Dequeue()));
                    }
                    session.Flush();
                }
            }
        }
 public void Can_get_count_from_queue()
 {
     using (var queue = new PersistentQueue(path))
     {
         Assert.AreEqual(0, queue.EstimatedCountOfItemsInQueue);
     }
 }
Пример #3
0
        //[ExpectedException(typeof(InvalidOperationException),ExpectedMessage =  "End of file reached while trying to read queue item")]
        public void If_data_stream_is_truncated_will_raise_error()
        {
            using (var queue = new PersistentQueue(path))
                using (var session = queue.OpenSession())
                {
                    session.Enqueue(new byte[] { 1, 2, 3, 4 });
                    session.Flush();
                }
            using (var fs = new FileStream(Path.Combine(path, "data.0"), FileMode.Open))
            {
                fs.SetLength(2);//corrupt the file
            }

            var invalidOperationException = Assert.Throws <InvalidOperationException>(() =>
            {
                using (var queue = new PersistentQueue(path))
                {
                    using (var session = queue.OpenSession())
                    {
                        session.Dequeue();
                    }
                }
            });

            Assert.That(invalidOperationException.Message, Is.EqualTo("End of file reached while trying to read queue item"));
        }
Пример #4
0
        public void Can_handle_zero_length_entries_at_end()
        {
            using (var queue = new PersistentQueue(Path)
            {
                // avoid auto tx log trimming
                TrimTransactionLogOnDispose = false
            })
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 19; j++)
                    {
                        session.Enqueue(new byte[] { 1 });
                        session.Flush();
                    }
                    session.Enqueue(new byte[0]);
                    session.Flush();
                }
            }

            using (var queue = new PersistentQueue(Path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        Assert.IsNotNull(session.Dequeue());
                        session.Flush();
                    }
                }
            }
        }
Пример #5
0
 public void Can_resume_writing_to_second_file_when_restart_queue()
 {
     using (var queue = new PersistentQueue(Path, 10))
     {
         for (byte i = 0; i < 11; i++)
         {
             using (var session = queue.OpenSession())
             {
                 session.Enqueue(new[] { i });
                 session.Flush();
             }
         }
         Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
     }
     using (var queue = new PersistentQueue(Path, 10))
     {
         for (byte i = 0; i < 2; i++)
         {
             using (var session = queue.OpenSession())
             {
                 session.Enqueue(new[] { i });
                 session.Flush();
             }
         }
         Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
     }
 }
Пример #6
0
        public void Enque_remote_files_and_download()
        {
            var queue = new PersistentQueue(Path.Combine(_fileStorePath, "_FileQueueTest"));

            using (var session = queue.OpenSession())
            {
                //clean queue
                while (session.Dequeue() != null)
                {
                    ;
                }
                for (int i = 0; i < 2; i++)
                {
                    session.Enqueue(Encoding.UTF8.GetBytes(@"http://jx.taedu.gov.cn:83//Resource.Portal.Web/SubjectResource/DownloadById/030183bb-409f-43be-b3dd-4dd683e7dffc"));

                    session.Enqueue(Encoding.UTF8.GetBytes(@"http://jx.taedu.gov.cn:83/Storages/温秀云/2016/8/1/image/师说2_104707/jpg/师说2.jpg"));

                    session.Enqueue(Encoding.UTF8.GetBytes(@"http://jx.taedu.gov.cn:83/Storages/张华/2016/9/12/image/劝学01_110337/jpg/劝学01.jpg"));

                    session.Enqueue(Encoding.UTF8.GetBytes(@"http://jx.taedu.gov.cn:83/Storages/晁阳/2016/9/8/flash/正多边形内角和_181554/swf/正多边形内角和.swf"));

                    session.Enqueue(Encoding.UTF8.GetBytes(@"http://jx.taedu.gov.cn:83/Storages/周小广/2016/9/13/pdf/一年级英语上册-Unit1-School(2)课件-人教新起点_155027/pdf/一年级英语上册-Unit1-School(2)课件-人教新起点.pdf"));
                }

                session.Flush();
            }

            IWorker filePuller = new FilePuller(_fileStorePath,
                                                _filePuller_Interval, _filePuller_DownloadTimeout, _filePuller_RetryTimes, queue);

            filePuller.Start();

            Thread.Sleep(100000);
        }
Пример #7
0
        public void Enque_some_files_and_download_multiThread()
        {
            var queue = new PersistentQueue(Path.Combine(_fileStorePath, "_FileQueue"));

            IWorker fileServer = new FileServer(_fileServer_Port, _fileStorePath, queue);

            fileServer.Start();


            using (var session = queue.OpenSession())
            {
                //clean queue
                while (session.Dequeue() != null)
                {
                    ;
                }

                //20 images and 1 mp4
                foreach (var file in Directory.GetFiles(@"D:\Files\Source", "*", SearchOption.AllDirectories))
                {
                    session.Enqueue(Encoding.UTF8.GetBytes(file.Replace(@"D:\Files\Source\", @"http://localhost:9001/file/Source/")));
                }

                session.Flush();
            }

            for (int i = 0; i < 5; i++)
            {
                new FilePuller(_fileStorePath,
                               _filePuller_Interval, _filePuller_DownloadTimeout, _filePuller_RetryTimes, queue).Start();
            }

            Thread.Sleep(100000);
        }
        public void Can_dequeue_from_all_files()
        {
            using (var queue = new PersistentQueue(path, 10))
            {
                for (byte i = 0; i < 12; i++)
                {
                    using (var session = queue.OpenSession())
                    {
                        session.Enqueue(new[] { i });
                        session.Flush();
                    }
                }
                Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
            }

            using (var queue = new PersistentQueue(path, 10))
            {
                for (byte i = 0; i < 12; i++)
                {
                    using (var session = queue.OpenSession())
                    {
                        Assert.AreEqual(i, session.Dequeue()[0]);
                        session.Flush();
                    }
                }
            }
        }
Пример #9
0
        public void Enque_remote_files_and_download_multiThread()
        {
            var queue = new PersistentQueue(Path.Combine(_fileStorePath, "_FileQueue"));

            using (var session = queue.OpenSession())
            {
                //加入多个重复文件
                //当文件开始下载时就已经创建了,其他线程下载同样文件时,会检测到已下载(比较UpdateTime)而跳过
                for (int i = 0; i < 10; i++)
                {
                    //10m左右
                    session.Enqueue(Encoding.UTF8.GetBytes(@"http://jx.taedu.gov.cn:83/Resource.Portal.Web/SubjectResource/DownloadById/7923654c-189c-454f-bc0f-58dac38d2f78"));
                }

                session.Flush();
            }

            for (int i = 0; i < 5; i++)
            {
                new FilePuller(_fileStorePath,
                               _filePuller_Interval, _filePuller_DownloadTimeout, _filePuller_RetryTimes, queue).Start();
            }

            Thread.Sleep(100000);
        }
Пример #10
0
        public void Can_dequeue_from_all_files()
        {
            using (var queue = new PersistentQueue(Path, 10))
            {
                for (byte i = 0; i < 12; i++)
                {
                    using (var session = queue.OpenSession())
                    {
                        session.Enqueue(new[] { i });
                        session.Flush();
                    }
                }
                Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
            }

            using (var queue = new PersistentQueue(Path, 10))
            {
                for (byte i = 0; i < 12; i++)
                {
                    using (var session = queue.OpenSession())
                    {
                        Assert.AreEqual(i, session.Dequeue()[0]);
                        session.Flush();
                    }
                }
            }
        }
Пример #11
0
 public void Can_limit_amount_of_items_in_queue_file()
 {
     using (IPersistentQueue queue = new PersistentQueue(Path, 10))
     {
         Assert.AreEqual(10, queue.MaxFileSize);
     }
 }
Пример #12
0
 public void Can_get_count_from_queue()
 {
     using (var queue = new PersistentQueue(Path))
     {
         Assert.AreEqual(0, queue.EstimatedCountOfItemsInQueue);
     }
 }
Пример #13
0
        public void Enqueue_and_dequeue_large_items_with_restart_queue()
        {
            var random     = new Random();
            var itemsSizes = new List <int>();

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int i = 0; i < smallCount; i++)
                    {
                        var data = new byte[random.Next(1024 * 512, 1024 * 1024)];
                        itemsSizes.Add(data.Length);
                        session.Enqueue(data);
                    }
                    session.Flush();
                }
            }

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int i = 0; i < smallCount; i++)
                    {
                        Assert.AreEqual(itemsSizes[i], session.Dequeue().Length);
                    }
                    session.Flush();
                }
            }
        }
Пример #14
0
        public void After_reading_all_items_from_file_that_is_not_the_active_file_should_delete_file()
        {
            using (var queue = new PersistentQueue(Path, 10))
            {
                for (byte i = 0; i < 12; i++)
                {
                    using (var session = queue.OpenSession())
                    {
                        session.Enqueue(new[] { i });
                        session.Flush();
                    }
                }
                Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
            }

            using (var queue = new PersistentQueue(Path, 10))
            {
                for (byte i = 0; i < 12; i++)
                {
                    using (var session = queue.OpenSession())
                    {
                        Assert.AreEqual(i, session.Dequeue()[0]);
                        session.Flush();
                    }
                }
            }

            Assert.IsFalse(
                File.Exists(System.IO.Path.Combine(Path, "data.0"))
                );
        }
        private static PersistentQueue <CommandDefinition> BuildCommandQueue()
        {
            var commands = new PersistentQueue <CommandDefinition>(null,
                                                                   new Session {
                Attributes = new Dictionary <string, object>()
            }, "testQueue");

            commands.Enqueue(new CommandDefinition {
                IntentName = "1"
            });
            commands.Enqueue(new CommandDefinition {
                IntentName = "2"
            });
            commands.Enqueue(new CommandDefinition {
                IntentName = "3"
            });
            commands.Enqueue(new CommandDefinition {
                IntentName = "4"
            });
            commands.Enqueue(new CommandDefinition {
                IntentName = "5"
            });

            return(commands);
        }
Пример #16
0
        public void After_reading_all_items_from_file_that_is_not_the_active_file_should_delete_file()
        {
            using (var queue = new PersistentQueue(path, 10))
            {
                for (byte i = 0; i < 12; i++)
                {
                    using (var session = queue.OpenSession())
                    {
                        session.Enqueue(new[] { i });
                        session.Flush();
                    }
                }
                Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
            }

            using (var queue = new PersistentQueue(path, 10))
            {
                for (byte i = 0; i < 12; i++)
                {
                    using (var session = queue.OpenSession())
                    {
                        Assert.AreEqual(i, session.Dequeue()[0]);
                        session.Flush();
                    }
                }
            }

            Assert.IsFalse(
                File.Exists(Path.Combine(path, "data.0"))
                );
        }
Пример #17
0
        public void Will_remove_truncated_transaction()
        {
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(BitConverter.GetBytes(j));
                        session.Flush();
                    }
                }
            }

            using (var txLog = txLogInfo.Open(FileMode.Open))
            {
                txLog.SetLength(5);// corrupt all transactions
                txLog.Flush();
            }

            new PersistentQueue(path).Dispose();

            txLogInfo.Refresh();

            Assert.AreEqual(36, txLogInfo.Length);//empty transaction size
        }
Пример #18
0
        public void Can_handle_transaction_with_only_zero_length_entries()
        {
            using (var queue = new PersistentQueue(path)
            {
                // avoid auto tx log trimming
                TrimTransactionLogOnDispose = false
            })
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(new byte[0]);
                        session.Flush();
                    }
                }
            }

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        Assert.IsEmpty(session.Dequeue());
                    }
                    Assert.IsNull(session.Dequeue());
                    session.Flush();
                }
            }
        }
Пример #19
0
        public void Can_handle_start_separator_used_as_data()
        {
            using (var queue = new PersistentQueue(path)
            {
                // avoid auto tx log trimming
                TrimTransactionLogOnDispose = false
            })
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(Constants.StartTransactionSeparator); // ???
                        session.Flush();
                    }
                    session.Flush();
                }
            }

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    Assert.AreEqual(Constants.StartTransactionSeparator, session.Dequeue());
                    session.Flush();
                }
            }
        }
Пример #20
0
        public void Transaction_log_size_shrink_after_queue_disposed()
        {
            long txSizeWhenOpen;
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));
            using (var queue = new PersistentQueue(path))
            {
                queue.Internals.ParanoidFlushing = false;
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Enqueue(Guid.NewGuid().ToByteArray());
                    }
                    session.Flush();
                }

                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Dequeue();
                    }
                    session.Flush();
                }
                txSizeWhenOpen = txLogInfo.Length;
            }
            txLogInfo.Refresh();
            Assert.Less(txLogInfo.Length, txSizeWhenOpen);
        }
Пример #21
0
        public void Count_of_items_will_remain_fixed_after_dequeueing_without_flushing()
        {
            using (var queue = new PersistentQueue(path))
            {
                queue.Internals.ParanoidFlushing = false;
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Enqueue(Guid.NewGuid().ToByteArray());
                    }
                    session.Flush();
                }

                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Dequeue();
                    }
                    Assert.IsNull(session.Dequeue());

                    //	session.Flush(); explicitly removed
                }
            }
            using (var queue = new PersistentQueue(path))
            {
                Assert.AreEqual(10, queue.EstimatedCountOfItemsInQueue);
            }
        }
Пример #22
0
        public void Can_handle_truncated_start_transaction_seperator()
        {
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));

            using (var queue = new PersistentQueue(path)
            {
                // avoid auto tx log trimming
                TrimTransactionLogOnDispose = false
            })
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(BitConverter.GetBytes(j));
                        session.Flush();
                    }
                }
            }

            using (var txLog = txLogInfo.Open(FileMode.Open))
            {
                txLog.SetLength(5); // truncate log to halfway through start marker
                txLog.Flush();
            }

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    Assert.IsNull(session.Dequeue());// the last transaction was corrupted
                    session.Flush();
                }
            }
        }
Пример #23
0
        public void Can_handle_truncated_start_transaction_seperator()
        {
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));

            using (var queue = new PersistentQueue(path)
            {
                // avoid auto tx log trimming
                TrimTransactionLogOnDispose = false
            })
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(BitConverter.GetBytes(j));
                        session.Flush();
                    }
                }
            }

            using (var txLog = txLogInfo.Open(FileMode.Open))
            {
                txLog.SetLength(5);// corrupt last transaction
                txLog.Flush();
            }

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    Assert.IsNull(session.Dequeue());// the last transaction was corrupted
                    session.Flush();
                }
            }
        }
Пример #24
0
        public void Count_of_items_will_remain_fixed_after_dequeqing_without_flushing()
        {
            using (var queue = new PersistentQueue(path))
            {
                queue.Internals.ParanoidFlushing = false;
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Enqueue(Guid.NewGuid().ToByteArray());
                    }
                    session.Flush();
                }

                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Dequeue();
                    }
                    Assert.IsNull(session.Dequeue());

                    //	session.Flush(); explicitly removed
                }
            }
            using (var queue = new PersistentQueue(path))
            {
                Assert.AreEqual(10, queue.EstimatedCountOfItemsInQueue);
            }
        }
Пример #25
0
 public void Dequeing_from_empty_queue_will_return_null()
 {
     using (var queue = new PersistentQueue(Path))
         using (var session = queue.OpenSession())
         {
             Assert.IsNull(session.Dequeue());
         }
 }
Пример #26
0
 internal static void EnqueueMixpanelQueue(PersistentQueue persistentQueue, Value data)
 {
     using (PersistentQueueSession session = persistentQueue.OpenSession())
     {
         session.Enqueue(Encoding.UTF8.GetBytes(JsonUtility.ToJson(data)));
         SeembaMixpanel.Put(data);
         session.Flush();
     }
 }
Пример #27
0
 public void Can_enqueue_data_in_queue()
 {
     using (var queue = new PersistentQueue(Path))
         using (var session = queue.OpenSession())
         {
             session.Enqueue(new byte[] { 1, 2, 3, 4 });
             session.Flush();
         }
 }
 private void Enqueue(string queueName, string data)
 {
     using (var queue = PersistentQueue.WaitFor(Path.Combine(queryRoot, queueName), TimeSpan.FromSeconds(30)))
         using (var session = queue.OpenSession())
         {
             session.Enqueue(Encoding.UTF8.GetBytes(data));
             session.Flush();
         }
 }
Пример #29
0
 public void Queueing_and_dequeueing_empty_data_is_handled()
 {
     using (var queue = new PersistentQueue(Path))
         using (var session = queue.OpenSession())
         {
             session.Enqueue(new byte[0]);
             session.Flush();
             CollectionAssert.AreEqual(new byte[0], session.Dequeue());
         }
 }
Пример #30
0
 public void Can_dequeue_data_from_queue()
 {
     using (var queue = new PersistentQueue(Path))
         using (var session = queue.OpenSession())
         {
             session.Enqueue(new byte[] { 1, 2, 3, 4 });
             session.Flush();
             CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, session.Dequeue());
         }
 }
Пример #31
0
        private void DoFlush(string url, PersistentQueue queue)
        {
            int depth = queue.CurrentCountOfItemsInQueue;
            int count = (depth / BatchSize) + (depth % BatchSize != 0 ? 1 : 0);

            for (int i = 0; i < count; i++)
            {
                StartCoroutine(DoRequest(url, queue));
            }
        }
        public void AddingString_UpdatesInputQueue()
        {
            var inputQueue = new PersistentQueue <InputItem>(null, new Session {
                Attributes = new Dictionary <string, object>()
            }, "testQueue");

            inputQueue.Enqueue("test");

            Assert.That(inputQueue.LastItem().Value, Is.EqualTo("test"));
        }
 public void Can_dequeue_data_from_queue()
 {
     using (var queue = new PersistentQueue(path))
     using (var session = queue.OpenSession())
     {
         session.Enqueue(new byte[] { 1, 2, 3, 4 });
         session.Flush();
         CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, session.Dequeue());
     }
 }
Пример #34
0
 void AddToQueue(byte[] data)
 {
     Thread.Sleep(150);
     using (var queue = PersistentQueue.WaitFor(SharedStorage, TimeSpan.FromSeconds(30)))
         using (var session = queue.OpenSession())
         {
             session.Enqueue(data);
             session.Flush();
         }
 }
Пример #35
0
 byte[] ReadQueue()
 {
     Thread.Sleep(150);
     using (var queue = PersistentQueue.WaitFor(SharedStorage, TimeSpan.FromSeconds(30)))
         using (var session = queue.OpenSession())
         {
             var data = session.Dequeue();
             session.Flush();
             return(data);
         }
 }
Пример #36
0
        private IEnumerator DoRequest(string url, PersistentQueue queue, int retryCount = 0)
        {
            int   count = 0;
            Value batch = Mixpanel.ArrayPool.Get();

            using (PersistentQueueSession session = queue.OpenSession())
            {
                while (count < BatchSize)
                {
                    byte[] data = session.Dequeue();
                    if (data == null)
                    {
                        break;
                    }
                    batch.Add(JsonUtility.FromJson <Value>(Encoding.UTF8.GetString(data)));
                    ++count;
                }
                // If the batch is empty don't send the request
                if (count == 0)
                {
                    yield break;
                }
                string payload = Convert.ToBase64String(Encoding.UTF8.GetBytes(batch.ToString()));
                if (MixpanelSettings.Instance.ShowDebug)
                {
                    Debug.Log($"[Mixpanel] Sending Request - '{url}' with payload '{payload}'");
                }
                WWWForm form = new WWWForm();
                form.AddField("data", payload);
                UnityWebRequest request = UnityWebRequest.Post(url, form);
                yield return(request.SendWebRequest());

                while (!request.isDone)
                {
                    yield return(new WaitForEndOfFrame());
                }
                if (!request.isNetworkError && !request.isHttpError)
                {
                    session.Flush();
                    Mixpanel.Put(batch);
                    yield break;
                }
                if (retryCount > RetryMaxTries)
                {
                    yield break;
                }
            }
            retryCount += 1;
            // 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024 = 2046 seconds total
            yield return(new WaitForSecondsRealtime((float)Math.Pow(2, retryCount)));

            StartCoroutine(DoRequest(url, queue, retryCount));
        }
        public async Task SimpleTest()
        {
            var item = new TestDTO();
            var config = new PersistentQueueConfiguration(_queueName);
            config.DataDirectory = Path.GetTempPath();

            var sut = new PersistentQueue<TestDTO>(config);
            await sut.EnqueueAsync(item);
            var actual = await sut.DequeueAsync();

            actual.Id.Should().Be(item.Id);
            actual.UserName.Should().Be(item.UserName);
        }
 public void Can_enter_items_and_get_count_of_items()
 {
     using (var queue = new PersistentQueue(path))
     {
         for (byte i = 0; i < 5; i++)
         {
             using (var session = queue.OpenSession())
             {
                 session.Enqueue(new[] { i });
                 session.Flush();
             }
         }
         Assert.AreEqual(5, queue.EstimatedCountOfItemsInQueue);
     }
 }
        public void After_dequeue_from_queue_item_no_longer_on_queue()
        {
            using (var queue = new PersistentQueue(path))
            using (var session = queue.OpenSession())
            {
                session.Enqueue(new byte[] { 1, 2, 3, 4 });
                session.Flush();
            }

            using (var queue = new PersistentQueue(path))
            using (var session = queue.OpenSession())
            {
                CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, session.Dequeue());
                Assert.IsNull(session.Dequeue());
                session.Flush();
            }
        }
 public void If_data_stream_is_truncated_will_raise_error()
 {
     using (var queue = new PersistentQueue(path))
     using (var session = queue.OpenSession())
     {
         session.Enqueue(new byte[] { 1, 2, 3, 4 });
         session.Flush();
     }
     using (var fs = new FileStream(Path.Combine(path, "data.0"), FileMode.Open))
     {
         fs.SetLength(2);//corrupt the file
     }
     using (var queue = new PersistentQueue(path))
     using (var session = queue.OpenSession())
     {
         session.Dequeue();
     }
 }
Пример #41
0
        public void Dequeue_items_that_were_not_flushed_will_appear_after_queue_restart()
        {
            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Enqueue(Guid.NewGuid().ToByteArray());
                    }
                    session.Flush();
                }

                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Dequeue();
                    }
                    Assert.IsNull(session.Dequeue());

                    //	session.Flush(); explicitly removed
                }
            }
            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Dequeue();
                    }
                    Assert.IsNull(session.Dequeue());
                    session.Flush();
                }
            }
        }
Пример #42
0
 public void Entering_more_than_count_of_items_will_work()
 {
     using (var queue = new PersistentQueue(path, 10))
     {
         for (byte i = 0; i < 11; i++)
         {
             using (var session = queue.OpenSession())
             {
                 session.Enqueue(new[] { i });
                 session.Flush();
             }
         }
         Assert.AreEqual(11, queue.EstimatedCountOfItemsInQueue);
     }
 }
Пример #43
0
 public void When_creating_more_items_than_allowed_in_first_file_will_create_additional_file()
 {
     using (var queue = new PersistentQueue(path, 10))
     {
         for (byte i = 0; i < 11; i++)
         {
             using (var session = queue.OpenSession())
             {
                 session.Enqueue(new[] { i });
                 session.Flush();
             }
         }
         Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
     }
 }
 public void Dequeing_from_empty_queue_will_return_null()
 {
     using (var queue = new PersistentQueue(path))
     using (var session = queue.OpenSession())
     {
         Assert.IsNull(session.Dequeue());
     }
 }
Пример #45
0
        public void Truncated_transaction_is_ignored_and_can_continue_to_add_items_to_queue()
        {
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));

            using (var queue = new PersistentQueue(path)
            {
                // avoid auto tx log trimming
                TrimTransactionLogOnDispose = false
            })
            {
                queue.Internals.ParanoidFlushing = false;
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(BitConverter.GetBytes(j));
                        session.Flush();
                    }
                }
            }

            using (var txLog = txLogInfo.Open(FileMode.Open))
            {
                txLog.SetLength(txLog.Length - 5);// corrupt last transaction
                txLog.Flush();
            }

            using (var queue = new PersistentQueue(path)
            {
                // avoid auto tx log trimming
                TrimTransactionLogOnDispose = false
            })
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 20; j < 40; j++)
                    {
                        session.Enqueue(BitConverter.GetBytes(j));
                    }
                    session.Flush();
                }
            }

            var data = new List<int>();
            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    var dequeue = session.Dequeue();
                    while (dequeue != null)
                    {
                        data.Add(BitConverter.ToInt32(dequeue, 0));
                        dequeue = session.Dequeue();
                    }
                    session.Flush();
                }
            }
            var expected = 0;
            foreach (var i in data)
            {
                if (expected == 19)
                    continue;
                Assert.AreEqual(expected, data[i]);
                expected++;
            }
        }
Пример #46
0
        public void If_tx_log_grows_too_large_it_will_be_trimmed_while_queue_is_in_operation()
        {
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));

            using (var queue = new PersistentQueue(path)
            {
                SuggestedMaxTransactionLogSize = 32 // single entry
            })
            {
                queue.Internals.ParanoidFlushing = false;

                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(Guid.NewGuid().ToByteArray());
                    }
                    session.Flush();
                }
                // there is no way optimize here, so we should get expected size, even though it is bigger than
                // what we suggested as the max
                txLogInfo.Refresh();
                long txSizeWhenOpen = txLogInfo.Length;

                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Dequeue();
                    }
                    Assert.IsNull(session.Dequeue());

                    session.Flush();
                }
                txLogInfo.Refresh();
                Assert.Less(txLogInfo.Length, txSizeWhenOpen);
            }
        }
        public void Two_sessions_off_the_same_queue_cannot_get_same_item()
        {
            using (var queue = new PersistentQueue(path))
            using (var session = queue.OpenSession())
            {
                session.Enqueue(new byte[] { 1, 2, 3, 4 });
                session.Flush();
            }

            using (var queue = new PersistentQueue(path))
            using (var session2 = queue.OpenSession())
            using (var session1 = queue.OpenSession())
            {
                CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, session1.Dequeue());
                Assert.IsNull(session2.Dequeue());
            }
        }
 public void Can_enqueue_data_in_queue()
 {
     using (var queue = new PersistentQueue(path))
     using (var session = queue.OpenSession())
     {
         session.Enqueue(new byte[] { 1, 2, 3, 4 });
         session.Flush();
     }
 }
Пример #49
0
 public void Can_limit_amount_of_items_in_queue_file()
 {
     using (IPersistentQueue queue = new PersistentQueue(path, 10))
     {
         Assert.AreEqual(10, queue.MaxFileSize);
     }
 }
Пример #50
0
        public void Transaction_log_size_shrink_after_queue_disposed()
        {
            long txSizeWhenOpen;
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));
            using (var queue = new PersistentQueue(path))
            {
                queue.Internals.ParanoidFlushing = false;
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Enqueue(Guid.NewGuid().ToByteArray());
                    }
                    session.Flush();
                }

                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 10; j++)
                    {
                        session.Dequeue();
                    }
                    session.Flush();
                }
                txSizeWhenOpen = txLogInfo.Length;
            }
            txLogInfo.Refresh();
            Assert.Less(txLogInfo.Length, txSizeWhenOpen);
        }
Пример #51
0
        public void Will_remove_truncated_transaction()
        {
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(BitConverter.GetBytes(j));
                        session.Flush();
                    }
                }
            }

            using (var txLog = txLogInfo.Open(FileMode.Open))
            {
                txLog.SetLength(5);// corrupt all transactions
                txLog.Flush();
            }

            new PersistentQueue(path).Dispose();

            txLogInfo.Refresh();

            Assert.AreEqual(36, txLogInfo.Length);//empty transaction size
        }
Пример #52
0
 public void Can_resume_writing_to_second_file_when_restart_queue()
 {
     using (var queue = new PersistentQueue(path, 10))
     {
         for (byte i = 0; i < 11; i++)
         {
             using (var session = queue.OpenSession())
             {
                 session.Enqueue(new[] { i });
                 session.Flush();
             }
         }
         Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
     }
     using (var queue = new PersistentQueue(path, 10))
     {
         for (byte i = 0; i < 2; i++)
         {
             using (var session = queue.OpenSession())
             {
                 session.Enqueue(new[] { i });
                 session.Flush();
             }
         }
         Assert.AreEqual(1, queue.Internals.CurrentFileNumber);
     }
 }
        public void Not_flushing_the_session_will_revert_dequequed_items_two_sessions_same_queue()
        {
            using (var queue = new PersistentQueue(path))
            using (var session = queue.OpenSession())
            {
                session.Enqueue(new byte[] { 1, 2, 3, 4 });
                session.Flush();
            }

            using (var queue = new PersistentQueue(path))
            using (var session2 = queue.OpenSession())
            {
                using (var session1 = queue.OpenSession())
                {
                    CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, session1.Dequeue());
                    //Explicitly ommitted: session.Flush();
                }
                CollectionAssert.AreEqual(new byte[] { 1, 2, 3, 4 }, session2.Dequeue());
                session2.Flush();
            }
        }
Пример #54
0
        public void Truncated_transaction_is_ignored()
        {
            var txLogInfo = new FileInfo(Path.Combine(path, "transaction.log"));

            using (var queue = new PersistentQueue(path)
            {
                // avoid auto tx log trimming
                TrimTransactionLogOnDispose = false
            })
            {
                queue.Internals.ParanoidFlushing = false;

                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 20; j++)
                    {
                        session.Enqueue(BitConverter.GetBytes(j));
                        session.Flush();
                    }
                }
            }

            using (var txLog = txLogInfo.Open(FileMode.Open))
            {
                txLog.SetLength(txLog.Length - 5);// corrupt last transaction
                txLog.Flush();
            }

            using (var queue = new PersistentQueue(path))
            {
                using (var session = queue.OpenSession())
                {
                    for (int j = 0; j < 19; j++)
                    {
                        Assert.AreEqual(j, BitConverter.ToInt32(session.Dequeue(), 0));
                    }
                    Assert.IsNull(session.Dequeue());// the last transaction was corrupted
                    session.Flush();
                }
            }
        }