public void ServiceLevelAgreementMonitor_Should_Invoke_Proceed_On_The_Proxied_Method()
        {
            var slaProvider = new Mock<IServiceLevelAgreementProvider>();
            var monitor = new ServiceLevelAgreementMonitor(slaProvider.Object);

            var mockIntercept = new Mock<IInvocation>();
            mockIntercept.Setup(x => x.TargetType).Returns(typeof(SynchronousSLAMonitorTests));

            monitor.Intercept(mockIntercept.Object);

            mockIntercept.Verify(x => x.Proceed());
        }
        public void ServiceLevelAgreementMonitor_Should_be_able_to_configure_the_logging_level_when_sla_is_met(Level level)
        {
            var slaProvider = new Mock<IServiceLevelAgreementProvider>();
            SetupSLAWayIntoTheFuture(slaProvider);
            var loggingConfiguration = new LoggingConfiguration(loggingLevelWhenSlaIsMet: level, loggingLevelWhenSlaIsBreached: Level.Off);

            var monitor = new ServiceLevelAgreementMonitor(slaProvider.Object, loggingConfiguration);
            var expectedSlaType = typeof(SynchronousSLAMonitorTests);

            var mockIntercept = new Mock<IInvocation>();
            mockIntercept.Setup(x => x.TargetType).Returns(expectedSlaType);

            monitor.Intercept(mockIntercept.Object);

            var appender = GetAppender();

            AssertLoggingEvent(appender.Events, level);
        }
        public void ServiceLevelAgreementMonitor_Should_be_able_to_configure_the_breach_logging_level(Level level)
        {
            var slaProvider = new Mock<IServiceLevelAgreementProvider>();
            SetupSLAOfZero(slaProvider);
            var loggingConfiguration = new LoggingConfiguration(loggingLevelWhenSlaIsMet: Level.Off, loggingLevelWhenSlaIsBreached: level);

            var monitor = new ServiceLevelAgreementMonitor(slaProvider.Object, loggingConfiguration);
            var expectedSlaType = typeof(SynchronousSLAMonitorTests);

            var mockIntercept = new Mock<IInvocation>();
            mockIntercept.Setup(x => x.Proceed()).Callback(() => Thread.Sleep(5));

            mockIntercept.Setup(x => x.TargetType).Returns(expectedSlaType);

            monitor.Intercept(mockIntercept.Object);

            var appender = GetAppender();

            AssertLoggingEvent(appender.Events, level);
        }
        public void ServiceLevelAgreementMonitor_Should_Log_An_Error_When_SLA_is_breached()
        {
            var slaProvider = new Mock<IServiceLevelAgreementProvider>();
            SetupSLAOfZero(slaProvider);

            var monitor = new ServiceLevelAgreementMonitor(slaProvider.Object);
            var expectedSlaType = typeof(SynchronousSLAMonitorTests);

            var mockIntercept = new Mock<IInvocation>();
            mockIntercept.Setup(x => x.Proceed()).Callback(() => Thread.Sleep(5));

            mockIntercept.Setup(x => x.TargetType).Returns(expectedSlaType);

            monitor.Intercept(mockIntercept.Object);

            var appender = GetAppender();

            AssertLoggingEvent(appender.Events, Level.Error);
        }
        public void ServiceLevelAgreementMonitor_Should_Request_The_SLA_From_The_SLA_Provider()
        {
            var slaProvider = new Mock<IServiceLevelAgreementProvider>();
            var monitor = new ServiceLevelAgreementMonitor(slaProvider.Object);
            var expectedSlaType = typeof(SynchronousSLAMonitorTests);

            var mockIntercept = new Mock<IInvocation>();
            mockIntercept.Setup(x => x.TargetType).Returns(expectedSlaType);

            monitor.Intercept(mockIntercept.Object);

            slaProvider.Verify(x => x.GetServiceLevelAgreement(expectedSlaType));
        }
        public void ServiceLevelAgreementMonitor_Should_Log_The_Correct_SLA_Message_when_SLA_is_met()
        {
            var slaProvider = new Mock<IServiceLevelAgreementProvider>();
            SetupSLAWayIntoTheFuture(slaProvider);

            var monitor = new ServiceLevelAgreementMonitor(slaProvider.Object);
            var expectedSlaType = typeof(SynchronousSLAMonitorTests);

            var mockIntercept = new Mock<IInvocation>();
            mockIntercept.Setup(x => x.TargetType).Returns(expectedSlaType);

            monitor.Intercept(mockIntercept.Object);

            var appender = GetAppender();

            AssertLoggingEvent(appender.Events, Level.Debug);
        }