Example #1
0
        public void DrainToWithWritersTest()
        {
            var queue = new CostBoundedConcurrentQueue <string>(10000, new StringLengthCostAssigner());

            for (int i = 0; i < 5000; i++)
            {
                queue.Enqueue(BuildStringOfSize(2));
            }

            Assert.Equal(10000, queue.Cost);

            // start background writer that will attempt to enqueue
            // new messages while we drain
            var writerThread = StartBackgroundWriter(queue, 1, 7000);

            Thread.Sleep(100);
            var drainCollection = new List <string>();

            queue.DrainTo(drainCollection);

            // only the original 5000 messages should be drained, none
            // of the newly-written messages
            Assert.Equal(5000, drainCollection.Count);

            // background writer should finish writing
            Thread.Sleep(1000);
            drainCollection.Clear();
            queue.DrainTo(drainCollection);
            Assert.Equal(7000, drainCollection.Count);

            if (writerThread.IsAlive)
            {
                writerThread.Abort();
            }
        }
        public void DrainToWithWritersTest()
        {
            var queue = new CostBoundedConcurrentQueue<string>(10000, new StringLengthCostAssigner());
            for (int i = 0; i < 5000; i++)
            {
                queue.Enqueue(BuildStringOfSize(2));
            }

            Assert.Equal(10000, queue.Cost);

            // start background writer that will attempt to enqueue
            // new messages while we drain
            var writerThread = StartBackgroundWriter(queue, 1, 7000);
            Thread.Sleep(100);
            var drainCollection = new List<string>();
            queue.DrainTo(drainCollection);

            // only the original 5000 messages should be drained, none
            // of the newly-written messages
            Assert.Equal(5000, drainCollection.Count);

            // background writer should finish writing
            Thread.Sleep(1000);
            drainCollection.Clear();
            queue.DrainTo(drainCollection);
            Assert.Equal(7000, drainCollection.Count);

            if (writerThread.IsAlive)
            {
                writerThread.Abort();
            }
        }
 public void InsertBeyondCapacityTest()
 {
     var queue = new CostBoundedConcurrentQueue<string>(20, new StringLengthCostAssigner());
     Assert.True(queue.Enqueue(BuildStringOfSize(9)));
     Assert.True(queue.Enqueue(BuildStringOfSize(11)));
     Assert.Equal(2, queue.Count);
     Assert.False(queue.Enqueue(BuildStringOfSize(1)));
     Assert.Equal(20, queue.Cost);
 }
Example #4
0
        public void InsertBeyondCapacityTest()
        {
            var queue = new CostBoundedConcurrentQueue <string>(20, new StringLengthCostAssigner());

            Assert.True(queue.Enqueue(BuildStringOfSize(9)));
            Assert.True(queue.Enqueue(BuildStringOfSize(11)));
            Assert.Equal(2, queue.Count);
            Assert.False(queue.Enqueue(BuildStringOfSize(1)));
            Assert.Equal(20, queue.Cost);
        }
 public void DrainToTest()
 {
     var queue = new CostBoundedConcurrentQueue<string>(1000, new StringLengthCostAssigner());
     queue.Enqueue(BuildStringOfSize(600));
     queue.Enqueue(BuildStringOfSize(200));
     Assert.Equal(800, queue.Cost);
     queue.DrainTo(new List<string>());
     Assert.Equal(0, queue.Cost);
     Assert.Equal(0, queue.Count);
 }
Example #6
0
        public void DrainToTest()
        {
            var queue = new CostBoundedConcurrentQueue <string>(1000, new StringLengthCostAssigner());

            queue.Enqueue(BuildStringOfSize(600));
            queue.Enqueue(BuildStringOfSize(200));
            Assert.Equal(800, queue.Cost);
            queue.DrainTo(new List <string>());
            Assert.Equal(0, queue.Cost);
            Assert.Equal(0, queue.Count);
        }
 public void InsertElementInQueueTest()
 {
     var queue = new CostBoundedConcurrentQueue<string>(100, new StringLengthCostAssigner());
     queue.Enqueue("hello");
     queue.Enqueue("bye");
     Assert.Equal(2, queue.Count);
     Assert.Equal(8, queue.Cost);
     Assert.Equal("hello", queue.Dequeue());
     Assert.Equal(1, queue.Count);
     Assert.Equal("bye", queue.Dequeue());
     Assert.Equal(0, queue.Count);
 }
Example #8
0
        public void InsertElementInQueueTest()
        {
            var queue = new CostBoundedConcurrentQueue <string>(100, new StringLengthCostAssigner());

            queue.Enqueue("hello");
            queue.Enqueue("bye");
            Assert.Equal(2, queue.Count);
            Assert.Equal(8, queue.Cost);
            Assert.Equal("hello", queue.Dequeue());
            Assert.Equal(1, queue.Count);
            Assert.Equal("bye", queue.Dequeue());
            Assert.Equal(0, queue.Count);
        }
 public void SizeAndCapacityTest()
 {
     var queue = new CostBoundedConcurrentQueue<string>(20, new StringLengthCostAssigner());
     queue.Enqueue(BuildStringOfSize(9));
     queue.Enqueue(BuildStringOfSize(11));
     queue.Enqueue(BuildStringOfSize(11));
     Assert.Equal(20, queue.Cost);
     Assert.Equal(2, queue.Count);
     queue.Dequeue();
     Assert.Equal(11, queue.Cost);
     Assert.Equal(1, queue.Count);
     queue.Enqueue(BuildStringOfSize(3));
     Assert.Equal(2, queue.Count);
     queue.Enqueue(BuildStringOfSize(3));
     Assert.Equal(3, queue.Count);
     Assert.Equal(17, queue.Cost);
 }
Example #10
0
        public void SizeAndCapacityTest()
        {
            var queue = new CostBoundedConcurrentQueue <string>(20, new StringLengthCostAssigner());

            queue.Enqueue(BuildStringOfSize(9));
            queue.Enqueue(BuildStringOfSize(11));
            queue.Enqueue(BuildStringOfSize(11));
            Assert.Equal(20, queue.Cost);
            Assert.Equal(2, queue.Count);
            queue.Dequeue();
            Assert.Equal(11, queue.Cost);
            Assert.Equal(1, queue.Count);
            queue.Enqueue(BuildStringOfSize(3));
            Assert.Equal(2, queue.Count);
            queue.Enqueue(BuildStringOfSize(3));
            Assert.Equal(3, queue.Count);
            Assert.Equal(17, queue.Cost);
        }
Example #11
0
        /// <summary>
        /// Starts a background thread that will aggressively write elements into the specified queue.
        /// </summary>
        /// <param name="queue">Queue into which elements should be written</param>
        /// <param name="elementCost">Cost of each element</param>
        /// <param name="howMany">How many total elements should be written</param>
        /// <returns>The resultant thread. The thread will already be started.</returns>
        private static Thread StartBackgroundWriter(CostBoundedConcurrentQueue <string> queue, int elementCost, int howMany)
        {
            Thread t = new Thread(new ThreadStart(() =>
            {
                var str = BuildStringOfSize(elementCost);

                // spin as fast as possible, adding elements as soon as capacity becomes available
                for (int i = 0; i < howMany; i++)
                {
                    while (!queue.Enqueue(str))
                    {
                    }
                }
            }));

            t.Start();

            return(t);
        }
        /// <summary>
        /// Starts a background thread that will aggressively write elements into the specified queue.
        /// </summary>
        /// <param name="queue">Queue into which elements should be written</param>
        /// <param name="elementCost">Cost of each element</param>
        /// <param name="howMany">How many total elements should be written</param>
        /// <returns>The resultant thread. The thread will already be started.</returns>
        private static Thread StartBackgroundWriter(CostBoundedConcurrentQueue<string> queue, int elementCost, int howMany)
        {
            Thread t = new Thread(new ThreadStart(() =>
            {
                var str = BuildStringOfSize(elementCost);

                // spin as fast as possible, adding elements as soon as capacity becomes available
                for (int i = 0; i < howMany; i++)
                {
                    while (!queue.Enqueue(str))
                    {
                    }
                }
            }));

            t.Start();

            return t;
        }