Esempio n. 1
0
        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.");
            }
        }
Esempio n. 2
0
        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.");
            }
        }
Esempio n. 3
0
        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.");
            }
        }