/// <summary> /// Constructor. /// </summary> /// <param name="configuration">Configuration</param> /// <param name="logger">ILogger</param> public InteractiveStrategy(Configuration configuration, IO.ILogger logger) { this.Logger = logger ?? new ConsoleLogger(); this.Configuration = configuration; this.InputCache = new List <string>(); this.ExploredSteps = 0; }
/// <summary> /// Installs the specified <see cref="IO.ILogger"/>. /// </summary> /// <param name="logger">ILogger</param> public void SetLogger(IO.ILogger logger) { if (logger == null) { throw new InvalidOperationException("Cannot install a null logger."); } this.Logger.Dispose(); this.Logger = logger; this.ErrorReporter.Logger = logger; }
/// <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); } }