private async Task BuildAndExecuteTests(CppMutant mutant, int index) { try { if (_context.UseMultipleSolutions) { var buildExecutor = new CppBuildExecutor( _settings, string.Format(_context.TestSolution.FullName, index), _cpp.Target) { EnableLogging = false, Configuration = _cpp.Configuration, Platform = _cpp.Platform, IntDir = string.Format(_context.IntDir, index), OutDir = string.Format(_context.OutDir, index), OutputPath = string.Format(_context.OutputPath, index), IntermediateOutputPath = string.Format(_context.IntermediateOutputPath, index) }; if (_context.EnableBuildOptimization) { if (!_cpp.IncludeBuildEvents) { string.Format(_context.TestProject.FullName, index).RemoveBuildEvents(); } string.Format(_context.TestProject.FullName, index).OptimizeTestProject(); } var buildLog = new StringBuilder(); void BuildOutputDataReceived(object sender, string args) { lock (AppendLock) { buildLog.Append(args.PrintWithPreTag()); } } buildExecutor.OutputDataReceived += BuildOutputDataReceived; await buildExecutor.ExecuteBuild(); if (buildExecutor.LastBuildStatus == Constants.BuildExecutionStatus.Failed) { buildLog.Clear(); buildExecutor.Rebuild = true; await buildExecutor.ExecuteBuild(); buildExecutor.Rebuild = false; } lock (BuildAndExecuteTestLock) { SetBuildLog(buildExecutor, buildLog.ToString()); buildExecutor.OutputDataReceived -= BuildOutputDataReceived; } if (buildExecutor.LastBuildStatus == Constants.BuildExecutionStatus.Failed) { mutant.ResultStatus = MutantStatus.BuildError; OnMutantExecuted(new CppMutantEventArgs { Mutant = mutant, TestLog = _testDiagnostics, BuildLog = _buildDiagnostics }); return; } } var testExecutor = new GoogleTestExecutor { KillProcessOnTestFail = true, EnableTestTimeout = true, TestTimeout = _settings.TestTimeout }; var log = new StringBuilder(); void OutputDataReceived(object sender, string args) => log.Append(args.PrintWithPreTag()); if (EnableDiagnostics) { log.AppendLine("<fieldset style=\"margin-bottom:10\">"); var lineNumber = mutant.Mutation.LineNumber; log.Append( $"Line: {lineNumber.ToString().PrintImportant(color: Constants.Colors.Blue)} - {mutant.Mutation.DisplayName.Encode()}" .PrintWithDateTime() .PrintWithPreTag()); testExecutor.OutputDataReceived += OutputDataReceived; } var projectDirectory = Path.GetDirectoryName(_cpp.TestProject); var projectName = Path.GetFileNameWithoutExtension(_cpp.TestProject); var projectNameFromTestContext = string.Format(Path.GetFileNameWithoutExtension(_context.TestProject.Name), index); var app = $"{projectDirectory}/{string.Format(_context.OutDir, index)}{projectName}.exe"; if (!File.Exists(app)) { app = $"{projectDirectory}/{string.Format(_context.OutDir, index)}{projectNameFromTestContext}.exe"; } await testExecutor.ExecuteTests( app, _cpp.UseClassFilter ?$"{Path.GetFileNameWithoutExtension(_context.TestContexts[index].TestClass.Name)}*" : string.Empty); testExecutor.OutputDataReceived -= OutputDataReceived; if (EnableDiagnostics && testExecutor.LastTestExecutionStatus == Constants.TestExecutionStatus.Timeout) { log.AppendLine("</fieldset>"); _testDiagnostics = log.ToString(); } mutant.ResultStatus = testExecutor.LastTestExecutionStatus == Constants.TestExecutionStatus.Success ? MutantStatus.Survived : testExecutor.LastTestExecutionStatus == Constants.TestExecutionStatus.Timeout ? MutantStatus.Timeout : MutantStatus.Killed; OnMutantExecuted(new CppMutantEventArgs { Mutant = mutant, BuildLog = _buildDiagnostics, TestLog = _testDiagnostics }); } catch (Exception e) { mutant.ResultStatus = MutantStatus.BuildError; OnMutantExecuted(new CppMutantEventArgs { Mutant = mutant, BuildLog = e.ToString(), }); } }
private bool IsArid(CppMutant cppMutant) { cppMutant = cppMutant ?? throw new ArgumentNullException(nameof(cppMutant)); return(_aridNodeFilterProvider.Filters.Any(filter => filter.IsSatisfied(cppMutant.Mutation.OriginalNode))); }