public void MarkSuccess_NotTripped()
        {
            var mockStats = new Mock <IStats>();
            var breaker   = new BreakerBuilder(0, 0, "Test")
                            .WithStats(mockStats.Object)
                            .Create();

            breaker.MarkSuccess(0);

            mockStats.Verify(m => m.Event("mjolnir breaker Test MarkSuccess", "Ignored", null), Times.Once);
        }
        public void IsAllowing_Allows()
        {
            var mockStats = new Mock <IStats>();
            var breaker   = new BreakerBuilder(10, 50, "Test")
                            .WithStats(mockStats.Object)
                            .Create();

            breaker.IsAllowing();

            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test IsAllowing", "Allowed", It.IsAny <TimeSpan>()), Times.Once);
        }
        public void CheckAndSetTripped_ErrorBelowThreshold()
        {
            var mockStats = new Mock <IStats>();
            var breaker   = new BreakerBuilder(0, 100, "Test")
                            .WithStats(mockStats.Object)
                            .Create();

            breaker.IsAllowing();

            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test CheckAndSetTripped", "CriteriaNotMet", It.IsAny <TimeSpan>()), Times.Once);
        }
        public void AllowSingleTest_NotTripped()
        {
            var mockStats = new Mock <IStats>();
            var breaker   = new BreakerBuilder(10, 100, "Test")
                            .WithStats(mockStats.Object)
                            .Create();

            breaker.IsAllowing();

            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test AllowSingleTest", It.IsAny <string>(), It.IsAny <TimeSpan>()), Times.Never);
        }
        public void CheckAndSetTripped_JustTripped()
        {
            var mockStats = new Mock <IStats>();
            var breaker   = new BreakerBuilder(0, 0, "Test")
                            .WithStats(mockStats.Object)
                            .Create();

            breaker.IsAllowing(); // Trip.

            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test CheckAndSetTripped", "JustTripped", It.IsAny <TimeSpan>()), Times.Once);
            mockStats.Verify(m => m.Event("mjolnir breaker Test", "Tripped", null));
        }
        public void IsAllowing_ForceTripped()
        {
            var mockStats = new Mock <IStats>();
            var breaker   = new BreakerBuilder(10, 50, "Test")
                            .WithStats(mockStats.Object)
                            .Create();

            breaker.Properties.ForceTripped.Value = true;

            breaker.IsAllowing();

            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test IsAllowing", "Rejected", It.IsAny <TimeSpan>()), Times.Once);
        }
        public void IsAllowing_Tripped()
        {
            var mockStats = new Mock <IStats>();
            var breaker   = new BreakerBuilder(0, 0, "Test")
                            .WithStats(mockStats.Object)
                            .Create();

            breaker.IsAllowing(); // Trip.
            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test IsAllowing", "Rejected", It.IsAny <TimeSpan>()), Times.Once);

            breaker.IsAllowing();

            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test IsAllowing", "Rejected", It.IsAny <TimeSpan>()), Times.Exactly(2));
        }
        public async Task Construct_CreatesGauges()
        {
            const long gaugeIntervalMillis = 50;

            var mockStats = new Mock <IStats>();
            var breaker   = new BreakerBuilder(10, 50, "Test")
                            .WithStats(mockStats.Object)
                            .WithGaugeIntervalOverride(gaugeIntervalMillis)
                            .Create();

            await Task.Delay(TimeSpan.FromMilliseconds(gaugeIntervalMillis + 50));

            mockStats.Verify(m => m.Gauge("mjolnir breaker Test total", It.IsIn("Above", "Below"), It.IsAny <long>()), Times.AtLeastOnce);
            mockStats.Verify(m => m.Gauge("mjolnir breaker Test error", It.IsIn("Above", "Below"), It.IsAny <int>()), Times.AtLeastOnce);
        }
        public void AllowSingleTest_TrippedAndNotPastWaitDuration()
        {
            var mockStats = new Mock <IStats>();
            var clock     = new ManualTestClock();
            var breaker   = new BreakerBuilder(0, 0, "Test")
                            .WithStats(mockStats.Object)
                            .WithClock(clock)
                            .WithWaitMillis(1000)
                            .Create();

            breaker.IsAllowing(); // Trip.
            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test AllowSingleTest", "NotEligible", It.IsAny <TimeSpan>()), Times.Once);
            // Don't advance the clock.

            breaker.IsAllowing();

            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test AllowSingleTest", "NotEligible", It.IsAny <TimeSpan>()), Times.Exactly(2));
        }
        public void AllowSingleTest_TrippedAndPastWaitDuration()
        {
            var mockStats = new Mock <IStats>();
            var clock     = new ManualTestClock();
            var breaker   = new BreakerBuilder(0, 0, "Test")
                            .WithStats(mockStats.Object)
                            .WithClock(clock)
                            .WithWaitMillis(1000)
                            .Create();

            breaker.IsAllowing();        // Trip.
            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test AllowSingleTest", "NotEligible", It.IsAny <TimeSpan>()), Times.Once);
            clock.AddMilliseconds(2000); // Advance past wait duration.

            breaker.IsAllowing();

            mockStats.Verify(m => m.Elapsed("mjolnir breaker Test AllowSingleTest", "Allowed", It.IsAny <TimeSpan>()), Times.Once);
        }