/// <summary> /// Initializes a new instance of the <see cref="TestingEngine"/> class. /// </summary> private TestingEngine(Configuration configuration, TestMethodInfo testMethodInfo) { this.Configuration = configuration; this.TestMethodInfo = testMethodInfo; this.Logger = new ConsoleLogger(); this.ErrorReporter = new ErrorReporter(configuration, this.Logger); this.Profiler = new Profiler(); this.PerIterationCallbacks = new HashSet <Action <int> >(); // Initializes scheduling strategy specific components. this.RandomValueGenerator = new RandomValueGenerator(configuration); this.TestReport = new TestReport(configuration); this.ReadableTrace = string.Empty; this.ReproducableTrace = string.Empty; this.CancellationTokenSource = new CancellationTokenSource(); this.PrintGuard = 1; if (!configuration.UserExplicitlySetLivenessTemperatureThreshold && configuration.MaxFairSchedulingSteps > 0) { configuration.LivenessTemperatureThreshold = configuration.MaxFairSchedulingSteps / 2; } if (configuration.SchedulingStrategy is "replay") { var scheduleDump = this.GetScheduleForReplay(out bool isFair); ScheduleTrace schedule = new ScheduleTrace(scheduleDump); this.Strategy = new ReplayStrategy(configuration, schedule, isFair); } else if (configuration.SchedulingStrategy is "interactive") { configuration.TestingIterations = 1; configuration.PerformFullExploration = false; configuration.IsVerbose = true; this.Strategy = new InteractiveStrategy(configuration, this.Logger); } else if (configuration.SchedulingStrategy is "random") { this.Strategy = new RandomStrategy(configuration.MaxFairSchedulingSteps, this.RandomValueGenerator); } else if (configuration.SchedulingStrategy is "pct") { this.Strategy = new PCTStrategy(configuration.MaxUnfairSchedulingSteps, configuration.StrategyBound, this.RandomValueGenerator); } else if (configuration.SchedulingStrategy is "fairpct") { var prefixLength = configuration.SafetyPrefixBound == 0 ? configuration.MaxUnfairSchedulingSteps : configuration.SafetyPrefixBound; var prefixStrategy = new PCTStrategy(prefixLength, configuration.StrategyBound, this.RandomValueGenerator); var suffixStrategy = new RandomStrategy(configuration.MaxFairSchedulingSteps, this.RandomValueGenerator); this.Strategy = new ComboStrategy(prefixStrategy, suffixStrategy); } else if (configuration.SchedulingStrategy is "probabilistic") { this.Strategy = new ProbabilisticRandomStrategy(configuration.MaxFairSchedulingSteps, configuration.StrategyBound, this.RandomValueGenerator); } else if (configuration.SchedulingStrategy is "dfs") { this.Strategy = new DFSStrategy(configuration.MaxUnfairSchedulingSteps); } else if (configuration.SchedulingStrategy is "portfolio") { Error.ReportAndExit("Portfolio testing strategy is only " + "available in parallel testing."); } if (configuration.SchedulingStrategy != "replay" && configuration.ScheduleFile.Length > 0) { var scheduleDump = this.GetScheduleForReplay(out bool isFair); ScheduleTrace schedule = new ScheduleTrace(scheduleDump); this.Strategy = new ReplayStrategy(configuration, schedule, isFair, this.Strategy); } }
/// <summary> /// Initialized the testing engine. /// </summary> /// <param name="configuration">Configuration</param> private void Initialize(Configuration configuration) { this.Configuration = configuration; this.Logger = new ConsoleLogger(); this.ErrorReporter = new ErrorReporter(this.Configuration, this.Logger); this.Profiler = new Profiler(); this.PerIterationCallbacks = new HashSet <Action <int> >(); // Initializes scheduling strategy specific components. this.SchedulingStrategyLogger = new SchedulingStrategyLogger(this.Configuration); this.SetRandomNumberGenerator(); this.TestReport = new TestReport(this.Configuration); this.CancellationTokenSource = new CancellationTokenSource(); this.PrintGuard = 1; if (this.Configuration.SchedulingStrategy == SchedulingStrategy.Interactive) { this.Strategy = new InteractiveStrategy(this.Configuration, this.Logger); this.Configuration.SchedulingIterations = 1; this.Configuration.PerformFullExploration = false; this.Configuration.Verbose = 2; } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.Replay) { var scheduleDump = this.GetScheduleForReplay(out bool isFair); ScheduleTrace schedule = new ScheduleTrace(scheduleDump); this.Strategy = new ReplayStrategy(this.Configuration, schedule, isFair); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.Random) { this.Strategy = new RandomStrategy(this.Configuration.MaxFairSchedulingSteps, this.RandomNumberGenerator); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.ProbabilisticRandom) { this.Strategy = new ProbabilisticRandomStrategy(this.Configuration.MaxFairSchedulingSteps, this.Configuration.CoinFlipBound, this.RandomNumberGenerator); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.PCT) { this.Strategy = new PCTStrategy(this.Configuration.MaxUnfairSchedulingSteps, this.Configuration.PrioritySwitchBound, this.SchedulingStrategyLogger, this.RandomNumberGenerator); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.FairPCT) { var prefixLength = this.Configuration.SafetyPrefixBound == 0 ? this.Configuration.MaxUnfairSchedulingSteps : this.Configuration.SafetyPrefixBound; var prefixStrategy = new PCTStrategy(prefixLength, this.Configuration.PrioritySwitchBound, this.SchedulingStrategyLogger, this.RandomNumberGenerator); var suffixStrategy = new RandomStrategy(this.Configuration.MaxFairSchedulingSteps, this.RandomNumberGenerator); this.Strategy = new ComboStrategy(prefixStrategy, suffixStrategy); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.DFS) { this.Strategy = new DFSStrategy(this.Configuration.MaxUnfairSchedulingSteps, this.SchedulingStrategyLogger); this.Configuration.PerformFullExploration = false; } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.IDDFS) { this.Strategy = new IterativeDeepeningDFSStrategy(this.Configuration.MaxUnfairSchedulingSteps, this.SchedulingStrategyLogger); this.Configuration.PerformFullExploration = false; } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.DPOR) { this.Strategy = new DPORStrategy( new ContractAsserter(), null, -1, this.Configuration.MaxUnfairSchedulingSteps); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.RDPOR) { this.Strategy = new DPORStrategy( new ContractAsserter(), this.RandomNumberGenerator, -1, this.Configuration.MaxFairSchedulingSteps); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.DelayBounding) { this.Strategy = new ExhaustiveDelayBoundingStrategy(this.Configuration.MaxUnfairSchedulingSteps, this.Configuration.DelayBound, this.SchedulingStrategyLogger, this.RandomNumberGenerator); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.RandomDelayBounding) { this.Strategy = new RandomDelayBoundingStrategy(this.Configuration.MaxUnfairSchedulingSteps, this.Configuration.DelayBound, this.SchedulingStrategyLogger, this.RandomNumberGenerator); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.Portfolio) { Error.ReportAndExit("Portfolio testing strategy is only " + "available in parallel testing."); } if (this.Configuration.SchedulingStrategy != SchedulingStrategy.Replay && this.Configuration.ScheduleFile.Length > 0) { var scheduleDump = this.GetScheduleForReplay(out bool isFair); ScheduleTrace schedule = new ScheduleTrace(scheduleDump); this.Strategy = new ReplayStrategy(this.Configuration, schedule, isFair, this.Strategy); } }
/// <summary> /// Initializes a new instance of the <see cref="TestingEngine"/> class. /// </summary> private TestingEngine(Configuration configuration, TestMethodInfo testMethodInfo) { this.Configuration = configuration; this.TestMethodInfo = testMethodInfo; this.DefaultLogger = new ConsoleLogger() { LogLevel = configuration.LogLevel }; this.Logger = this.DefaultLogger; this.Profiler = new Profiler(); this.PerIterationCallbacks = new HashSet <Action <uint> >(); // Initializes scheduling strategy specific components. this.RandomValueGenerator = new RandomValueGenerator(configuration); this.TestReport = new TestReport(configuration); this.ReadableTrace = string.Empty; this.ReproducibleTrace = string.Empty; this.CancellationTokenSource = new CancellationTokenSource(); this.PrintGuard = 1; if (configuration.IsDebugVerbosityEnabled) { IO.Debug.IsEnabled = true; } if (!configuration.UserExplicitlySetLivenessTemperatureThreshold && configuration.MaxFairSchedulingSteps > 0) { configuration.LivenessTemperatureThreshold = configuration.MaxFairSchedulingSteps / 2; } if (configuration.SchedulingStrategy is "replay") { var scheduleDump = this.GetScheduleForReplay(out bool isFair); ScheduleTrace schedule = new ScheduleTrace(scheduleDump); this.Strategy = new ReplayStrategy(configuration, schedule, isFair); } else if (configuration.SchedulingStrategy is "interactive") { configuration.TestingIterations = 1; configuration.PerformFullExploration = false; configuration.IsVerbose = true; this.Strategy = new InteractiveStrategy(configuration, this.Logger); } else if (configuration.SchedulingStrategy is "random") { this.Strategy = new RandomStrategy(configuration.MaxFairSchedulingSteps, this.RandomValueGenerator); } else if (configuration.SchedulingStrategy is "pct") { this.Strategy = new PCTStrategy(configuration.MaxUnfairSchedulingSteps, configuration.StrategyBound, this.RandomValueGenerator); } else if (configuration.SchedulingStrategy is "fairpct") { var prefixLength = configuration.SafetyPrefixBound is 0 ? configuration.MaxUnfairSchedulingSteps : configuration.SafetyPrefixBound; var prefixStrategy = new PCTStrategy(prefixLength, configuration.StrategyBound, this.RandomValueGenerator); var suffixStrategy = new RandomStrategy(configuration.MaxFairSchedulingSteps, this.RandomValueGenerator); this.Strategy = new ComboStrategy(prefixStrategy, suffixStrategy); } else if (configuration.SchedulingStrategy is "probabilistic") { this.Strategy = new ProbabilisticRandomStrategy(configuration.MaxFairSchedulingSteps, configuration.StrategyBound, this.RandomValueGenerator); } else if (configuration.SchedulingStrategy is "dfs") { this.Strategy = new DFSStrategy(configuration.MaxUnfairSchedulingSteps); } else if (configuration.SchedulingStrategy is "rl") { this.Strategy = new QLearningStrategy(configuration.AbstractionLevel, configuration.MaxUnfairSchedulingSteps, this.RandomValueGenerator); } else if (configuration.SchedulingStrategy is "portfolio") { var msg = "Portfolio testing strategy is only " + "available in parallel testing."; if (configuration.DisableEnvironmentExit) { throw new Exception(msg); } else { Error.ReportAndExit(msg); } } if (configuration.SchedulingStrategy != "replay" && configuration.ScheduleFile.Length > 0) { var scheduleDump = this.GetScheduleForReplay(out bool isFair); ScheduleTrace schedule = new ScheduleTrace(scheduleDump); this.Strategy = new ReplayStrategy(configuration, schedule, isFair, this.Strategy); } if (TelemetryClient is null) { TelemetryClient = new CoyoteTelemetryClient(this.Configuration); } }
/// <summary> /// Initialized the testing engine. /// </summary> private void Initialize() { this.Logger = new ConsoleLogger(); this.ErrorReporter = new ErrorReporter(this.Configuration, this.Logger); this.Profiler = new Profiler(); this.CancellationTokenSource = new CancellationTokenSource(); this.TestReport = new TestReport(this.Configuration); this.PrintGuard = 1; if (this.Configuration.SchedulingStrategy == SchedulingStrategy.Interactive) { this.Strategy = new InteractiveStrategy(this.Configuration, this.Logger); this.Configuration.SchedulingIterations = 1; this.Configuration.PerformFullExploration = false; this.Configuration.Verbose = 2; } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.Replay) { string[] scheduleDump; if (this.Configuration.ScheduleTrace.Length > 0) { scheduleDump = this.Configuration.ScheduleTrace.Split(new string[] { Environment.NewLine }, StringSplitOptions.None); } else { scheduleDump = File.ReadAllLines(this.Configuration.ScheduleFile); } bool isFair = false; foreach (var line in scheduleDump) { if (!line.StartsWith("--")) { break; } if (line.Equals("--fair-scheduling")) { isFair = true; } else if (line.Equals("--state-caching")) { this.Configuration.CacheProgramState = true; } else if (line.StartsWith("--liveness-temperature-threshold:")) { this.Configuration.LivenessTemperatureThreshold = Int32.Parse(line.Substring("--liveness-temperature-threshold:".Length)); } else if (line.StartsWith("--test-method:")) { this.Configuration.TestMethodName = line.Substring("--test-method:".Length); } } ScheduleTrace schedule = new ScheduleTrace(scheduleDump); this.Strategy = new ReplayStrategy(this.Configuration, schedule, isFair); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.Random) { this.Strategy = new RandomStrategy(this.Configuration); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.ProbabilisticRandom) { this.Strategy = new ProbabilisticRandomStrategy(this.Configuration, this.Configuration.CoinFlipBound); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.DFS) { this.Strategy = new DFSStrategy(this.Configuration); this.Configuration.PerformFullExploration = false; } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.IDDFS) { this.Strategy = new IterativeDeepeningDFSStrategy(this.Configuration); this.Configuration.PerformFullExploration = false; } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.DelayBounding) { this.Strategy = new ExhaustiveDelayBoundingStrategy(this.Configuration, this.Configuration.DelayBound); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.RandomDelayBounding) { this.Strategy = new RandomDelayBoundingStrategy(this.Configuration, this.Configuration.DelayBound); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.PCT) { this.Strategy = new PCTStrategy(this.Configuration, this.Configuration.PrioritySwitchBound); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.FairPCT) { var strategy1 = new PCTStrategy(this.Configuration, this.Configuration.PrioritySwitchBound); var strategy2 = new RandomStrategy(this.Configuration); this.Strategy = new ComboStrategy(this.Configuration, strategy1, strategy2); } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.MaceMC) { this.Strategy = new MaceMCStrategy(this.Configuration); this.Configuration.PerformFullExploration = false; this.Configuration.CacheProgramState = false; } else if (this.Configuration.SchedulingStrategy == SchedulingStrategy.Portfolio) { Error.ReportAndExit("Portfolio testing strategy in only " + "available in parallel testing."); } }
/// <summary> /// Initializes a new instance of the <see cref="SchedulingContext"/> class. /// </summary> private SchedulingContext(Configuration configuration, ILogger logger) { this.Configuration = configuration; this.ValueGenerator = new RandomValueGenerator(configuration); if (!configuration.UserExplicitlySetLivenessTemperatureThreshold && configuration.MaxFairSchedulingSteps > 0) { configuration.LivenessTemperatureThreshold = configuration.MaxFairSchedulingSteps / 2; } SchedulingStrategy strategy = null; if (configuration.SchedulingStrategy is "replay") { this.ReplayStrategy = new ReplayStrategy(configuration); strategy = this.ReplayStrategy; this.IsReplayingSchedule = true; } else if (configuration.SchedulingStrategy is "interactive") { configuration.TestingIterations = 1; configuration.PerformFullExploration = false; configuration.IsVerbose = true; strategy = new InteractiveStrategy(configuration, logger); } else if (configuration.SchedulingStrategy is "random") { strategy = new RandomStrategy(configuration.MaxFairSchedulingSteps, this.ValueGenerator); } else if (configuration.SchedulingStrategy is "pct") { strategy = new PCTStrategy(configuration.MaxUnfairSchedulingSteps, configuration.StrategyBound, this.ValueGenerator); } else if (configuration.SchedulingStrategy is "fairpct") { var prefixLength = configuration.SafetyPrefixBound is 0 ? configuration.MaxUnfairSchedulingSteps : configuration.SafetyPrefixBound; var prefixStrategy = new PCTStrategy(prefixLength, configuration.StrategyBound, this.ValueGenerator); var suffixStrategy = new RandomStrategy(configuration.MaxFairSchedulingSteps, this.ValueGenerator); strategy = new ComboStrategy(prefixStrategy, suffixStrategy); } else if (configuration.SchedulingStrategy is "probabilistic") { strategy = new ProbabilisticRandomStrategy(configuration.MaxFairSchedulingSteps, configuration.StrategyBound, this.ValueGenerator); } else if (configuration.SchedulingStrategy is "dfs") { strategy = new DFSStrategy(configuration.MaxUnfairSchedulingSteps); } else if (configuration.SchedulingStrategy is "rl") { this.Strategy = new QLearningStrategy(configuration.AbstractionLevel, configuration.MaxUnfairSchedulingSteps, this.ValueGenerator); } if (configuration.SchedulingStrategy != "replay" && configuration.ScheduleFile.Length > 0) { this.ReplayStrategy = new ReplayStrategy(configuration, strategy); strategy = this.ReplayStrategy; this.IsReplayingSchedule = true; } this.Strategy = strategy; }