Exemplo n.º 1
0
        public void CreateStringQueue_FromStringList_ShouldCreateAThreadSafeConcurrentQueueWithSameElements(List <string> ls)
        {
            // Compare just the total count and the first item.

            var sq = StringQueue.CreateStringQueue(ls);

            Assert.AreEqual(sq.Count(), ls.Count);

            var item = sq.Dequeue();

            Assert.AreEqual(item, ls.FirstOrDefault());
        }
Exemplo n.º 2
0
        public void Enqueue_CorrectStringItem_ShouldAddItemToTheQueueAndTriggersEventItemEnqueued(List <string> ls)
        {
            var sq = StringQueue.CreateStringQueue(ls);

            var wait1 = new AutoResetEvent(false);

            sq.ItemEnqueued += (sender, eventArgs) => wait1.Set();

            sq.Enqueue("test");

            Assert.IsTrue(wait1.WaitOne(TimeSpan.FromSeconds(5)));
            Assert.AreEqual(sq.Count(), ls.Count + 1);
        }
Exemplo n.º 3
0
        public void Enqueue_NullItem_ShouldReturnTheQueueUnchangedAndNotTriggersEventItemEnqueued(List <string> ls)
        {
            var sq = StringQueue.CreateStringQueue(ls);

            var wait1 = new AutoResetEvent(false);

            sq.ItemEnqueued += (sender, eventArgs) => wait1.Set();

            sq.Enqueue(null);

            Assert.IsFalse(wait1.WaitOne(TimeSpan.FromSeconds(5)));
            Assert.AreEqual(sq.Count(), ls.Count);
        }
Exemplo n.º 4
0
        public void Consume_WithVariousConsumers_ShouldConsumeTheQueueCorrectly(List <string> ls)
        {
            var sq = StringQueue.CreateStringQueue(ls);

            // Necesitamos usar Task.Factory.StartNew para probar nuestro método Consume
            // durante un cierto tiempo (5 segundos). Este wrapper por sí mismo no garantiza un nuevo
            // hilo, pero nuestro método se encarga de crearlo, tal como se indica en los requerimientos.
            // La diferencia principal es que Task.Factory usa Thread-pool, que es manejado por el
            // sistema, se supone que de forma más eficiente. También permite especificar un intervalo
            // de tiempo en el que debe correr el proceso, como en este caso.
            // Probar procesos multi-threading siempre es un poco
            // truculento, pero es mucho mejor que no hacer nada.

            var t1 = Task.Factory.StartNew(() => Consumer.CreateConsumerNewThread(sq, "Consumer 1").Consume()).Wait(5000);
            var t2 = Task.Factory.StartNew(() => Consumer.CreateConsumerNewThread(sq, "Consumer 2").Consume()).Wait(5000);
            var t3 = Task.Factory.StartNew(() => Consumer.CreateConsumerNewThread(sq, "Consumer 3").Consume()).Wait(5000);
            var t4 = Task.Factory.StartNew(() => Consumer.CreateConsumerNewThread(sq, "Consumer 4").Consume()).Wait(5000);

            Assert.AreEqual(sq.Count(), 0);
        }
Exemplo n.º 5
0
        public void Dequeue_Item_ShouldUpdateTheQueueAndTriggersEventItemDequeued(List <string> ls)
        {
            var sq = StringQueue.CreateStringQueue(ls);

            var wait1 = new AutoResetEvent(false);

            sq.ItemDequeued += (sender, eventArgs) => wait1.Set();

            var item = sq.Dequeue();

            if (item != null)
            {
                Assert.IsTrue(wait1.WaitOne(TimeSpan.FromSeconds(5)));
            }
            else
            {
                Assert.IsFalse(wait1.WaitOne(TimeSpan.FromSeconds(5)));
            }

            Assert.AreEqual(item, ls.FirstOrDefault());
        }
Exemplo n.º 6
0
 public void CreateStringQueue_FromNullStringList_ShouldThrowArgumentNUllException(List <string> ls)
 {
     Assert.Throws <ArgumentNullException>(() => StringQueue.CreateStringQueue(ls));
 }