private static void RunCore(Type benchmarkType, CompetitionState competitionState, int maxRunsAllowed) { var logger = competitionState.Logger; while (competitionState.RunsLeft > 0) { competitionState.PrepareForRun(); var run = competitionState.RunNumber; var runsExpected = competitionState.RunNumber + competitionState.RunsLeft; var runMessage = competitionState.RunLimitExceeded ? $"Run {run}, total runs (expected): {runsExpected} (rerun limit exceeded, last run)" : $"Run {run}, total runs (expected): {runsExpected}"; using (BeginLogImportant(competitionState.Config)) { logger.WriteSeparatorLine(runMessage); } // Running the benchmark var summary = BenchmarkRunner.Run(benchmarkType, competitionState.Config); competitionState.RunCompleted(summary); // TODO: dump them before analyser run? WriteValidationMessages(competitionState); if (competitionState.HasCriticalErrorsInRun) { logger.WriteLineInfo($"{LogImportantInfoPrefix} Breaking competition execution. High severity error occured."); break; } if (competitionState.RunLimitExceeded) { break; } if (competitionState.RunsLeft > 0) { logger.WriteLineInfo($"{LogImportantInfoPrefix} Rerun requested. Runs left: {competitionState.RunsLeft}."); } } // TODO: notify analysers for last run? // Will need to define custom interface, of course. // TODO: move to somewhere else? if (competitionState.RunLimitExceeded && competitionState.RunsLeft > 0) { competitionState.WriteMessage( MessageSource.Runner, MessageSeverity.TestError, $"The benchmark run limit ({competitionState.MaxRunsAllowed} runs(s)) exceeded (read log for details). Try to loose competition limits."); } else if (competitionState.RunNumber > 1) { competitionState.WriteMessage( MessageSource.Runner, MessageSeverity.Warning, $"The benchmark was run {competitionState.RunNumber} time(s) (read log for details). Try to loose competition limits."); } }
private static void RunCore(Type benchmarkType, CompetitionState competitionState) { var logger = competitionState.Logger; var runOptions = competitionState.Options.RunOptions; Code.InRange( runOptions.MaxRunsAllowed, CompetitionRunMode.MaxRunsAllowedCharacteristic.FullId, 0, MaxRunLimit); while (competitionState.RunsLeft > 0) { competitionState.PrepareForRun(); var run = competitionState.RunNumber; var runsExpected = competitionState.RunNumber + competitionState.RunsLeft; var runMessage = competitionState.RunLimitExceeded ? $"Run {run}, total runs (expected): {runsExpected} (rerun limit exceeded, last run)" : $"Run {run}, total runs (expected): {runsExpected}"; using (BeginLogImportant(competitionState.Config)) { logger.WriteSeparatorLine(runMessage); } // TODO: toolchainProvider to base (???). Func <Job, IToolchain> toolchainProvider = j => j.Infrastructure?.Toolchain ?? InProcessToolchain.Instance; // Running the benchmark var summary = BenchmarkRunnerCore.Run( BenchmarkConverter.TypeToBenchmarks(benchmarkType, competitionState.Config), competitionState.Config, toolchainProvider); competitionState.RunCompleted(summary); // Dump messages if analysis was not run and there is a validation analyser. if (summary.HasCriticalValidationErrors) { var validationAnalyser = competitionState.Config .GetAnalysers() .OfType <ValidatorMessagesAnalyser>() .FirstOrDefault(); validationAnalyser?.Analyse(summary); } if (competitionState.HasCriticalErrorsInRun) { competitionState.Logger.WriteVerboseHint("Breaking competition execution. High severity error occured."); break; } if (competitionState.RunLimitExceeded) { break; } if (competitionState.RunsLeft > 0) { competitionState.Logger.WriteVerboseHint($"Rerun requested. Runs left: {competitionState.RunsLeft}."); } } if (competitionState.RunLimitExceeded && competitionState.RunsLeft > 0) { competitionState.WriteMessage( MessageSource.Runner, MessageSeverity.TestError, $"The benchmark run limit ({runOptions.MaxRunsAllowed} runs(s)) exceeded, check log for details."); } else if (competitionState.RunNumber > 1) { competitionState.WriteMessage( MessageSource.Runner, MessageSeverity.Warning, $"The benchmark was run {competitionState.RunNumber} time(s), check log for details."); } }
private static void RunCore(CompetitionState competitionState, IMessageLogger messageLogger) { var logger = competitionState.Logger; var runOptions = competitionState.Options.RunOptions; Code.InRange( runOptions.MaxRunsAllowed, CompetitionRunMode.MaxRunsAllowedCharacteristic.FullId, 0, MaxRunLimit); while (competitionState.RunsLeft > 0) { competitionState.PrepareForRun(); LogCompetitionRunHeader(competitionState); // Running the benchmark var benchmarkType = competitionState.BenchmarkType; var runInfo = _typeToBenchmarkHack( benchmarkType, benchmarkType.GetMethods(), new ReadOnlyConfig(competitionState.Config)); var summary = BenchmarkRunnerCore.Run( runInfo, j => j.Infrastructure?.Toolchain ?? InProcessToolchain.Instance); competitionState.RunCompleted(summary); // Dump messages if analysis was not run and there is a validation analyser. if (summary.HasCriticalValidationErrors) { var validationAnalyser = competitionState.Config .GetAnalysers() .OfType <ValidatorMessagesAnalyser>() .FirstOrDefault(); validationAnalyser?.Analyse(summary); } if (competitionState.HasCriticalErrorsInRun) { logger.WriteHintLine("Breaking competition execution. High severity error occured."); break; } if (competitionState.RunLimitExceeded) { break; } if (competitionState.RunsLeft > 0) { logger.WriteHintLine($"Rerun requested. Runs left: {competitionState.RunsLeft}."); } } if (competitionState.RunLimitExceeded && competitionState.RunsLeft > 0) { messageLogger.WriteTestErrorMessage( $"The benchmark run limit ({runOptions.MaxRunsAllowed} runs(s)) exceeded, check log for details."); } else if (competitionState.RunNumber > 1) { messageLogger.WriteWarningMessage( $"The benchmark was run {competitionState.RunNumber} time(s), check log for details."); } }