Ejemplo n.º 1
0
        public void Dequeue_ReturnsItemsInTheSameOrderAsTheyHaveBeenAdded()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            var items = new[]
            {
                new SystemInformation {
                    MachineName = "1", Timestamp = DateTime.UtcNow
                },
                new SystemInformation {
                    MachineName = "2", Timestamp = DateTime.UtcNow
                },
                new SystemInformation {
                    MachineName = "3", Timestamp = DateTime.UtcNow
                }
            };

            // Act
            foreach (var item in items)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Assert
            foreach (var systemInformation in items)
            {
                var dequeuedItem = queue.Dequeue();
                Assert.AreEqual(systemInformation, dequeuedItem.Item);
            }
        }
Ejemplo n.º 2
0
        public void PurgeAllItems_QueueContainsThreeItems_ResultIsArrayHasTheSameOrderAsTheQueue()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            var items = new[]
            {
                new SystemInformation {
                    MachineName = "1", Timestamp = DateTime.UtcNow
                },
                new SystemInformation {
                    MachineName = "2", Timestamp = DateTime.UtcNow
                },
                new SystemInformation {
                    MachineName = "3", Timestamp = DateTime.UtcNow
                }
            };

            foreach (var item in items)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Act
            var result = queue.PurgeAllItems();

            // Assert
            for (int i = 0; i < result.Length; i++)
            {
                Assert.AreEqual(items[i], result[i].Item);
            }
        }
Ejemplo n.º 3
0
        public void PurgeAllItems_QueueContainsThreeItems_ResultIsArrayWithThreeItems()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            var items = new[]
            {
                new SystemInformation {
                    MachineName = "1", Timestamp = DateTime.UtcNow
                },
                new SystemInformation {
                    MachineName = "2", Timestamp = DateTime.UtcNow
                },
                new SystemInformation {
                    MachineName = "3", Timestamp = DateTime.UtcNow
                }
            };

            foreach (var item in items)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Act
            var result = queue.PurgeAllItems();

            // Assert
            Assert.AreEqual(items.Length, result.Length);
        }
        public void EnqueueAndDequeue_OneMillionItems()
        {
            // Arrange
            int itemCount   = 1000000;
            var aLotOfItems = TestUtilities.GetSystemInformationObjects(itemCount);
            var queue       = new SystemInformationMessageQueue();

            // Act
            var enqueueWatch = new Stopwatch();

            enqueueWatch.Start();

            foreach (var item in aLotOfItems)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            enqueueWatch.Stop();
            Console.WriteLine("Enqueing {0} items took {1} milliseconds.", itemCount, enqueueWatch.ElapsedMilliseconds);

            // Assert
            for (int i = 0; i < aLotOfItems.Length; i++)
            {
                var dequedItem = queue.Dequeue();
                Assert.AreEqual(aLotOfItems[i], dequedItem.Item);
            }
        }
        public void EnqueueAndDequeue_OneMillionItems()
        {
            // Arrange
            int itemCount = 1000000;
            var aLotOfItems = TestUtilities.GetSystemInformationObjects(itemCount);
            var queue = new SystemInformationMessageQueue();

            // Act
            var enqueueWatch = new Stopwatch();
            enqueueWatch.Start();

            foreach (var item in aLotOfItems)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            enqueueWatch.Stop();
            Console.WriteLine("Enqueing {0} items took {1} milliseconds.", itemCount, enqueueWatch.ElapsedMilliseconds);

            // Assert
            for (int i = 0; i < aLotOfItems.Length; i++)
            {
                var dequedItem = queue.Dequeue();
                Assert.AreEqual(aLotOfItems[i], dequedItem.Item);
            }
        }
        public void Dequeue_ReturnsItemsInTheSameOrderAsTheyHaveBeenAdded()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            var items = new[]
                {
                    new SystemInformation { MachineName = "1", Timestamp = DateTime.UtcNow },
                    new SystemInformation { MachineName = "2", Timestamp = DateTime.UtcNow },
                    new SystemInformation { MachineName = "3", Timestamp = DateTime.UtcNow }
                };

            // Act
            foreach (var item in items)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Assert
            foreach (var systemInformation in items)
            {
                var dequeuedItem = queue.Dequeue();
                Assert.AreEqual(systemInformation, dequeuedItem.Item);
            }
        }
Ejemplo n.º 7
0
        public void Enqueue_ItemIsNull_ArgumentNullExceptionIsThrown()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            IQueueItem <SystemInformation> item = null;

            // Act
            queue.Enqueue(item);
        }
        public static void Setup()
        {
            ObjectFactory.Configure(
                config =>
            {
                /* common */
                config.For <IEncodingProvider>().Use <DefaultEncodingProvider>();
                config.For <IMemoryUnitConverter>().Use <MemoryUnitConverter>();
                config.For <ITimeProvider>().Use <UTCTimeProvider>();

                /* collector */
                config.For <ISystemInformationProvider>().Use <SystemInformationProvider>();
                config.For <IUrlComponentExtractor>().Use <UrlComponentExtractor>();
                config.For <IMachineNameProvider>().Use <EnvironmentMachineNameProvider>();

                /* system performance */
                config.For <ILogicalDiscInstanceNameProvider>().Use <LogicalDiscInstanceNameProvider>();
                config.For <ISystemPerformanceDataProvider>().Use <SystemPerformanceDataProvider>();
                config.For <IProcessorStatusProvider>().Use <ProcessorStatusProvider>();
                config.For <ISystemStorageStatusProvider>().Use <SystemStorageStatusProvider>();
                config.For <ISystemMemoryStatusProvider>().Use <SystemMemoryStatusProvider>();

                /* http status code */
                config.For <IHttpStatusCodeFetcher>().Use <HttpStatusCodeFetcher>();
                config.For <IHttpStatusCodeCheckResultProvider>().Use <HttpStatusCodeCheckResultProvider>();

                /* coordination */
                config.For <IAgentCoordinationServiceFactory>().Use <AgentCoordinationServiceFactory>();

                /* queuing */
                var workQueue            = new SystemInformationMessageQueue();
                var errorQueue           = new SystemInformationMessageQueue();
                var messageQueueProvider = new SystemInformationMessageQueueProvider(workQueue, errorQueue);
                config.For <IMessageQueueProvider <SystemInformation> >().Singleton().Use(() => messageQueueProvider);

                config.For <IMessageQueuePersistence <SystemInformation> >().Use <JSONSystemInformationMessageQueuePersistence>();
                config.For <IJSONMessageQueuePersistenceConfigurationProvider>().Use <AppConfigJSONMessageQueuePersistenceConfigurationProvider>();

                config.For <IMessageQueueFeederFactory>().Use <SystemInformationMessageQueueFeederFactory>();
                config.For <IMessageQueueWorkerFactory>().Use <SystemInformationMessageQueueWorkerFactory>();

                /* sender configuration */
                config.For <IAgentControlDefinitionAccessor>().Use <AgentControlDefinitionAccessor>();
                config.For <IAgentControlDefinitionProvider>().Use <AgentControlDefinitionProvider>();
                config.For <IAgentControlDefinitionServiceUrlProvider>().Use <AppConfigAgentControlDefinitionServiceUrlProvider>();
                config.For <IRESTBasedSystemInformationSenderConfigurationProvider>().Use <RESTBasedSystemInformationSenderConfigurationProvider>();

                /* sender */
                config.For <IRESTClientFactory>().Use <RESTClientFactory>();
                config.For <IRESTRequestFactory>().Use <JSONRequestFactory>();
                config.For <ISystemInformationSender>().Use <RESTBasedSystemInformationSender>();

                config.For <ISystemInformationDispatchingService>().Use <SystemInformationDispatchingService>();
            });
        }
        public static void Setup()
        {
            ObjectFactory.Configure(
                config =>
                {
                    /* common */
                    config.For<IEncodingProvider>().Use<DefaultEncodingProvider>();
                    config.For<IMemoryUnitConverter>().Use<MemoryUnitConverter>();
                    config.For<ITimeProvider>().Use<UTCTimeProvider>();

                    /* collector */
                    config.For<ISystemInformationProvider>().Use<SystemInformationProvider>();
                    config.For<IUrlComponentExtractor>().Use<UrlComponentExtractor>();
                    config.For<IMachineNameProvider>().Use<EnvironmentMachineNameProvider>();

                    /* system performance */
                    config.For<ILogicalDiscInstanceNameProvider>().Use<LogicalDiscInstanceNameProvider>();
                    config.For<ISystemPerformanceDataProvider>().Use<SystemPerformanceDataProvider>();
                    config.For<IProcessorStatusProvider>().Use<ProcessorStatusProvider>();
                    config.For<ISystemStorageStatusProvider>().Use<SystemStorageStatusProvider>();
                    config.For<ISystemMemoryStatusProvider>().Use<SystemMemoryStatusProvider>();

                    /* http status code */
                    config.For<IHttpStatusCodeFetcher>().Use<HttpStatusCodeFetcher>();
                    config.For<IHttpStatusCodeCheckResultProvider>().Use<HttpStatusCodeCheckResultProvider>();

                    /* coordination */
                    config.For<IAgentCoordinationServiceFactory>().Use<AgentCoordinationServiceFactory>();

                    /* queuing */
                    var workQueue = new SystemInformationMessageQueue();
                    var errorQueue = new SystemInformationMessageQueue();
                    var messageQueueProvider = new SystemInformationMessageQueueProvider(workQueue, errorQueue);
                    config.For<IMessageQueueProvider<SystemInformation>>().Singleton().Use(() => messageQueueProvider);

                    config.For<IMessageQueuePersistence<SystemInformation>>().Use<JSONSystemInformationMessageQueuePersistence>();
                    config.For<IJSONMessageQueuePersistenceConfigurationProvider>().Use<AppConfigJSONMessageQueuePersistenceConfigurationProvider>();

                    config.For<IMessageQueueFeederFactory>().Use<SystemInformationMessageQueueFeederFactory>();
                    config.For<IMessageQueueWorkerFactory>().Use<SystemInformationMessageQueueWorkerFactory>();

                    /* sender configuration */
                    config.For<IAgentControlDefinitionAccessor>().Use<AgentControlDefinitionAccessor>();
                    config.For<IAgentControlDefinitionProvider>().Use<AgentControlDefinitionProvider>();
                    config.For<IAgentControlDefinitionServiceUrlProvider>().Use<AppConfigAgentControlDefinitionServiceUrlProvider>();
                    config.For<IRESTBasedSystemInformationSenderConfigurationProvider>().Use<RESTBasedSystemInformationSenderConfigurationProvider>();

                    /* sender */
                    config.For<IRESTClientFactory>().Use<RESTClientFactory>();
                    config.For<IRESTRequestFactory>().Use<JSONRequestFactory>();
                    config.For<ISystemInformationSender>().Use<RESTBasedSystemInformationSender>();

                    config.For<ISystemInformationDispatchingService>().Use<SystemInformationDispatchingService>();
                });
        }
Ejemplo n.º 10
0
        public void PurgeAllItems_OnEmptyQueue_ResultIsEmptyArray()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            // Act
            var results = queue.PurgeAllItems();

            // Assert
            Assert.IsEmpty(results);
        }
        public void Dequeue_OnAnEmptyQueue_ResultIsNull()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            // Act
            var result = queue.Dequeue();

            // Assert
            Assert.IsNull(result);
        }
Ejemplo n.º 12
0
        public void GetSize_QueueIsEmpty_ResultIsZero()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            // Act
            var result = queue.GetSize();

            // Assert
            Assert.AreEqual(0, result);
        }
Ejemplo n.º 13
0
        public void NewQueue_IsEmptyReturnsTrue()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            // Act
            var result = queue.IsEmpty();

            // Assert
            Assert.IsTrue(result);
        }
Ejemplo n.º 14
0
        public void Dequeue_OnAnEmptyQueue_ResultIsNull()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            // Act
            var result = queue.Dequeue();

            // Assert
            Assert.IsNull(result);
        }
        public void PurgeQueueWhileEnqueuing_AllItemsThatAreEnqueuedAreAlsoDequeued()
        {
            // Arrange
            var itemPoolSize = 10000000;
            var itemPool     = TestUtilities.GetSystemInformationObjects(itemPoolSize);
            var queue        = new SystemInformationMessageQueue();

            // Act
            var purgeCount        = 0;
            var dequeuedItemCount = 0;
            var enqueuedItemCount = 0;

            var thread1 = new Task(
                () =>
            {
                foreach (var item in itemPool)
                {
                    queue.Enqueue(new SystemInformationQueueItem(item));
                    enqueuedItemCount++;
                }
            });

            var thread2 = new Task(
                () =>
            {
                while (!queue.IsEmpty())
                {
                    purgeCount++;
                    dequeuedItemCount += queue.PurgeAllItems().Count();
                    int millisecondsToWaitBeforeNextItemIsQueued = TestUtilities.GetRandNumber(50, 100);
                    Thread.Sleep(millisecondsToWaitBeforeNextItemIsQueued);
                }
            });

            var stopWatch = new Stopwatch();

            stopWatch.Start();

            thread1.Start();
            thread2.Start();
            Task.WaitAll(thread1, thread2);

            stopWatch.Stop();

            // Assert
            Console.WriteLine(
                "Enqueuing {0} items while another thread purged the queue took {1} milliseconds. The queue has been purged {2} time(s) during this time.",
                enqueuedItemCount,
                stopWatch.ElapsedMilliseconds,
                purgeCount);

            Assert.AreEqual(enqueuedItemCount, dequeuedItemCount);
            Assert.IsTrue(queue.IsEmpty());
        }
Ejemplo n.º 16
0
        public void Enqueue_EmptyCollection_NoItemIsEnqueued()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            var items = new IQueueItem <SystemInformation>[] { };

            // Act
            queue.Enqueue(items);

            // Assert
            Assert.AreEqual(0, queue.GetSize());
        }
        public void Enqueue_Collection_EachItemInTheSuppliedCollectionIsEnqueued()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            var items = TestUtilities.GetSystemInformationObjects(10).Select(i => new SystemInformationQueueItem(i)).ToArray();

            // Act
            queue.Enqueue(items);

            // Assert
            Assert.AreEqual(items.Length, queue.GetSize());
        }
Ejemplo n.º 18
0
        public void Enqueue_Collection_EachItemInTheSuppliedCollectionIsEnqueued()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            var items = TestUtilities.GetSystemInformationObjects(10).Select(i => new SystemInformationQueueItem(i)).ToArray();

            // Act
            queue.Enqueue(items);

            // Assert
            Assert.AreEqual(items.Length, queue.GetSize());
        }
Ejemplo n.º 19
0
        public void PurgeAllItems_OnNonEmptyQueue_QueueIsEmptyAfterwards()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation()));

            // Act
            queue.PurgeAllItems();

            // Assert
            Assert.IsTrue(queue.IsEmpty());
        }
Ejemplo n.º 20
0
        public void GetSize_QueueContainsOneItem_ResultIsOne()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation()));

            // Act
            var result = queue.GetSize();

            // Assert
            Assert.AreEqual(1, result);
        }
Ejemplo n.º 21
0
        public void NonEmptyQueue_IsEmptyReturnsFalse()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation()));

            // Act
            var result = queue.IsEmpty();

            // Assert
            Assert.IsFalse(result);
        }
Ejemplo n.º 22
0
        public void Enqueue_Item_DequeueReturnsSameItem()
        {
            // Arrange
            var item = new SystemInformation {
                MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow
            };
            var queue = new SystemInformationMessageQueue();

            // Act
            queue.Enqueue(new SystemInformationQueueItem(item));
            var dequeuedItem = queue.Dequeue();

            // Assert
            Assert.AreEqual(item, dequeuedItem.Item);
        }
        public void DequeueItemsWithTwoParallelThreads_AllItemsAreDequeued()
        {
            // Arrange
            var itemPoolSize = 10000000;
            var itemPool     = TestUtilities.GetSystemInformationObjects(itemPoolSize);
            var queue        = new SystemInformationMessageQueue();

            foreach (var item in itemPool)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Act
            var dequeuedItemCount = 0;
            var thread1           = new Action(
                () =>
            {
                while (queue.Dequeue() != null)
                {
                    Monitor.Enter(this.dequeueItemsWithTwoParallelThreadsAllItemsAreDequeuedLockObject);
                    dequeuedItemCount++;
                    Monitor.Exit(this.dequeueItemsWithTwoParallelThreadsAllItemsAreDequeuedLockObject);
                }
            });

            var thread2 = new Action(
                () =>
            {
                while (queue.Dequeue() != null)
                {
                    Monitor.Enter(this.dequeueItemsWithTwoParallelThreadsAllItemsAreDequeuedLockObject);
                    dequeuedItemCount++;
                    Monitor.Exit(this.dequeueItemsWithTwoParallelThreadsAllItemsAreDequeuedLockObject);
                }
            });

            var dequeueWatch = new Stopwatch();

            dequeueWatch.Start();

            Parallel.Invoke(thread1, thread2);

            dequeueWatch.Stop();
            Console.WriteLine("Dequeuing {0} items with two parallel threads took {1} milliseconds.", dequeuedItemCount, dequeueWatch.ElapsedMilliseconds);

            // Assert
            Assert.AreEqual(itemPoolSize, dequeuedItemCount);
        }
        public void Dequeue_FirstItemThatIsAddedIsReturned()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            var firstItem = new SystemInformation { MachineName = "1", Timestamp = DateTime.UtcNow };
            queue.Enqueue(new SystemInformationQueueItem(firstItem));
            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation { MachineName = "2", Timestamp = DateTime.UtcNow }));
            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation { MachineName = "3", Timestamp = DateTime.UtcNow }));

            // Act
            var dequeuedItem = queue.Dequeue();

            // Assert
            Assert.AreEqual(firstItem, dequeuedItem.Item);
        }
        public void DequeueItemsWithTwoParallelThreads_AllItemsAreDequeued()
        {
            // Arrange
            var itemPoolSize = 10000000;
            var itemPool = TestUtilities.GetSystemInformationObjects(itemPoolSize);
            var queue = new SystemInformationMessageQueue();
            foreach (var item in itemPool)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Act
            var dequeuedItemCount = 0;
            var thread1 = new Action(
                () =>
                {
                    while (queue.Dequeue() != null)
                    {
                        Monitor.Enter(this.dequeueItemsWithTwoParallelThreadsAllItemsAreDequeuedLockObject);
                        dequeuedItemCount++;
                        Monitor.Exit(this.dequeueItemsWithTwoParallelThreadsAllItemsAreDequeuedLockObject);
                    }
                });

            var thread2 = new Action(
                () =>
                {
                    while (queue.Dequeue() != null)
                    {
                        Monitor.Enter(this.dequeueItemsWithTwoParallelThreadsAllItemsAreDequeuedLockObject);
                        dequeuedItemCount++;
                        Monitor.Exit(this.dequeueItemsWithTwoParallelThreadsAllItemsAreDequeuedLockObject);
                    }
                });

            var dequeueWatch = new Stopwatch();
            dequeueWatch.Start();

            Parallel.Invoke(thread1, thread2);

            dequeueWatch.Stop();
            Console.WriteLine("Dequeuing {0} items with two parallel threads took {1} milliseconds.", dequeuedItemCount, dequeueWatch.ElapsedMilliseconds);

            // Assert
            Assert.AreEqual(itemPoolSize, dequeuedItemCount);
        }
Ejemplo n.º 26
0
        public void Enqueue_QueueItemCounterIsIncreasedByOne()
        {
            // Arrange
            var item = new SystemInformationQueueItem(new SystemInformation {
                MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow
            });
            int previousCount = item.EnqueuCount;

            var queue = new SystemInformationMessageQueue();

            queue.Enqueue(item);

            // Act
            var dequeuedItem = queue.Dequeue();

            // Assert
            Assert.AreEqual(previousCount + 1, dequeuedItem.EnqueuCount);
        }
Ejemplo n.º 27
0
        public void GetSize_ResultIsWhatEverTheQueueSizeIs()
        {
            // Arrange
            var queue         = new SystemInformationMessageQueue();
            int expectedCount = TestUtilities.GetRandNumber(1, 10000000);
            var items         = TestUtilities.GetSystemInformationObjects(expectedCount);

            foreach (var item in items)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }


            // Act
            var result = queue.GetSize();

            // Assert
            Assert.AreEqual(expectedCount, result);
        }
Ejemplo n.º 28
0
        public void Enqueue_EveryTimeAnItemIsEnqueued_TheItemCounterIsIncreasedByOne()
        {
            // Arrange
            int timesItemIsQueued = 10;
            var item = new SystemInformationQueueItem(new SystemInformation {
                MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow
            });

            var queue = new SystemInformationMessageQueue();

            // Act
            for (int i = 1; i <= timesItemIsQueued; i++)
            {
                queue.Enqueue(item);
                queue.Dequeue();
            }

            // Assert
            Assert.AreEqual(timesItemIsQueued, item.EnqueuCount);
        }
        public void EnqueueItemsWithTwoParallelThreads_AllItemsAreAddedToQueue()
        {
            // Arrange
            var itemPoolSize = 10000000;
            var itemPool     = TestUtilities.GetSystemInformationObjects(itemPoolSize);
            var thread1Items = itemPool.Take(itemPoolSize / 2).ToList();
            var thread2Items = itemPool.Skip(itemPoolSize / 2).Take(itemPoolSize / 2).ToList();

            var queue = new SystemInformationMessageQueue();

            // Act
            var thread1 = new Action(
                () =>
            {
                foreach (var item in thread1Items)
                {
                    queue.Enqueue(new SystemInformationQueueItem(item));
                }
            });

            var thread2 = new Action(
                () =>
            {
                foreach (var item in thread2Items)
                {
                    queue.Enqueue(new SystemInformationQueueItem(item));
                }
            });

            var enqueueWatch = new Stopwatch();

            enqueueWatch.Start();

            Parallel.Invoke(thread1, thread2);

            enqueueWatch.Stop();
            Console.WriteLine("Enqueing {0} items with two parallel threads took {1} milliseconds.", itemPoolSize, enqueueWatch.ElapsedMilliseconds);

            // Assert
            Assert.AreEqual(itemPoolSize, queue.GetSize());
        }
Ejemplo n.º 30
0
        public void Dequeue_FirstItemThatIsAddedIsReturned()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            var firstItem = new SystemInformation {
                MachineName = "1", Timestamp = DateTime.UtcNow
            };

            queue.Enqueue(new SystemInformationQueueItem(firstItem));
            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation {
                MachineName = "2", Timestamp = DateTime.UtcNow
            }));
            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation {
                MachineName = "3", Timestamp = DateTime.UtcNow
            }));

            // Act
            var dequeuedItem = queue.Dequeue();

            // Assert
            Assert.AreEqual(firstItem, dequeuedItem.Item);
        }
        public void EnqueueItemsWithTwoParallelThreads_AllItemsAreAddedToQueue()
        {
            // Arrange
            var itemPoolSize = 10000000;
            var itemPool = TestUtilities.GetSystemInformationObjects(itemPoolSize);
            var thread1Items = itemPool.Take(itemPoolSize / 2).ToList();
            var thread2Items = itemPool.Skip(itemPoolSize / 2).Take(itemPoolSize / 2).ToList();

            var queue = new SystemInformationMessageQueue();

            // Act
            var thread1 = new Action(
                () =>
                    {
                        foreach (var item in thread1Items)
                        {
                            queue.Enqueue(new SystemInformationQueueItem(item));
                        }
                    });

            var thread2 = new Action(
                () =>
                {
                    foreach (var item in thread2Items)
                    {
                        queue.Enqueue(new SystemInformationQueueItem(item));
                    }
                });

            var enqueueWatch = new Stopwatch();
            enqueueWatch.Start();

            Parallel.Invoke(thread1, thread2);

            enqueueWatch.Stop();
            Console.WriteLine("Enqueing {0} items with two parallel threads took {1} milliseconds.", itemPoolSize, enqueueWatch.ElapsedMilliseconds);

            // Assert
            Assert.AreEqual(itemPoolSize, queue.GetSize());
        }
        public void RunFor10Seconds_SendFailsForAllItems_DispatcherStopsOnlyIfTheQueueIsEmptyAndAllRetryAttempsHaveFailed()
        {
            // Arrange
            int runtimeInMilliseconds = 10 * 1000;
            int itemsReturnedFromSystemInformationProvider = 0;
            int attemptsToSend = 0;

            // prepare system information provider
            var provider = new Mock <ISystemInformationProvider>();

            provider.Setup(p => p.GetSystemInfo()).Returns(() =>
            {
                itemsReturnedFromSystemInformationProvider++;
                return(new SystemInformation {
                    MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow
                });
            });

            // prepare sender
            var sender = new Mock <ISystemInformationSender>();

            sender.Setup(s => s.Send(It.IsAny <SystemInformation>())).Callback(() => { attemptsToSend++; }).Throws(new SendSystemInformationFailedException("Send failed.", null));

            IMessageQueue <SystemInformation>         workQueue            = new SystemInformationMessageQueue();
            IMessageQueue <SystemInformation>         errorQueue           = new SystemInformationMessageQueue();
            IMessageQueueProvider <SystemInformation> messageQueueProvider = new SystemInformationMessageQueueProvider(workQueue, errorQueue);

            IMessageQueueFeeder messageQueueFeeder = new SystemInformationMessageQueueFeeder(provider.Object, workQueue);
            IMessageQueueWorker messageQueueWorker = new SystemInformationMessageQueueWorker(sender.Object, workQueue, errorQueue);

            var agentCoordinationService        = new Mock <IAgentCoordinationService>();
            var agentCoordinationServiceFactory = new Mock <IAgentCoordinationServiceFactory>();

            agentCoordinationServiceFactory.Setup(f => f.GetAgentCoordinationService(It.IsAny <Action>(), It.IsAny <Action>())).Returns(
                agentCoordinationService.Object);

            var messageQueueFeederFactory = new Mock <IMessageQueueFeederFactory>();

            messageQueueFeederFactory.Setup(f => f.GetMessageQueueFeeder()).Returns(messageQueueFeeder);

            var messageQueueWorkerFactory = new Mock <IMessageQueueWorkerFactory>();

            messageQueueWorkerFactory.Setup(f => f.GetMessageQueueWorker()).Returns(messageQueueWorker);

            IMessageQueuePersistence <SystemInformation> messageQueuePersistence =
                new JSONSystemInformationMessageQueuePersistence(this.jsonMessageQueuePersistenceConfigurationProvider, this.encodingProvider);

            var systemInformationDispatchingService = new SystemInformationDispatchingService(
                agentCoordinationServiceFactory.Object,
                messageQueueFeederFactory.Object,
                messageQueueWorkerFactory.Object,
                messageQueueProvider,
                messageQueuePersistence);

            // Act
            var stopwatch = new Stopwatch();

            stopwatch.Start();

            var dispatcher = new Task(systemInformationDispatchingService.Start);

            dispatcher.Start();

            Thread.Sleep(runtimeInMilliseconds);
            systemInformationDispatchingService.Stop();

            Task.WaitAll(new[] { dispatcher });

            stopwatch.Stop();

            // Assert
            int queueSize = workQueue.GetSize();

            Console.WriteLine(
                "After a runtime of {0} milliseconds the dispatcher has been stopped with {1} items in queue. It took {2} milliseconds until the queue worker stopped sending out all queue items (Attempts To Send: {3}).",
                runtimeInMilliseconds,
                itemsReturnedFromSystemInformationProvider,
                stopwatch.ElapsedMilliseconds,
                attemptsToSend);

            Assert.AreEqual(0, queueSize);
        }
        public void PurgeQueueWhileEnqueuing_AllItemsThatAreEnqueuedAreAlsoDequeued()
        {
            // Arrange
            var itemPoolSize = 10000000;
            var itemPool = TestUtilities.GetSystemInformationObjects(itemPoolSize);
            var queue = new SystemInformationMessageQueue();

            // Act
            var purgeCount = 0;
            var dequeuedItemCount = 0;
            var enqueuedItemCount = 0;

            var thread1 = new Task(
                () =>
                {
                    foreach (var item in itemPool)
                    {
                        queue.Enqueue(new SystemInformationQueueItem(item));
                        enqueuedItemCount++;
                    }
                });

            var thread2 = new Task(
                () =>
                {
                    while (!queue.IsEmpty())
                    {
                        purgeCount++;
                        dequeuedItemCount += queue.PurgeAllItems().Count();
                        int millisecondsToWaitBeforeNextItemIsQueued = TestUtilities.GetRandNumber(50, 100);
                        Thread.Sleep(millisecondsToWaitBeforeNextItemIsQueued);
                    }
                });

            var stopWatch = new Stopwatch();
            stopWatch.Start();

            thread1.Start();
            thread2.Start();
            Task.WaitAll(thread1, thread2);

            stopWatch.Stop();

            // Assert
            Console.WriteLine(
                "Enqueuing {0} items while another thread purged the queue took {1} milliseconds. The queue has been purged {2} time(s) during this time.",
                enqueuedItemCount,
                stopWatch.ElapsedMilliseconds,
                purgeCount);

            Assert.AreEqual(enqueuedItemCount, dequeuedItemCount);
            Assert.IsTrue(queue.IsEmpty());
        }
        public void PurgeAllItems_QueueContainsThreeItems_ResultIsArrayHasTheSameOrderAsTheQueue()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            var items = new[]
                {
                    new SystemInformation { MachineName = "1", Timestamp = DateTime.UtcNow },
                    new SystemInformation { MachineName = "2", Timestamp = DateTime.UtcNow },
                    new SystemInformation { MachineName = "3", Timestamp = DateTime.UtcNow }
                };

            foreach (var item in items)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Act
            var result = queue.PurgeAllItems();

            // Assert
            for (int i = 0; i < result.Length; i++)
            {
                Assert.AreEqual(items[i], result[i].Item);
            }
        }
        public void PurgeAllItems_QueueContainsThreeItems_ResultIsArrayWithThreeItems()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            var items = new[]
                {
                    new SystemInformation { MachineName = "1", Timestamp = DateTime.UtcNow },
                    new SystemInformation { MachineName = "2", Timestamp = DateTime.UtcNow },
                    new SystemInformation { MachineName = "3", Timestamp = DateTime.UtcNow }
                };

            foreach (var item in items)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Act
            var result = queue.PurgeAllItems();

            // Assert
            Assert.AreEqual(items.Length, result.Length);
        }
        public void Enqueue_Item_DequeueReturnsSameItem()
        {
            // Arrange
            var item = new SystemInformation { MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow };
            var queue = new SystemInformationMessageQueue();

            // Act
            queue.Enqueue(new SystemInformationQueueItem(item));
            var dequeuedItem = queue.Dequeue();

            // Assert
            Assert.AreEqual(item, dequeuedItem.Item);
        }
        public void PurgeAllItems_OnNonEmptyQueue_QueueIsEmptyAfterwards()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation()));

            // Act
            queue.PurgeAllItems();

            // Assert
            Assert.IsTrue(queue.IsEmpty());
        }
        public void NewQueue_IsEmptyReturnsTrue()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            // Act
            var result = queue.IsEmpty();

            // Assert
            Assert.IsTrue(result);
        }
        public void NonEmptyQueue_IsEmptyReturnsFalse()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation()));

            // Act
            var result = queue.IsEmpty();

            // Assert
            Assert.IsFalse(result);
        }
        public void RunFor10Seconds_SendFailsForAllItems_DispatcherStopsOnlyIfTheQueueIsEmptyAndAllRetryAttempsHaveFailed()
        {
            // Arrange
            int runtimeInMilliseconds = 10 * 1000;
            int itemsReturnedFromSystemInformationProvider = 0;
            int attemptsToSend = 0;

            // prepare system information provider
            var provider = new Mock<ISystemInformationProvider>();
            provider.Setup(p => p.GetSystemInfo()).Returns(() =>
                {
                    itemsReturnedFromSystemInformationProvider++;
                    return new SystemInformation { MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow };
                });

            // prepare sender
            var sender = new Mock<ISystemInformationSender>();
            sender.Setup(s => s.Send(It.IsAny<SystemInformation>())).Callback(() => { attemptsToSend++; }).Throws(new SendSystemInformationFailedException("Send failed.", null));

            IMessageQueue<SystemInformation> workQueue = new SystemInformationMessageQueue();
            IMessageQueue<SystemInformation> errorQueue = new SystemInformationMessageQueue();
            IMessageQueueProvider<SystemInformation> messageQueueProvider = new SystemInformationMessageQueueProvider(workQueue, errorQueue);

            IMessageQueueFeeder messageQueueFeeder = new SystemInformationMessageQueueFeeder(provider.Object, workQueue);
            IMessageQueueWorker messageQueueWorker = new SystemInformationMessageQueueWorker(sender.Object, workQueue, errorQueue);

            var agentCoordinationService = new Mock<IAgentCoordinationService>();
            var agentCoordinationServiceFactory = new Mock<IAgentCoordinationServiceFactory>();
            agentCoordinationServiceFactory.Setup(f => f.GetAgentCoordinationService(It.IsAny<Action>(), It.IsAny<Action>())).Returns(
                agentCoordinationService.Object);

            var messageQueueFeederFactory = new Mock<IMessageQueueFeederFactory>();
            messageQueueFeederFactory.Setup(f => f.GetMessageQueueFeeder()).Returns(messageQueueFeeder);

            var messageQueueWorkerFactory = new Mock<IMessageQueueWorkerFactory>();
            messageQueueWorkerFactory.Setup(f => f.GetMessageQueueWorker()).Returns(messageQueueWorker);

            IMessageQueuePersistence<SystemInformation> messageQueuePersistence =
                new JSONSystemInformationMessageQueuePersistence(this.jsonMessageQueuePersistenceConfigurationProvider, this.encodingProvider);

            var systemInformationDispatchingService = new SystemInformationDispatchingService(
                agentCoordinationServiceFactory.Object,
                messageQueueFeederFactory.Object,
                messageQueueWorkerFactory.Object,
                messageQueueProvider,
                messageQueuePersistence);

            // Act
            var stopwatch = new Stopwatch();
            stopwatch.Start();

            var dispatcher = new Task(systemInformationDispatchingService.Start);
            dispatcher.Start();

            Thread.Sleep(runtimeInMilliseconds);
            systemInformationDispatchingService.Stop();

            Task.WaitAll(new[] { dispatcher });

            stopwatch.Stop();

            // Assert
            int queueSize = workQueue.GetSize();
            Console.WriteLine(
                "After a runtime of {0} milliseconds the dispatcher has been stopped with {1} items in queue. It took {2} milliseconds until the queue worker stopped sending out all queue items (Attempts To Send: {3}).",
                runtimeInMilliseconds,
                itemsReturnedFromSystemInformationProvider,
                stopwatch.ElapsedMilliseconds,
                attemptsToSend);

            Assert.AreEqual(0, queueSize);
        }
        public void GetSize_ResultIsWhatEverTheQueueSizeIs()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            int expectedCount = TestUtilities.GetRandNumber(1, 10000000);
            var items = TestUtilities.GetSystemInformationObjects(expectedCount);
            foreach (var item in items)
            {
                queue.Enqueue(new SystemInformationQueueItem(item));
            }

            // Act
            var result = queue.GetSize();

            // Assert
            Assert.AreEqual(expectedCount, result);
        }
        public void GetSize_QueueContainsOneItem_ResultIsOne()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            queue.Enqueue(new SystemInformationQueueItem(new SystemInformation()));

            // Act
            var result = queue.GetSize();

            // Assert
            Assert.AreEqual(1, result);
        }
        public void Enqueue_QueueItemCounterIsIncreasedByOne()
        {
            // Arrange
            var item = new SystemInformationQueueItem(new SystemInformation { MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow });
            int previousCount = item.EnqueuCount;

            var queue = new SystemInformationMessageQueue();
            queue.Enqueue(item);

            // Act
            var dequeuedItem = queue.Dequeue();

            // Assert
            Assert.AreEqual(previousCount + 1, dequeuedItem.EnqueuCount);
        }
        public void Enqueue_EveryTimeAnItemIsEnqueued_TheItemCounterIsIncreasedByOne()
        {
            // Arrange
            int timesItemIsQueued = 10;
            var item = new SystemInformationQueueItem(new SystemInformation { MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow });

            var queue = new SystemInformationMessageQueue();

            // Act
            for (int i = 1; i <= timesItemIsQueued; i++)
            {
                queue.Enqueue(item);
                queue.Dequeue();
            }

            // Assert
            Assert.AreEqual(timesItemIsQueued, item.EnqueuCount);
        }
        public void Enqueue_EmptyCollection_NoItemIsEnqueued()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            var items = new IQueueItem<SystemInformation>[] { };

            // Act
            queue.Enqueue(items);

            // Assert
            Assert.AreEqual(0, queue.GetSize());
        }
        public void PurgeAllItems_OnEmptyQueue_ResultIsEmptyArray()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            // Act
            var results = queue.PurgeAllItems();

            // Assert
            Assert.IsEmpty(results);
        }
        public void GetSize_QueueIsEmpty_ResultIsZero()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();

            // Act
            var result = queue.GetSize();

            // Assert
            Assert.AreEqual(0, result);
        }
        public void Enqueue_ItemsParameterIsNull_ArgumentNullExceptionIsThrown()
        {
            // Arrange
            var queue = new SystemInformationMessageQueue();
            IQueueItem<SystemInformation>[] items = null;

            // Act
            queue.Enqueue(items);
        }