예제 #1
0
        // Cause a failure to occur, either a random failure or a specific one
        // If fallbackToRandom is true, then if the specified failure can't be found or can't be triggered, a random failure will be triggered instead
        // Returns the triggered failure module, or null if none
        public ITestFlightFailure TriggerFailure()
        {
            // We won't trigger a failure if we are already failed
            if (activeFailure != null)
            {
                return(null);
            }

            // Failure occurs.  Determine which failure module to trigger
            int totalWeight   = 0;
            int currentWeight = 0;
            int chosenWeight  = 0;
            List <ITestFlightFailure> failureModules = null;

            // Get all failure modules on the part
            // Then filter only the ones that are not disabled
            List <ITestFlightFailure> allFailureModules = TestFlightUtil.GetFailureModules(this.part);

            foreach (ITestFlightFailure fm in allFailureModules)
            {
                PartModule pm = fm as PartModule;
                if (!disabledFailures.Contains(pm.moduleName.Trim().ToLowerInvariant()))
                {
                    if (failureModules == null)
                    {
                        failureModules = new List <ITestFlightFailure>();
                    }
                    failureModules.Add(fm);
                }
            }

            if (failureModules == null || failureModules.Count == 0)
            {
                return(null);
            }

            foreach (ITestFlightFailure fm in failureModules)
            {
                totalWeight += fm.GetFailureDetails().weight;
            }
            chosenWeight = RandomGenerator.Next(1, totalWeight);
            foreach (ITestFlightFailure fm in failureModules)
            {
                currentWeight += fm.GetFailureDetails().weight;
                if (currentWeight >= chosenWeight)
                {
                    // Trigger this module's failure
                    PartModule pm = fm as PartModule;
                    if (pm != null)
                    {
                        return(TriggerNamedFailure(pm.moduleName, false));
                    }
                }
            }

            return(null);
        }
예제 #2
0
        public ITestFlightFailure TriggerNamedFailure(String failureModuleName, bool fallbackToRandom)
        {
            // We won't trigger a failure if we are already failed
            if (activeFailure != null)
            {
                return(null);
            }

            failureModuleName = failureModuleName.ToLower().Trim();

            List <ITestFlightFailure> failureModules;

            failureModules = TestFlightUtil.GetFailureModules(this.part);

            foreach (ITestFlightFailure fm in failureModules)
            {
                PartModule pm = fm as PartModule;
                if (pm.moduleName.ToLower().Trim() == failureModuleName)
                {
                    if (fm == null && fallbackToRandom)
                    {
                        return(TriggerFailure());
                    }
                    else if (fm == null & !fallbackToRandom)
                    {
                        return(null);
                    }
                    else
                    {
                        Log("Triggering Failure: " + pm.moduleName);
                        if (!fm.OneShot)
                        {
                            activeFailure       = fm;
                            failureAcknowledged = false;
                            fm.DoFailure();
                            operatingTime = -1;
                            return(fm);
                        }
                    }
                }
            }

            if (fallbackToRandom)
            {
                return(TriggerFailure());
            }

            return(null);
        }
예제 #3
0
        // Returns a list of all available failures on the part
        public List <String> GetAvailableFailures()
        {
            List <String>             failureModulesString = new List <string>();
            List <ITestFlightFailure> failureModules;

            failureModules = TestFlightUtil.GetFailureModules(this.part);

            foreach (ITestFlightFailure fm in failureModules)
            {
                PartModule pm = fm as PartModule;
                failureModulesString.Add(pm.moduleName);
            }

            return(failureModulesString);
        }
예제 #4
0
        // Returns a list of all available failures on the part
        public List <String> GetAvailableFailures()
        {
            List <String>             failureModulesString = new List <string>();
            List <ITestFlightFailure> failureModules;

            failureModules = TestFlightUtil.GetFailureModules(this.part, Alias);

            for (int i = 0, failureModulesCount = failureModules.Count; i < failureModulesCount; i++)
            {
                ITestFlightFailure fm = failureModules[i];
                PartModule         pm = fm as PartModule;
                failureModulesString.Add(pm.moduleName);
            }

            return(failureModulesString);
        }
예제 #5
0
        public override void OnAwake()
        {
            String partName;

            if (this.part != null)
            {
                partName = this.part.name;
            }
            else
            {
                partName = "unknown";
            }

            if (momentaryFailureRates == null)
            {
                momentaryFailureRates = new List <MomentaryFailureRate>();
            }

            if (momentaryFailureModifiers == null)
            {
                momentaryFailureModifiers = new List <MomentaryFailureModifier>();
            }

            if (disabledFailures == null)
            {
                disabledFailures = new List <string>();
            }

            // poll failure modules for any existing failures
            if (failures == null)
            {
                failures = new List <ITestFlightFailure>();
            }
            List <ITestFlightFailure> failureModules = TestFlightUtil.GetFailureModules(this.part, Alias);

            foreach (ITestFlightFailure failure in failureModules)
            {
                if (failure.Failed)
                {
                    failures.Add(failure);
                    if (failure.GetFailureDetails().severity.ToLowerInvariant() == "major")
                    {
                        hasMajorFailure = true;
                    }
                }
            }
        }
예제 #6
0
        public ITestFlightFailure TriggerNamedFailure(String failureModuleName, bool fallbackToRandom)
        {
            failureModuleName = failureModuleName.ToLower().Trim();

            List <ITestFlightFailure> failureModules;

            failureModules = TestFlightUtil.GetFailureModules(this.part, Alias);

            foreach (ITestFlightFailure fm in failureModules)
            {
                PartModule pm = fm as PartModule;
                if (pm.moduleName.ToLower().Trim() == failureModuleName)
                {
                    if ((fm == null || fm.Failed) && fallbackToRandom)
                    {
                        return(TriggerFailure());
                    }
                    else if (fm == null & !fallbackToRandom)
                    {
                        return(null);
                    }
                    else
                    {
                        Log("Triggering Failure: " + pm.moduleName);
                        if (failures == null)
                        {
                            failures = new List <ITestFlightFailure>();
                        }
                        failures.Add(fm);
                        fm.DoFailure();
                        if (fm.GetFailureDetails().severity.ToLowerInvariant() == "major")
                        {
                            hasMajorFailure = true;
                        }
                        return(fm);
                    }
                }
            }

            if (fallbackToRandom)
            {
                return(TriggerFailure());
            }

            return(null);
        }
예제 #7
0
        public List <string> GetTestFlightInfo()
        {
            List <string> infoStrings = new List <string>();
            string        partName    = Alias;

            infoStrings.Add("<b>Core</b>");
            infoStrings.Add("<b>Active Part</b>: " + partName);
            float flightData = TestFlightManagerScenario.Instance.GetFlightDataForPartName(partName);

            if (flightData < 0f)
            {
                flightData = 0f;
            }
            infoStrings.Add(String.Format("<b>Flight Data</b>: {0:f2}/{1:f2}", flightData, maxData));

            List <ITestFlightReliability> reliabilityModules = TestFlightUtil.GetReliabilityModules(this.part, Alias);

            if (reliabilityModules != null)
            {
                for (int i = 0, reliabilityModulesCount = reliabilityModules.Count; i < reliabilityModulesCount; i++)
                {
                    ITestFlightReliability reliabilityModule = reliabilityModules[i];
                    infoStrings.AddRange(reliabilityModule.GetTestFlightInfo());
                }
            }

            List <ITestFlightFailure> failureModules = TestFlightUtil.GetFailureModules(this.part, Alias);

            if (failureModules != null)
            {
                for (int i = 0, failureModulesCount = failureModules.Count; i < failureModulesCount; i++)
                {
                    ITestFlightFailure failureModule = failureModules[i];
                    List <string>      infoColl      = failureModule.GetTestFlightInfo();
                    if (infoColl != null)
                    {
                        infoStrings.AddRange(infoColl);
                    }
                }
            }

            return(infoStrings);
        }
예제 #8
0
        public override string GetInfo()
        {
            // This methods collects data from all the TestFlight modules and combines it into one string
            List <string> infoStrings = new List <string>();

            List <ITestFlightReliability> reliabilityModules = TestFlightUtil.GetReliabilityModules(this.part, Alias, false);

            if (reliabilityModules != null)
            {
                for (int i = 0, reliabilityModulesCount = reliabilityModules.Count; i < reliabilityModulesCount; i++)
                {
                    ITestFlightReliability reliabilityModule = reliabilityModules[i];
                    var s = reliabilityModule.GetModuleInfo();
                    if (!string.IsNullOrEmpty(s))
                    {
                        infoStrings.Add(s);
                    }
                }
            }

            List <ITestFlightFailure> failureModules = TestFlightUtil.GetFailureModules(this.part, Alias, false);

            if (failureModules != null)
            {
                for (int i = 0, failureModulesCount = failureModules.Count; i < failureModulesCount; i++)
                {
                    ITestFlightFailure failureModule = failureModules[i];
                    var s = failureModule.GetModuleInfo();
                    if (!string.IsNullOrEmpty(s))
                    {
                        infoStrings.Add(s);
                    }
                }
            }

            if (infoStrings.Count > 0)
            {
                return(string.Join("\n", infoStrings.ToArray()));
            }

            return(base.GetInfo());
        }
예제 #9
0
        // Cause a failure to occur, either a random failure or a specific one
        // If fallbackToRandom is true, then if the specified failure can't be found or can't be triggered, a random failure will be triggered instead
        // Returns the triggered failure module, or null if none
        public ITestFlightFailure TriggerFailure(string severity)
        {
            severity = severity.ToLowerInvariant();
            Log(string.Format("Triggering random {0} failure", severity));

            // Failure occurs.  Determine which failure module to trigger
            int totalWeight   = 0;
            int currentWeight = 0;
            int chosenWeight  = 0;
            List <ITestFlightFailure> failureModules = null;

            // Get all failure modules on the part
            // Then filter only the ones that are not disabled and are of the desired severity
            List <ITestFlightFailure> allFailureModules = TestFlightUtil.GetFailureModules(this.part, Alias);

            for (int i = 0, allFailureModulesCount = allFailureModules.Count; i < allFailureModulesCount; i++)
            {
                ITestFlightFailure fm = allFailureModules[i];
                PartModule         pm = fm as PartModule;
                if (fm.GetFailureDetails().severity.ToLowerInvariant() == severity || severity == "any")
                {
                    if (fm.Failed)
                    {
                        Log(string.Format("Skipping {0} because it is already active", pm.moduleName));
                        continue;
                    }
                    if (!disabledFailures.Contains(pm.moduleName.Trim().ToLowerInvariant()))
                    {
                        if (failureModules == null)
                        {
                            failureModules = new List <ITestFlightFailure>();
                        }
                        failureModules.Add(fm);
                    }
                }
                else
                {
                    Log(string.Format("Skipping {0} because it doesn't have a matching severity ({1} != {2}", pm.moduleName, fm.GetFailureDetails().severity, severity));
                }
            }

            if (failureModules == null || failureModules.Count == 0)
            {
                Log("No failure modules to trigger");
                return(null);
            }

            for (int i = 0, failureModulesCount = failureModules.Count; i < failureModulesCount; i++)
            {
                ITestFlightFailure fm = failureModules[i];
                totalWeight += fm.GetFailureDetails().weight;
            }
            chosenWeight = RandomGenerator.Next(1, totalWeight);
            for (int i = 0, failureModulesCount = failureModules.Count; i < failureModulesCount; i++)
            {
                ITestFlightFailure fm = failureModules[i];
                currentWeight += fm.GetFailureDetails().weight;
                if (currentWeight >= chosenWeight)
                {
                    // Trigger this module's failure
                    PartModule pm = fm as PartModule;
                    if (pm != null)
                    {
                        return(TriggerNamedFailure(pm.moduleName, false));
                    }
                }
            }

            return(null);
        }
예제 #10
0
 // Get all Failure Modules that are bound to a given alias
 public static List <ITestFlightFailure> GetFailureModules(Part part, string alias)
 {
     return(TestFlightUtil.GetFailureModules(part, alias));
 }
예제 #11
0
 // Get all Failure Modules - can be more than one.
 public static List <ITestFlightFailure> GetFailureModules(Part part)
 {
     return(TestFlightUtil.GetFailureModules(part));
 }