public void Stop_ServiceIsStopped_StatusIsNotChanged()
        {
            // Arrange
            var systemInformationProvider = new Mock<ISystemInformationProvider>();
            var workQueue = new Mock<IMessageQueue<SystemInformation>>();

            var messageQueueFeeder = new SystemInformationMessageQueueFeeder(systemInformationProvider.Object, workQueue.Object);
            var messageQueueFeederTask = new Task(messageQueueFeeder.Start);
            messageQueueFeederTask.Start();
            messageQueueFeeder.Stop();

            var statusBeforeStop = messageQueueFeeder.GetStatus();

            // Act
            messageQueueFeeder.Stop();
            var statusAfterStop = messageQueueFeeder.GetStatus();

            // Assert
            Assert.AreEqual(statusBeforeStop, statusAfterStop);
        }
        public void Stop_EndsARunningService()
        {
            // Arrange
            int durationInMilliseconds = SystemInformationMessageQueueFeeder.SendIntervalInMilliseconds * 3;

            var systemInformationProvider = new Mock<ISystemInformationProvider>();
            var workQueue = new Mock<IMessageQueue<SystemInformation>>();

            var messageQueueFeeder = new SystemInformationMessageQueueFeeder(systemInformationProvider.Object, workQueue.Object);
            var messageQueueFeederTask = new Task(messageQueueFeeder.Start);
            messageQueueFeederTask.Start();

            // Act
            Thread.Sleep(durationInMilliseconds);

            messageQueueFeeder.Stop();

            // Assert
            Assert.AreEqual(ServiceStatus.Stopped, messageQueueFeeder.GetStatus());
        }
        public void Start_SystemInformationProviderReturnsSystemInformation_SystemInformationIsAddedToQueue()
        {
            // Arrange
            int durationInMilliseconds = SystemInformationMessageQueueFeeder.SendIntervalInMilliseconds * 2;

            var systemInformationProvider = new Mock<ISystemInformationProvider>();
            systemInformationProvider.Setup(s => s.GetSystemInfo()).Returns(() => new SystemInformation { MachineName = Environment.MachineName, Timestamp = DateTime.UtcNow });

            var workQueue = new Mock<IMessageQueue<SystemInformation>>();

            using (var messageQueueFeeder = new SystemInformationMessageQueueFeeder(systemInformationProvider.Object, workQueue.Object))
            {
                // Act
                var feederTask = new Task(messageQueueFeeder.Start);
                feederTask.Start();
                Task.WaitAll(new[] { feederTask }, durationInMilliseconds);
                messageQueueFeeder.Stop();

                // Assert
                workQueue.Verify(s => s.Enqueue(It.IsAny<SystemInformationQueueItem>()), Times.AtLeastOnce());
            }
        }
        public void Start_SystemInformationProviderReturnsNull_InfoIsNotQueued()
        {
            // Arrange
            int durationInMilliseconds = SystemInformationMessageQueueFeeder.SendIntervalInMilliseconds * 2;

            var systemInformationProvider = new Mock<ISystemInformationProvider>();
            SystemInformation systemInformation = null;
            systemInformationProvider.Setup(s => s.GetSystemInfo()).Returns(systemInformation);

            var workQueue = new Mock<IMessageQueue<SystemInformation>>();

            using (var messageQueueFeeder = new SystemInformationMessageQueueFeeder(systemInformationProvider.Object, workQueue.Object))
            {
                // Act
                var feederTaks = new Task(messageQueueFeeder.Start);
                feederTaks.Start();
                Task.WaitAll(new[] { feederTaks }, durationInMilliseconds);
                messageQueueFeeder.Stop();

                // Assert
                workQueue.Verify(s => s.Enqueue(It.IsAny<SystemInformationQueueItem>()), Times.Never());
            }
        }
        public void Start_RunFor3Intervals_SystemInfoIsPulledAtMostThreeTimes()
        {
            // Arrange
            int durationInMilliseconds = SystemInformationMessageQueueFeeder.SendIntervalInMilliseconds * 3;

            var systemInformationProvider = new Mock<ISystemInformationProvider>();
            var workQueue = new Mock<IMessageQueue<SystemInformation>>();

            using (var messageQueueFeeder = new SystemInformationMessageQueueFeeder(systemInformationProvider.Object, workQueue.Object))
            {
                // Act
                var feederTask = new Task(messageQueueFeeder.Start);
                feederTask.Start();
                Task.WaitAll(new[] { feederTask }, durationInMilliseconds);
                messageQueueFeeder.Stop();

                // Assert
                systemInformationProvider.Verify(s => s.GetSystemInfo(), Times.AtMost(3));
            }
        }
        public void Resume_ServiceIsStopped_StatusIsStillStopped()
        {
            // Arrange
            var systemInformationProvider = new Mock<ISystemInformationProvider>();
            var workQueue = new Mock<IMessageQueue<SystemInformation>>();

            using (var messageQueueFeeder = new SystemInformationMessageQueueFeeder(systemInformationProvider.Object, workQueue.Object))
            {
                var messageQueueFeederTask = new Task(messageQueueFeeder.Start);
                messageQueueFeederTask.Start();
                messageQueueFeeder.Stop();

                // Act
                messageQueueFeeder.Resume();

                // Assert
                Assert.AreEqual(ServiceStatus.Stopped, messageQueueFeeder.GetStatus());
            }
        }