private static int GetCondition(List <string> parameters, out InjectionComparisonOperator comparisonOperator, out string valueToCompareTo)
        {
            valueToCompareTo   = null;
            comparisonOperator = InjectionComparisonOperator.Skip;
            int result = 0;

            if (2 < parameters.Count && parameters[0].Equals("CONDITION"))
            {
                valueToCompareTo   = parameters[1];
                comparisonOperator = (InjectionComparisonOperator)Enum.Parse(typeof(InjectionComparisonOperator), parameters[2], true);
                result             = 3;
            }
            return(result);
        }
        private static bool ValidateCondition <T>(string valueToCompareTo, ref T objectToCompare, InjectionComparisonOperator comparisonOperator)
        {
            bool result;

            try
            {
                T t = default(T);
                if (valueToCompareTo != null)
                {
                    FaultInjectionTrace.StringToValue <T>(valueToCompareTo, ref t);
                }
                string text = objectToCompare as string;
                switch (comparisonOperator)
                {
                case InjectionComparisonOperator.Skip:
                    result = true;
                    break;

                case InjectionComparisonOperator.Equals:
                    result = (Comparer <T> .Default.Compare(objectToCompare, t) == 0);
                    break;

                case InjectionComparisonOperator.NotEquals:
                    result = (Comparer <T> .Default.Compare(objectToCompare, t) != 0);
                    break;

                case InjectionComparisonOperator.GreaterThan:
                    result = (Comparer <T> .Default.Compare(objectToCompare, t) == 1);
                    break;

                case InjectionComparisonOperator.GreaterThanOrEqual:
                    result = (Comparer <T> .Default.Compare(objectToCompare, t) >= 0);
                    break;

                case InjectionComparisonOperator.LessThan:
                    result = (Comparer <T> .Default.Compare(objectToCompare, t) == -1);
                    break;

                case InjectionComparisonOperator.LessThanOrEqual:
                    result = (Comparer <T> .Default.Compare(objectToCompare, t) <= 0);
                    break;

                case InjectionComparisonOperator.Contains:
                    if (text != null)
                    {
                        result = text.Contains(valueToCompareTo);
                    }
                    else
                    {
                        result = false;
                    }
                    break;

                case InjectionComparisonOperator.NotContains:
                    if (text != null)
                    {
                        result = !text.Contains(valueToCompareTo);
                    }
                    else
                    {
                        result = false;
                    }
                    break;

                case InjectionComparisonOperator.IsNull:
                    result = (objectToCompare == null);
                    break;

                case InjectionComparisonOperator.IsNotNull:
                    result = (objectToCompare != null);
                    break;

                case InjectionComparisonOperator.PPM:
                {
                    int  num = FaultInjectionTrace.random.Next(1000000);
                    int  num2;
                    bool flag = int.TryParse((string)((object)t), out num2);
                    if (flag && num < num2)
                    {
                        result = true;
                    }
                    else
                    {
                        result = false;
                    }
                    break;
                }

                default:
                    result = false;
                    break;
                }
            }
            catch (Exception ex)
            {
                ExTraceGlobals.TracingTracer.TraceInformation <string>(63039, 0L, "ValidateCondition<T>: An exception occured while doing the comparison: {0}", ex.ToString());
                result = false;
            }
            return(result);
        }
        public void TraceTest <T>(uint lid, ref T objectToChange)
        {
            string text = ExTraceConfiguration.Instance.ComponentInjection();

            ExTraceGlobals.TracingTracer.TraceDebug <uint, string>(35221, (long)((ulong)lid), "TraceTest called for LID:{0}, TagIdentifier:'{1}'.", lid, text);
            if (base.IsTraceEnabled(TraceType.FaultInjection))
            {
                if (ExTraceConfiguration.DisableAllTraces != null && ExTraceConfiguration.DisableAllTraces.Contains(this.category))
                {
                    ExTraceGlobals.TracingTracer.TraceDebug <Guid>(56316L, "Component: {0} has all traces temporary disabled for this thread.", this.category);
                    return;
                }
                ExTraceGlobals.TracingTracer.TraceDebug <Guid, uint, string>(51605, (long)((ulong)lid), "FI tracing is enabled for category:{0}, lid:{1}, tagIdentifier:'{2}'.", this.category, lid, text);
                FaultInjectionTagComponentConfig faultInjectionTagComponentConfig = null;
                if (ExTraceConfiguration.Instance.FaultInjectionConfiguration.TryGetValue(this.category, out faultInjectionTagComponentConfig))
                {
                    FaultInjectionComponentConfig faultInjectionComponentConfig = null;
                    if (faultInjectionTagComponentConfig.TryGetValue(text, out faultInjectionComponentConfig) || faultInjectionTagComponentConfig.TryGetValue(string.Empty, out faultInjectionComponentConfig))
                    {
                        ExTraceGlobals.TracingTracer.TraceDebug <string>(33320, (long)((ulong)lid), "Tracing found for tag identifier:'{0}'", text);
                        if (ExTraceConfiguration.DisabledLids != null && ExTraceConfiguration.DisabledLids.Contains(lid))
                        {
                            ExTraceGlobals.TracingTracer.TraceDebug <uint>(43932, (long)((ulong)lid), "LID:{0} is temporary disabled for this thread.", lid);
                            return;
                        }
                        FaultInjectionPointConfig faultInjectionPointConfig = null;
                        if (faultInjectionComponentConfig.TryGetValue(lid, out faultInjectionPointConfig))
                        {
                            ExTraceGlobals.TracingTracer.TraceDebug <FaultInjectionType, uint>(45461, (long)((ulong)lid), "Tracing found for a configuration of type:{0} for lid:{1}", faultInjectionPointConfig.Type, lid);
                            string valueToCompareTo = null;
                            InjectionComparisonOperator comparisonOperator = InjectionComparisonOperator.Skip;
                            List <string> expectedCallStack = null;
                            switch (faultInjectionPointConfig.Type)
                            {
                            case FaultInjectionType.None:
                                break;

                            case FaultInjectionType.Sync:
                            {
                                int condition = FaultInjectionTrace.GetCondition(faultInjectionPointConfig.Parameters, out comparisonOperator, out valueToCompareTo);
                                if (condition < faultInjectionPointConfig.Parameters.Count)
                                {
                                    expectedCallStack = faultInjectionPointConfig.Parameters.GetRange(condition, faultInjectionPointConfig.Parameters.Count - condition);
                                }
                                if (FaultInjectionTrace.ValidateCondition <T>(valueToCompareTo, ref objectToChange, comparisonOperator) && FaultInjectionTrace.ValidateCallStack(lid, expectedCallStack))
                                {
                                    ExTraceGlobals.TracingTracer.TraceInformation <uint>(59951, (long)((ulong)lid), "FI.Sync[lid:{0}]", lid);
                                    FaultInjectionTrace.InjectSync(lid, text);
                                    return;
                                }
                                break;
                            }

                            case FaultInjectionType.Exception:
                                if (faultInjectionPointConfig.Parameters != null && 0 < faultInjectionPointConfig.Parameters.Count)
                                {
                                    int condition2 = FaultInjectionTrace.GetCondition(faultInjectionPointConfig.Parameters, out comparisonOperator, out valueToCompareTo);
                                    if (condition2 < faultInjectionPointConfig.Parameters.Count)
                                    {
                                        string text2 = faultInjectionPointConfig.Parameters[condition2];
                                        if (condition2 + 1 < faultInjectionPointConfig.Parameters.Count)
                                        {
                                            expectedCallStack = faultInjectionPointConfig.Parameters.GetRange(condition2 + 1, faultInjectionPointConfig.Parameters.Count - condition2 - 1);
                                        }
                                        if (FaultInjectionTrace.ValidateCondition <T>(valueToCompareTo, ref objectToChange, comparisonOperator) && FaultInjectionTrace.ValidateCallStack(lid, expectedCallStack))
                                        {
                                            this.EnsureExceptionInjectionCallbackExists();
                                            ExTraceGlobals.TracingTracer.TraceInformation <uint, string>(43567, (long)((ulong)lid), "FI.Exception[lid:{0}] {1}", lid, text2);
                                            FaultInjectionTrace.InjectException(this.category, text2);
                                            return;
                                        }
                                    }
                                }
                                break;

                            case FaultInjectionType.Investigate:
                                ExTraceGlobals.TracingTracer.TraceInformation <StackTrace>(53653, 0L, "Tracing FaultInjectionType.Investigate with stack trace: {0}", new StackTrace());
                                return;

                            case FaultInjectionType.ChangeValue:
                                if (faultInjectionPointConfig.Parameters != null && 0 < faultInjectionPointConfig.Parameters.Count)
                                {
                                    int    condition3 = FaultInjectionTrace.GetCondition(faultInjectionPointConfig.Parameters, out comparisonOperator, out valueToCompareTo);
                                    string text3      = null;
                                    if (condition3 < faultInjectionPointConfig.Parameters.Count)
                                    {
                                        text3 = faultInjectionPointConfig.Parameters[condition3];
                                    }
                                    if (string.IsNullOrEmpty(text3))
                                    {
                                        throw new InvalidOperationException("Expected non-null and non-empty string: string.IsNullOrEmpty(valueToChangeTo)");
                                    }
                                    if (condition3 + 1 < faultInjectionPointConfig.Parameters.Count)
                                    {
                                        expectedCallStack = faultInjectionPointConfig.Parameters.GetRange(1, faultInjectionPointConfig.Parameters.Count - 1);
                                    }
                                    object obj = null;
                                    if (FaultInjectionTrace.ValidateCondition <object>(valueToCompareTo, ref obj, comparisonOperator) && FaultInjectionTrace.ValidateCallStack(lid, expectedCallStack))
                                    {
                                        ExTraceGlobals.TracingTracer.TraceInformation <uint, T, string>(55855, (long)((ulong)lid), "FI.ChangeValue[lid:{0}] {1} => {2}", lid, objectToChange, text3);
                                        FaultInjectionTrace.StringToValue <T>(text3, ref objectToChange);
                                    }
                                }
                                break;

                            default:
                                return;
                            }
                        }
                    }
                }
            }
        }