public async Task <MutationDocumentResult> ExecuteMutationAsync(UnimaConfig config, MutationDocument mutationDocument) { var mutationResult = new MutationDocumentResult { Id = mutationDocument.Id, MutationName = mutationDocument.MutationName, ProjectName = mutationDocument.ProjectName, FileName = mutationDocument.FileName, Location = mutationDocument.MutationDetails.Location, Orginal = mutationDocument.MutationDetails.Orginal.ToFullString(), FullOrginal = mutationDocument.MutationDetails.FullOrginal.ToFullString(), Mutation = mutationDocument.MutationDetails.Mutation.ToFullString(), FullMutation = mutationDocument.MutationDetails.FullMutation.ToFullString() }; mutationResult.GenerateHash(); LogTo.Info($"Running mutation: \"{mutationDocument.MutationName}\""); var results = new List <TestSuiteResult>(); // Create the temporary "head" mutation directory to run all tests var mutationDirectoryPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestRun", mutationDocument.Id.ToString()); // Where we should save our compiled mutation var mutationDllPath = Path.Combine(mutationDirectoryPath, $"{config.MutationProjects.FirstOrDefault(m => m.Name == mutationDocument.ProjectName).OutputFileName}"); Directory.CreateDirectory(mutationDirectoryPath); mutationResult.CompilationResult = await _compiler.CompileAsync(mutationDllPath, mutationDocument); if (!mutationResult.CompilationResult.IsSuccess) { return(mutationResult); } foreach (var testProject in config.TestProjects) { var baseline = config.BaselineInfos.FirstOrDefault(b => b.TestProjectName.Equals(testProject.Project.Name, StringComparison.OrdinalIgnoreCase)); var result = await RunTestAsync(testProject, mutationDirectoryPath, mutationDllPath, config.DotNetPath, baseline?.GetTestProjectTimeout() ?? TimeSpan.FromMinutes(config.MaxTestTimeMin)); results.Add(result); if (results.Any(r => !r.IsSuccess)) { break; } } try { Directory.Delete(mutationDirectoryPath, true); } catch (Exception ex) { LogTo.Error($"Failed to delete test directory: {ex.Message}"); } var final = CombineResult(mutationDocument.FileName, results); LogTo.Info($"\"{mutationDocument.MutationName}\" done. Ran {final.TestResults.Count} tests and {final.TestResults.Count(t => !t.IsSuccess)} failed."); mutationResult.FailedTests = final.TestResults.Where(t => !t.IsSuccess).ToList(); mutationResult.TestsRunCount = final.TestResults.Count; return(mutationResult); }
public async Task <MutationDocumentResult> ExecuteMutationAsync( MutationConfig config, MutationDocument mutationDocument, CancellationToken cancellationToken = default(CancellationToken)) { var mutationResult = new MutationDocumentResult { Id = mutationDocument.Id, MutationName = mutationDocument.MutationName, ProjectName = mutationDocument.ProjectName, FileName = mutationDocument.FileName, Location = mutationDocument.MutationDetails.Location, Orginal = mutationDocument.MutationDetails.Original.ToFullString(), FullOrginal = mutationDocument.MutationDetails.FullOriginal.ToFullString(), Mutation = mutationDocument.MutationDetails.Mutation.ToFullString(), FullMutation = mutationDocument.MutationDetails.FullMutation.ToFullString(), Category = mutationDocument.MutationDetails.Category }; mutationResult.GenerateHash(); Log.Info($"Running mutation: \"{mutationDocument.MutationName}\""); var results = new List <TestSuiteResult>(); // Create the temporary "head" mutation directory to run all tests var mutationDirectoryPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "TestRun", mutationDocument.Id.ToString()); // Where we should save our compiled mutation var mutationDllPath = Path.Combine(mutationDirectoryPath, $"{config.MutationProjects.FirstOrDefault(m => m.Project.Name == mutationDocument.ProjectName).Project.OutputFileName}"); _fileSystem.Directory.DeleteDirectoryAndCheckForException(mutationDirectoryPath); try { cancellationToken.ThrowIfCancellationRequested(); _fileSystem.Directory.CreateDirectory(mutationDirectoryPath); mutationResult.CompilationResult = await _compiler.CompileAsync(mutationDllPath, mutationDocument); if (!mutationResult.CompilationResult.IsSuccess) { return(mutationResult); } foreach (var testProject in config.TestProjects) { cancellationToken.ThrowIfCancellationRequested(); if (ShouldIgnoreTestProject(mutationDocument, config.MutationProjects, testProject)) { continue; } var baseline = config.BaselineInfos.FirstOrDefault(b => b.TestProjectName.Equals(testProject.Project.Name, StringComparison.OrdinalIgnoreCase)); var result = await RunTestAsync( testProject, mutationDirectoryPath, mutationDllPath, config.DotNetPath, baseline?.GetTestProjectTimeout() ?? TimeSpan.FromMinutes(config.MaxTestTimeMin), cancellationToken); results.Add(result); if (results.Any(r => !r.IsSuccess)) { break; } } var final = CombineResult(mutationDocument.FileName, results); if (final.TestResults.Count == 0) { throw new MutationDocumentException($"Unknown error when running, we should not have 0 tests. Also make sure that you don't have bad project mapping. Error: \"{final.Name}\""); } Log.Info($"\"{mutationDocument.MutationName}\" done. Ran {final.TestResults.Count} tests and {final.TestResults.Count(t => !t.IsSuccess)} failed."); mutationResult.FailedTests = final.TestResults.Where(t => !t.IsSuccess).ToList(); mutationResult.TestsRunCount = final.TestResults.Count; } catch (OperationCanceledException) { Log.Info("Cancellation requested (single mutation)"); mutationResult.UnexpectedError = "Mutation cancelled"; } catch (Exception) { throw; } finally { _fileSystem.Directory.DeleteDirectoryAndCheckForException(mutationDirectoryPath); } return(mutationResult); }