public void CircuitBreaker_ReturnsOnOpenCircuit()
        {
            var circuitBreaker = new SimpleCircuitBreaker();
            var cache          = new CircuitBreakingFluentDictionaryCache(circuitBreaker)
                                 .WithSource(new CacheMe());

            CacheStrategy <double> cacheStrategy = cache.Method(r => r.DoWork());


            Assert.IsFalse(circuitBreaker.IsBroken, "circuit should be open");

            CachedValue <double> result1 = cacheStrategy.Get();

            Assert.IsNotNull(result1, "because the circuit is open, we should have gotten a result");

            CachedValue <double> result2 = cacheStrategy.Get();

            Assert.IsNotNull(result2, "because the circuit is open, we should have gotten a result");
            Assert.AreEqual(result1.Version, result2.Version, "the first and 2nd results should be the same");
        }
        public void CircuitBreaker_NullOnBrokenCircuit()
        {
            var circuitBreaker = new SimpleCircuitBreaker();
            var cache          = new CircuitBreakingFluentDictionaryCache(circuitBreaker)
                                 .WithSource(new CacheMe());

            CacheStrategy <double> cacheStrategy = cache.Method(r => r.DoWork());


            Assert.IsFalse(circuitBreaker.IsBroken, "circuit should be open");

            CachedValue <double> result1 = cacheStrategy.Get();

            Assert.IsNotNull(result1, "because the circuit is open, we should have gotten a result");

            circuitBreaker.TryBreak(new InvalidOperationException());
            Assert.IsTrue(circuitBreaker.IsBroken, "circuit should be closed");

            CachedValue <double> result2 = cacheStrategy.Get();

            Assert.IsNull(result2, "because the circuit is closed, we should have gotten no result");
        }
        public void CircuitBreaker_NullOnBrokenCircuitDueToCachingFailure()
        {
            var circuitBreaker = new SimpleCircuitBreaker();
            var rawCache       = new CircuitBreakingFluentDictionaryCache(circuitBreaker);
            var cache          = rawCache.WithSource(new CacheMe());

            CacheStrategy <double> cacheStrategy = cache.Method(r => r.DoWork());


            Assert.IsFalse(circuitBreaker.IsBroken, "circuit should be open");

            CachedValue <double> result1 = cacheStrategy.Get();

            Assert.IsNotNull(result1, "because the circuit is open, we should have gotten a result");

            //Simulate failure
            rawCache.ShouldThrowException = true;

            CachedValue <double> result2 = cacheStrategy.Get();

            Assert.IsTrue(circuitBreaker.IsBroken, "circuit should now be broken");
            Assert.IsNull(result2, "because the circuit is closed, we should have gotten no result");
        }