Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions FineCodeCoverage/Core/Cobertura/CoberturaUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ internal class CoberturaUtil:ICoberturaUtil
private CoverageReport coverageReport;
public List<CoverageLine> CoverageLines { get; private set; }

private CoverageReport LoadReport(string xml)
private CoverageReport LoadReport(string xmlFile)
{
using (var reader = XmlReader.Create(new StringReader(xml), READER_SETTINGS))
using (var reader = XmlReader.Create(xmlFile, READER_SETTINGS))
{
var report = (CoverageReport)SERIALIZER.Deserialize(reader);
return report;
Expand Down Expand Up @@ -68,11 +68,11 @@ private CoverageReport LoadReport(string xml)
// return jsonText;
//}

public void ProcessCoberturaXml(string xml)
public void ProcessCoberturaXml(string xmlFile)
{
CoverageLines = new List<CoverageLine>();

coverageReport = LoadReport(xml);
coverageReport = LoadReport(xmlFile);

foreach (var package in coverageReport.Packages.Package)
{
Expand Down
2 changes: 1 addition & 1 deletion FineCodeCoverage/Core/Cobertura/ICoberturaUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ interface ICoberturaUtil
{
List<CoverageLine> CoverageLines { get; }

void ProcessCoberturaXml(string xml);
void ProcessCoberturaXml(string xmlFile);
string[] GetSourceFiles(string assemblyName, string qualifiedClassName, int file);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,6 @@ internal class CoverageToolOutputManager : ICoverageToolOutputManager
{
private readonly ILogger logger;
private readonly IFileUtil fileUtil;
private const string unifiedHtmlFileName = "index.html";
private const string unifiedXmlFileName = "Cobertura.xml";
private const string processedHtmlFileName = "index-processed.html";
private const string projectCoverageToolOutputFolderName = "coverage-tool-output";
private string outputFolderForAllProjects;
private List<ICoverageProject> coverageProjects;
Expand Down Expand Up @@ -50,14 +47,7 @@ public void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjec
}
}

public void OutputReports(string unifiedHtml, string processedReport, string unifiedXml)
{
var outputFolder = outputFolderForAllProjects ?? coverageProjects[0].CoverageOutputFolder;

fileUtil.WriteAllText(Path.Combine(outputFolder, unifiedHtmlFileName), unifiedHtml);
fileUtil.WriteAllText(Path.Combine(outputFolder, processedHtmlFileName), processedReport);
fileUtil.WriteAllText(Path.Combine(outputFolder, unifiedXmlFileName), unifiedXml);
}


private void DetermineOutputFolder()
{
Expand All @@ -67,5 +57,10 @@ private void DetermineOutputFolder()
logger.Log($"FCC output in {outputFolderForAllProjects}");
}
}

public string GetReportOutputFolder()
{
return outputFolderForAllProjects ?? coverageProjects[0].CoverageOutputFolder;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ namespace FineCodeCoverage.Engine
internal interface ICoverageToolOutputManager
{
void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjects);
void OutputReports(string unifiedHtml, string processedReport, string unifiedXml);
string GetReportOutputFolder();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -138,12 +138,14 @@ public async Task<bool> RunAsync(ICoverageProject project, bool throwError = fal
*/
if (result.ExitCode > 3)
{
logger.Log($"{title} Error. Exit code: {result.ExitCode}");
logger.Log($"{title} Error. Output: ", result.Output);
if (throwError)
{
throw new Exception(result.Output);
}

logger.Log($"{title} Error", result.Output);

return false;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ private string GetSettings()
{
var dataCollectorSettingsBuilder = dataCollectorSettingsBuilderFactory.Create();
dataCollectorSettingsBuilder
.Initialize(coverageProject.Settings, coverageProject.RunSettingsFile, $"{coverageProject.CoverageOutputFolder}/FCC.runsettings");
.Initialize(coverageProject.Settings, coverageProject.RunSettingsFile, Path.Combine(coverageProject.CoverageOutputFolder,"FCC.runsettings"));

// command arguments
dataCollectorSettingsBuilder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,12 @@ internal class DataCollectorSettingsBuilder : IDataCollectorSettingsBuilder
private string generatedRunSettingsPath;
private string existingRunSettings;
private IAppOptions coverageProjectSettings;
private readonly ILogger logger;

public DataCollectorSettingsBuilder(ILogger logger)
{
this.logger = logger;
}
#region Arguments
internal string ProjectDll { get; set; }
internal string Blame { get; set; }
Expand Down Expand Up @@ -67,6 +72,7 @@ public string Build()
private void GenerateRunSettings()
{
var runSettingsDocument = existingRunSettings == null ? GenerateFullRunSettings() : GenerateRunSettingsFromExisting();
logger.Log($"Saving run settings to {generatedRunSettingsPath}");
runSettingsDocument.Save(generatedRunSettingsPath);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,16 @@ namespace FineCodeCoverage.Engine.Coverlet
[Export(typeof(IDataCollectorSettingsBuilderFactory))]
internal class DataCollectorSettingsBuilderFactory : IDataCollectorSettingsBuilderFactory
{
private readonly ILogger logger;

[ImportingConstructor]
public DataCollectorSettingsBuilderFactory(ILogger logger)
{
this.logger = logger;
}
public IDataCollectorSettingsBuilder Create()
{
return new DataCollectorSettingsBuilder();
return new DataCollectorSettingsBuilder(logger);
}
}
}
14 changes: 8 additions & 6 deletions FineCodeCoverage/Core/FCCEngine.cs
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ private void UpdateUI(List<CoverageLine> coverageLines, string reportHtml)
RaiseUpdateOutputWindow(reportHtml);
}

private async System.Threading.Tasks.Task<(List<CoverageLine> coverageLines,string reportFilePath)> RunAndProcessReportAsync(string[] coverOutputFiles,CancellationToken cancellationToken)
private async System.Threading.Tasks.Task<(List<CoverageLine> coverageLines,string reportFilePath)> RunAndProcessReportAsync(string[] coverOutputFiles,string reportOutputFolder,CancellationToken cancellationToken)
{
cancellationToken.ThrowIfCancellationRequested();

Expand All @@ -164,15 +164,16 @@ private void UpdateUI(List<CoverageLine> coverageLines, string reportHtml)

var darkMode = CurrentTheme.Equals("Dark", StringComparison.OrdinalIgnoreCase);

var result = await reportGeneratorUtil.GenerateAsync(coverOutputFiles, darkMode, true);
var result = await reportGeneratorUtil.GenerateAsync(coverOutputFiles,reportOutputFolder, darkMode, true);

if (result.Success)
{
coberturaUtil.ProcessCoberturaXml(result.UnifiedXml);
logger.Log("Processing cobertura");
coberturaUtil.ProcessCoberturaXml(result.UnifiedXmlFile);
coverageLines = coberturaUtil.CoverageLines;

processedReport = reportGeneratorUtil.ProcessUnifiedHtml(result.UnifiedHtml, darkMode);
coverageOutputManager.OutputReports(result.UnifiedHtml, processedReport, result.UnifiedXml);
logger.Log("Processing report");
processedReport = reportGeneratorUtil.ProcessUnifiedHtml(result.UnifiedHtml,reportOutputFolder, darkMode);
}
return (coverageLines, processedReport);
}
Expand Down Expand Up @@ -257,12 +258,13 @@ public void ReloadCoverage(Func<System.Threading.Tasks.Task<List<ICoverageProjec
var coverageProjects = await coverageRequestCallback();

coverageOutputManager.SetProjectCoverageOutputFolder(coverageProjects);
var reportOutputFolder = coverageOutputManager.GetReportOutputFolder();

var coverOutputFiles = await RunCoverageAsync(coverageProjects, cancellationToken);

if (coverOutputFiles.Any())
{
var (lines, report) = await RunAndProcessReportAsync(coverOutputFiles,cancellationToken);
var (lines, report) = await RunAndProcessReportAsync(coverOutputFiles,reportOutputFolder,cancellationToken);
coverageLines = lines;
reportHtml = report;
}
Expand Down
36 changes: 20 additions & 16 deletions FineCodeCoverage/Core/ReportGenerator/ReportGeneratorUtil.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,15 @@ namespace FineCodeCoverage.Engine.ReportGenerator
interface IReportGeneratorUtil
{
void Initialize(string appDataFolder);
string ProcessUnifiedHtml(string htmlForProcessing, bool darkMode);
Task<ReportGeneratorResult> GenerateAsync(IEnumerable<string> coverOutputFiles, bool darkMode, bool throwError = false);
string ProcessUnifiedHtml(string htmlForProcessing,string reportOutputFolder, bool darkMode);
Task<ReportGeneratorResult> GenerateAsync(IEnumerable<string> coverOutputFiles,string reportOutputFolder, bool darkMode, bool throwError = false);

}

internal class ReportGeneratorResult
{
public string UnifiedHtml { get; set; }
public string UnifiedXml { get; set; }
public string UnifiedXmlFile { get; set; }
public bool Success { get; set; }
}

Expand Down Expand Up @@ -68,17 +68,16 @@ public void Initialize(string appDataFolder)
?? Directory.GetFiles(zipDestination, "*reportGenerator*.exe", SearchOption.AllDirectories).FirstOrDefault();
}

public async Task<ReportGeneratorResult> GenerateAsync(IEnumerable<string> coverOutputFiles, bool darkMode, bool throwError = false)
public async Task<ReportGeneratorResult> GenerateAsync(IEnumerable<string> coverOutputFiles,string reportOutputFolder, bool darkMode, bool throwError = false)
{
var title = "ReportGenerator Run";
var tempDirectory = fileUtil.CreateTempDirectory();

var unifiedHtmlFile = Path.Combine(tempDirectory, "index.html");
var unifiedXmlFile = Path.Combine(tempDirectory, "Cobertura.xml");
var unifiedHtmlFile = Path.Combine(reportOutputFolder, "index.html");
var unifiedXmlFile = Path.Combine(reportOutputFolder, "Cobertura.xml");

var reportGeneratorSettings = new List<string>();

reportGeneratorSettings.Add($@"""-targetdir:{tempDirectory}""");
reportGeneratorSettings.Add($@"""-targetdir:{reportOutputFolder}""");

async Task<bool> run(string outputReportType, string inputReports)
{
Expand Down Expand Up @@ -107,20 +106,22 @@ async Task<bool> run(string outputReportType, string inputReports)
{
FilePath = ReportGeneratorExePath,
Arguments = string.Join(" ", reportTypeSettings),
WorkingDirectory = tempDirectory
WorkingDirectory = reportOutputFolder
});


if(result != null)
{
if (result.ExitCode != 0)
{
logger.Log($"{title} [reporttype:{outputReportType}] Error", result.Output);
logger.Log($"{title} [reporttype:{outputReportType}] Error", result.ExitCode);

if (throwError)
{
throw new Exception(result.Output);
}

logger.Log($"{title} [reporttype:{outputReportType}] Error", result.Output);
return false;
}

Expand All @@ -131,7 +132,7 @@ async Task<bool> run(string outputReportType, string inputReports)

}

var reportGeneratorResult = new ReportGeneratorResult { Success = false, UnifiedHtml = null, UnifiedXml = null };
var reportGeneratorResult = new ReportGeneratorResult { Success = false, UnifiedHtml = null, UnifiedXmlFile = unifiedXmlFile };

var coberturaResult = await run("Cobertura", string.Join(";", coverOutputFiles));

Expand All @@ -140,20 +141,17 @@ async Task<bool> run(string outputReportType, string inputReports)
var htmlResult = await run("HtmlInline_AzurePipelines", unifiedXmlFile);
if (htmlResult)
{
reportGeneratorResult.UnifiedXml = fileUtil.ReadAllText(unifiedXmlFile);
reportGeneratorResult.UnifiedHtml = fileUtil.ReadAllText(unifiedHtmlFile);
reportGeneratorResult.Success = true;
}

}

fileUtil.TryDeleteDirectory(tempDirectory);

return reportGeneratorResult;

}

public string ProcessUnifiedHtml(string htmlForProcessing, bool darkMode)
public string ProcessUnifiedHtml(string htmlForProcessing, string reportOutputFolder, bool darkMode)
{
return assemblyUtil.RunInAssemblyResolvingContext(() =>
{
Expand All @@ -163,6 +161,7 @@ public string ProcessUnifiedHtml(string htmlForProcessing, bool darkMode)
doc.OptionAutoCloseOnEnd = true;

doc.LoadHtml(htmlForProcessing);
htmlForProcessing = null;

doc.DocumentNode.QuerySelectorAll(".footer").ToList().ForEach(x => x.SetAttributeValue("style", "display:none"));
doc.DocumentNode.QuerySelectorAll(".container").ToList().ForEach(x => x.SetAttributeValue("style", "margin:0;padding:0;border:0"));
Expand Down Expand Up @@ -500,7 +499,7 @@ Risk Hotspots

htmlSb.Replace("branchCoverageAvailable = true", "branchCoverageAvailable = false");

return string.Join(
var processed = string.Join(
Environment.NewLine,
htmlSb.ToString().Split('\r', '\n')
.Select(line =>
Expand Down Expand Up @@ -566,6 +565,11 @@ Risk Hotspots
return line;
}));

var processedHtmlFile = Path.Combine(reportOutputFolder, "index-processed.html");
File.WriteAllText(processedHtmlFile, processed);

return processed;

});
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,28 +124,21 @@ public void Should_Output_Reports_To_First_Project_CoverageOutputFolder_When_Not
var coverageToolOutputManager = mocker.Create<CoverageToolOutputManager>();
coverageToolOutputManager.SetProjectCoverageOutputFolder(coverageProjects);

coverageToolOutputManager.OutputReports("unified html", "processed report", "unified xml");

var firstProjectOutputFolder = mockProject1.Object.CoverageOutputFolder;

mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine(firstProjectOutputFolder, "index.html"), "unified html"));
mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine(firstProjectOutputFolder, "index-processed.html"), "processed report"));
mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine(firstProjectOutputFolder, "Cobertura.xml"), "unified xml"));

Assert.AreEqual(coverageToolOutputManager.GetReportOutputFolder(), firstProjectOutputFolder);
}

[Test]
public void Should_Output_Reports_To_Provided_When_Not_Provided()
public void Should_Output_Reports_To_Provided_When_Provided()
{
SetUpProviders(true, "Provided", null);
var coverageToolOutputManager = mocker.Create<CoverageToolOutputManager>();
coverageToolOutputManager.SetProjectCoverageOutputFolder(coverageProjects);

coverageToolOutputManager.OutputReports("unified html", "processed report", "unified xml");
var outputFolder = coverageToolOutputManager.GetReportOutputFolder();

mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine("Provided", "index.html"), "unified html"));
mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine("Provided", "index-processed.html"), "processed report"));
mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine("Provided", "Cobertura.xml"), "unified xml"));
Assert.AreEqual(outputFolder, "Provided");

}

Expand Down
Loading