/// <summary> /// Creates a bug-reproducing task. /// </summary> /// <returns>Task</returns> private Task CreateBugReproducingTask() { Task task = new Task(() => { var runtime = new PSharpBugFindingRuntime(base.Configuration, base.Strategy, base.Visualizer); StringWriter sw = null; if (base.Configuration.RedirectTestConsoleOutput && base.Configuration.Verbose < 2) { sw = base.RedirectConsoleOutput(); base.HasRedirectedConsoleOutput = true; } // Start the test. if (base.TestAction != null) { base.TestAction(runtime); } else { try { if (base.TestInitMethod != null) { // Initializes the test state. base.TestInitMethod.Invoke(null, new object[] { }); } // Starts the test. base.TestMethod.Invoke(null, new object[] { runtime }); } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } } // Wait for test to terminate. runtime.Wait(); if (base.Configuration.EnableVisualization) { base.Visualizer.Refresh(); } try { // Invokes user-provided cleanup for this iteration. if (base.TestIterationDisposeMethod != null) { // Disposes the test state. base.TestIterationDisposeMethod.Invoke(null, new object[] { }); } // Invokes user-provided cleanup for all iterations. if (base.TestDisposeMethod != null) { // Disposes the test state. base.TestDisposeMethod.Invoke(null, new object[] { }); } } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } // Checks for any liveness property violations. Requires // that the program has terminated and no safety property // violations have been found. if (!runtime.BugFinder.BugFound) { runtime.LivenessChecker.CheckLivenessAtTermination(); } if (base.HasRedirectedConsoleOutput) { base.ResetOutput(); } base.ExploredDepth = runtime.BugFinder.ExploredSteps; if (runtime.BugFinder.BugFound) { base.NumOfFoundBugs++; base.BugReport = runtime.BugFinder.BugReport; } else { base.BugReport = ""; } }, base.CancellationTokenSource.Token); return task; }
/// <summary> /// Creates a new bug-finding task. /// </summary> /// <returns>Task</returns> private Task CreateBugFindingTask() { if (base.Configuration.TestingProcessId >= 0) { IO.Error.PrintLine($"... Task {this.Configuration.TestingProcessId} is " + $"using '{base.Configuration.SchedulingStrategy}' strategy."); } else { IO.PrintLine($"... Using '{base.Configuration.SchedulingStrategy}' strategy."); } Task task = new Task(() => { try { if (base.TestInitMethod != null) { // Initializes the test state. base.TestInitMethod.Invoke(null, new object[] { }); } } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } int maxIterations = base.Configuration.SchedulingIterations; for (int i = 0; i < maxIterations; i++) { if (this.CancellationTokenSource.IsCancellationRequested) { break; } if (this.ShouldPrintIteration(i + 1)) { IO.PrintLine($"..... Iteration #{i + 1}"); } var runtime = new PSharpBugFindingRuntime(base.Configuration, base.Strategy, base.TestReport.CoverageInfo); StringWriter sw = null; if (base.Configuration.RedirectTestConsoleOutput && base.Configuration.Verbose < 2) { sw = base.RedirectConsoleOutput(); base.HasRedirectedConsoleOutput = true; } // Starts the test. if (base.TestAction != null) { base.TestAction(runtime); } else { try { base.TestMethod.Invoke(null, new object[] { runtime }); } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } } // Wait for the test to terminate. runtime.Wait(); if (this.Configuration.EnableDataRaceDetection) { this.EmitRaceInstrumentationTraces(runtime, i); } try { // Invokes user-provided cleanup for this iteration. if (base.TestIterationDisposeMethod != null) { // Disposes the test state. base.TestIterationDisposeMethod.Invoke(null, null); } } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } // Invoke the per iteration callbacks, if any. foreach (var callback in base.PerIterationCallbacks) { callback(i); } // Cleans up the runtime before the next // iteration starts. this.CleanUpRuntime(); // Checks for any liveness property violations. Requires // that the program has terminated and no safety property // violations have been found. if (!runtime.BugFinder.BugFound) { runtime.LivenessChecker.CheckLivenessAtTermination(); } if (base.HasRedirectedConsoleOutput) { base.ResetOutput(); } this.GatherIterationStatistics(runtime); if (runtime.BugFinder.BugFound) { base.TestReport.NumOfFoundBugs++; base.TestReport.BugReport = runtime.BugFinder.BugReport; if (base.Configuration.PerformFullExploration) { IO.PrintLine($"..... Iteration #{i + 1} triggered " + $"bug #{base.TestReport.NumOfFoundBugs}"); } } else { base.TestReport.BugReport = ""; } if (base.Strategy.HasFinished()) { break; } base.Strategy.ConfigureNextIteration(); if (!base.Configuration.PerformFullExploration && base.TestReport.NumOfFoundBugs > 0) { if (sw != null && !base.Configuration.SuppressTrace) { this.ReadableTrace = sw.ToString(); this.ReadableTrace += this.CreateReport("<StrategyLog>"); this.BugTrace = runtime.BugTrace; this.ConstructReproducableTrace(runtime); } break; } else if (sw != null && base.Configuration.PrintTrace) { this.ReadableTrace = sw.ToString(); this.ReadableTrace += this.CreateReport("<StrategyLog>"); this.BugTrace = runtime.BugTrace; this.ConstructReproducableTrace(runtime); } // Increases iterations if there is a specified timeout // and the default iteration given. if (base.Configuration.SchedulingIterations == 1 && base.Configuration.Timeout > 0) { maxIterations++; } runtime.Dispose(); } try { if (base.TestDisposeMethod != null) { // Disposes the test state. base.TestDisposeMethod.Invoke(null, new object[] { }); } } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } }, base.CancellationTokenSource.Token); return(task); }
/// <summary> /// Creates a bug-reproducing task. /// </summary> /// <returns>Task</returns> private Task CreateBugReproducingTask() { Task task = new Task(() => { var runtime = new PSharpBugFindingRuntime(base.Configuration, base.Strategy, base.TestReport.CoverageInfo); StringWriter sw = null; if (base.Configuration.RedirectTestConsoleOutput && base.Configuration.Verbose < 2) { sw = base.RedirectConsoleOutput(); base.HasRedirectedConsoleOutput = true; } // Start the test. if (base.TestAction != null) { base.TestAction(runtime); } else { try { if (base.TestInitMethod != null) { // Initializes the test state. base.TestInitMethod.Invoke(null, new object[] { }); } // Starts the test. base.TestMethod.Invoke(null, new object[] { runtime }); } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } } // Wait for the test to terminate. runtime.Wait(); try { // Invokes user-provided cleanup for this iteration. if (base.TestIterationDisposeMethod != null) { // Disposes the test state. base.TestIterationDisposeMethod.Invoke(null, new object[] { }); } // Invokes user-provided cleanup for all iterations. if (base.TestDisposeMethod != null) { // Disposes the test state. base.TestDisposeMethod.Invoke(null, new object[] { }); } } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } // Checks for any liveness property violations. Requires // that the program has terminated and no safety property // violations have been found. if (!runtime.BugFinder.BugFound) { runtime.LivenessChecker.CheckLivenessAtTermination(); } if (base.HasRedirectedConsoleOutput) { base.ResetOutput(); } if (runtime.BugFinder.BugFound) { base.TestReport.NumOfFoundBugs++; base.TestReport.BugReport = runtime.BugFinder.BugReport; } else { base.TestReport.BugReport = ""; } }, base.CancellationTokenSource.Token); return(task); }
/// <summary> /// Creates a new bug-finding task. /// </summary> /// <returns>Task</returns> private Task CreateBugFindingTask() { if (base.Configuration.TestingProcessId >= 0) { IO.Error.PrintLine($"... Task {this.Configuration.TestingProcessId} is " + $"using '{base.Configuration.SchedulingStrategy}' strategy."); } else { IO.PrintLine($"... Using '{base.Configuration.SchedulingStrategy}' strategy."); } Task task = new Task(() => { try { if (base.TestInitMethod != null) { // Initializes the test state. base.TestInitMethod.Invoke(null, new object[] { }); } } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } int maxIterations = base.Configuration.SchedulingIterations; for (int i = 0; i < maxIterations; i++) { if (this.CancellationTokenSource.IsCancellationRequested) { break; } if (this.ShouldPrintIteration(i + 1)) { IO.PrintLine($"..... Iteration #{i + 1}"); } var runtime = new PSharpBugFindingRuntime(base.Configuration, base.Strategy, base.Visualizer); StringWriter sw = null; if (base.Configuration.RedirectTestConsoleOutput && base.Configuration.Verbose < 2) { sw = base.RedirectConsoleOutput(); base.HasRedirectedConsoleOutput = true; } // Starts the test. if (base.TestAction != null) { base.TestAction(runtime); } else { try { base.TestMethod.Invoke(null, new object[] { runtime }); } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } } // Wait for test to terminate. runtime.Wait(); if (base.Configuration.EnableVisualization) { base.Visualizer.Refresh(); } if (this.Configuration.EnableDataRaceDetection) { this.EmitRaceInstrumentationTraces(runtime, i); } try { // Invokes user-provided cleanup for this iteration. if (base.TestIterationDisposeMethod != null) { // Disposes the test state. base.TestIterationDisposeMethod.Invoke(null, null); } } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } // Invoke the per iteration callbacks, if any. foreach (var callback in base.PerIterationCallbacks) { callback(i); } // Cleans up the runtime before the next // iteration starts. this.CleanUpRuntime(); // Checks for any liveness property violations. Requires // that the program has terminated and no safety property // violations have been found. if (!runtime.BugFinder.BugFound) { runtime.LivenessChecker.CheckLivenessAtTermination(); } if (base.HasRedirectedConsoleOutput) { base.ResetOutput(); } this.ExploredSchedules++; base.ExploredDepth = runtime.BugFinder.ExploredSteps; if (base.Strategy.HasReachedMaxSchedulingSteps()) { this.MaxStepsHit++; } if (runtime.BugFinder.BugFound) { base.NumOfFoundBugs++; base.BugReport = runtime.BugFinder.BugReport; if (base.Configuration.PerformFullExploration) { IO.PrintLine($"..... Iteration #{i + 1} triggered " + $"bug #{base.NumOfFoundBugs}"); } } else { base.BugReport = ""; } if (base.Strategy.HasFinished()) { break; } base.Strategy.ConfigureNextIteration(); if (!base.Configuration.PerformFullExploration && base.NumOfFoundBugs > 0) { if (sw != null && !base.Configuration.SuppressTrace) { this.ReadableTrace = sw.ToString(); this.ReadableTrace += this.CreateReport("<StrategyLog>"); this.BugTrace = runtime.BugTrace; this.ConstructReproducableTrace(runtime); } break; } else if (sw != null && base.Configuration.PrintTrace) { this.ReadableTrace = sw.ToString(); this.ReadableTrace += this.CreateReport("<StrategyLog>"); this.BugTrace = runtime.BugTrace; this.ConstructReproducableTrace(runtime); } // Increases iterations if there is a specified timeout // and the default iteration given. if (base.Configuration.SchedulingIterations == 1 && base.Configuration.Timeout > 0) { maxIterations++; } runtime.Dispose(); } try { if (base.TestDisposeMethod != null) { // Disposes the test state. base.TestDisposeMethod.Invoke(null, new object[] { }); } } catch (TargetInvocationException ex) { if (!(ex.InnerException is TaskCanceledException)) { ExceptionDispatchInfo.Capture(ex.InnerException).Throw(); } } }, base.CancellationTokenSource.Token); return task; }