public void Execution_Success()
        {
            SL.Config(TestCommandKey, TestGroupKey, TestDomain);
            for (int i = 0; i < DefaultConfigSet.CircuitBreakerRequestCountThreshold * 2; i++)
            {
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                using (SL instance = new SL(TestCommandKey, TestGroupKey, TestDomain))
                {
                    instance.StartExecution();
                    Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
                    instance.MarkSuccess();
                }
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            }

            CommandComponents.ConfigSet.InitTestHealthSnapshotInterval();
            for (int i = 0; i < DefaultConfigSet.CircuitBreakerRequestCountThreshold * 2; i++)
            {
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                using (SL instance = new SL(TestCommandKey, TestGroupKey, TestDomain))
                {
                    ScenarioTestHelper.SleepHealthSnapshotInverval();
                    instance.StartExecution();
                    Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
                    instance.MarkSuccess();
                }
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            }
        }
        public void EndExecution_ForNotStartedExecution()
        {
            SL instance = new SL(TestCommandKey, TestGroupKey, TestDomain);

            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            instance.EndExecution();
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            instance.EndExecution();
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);

            instance.StartExecution();
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
            instance.EndExecution();
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);

            instance.EndExecution();
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);

            using (instance = new SL(TestCommandKey))
            {
                instance.StartExecution();
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
            }
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);

            instance.EndExecution();
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
        }
        public void StartExecution_WithInstance()
        {
            object instance = SL.CreateInstance(TestCommandKey);

            Assert.AreEqual(CommandComponents.ConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            SL.StartExecution(instance);
            Assert.AreEqual(CommandComponents.ConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
        }
 public void Config_Key_Group_Config()
 {
     SL.Config(TestCommandKey, TestGroupKey, configSet => ScenarioTestHelper.SetCommandConfigFrom(configSet, CustomConfigSet));
     Assert.AreEqual(TestCommandKey, CommandComponents.CommandInfo.Key, true);
     Assert.AreEqual(TestGroupKey, CommandComponents.CommandInfo.GroupKey, true);
     Assert.AreEqual(CommandDomains.Default, CommandComponents.CommandInfo.Domain, true);
     Assert.IsTrue(ScenarioTestHelper.AreEqual(CustomConfigSet, CommandComponents.ConfigSet));
 }
 public void Config_Key_Group_Domain_MaxConcurrentCount()
 {
     SL.Config(TestCommandKey, TestGroupKey, TestDomain, CustomConfigSet.CommandMaxConcurrentCount);
     Assert.AreEqual(TestCommandKey, CommandComponents.CommandInfo.Key, true);
     Assert.AreEqual(TestGroupKey, CommandComponents.CommandInfo.GroupKey, true);
     Assert.AreEqual(TestDomain, CommandComponents.CommandInfo.Domain, true);
     Assert.AreEqual(CustomConfigSet.CommandMaxConcurrentCount, CommandComponents.ConfigSet.CommandMaxConcurrentCount);
 }
 public void Config_Key_Group_Domain_Config_Default()
 {
     SL.Config(TestCommandKey, null, null, config => {});
     Assert.AreEqual(TestCommandKey, CommandComponents.CommandInfo.Key, true);
     Assert.AreEqual(HystrixCommandBase.DefaultGroupKey, CommandComponents.CommandInfo.GroupKey, true);
     Assert.AreEqual(CommandDomains.Default, CommandComponents.CommandInfo.Domain, true);
     Assert.IsTrue(ScenarioTestHelper.AreEqual(DefaultConfigSet, CommandComponents.ConfigSet));
 }
 public void Config_Key_Group_Domain()
 {
     SL.Config(TestCommandKey, TestGroupKey, TestDomain);
     Assert.AreEqual(TestCommandKey, CommandComponents.CommandInfo.Key, true);
     Assert.AreEqual(TestGroupKey, CommandComponents.CommandInfo.GroupKey, true);
     Assert.AreEqual(TestDomain, CommandComponents.CommandInfo.Domain, true);
     Assert.IsTrue(ScenarioTestHelper.AreEqual(DefaultConfigSet, CommandComponents.ConfigSet));
 }
        public void SemaphoreIsolation_Key_GroupKey_Domain()
        {
            SL instance = new SL(TestCommandKey, TestGroupKey, TestDomain);

            Assert.AreEqual(TestCommandKey, CommandComponents.CommandInfo.Key, true);
            Assert.AreEqual(TestGroupKey, CommandComponents.CommandInfo.GroupKey, true);
            Assert.AreEqual(TestDomain, CommandComponents.CommandInfo.Domain, true);
            Assert.IsTrue(ScenarioTestHelper.AreEqual(DefaultConfigSet, CommandComponents.ConfigSet));
        }
        public void SemaphoreIsolation_Key()
        {
            SL instance = new SL(TestCommandKey);

            Assert.AreEqual(TestCommandKey, CommandComponents.CommandInfo.Key, true);
            Assert.AreEqual(HystrixCommandBase.DefaultGroupKey, CommandComponents.CommandInfo.GroupKey, true);
            Assert.AreEqual(CommandDomains.Default, CommandComponents.CommandInfo.Domain, true);
            Assert.IsTrue(ScenarioTestHelper.AreEqual(DefaultConfigSet, CommandComponents.ConfigSet));
        }
        public void StartExecution_RestartFailedSilently()
        {
            SL instance = new SL(TestCommandKey, TestGroupKey, TestDomain);

            instance.StartExecution();
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);

            instance.StartExecution();
            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
        }
        public void SemaphoreIsolation_Key_GroupKey_Domain_Config()
        {
            SL instance = new SL(TestCommandKey, TestGroupKey, TestDomain,
                                 configSet => ScenarioTestHelper.SetCommandConfigFrom(configSet, CustomConfigSet));

            Assert.AreEqual(TestCommandKey, CommandComponents.CommandInfo.Key, true);
            Assert.AreEqual(TestGroupKey, CommandComponents.CommandInfo.GroupKey, true);
            Assert.AreEqual(TestDomain, CommandComponents.CommandInfo.Domain, true);
            Assert.IsTrue(ScenarioTestHelper.AreEqual(CustomConfigSet, CommandComponents.ConfigSet));
        }
        public void CreateInstance_Success()
        {
            Object instance = SL.CreateInstance(TestCommandKey);

            Assert.IsInstanceOfType(instance, typeof(SL));
            Assert.AreEqual(1, HystrixCommandBase.CommandComponentsCollection.Count);
            Assert.AreEqual(1, HystrixCommandBase.ExecutionSemaphores.Count);
            Assert.AreEqual(TestCommandKey, CommandComponents.CommandInfo.Key, true);
            Assert.AreEqual(HystrixCommandBase.DefaultGroupKey, CommandComponents.CommandInfo.GroupKey, true);
            Assert.AreEqual(CommandDomains.Default, CommandComponents.CommandInfo.Domain, true);
        }
 public void CreateInstance_Fail()
 {
     foreach (string key in EmptyStrings)
     {
         try
         {
             SL.CreateInstance(key);
         }
         catch (ArgumentNullException)
         {
         }
     }
 }
        public void Execution_ShortCircuited_ByFailureAndTimeout()
        {
            SL.Config(TestCommandKey, TestGroupKey, TestDomain);
            CommandComponents.ConfigSet.InitTestHealthSnapshotInterval();
            CommandComponents.ConfigSet.CommandTimeoutInMilliseconds = TimeoutInMilliseconds;
            for (int i = 0; i < DefaultConfigSet.CircuitBreakerRequestCountThreshold; i++)
            {
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                using (SL instance = new SL(TestCommandKey))
                {
                    ScenarioTestHelper.SleepHealthSnapshotInverval();
                    instance.StartExecution();
                    Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
                    if (i % 2 == 0)
                    {
                        if (i % 4 == 0)
                        {
                            instance.MarkFailure();
                            continue;
                        }

                        Thread.Sleep(TimeoutInMilliseconds + 2);
                    }

                    instance.MarkSuccess();
                }
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            }

            try
            {
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                using (SL instance = new SL(TestCommandKey))
                {
                    ScenarioTestHelper.SleepHealthSnapshotInverval();
                    try
                    {
                        instance.StartExecution();
                        Assert.Fail("Short circuited exception should be thrown before.");
                    }
                    finally
                    {
                        Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                    }
                }
            }
            catch (HystrixException ex)
            {
                Assert.AreEqual(FailureTypeEnum.ShortCircuited, ex.FailureType);
            }
        }
Example #15
0
        private static SemaphoreIsolation ConvertInstance(object instance)
        {
            if (instance == null)
            {
                throw new ArgumentNullException("instance");
            }
            SemaphoreIsolation isolation = instance as SemaphoreIsolation;

            if (isolation == null)
            {
                throw new ArgumentException("instance should be of type SemaphoreIsolation!");
            }
            return(isolation);
        }
 public void Config_EmptyKey()
 {
     foreach (string key in EmptyStrings)
     {
         try
         {
             SL.Config(key, null, null, config => { });
             Assert.Fail("Empty key should cause ArgumentNullException");
         }
         catch (ArgumentNullException)
         {
         }
     }
 }
 public void Config_Key_Group_Domain_MaxConcurrentCount_Timeout_RequestCountThreshold_ErrorThresholdPercentage_FallbackMaxConcurrentCount()
 {
     SL.Config(TestCommandKey, TestGroupKey, TestDomain,
               CustomConfigSet.CommandMaxConcurrentCount, CustomConfigSet.CommandTimeoutInMilliseconds,
               CustomConfigSet.CircuitBreakerRequestCountThreshold, CustomConfigSet.CircuitBreakerErrorThresholdPercentage,
               CustomConfigSet.FallbackMaxConcurrentCount);
     Assert.AreEqual(TestGroupKey, CommandComponents.CommandInfo.GroupKey, true);
     Assert.AreEqual(TestDomain, CommandComponents.CommandInfo.Domain, true);
     Assert.IsFalse(ScenarioTestHelper.AreEqual(CustomConfigSet, CommandComponents.ConfigSet));
     Assert.AreEqual(CustomConfigSet.CommandMaxConcurrentCount, CommandComponents.ConfigSet.CommandMaxConcurrentCount);
     Assert.AreEqual(CustomConfigSet.CommandTimeoutInMilliseconds, CommandComponents.ConfigSet.CommandTimeoutInMilliseconds);
     Assert.AreEqual(CustomConfigSet.CircuitBreakerRequestCountThreshold, CommandComponents.ConfigSet.CircuitBreakerRequestCountThreshold);
     Assert.AreEqual(CustomConfigSet.CircuitBreakerErrorThresholdPercentage, CommandComponents.ConfigSet.CircuitBreakerErrorThresholdPercentage);
     Assert.AreEqual(CustomConfigSet.FallbackMaxConcurrentCount, CommandComponents.ConfigSet.FallbackMaxConcurrentCount);
 }
 public void MarkBadRequest_RunOnce()
 {
     SL.Config(TestCommandKey, TestGroupKey, TestDomain);
     CommandComponents.ConfigSet.InitTestHealthSnapshotInterval();
     for (int i = 1; i <= DefaultConfigSet.CircuitBreakerRequestCountThreshold; i++)
     {
         using (SL instance = new SL(TestCommandKey))
         {
             instance.StartExecution();
             instance.MarkBadRequest();
             ScenarioTestHelper.SleepHealthSnapshotInverval();
             Dictionary <CommandExecutionEventEnum, int> counts = CommandComponents.Metrics.ToConcrete().GetExecutionEventDistribution();
             Assert.AreEqual(i, counts[CommandExecutionEventEnum.BadRequest]);
         }
     }
 }
        public void Execution_SimulateReal()
        {
            CountdownEvent waitHandle = new CountdownEvent(DefaultConfigSet.CommandMaxConcurrentCount);

            for (int i = 0; i < DefaultConfigSet.CommandMaxConcurrentCount; i++)
            {
                Task.Factory.StartNew(
                    j =>
                {
                    for (int k = 0; k < 10; k++)
                    {
                        using (SL instance = new SL(TestCommandKey))
                        {
                            instance.StartExecution();
                            Assert.AreNotEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                            Thread.Sleep(1000);
                            int v = (int)j;
                            if (v % 3 == 0)
                            {
                                instance.MarkFailure();
                            }
                            else if (v % 5 == 0)
                            {
                                instance.MarkBadRequest();
                            }
                            else
                            {
                                instance.MarkSuccess();
                            }
                            Assert.AreNotEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                        }
                    }
                }, i)
                .ContinueWith(
                    t =>
                {
                    var ex = t.Exception;
                    waitHandle.Signal();
                });
            }

            bool success = waitHandle.Wait(180 * 1000);

            Assert.IsTrue(success);

            Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
        }
        public void StartExecution_Rejected()
        {
            for (int i = 1; i <= DefaultConfigSet.CommandMaxConcurrentCount; i++)
            {
                SL instance = new SL(TestCommandKey, TestGroupKey, TestDomain);
                instance.StartExecution();
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - i, TestSemaphore.CurrentCount);
            }

            try
            {
                SL instance = new SL(TestCommandKey, TestGroupKey, TestDomain);
                instance.StartExecution();
                Assert.Fail("Execution should be rejected here.");
            }
            catch (HystrixException ex)
            {
                Assert.AreEqual(FailureTypeEnum.SemaphoreIsolationRejected, ex.FailureType);
            }
        }
        public void MarkBadRequest_WithInstance()
        {
            SL.Config(TestCommandKey, TestGroupKey, TestDomain);
            CommandComponents.ConfigSet.InitTestHealthSnapshotInterval();
            object instance = SL.CreateInstance(TestCommandKey);

            Assert.AreEqual(CommandComponents.ConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            SL.StartExecution(instance);
            Assert.AreEqual(CommandComponents.ConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);

            SL.MarkBadRequest(instance);
            Assert.AreEqual(CommandComponents.ConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);

            ScenarioTestHelper.SleepHealthSnapshotInverval();
            Dictionary <CommandExecutionEventEnum, int> counts = CommandComponents.Metrics.ToConcrete().GetExecutionEventDistribution();

            Assert.AreEqual(1, counts[CommandExecutionEventEnum.BadRequest]);

            SL.EndExecution(instance);
            Assert.AreEqual(CommandComponents.ConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
        }
        /// <summary>
        /// Release the occupied semaphore
        /// </summary>
        public static void EndExecution(object instance)
        {
            SemaphoreIsolation isolationInstance = ConvertInstance(instance);

            isolationInstance.EndExecution();
        }
        public static void MarkBadRequest(object instance)
        {
            SemaphoreIsolation isolationInstance = ConvertInstance(instance);

            isolationInstance.MarkBadRequest();
        }
        public static void MarkFailure(object instance)
        {
            SemaphoreIsolation isolationInstance = ConvertInstance(instance);

            isolationInstance.MarkFailure();
        }
        public static void MarkSuccess(object instance)
        {
            SemaphoreIsolation isolationInstance = ConvertInstance(instance);

            isolationInstance.MarkSuccess();
        }
 public void MarkSuccess_WithEmptyInstance()
 {
     SL.MarkSuccess(null);
 }
        public void Execution_ShortCircuited_AutoRecover_WithInstance()
        {
            SL.Config(TestCommandKey, TestGroupKey, TestDomain);
            CommandComponents.ConfigSet.InitTestHealthSnapshotInterval();
            for (int i = 0; i < DefaultConfigSet.CircuitBreakerRequestCountThreshold; i++)
            {
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                object instance = SL.CreateInstance(TestCommandKey);
                ScenarioTestHelper.SleepHealthSnapshotInverval();
                SL.StartExecution(instance);
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
                SL.MarkFailure(instance);
                SL.EndExecution(instance);
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            }

            for (int i = 0; i < 10; i++)
            {
                try
                {
                    Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                    object instance = SL.CreateInstance(TestCommandKey);
                    ScenarioTestHelper.SleepHealthSnapshotInverval();
                    try
                    {
                        SL.StartExecution(instance);
                        Assert.Fail("Short circuited exception should be thrown before.");
                    }
                    catch (HystrixException)
                    {
                        Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                        throw;
                    }
                }
                catch (HystrixException ex)
                {
                    Assert.AreEqual(FailureTypeEnum.ShortCircuited, ex.FailureType);
                }
            }

            Thread.Sleep(DefaultConfigSet.CircuitBreakerSleepWindowInMilliseconds + 10);

            {
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                object instance = SL.CreateInstance(TestCommandKey);
                ScenarioTestHelper.SleepHealthSnapshotInverval();
                SL.StartExecution(instance);
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
                SL.MarkFailure(instance);
                SL.EndExecution(instance);
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            }

            for (int i = 0; i < 10; i++)
            {
                try
                {
                    Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                    object instance = SL.CreateInstance(TestCommandKey);
                    ScenarioTestHelper.SleepHealthSnapshotInverval();
                    try
                    {
                        SL.StartExecution(instance);
                        Assert.Fail("Short circuited exception should be thrown before.");
                    }
                    catch (HystrixException)
                    {
                        Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                        throw;
                    }
                }
                catch (HystrixException ex)
                {
                    Assert.AreEqual(FailureTypeEnum.ShortCircuited, ex.FailureType);
                }
            }

            Thread.Sleep(DefaultConfigSet.CircuitBreakerSleepWindowInMilliseconds + 10);

            for (int i = 0; i < 10; i++)
            {
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
                object instance = SL.CreateInstance(TestCommandKey);
                SL.StartExecution(instance);
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount - 1, TestSemaphore.CurrentCount);
                SL.MarkSuccess(instance);
                SL.EndExecution(instance);
                Assert.AreEqual(DefaultConfigSet.CommandMaxConcurrentCount, TestSemaphore.CurrentCount);
            }
        }
 public void EndExecution_WithEmptyInstance()
 {
     SL.EndExecution(null);
 }
 public void MarkBadRequest_WithEmptyInstance()
 {
     SL.MarkBadRequest(null);
 }
 public void MarkFailure_WithEmptyInstance()
 {
     SL.MarkFailure(null);
 }