Skip to content

Commit cefee3b

Browse files
committed
replace File.ReadAllText(cobertura) with reading from file by xmlreader
1 parent 97ae2ba commit cefee3b

File tree

8 files changed

+55
-104
lines changed

8 files changed

+55
-104
lines changed

FineCodeCoverage/Core/Cobertura/CoberturaUtil.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,9 +17,9 @@ internal class CoberturaUtil:ICoberturaUtil
1717
private CoverageReport coverageReport;
1818
public List<CoverageLine> CoverageLines { get; private set; }
1919

20-
private CoverageReport LoadReport(string xml)
20+
private CoverageReport LoadReport(string xmlFile)
2121
{
22-
using (var reader = XmlReader.Create(new StringReader(xml), READER_SETTINGS))
22+
using (var reader = XmlReader.Create(xmlFile, READER_SETTINGS))
2323
{
2424
var report = (CoverageReport)SERIALIZER.Deserialize(reader);
2525
return report;
@@ -68,11 +68,11 @@ private CoverageReport LoadReport(string xml)
6868
// return jsonText;
6969
//}
7070

71-
public void ProcessCoberturaXml(string xml)
71+
public void ProcessCoberturaXml(string xmlFile)
7272
{
7373
CoverageLines = new List<CoverageLine>();
7474

75-
coverageReport = LoadReport(xml);
75+
coverageReport = LoadReport(xmlFile);
7676

7777
foreach (var package in coverageReport.Packages.Package)
7878
{

FineCodeCoverage/Core/Cobertura/ICoberturaUtil.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ interface ICoberturaUtil
77
{
88
List<CoverageLine> CoverageLines { get; }
99

10-
void ProcessCoberturaXml(string xml);
10+
void ProcessCoberturaXml(string xmlFile);
1111
string[] GetSourceFiles(string assemblyName, string qualifiedClassName, int file);
1212
}
1313
}

FineCodeCoverage/Core/CoverageToolOutput/CoverageToolOutputManager.cs

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,6 @@ internal class CoverageToolOutputManager : ICoverageToolOutputManager
1313
{
1414
private readonly ILogger logger;
1515
private readonly IFileUtil fileUtil;
16-
private const string unifiedHtmlFileName = "index.html";
17-
private const string unifiedXmlFileName = "Cobertura.xml";
18-
private const string processedHtmlFileName = "index-processed.html";
1916
private const string projectCoverageToolOutputFolderName = "coverage-tool-output";
2017
private string outputFolderForAllProjects;
2118
private List<ICoverageProject> coverageProjects;
@@ -50,14 +47,7 @@ public void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjec
5047
}
5148
}
5249

53-
public void OutputReports(string unifiedHtml, string processedReport, string unifiedXml)
54-
{
55-
var outputFolder = outputFolderForAllProjects ?? coverageProjects[0].CoverageOutputFolder;
56-
57-
fileUtil.WriteAllText(Path.Combine(outputFolder, unifiedHtmlFileName), unifiedHtml);
58-
fileUtil.WriteAllText(Path.Combine(outputFolder, processedHtmlFileName), processedReport);
59-
fileUtil.WriteAllText(Path.Combine(outputFolder, unifiedXmlFileName), unifiedXml);
60-
}
50+
6151

6252
private void DetermineOutputFolder()
6353
{
@@ -67,5 +57,10 @@ private void DetermineOutputFolder()
6757
logger.Log($"FCC output in {outputFolderForAllProjects}");
6858
}
6959
}
60+
61+
public string GetReportOutputFolder()
62+
{
63+
return outputFolderForAllProjects ?? coverageProjects[0].CoverageOutputFolder;
64+
}
7065
}
7166
}

FineCodeCoverage/Core/CoverageToolOutput/ICoverageToolOutputManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,6 @@ namespace FineCodeCoverage.Engine
66
internal interface ICoverageToolOutputManager
77
{
88
void SetProjectCoverageOutputFolder(List<ICoverageProject> coverageProjects);
9-
void OutputReports(string unifiedHtml, string processedReport, string unifiedXml);
9+
string GetReportOutputFolder();
1010
}
1111
}

FineCodeCoverage/Core/FCCEngine.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,7 +155,7 @@ private void UpdateUI(List<CoverageLine> coverageLines, string reportHtml)
155155
RaiseUpdateOutputWindow(reportHtml);
156156
}
157157

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

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

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

167-
var result = await reportGeneratorUtil.GenerateAsync(coverOutputFiles, darkMode, true);
167+
var result = await reportGeneratorUtil.GenerateAsync(coverOutputFiles,reportOutputFolder, darkMode, true);
168168

169169
if (result.Success)
170170
{
171-
coberturaUtil.ProcessCoberturaXml(result.UnifiedXml);
171+
logger.Log("Processing cobertura");
172+
coberturaUtil.ProcessCoberturaXml(result.UnifiedXmlFile);
172173
coverageLines = coberturaUtil.CoverageLines;
173174

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

259260
coverageOutputManager.SetProjectCoverageOutputFolder(coverageProjects);
261+
var reportOutputFolder = coverageOutputManager.GetReportOutputFolder();
260262

261263
var coverOutputFiles = await RunCoverageAsync(coverageProjects, cancellationToken);
262264

263265
if (coverOutputFiles.Any())
264266
{
265-
var (lines, report) = await RunAndProcessReportAsync(coverOutputFiles,cancellationToken);
267+
var (lines, report) = await RunAndProcessReportAsync(coverOutputFiles,reportOutputFolder,cancellationToken);
266268
coverageLines = lines;
267269
reportHtml = report;
268270
}

FineCodeCoverage/Core/ReportGenerator/ReportGeneratorUtil.cs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,15 @@ namespace FineCodeCoverage.Engine.ReportGenerator
1717
interface IReportGeneratorUtil
1818
{
1919
void Initialize(string appDataFolder);
20-
string ProcessUnifiedHtml(string htmlForProcessing, bool darkMode);
21-
Task<ReportGeneratorResult> GenerateAsync(IEnumerable<string> coverOutputFiles, bool darkMode, bool throwError = false);
20+
string ProcessUnifiedHtml(string htmlForProcessing,string reportOutputFolder, bool darkMode);
21+
Task<ReportGeneratorResult> GenerateAsync(IEnumerable<string> coverOutputFiles,string reportOutputFolder, bool darkMode, bool throwError = false);
2222

2323
}
2424

2525
internal class ReportGeneratorResult
2626
{
2727
public string UnifiedHtml { get; set; }
28-
public string UnifiedXml { get; set; }
28+
public string UnifiedXmlFile { get; set; }
2929
public bool Success { get; set; }
3030
}
3131

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

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

76-
var unifiedHtmlFile = Path.Combine(tempDirectory, "index.html");
77-
var unifiedXmlFile = Path.Combine(tempDirectory, "Cobertura.xml");
75+
var unifiedHtmlFile = Path.Combine(reportOutputFolder, "index.html");
76+
var unifiedXmlFile = Path.Combine(reportOutputFolder, "Cobertura.xml");
7877

7978
var reportGeneratorSettings = new List<string>();
8079

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

8382
async Task<bool> run(string outputReportType, string inputReports)
8483
{
@@ -107,20 +106,21 @@ async Task<bool> run(string outputReportType, string inputReports)
107106
{
108107
FilePath = ReportGeneratorExePath,
109108
Arguments = string.Join(" ", reportTypeSettings),
110-
WorkingDirectory = tempDirectory
109+
WorkingDirectory = reportOutputFolder
111110
});
112111
113112
114113
if(result != null)
115114
{
116115
if (result.ExitCode != 0)
117116
{
117+
logger.Log($"{title} [reporttype:{outputReportType}] Error", result.Output);
118+
118119
if (throwError)
119120
{
120121
throw new Exception(result.Output);
121122
}
122123
123-
logger.Log($"{title} [reporttype:{outputReportType}] Error", result.Output);
124124
return false;
125125
}
126126
@@ -131,7 +131,7 @@ async Task<bool> run(string outputReportType, string inputReports)
131131
132132
}
133133
134-
var reportGeneratorResult = new ReportGeneratorResult { Success = false, UnifiedHtml = null, UnifiedXml = null };
134+
var reportGeneratorResult = new ReportGeneratorResult { Success = false, UnifiedHtml = null, UnifiedXmlFile = unifiedXmlFile };
135135
136136
var coberturaResult = await run("Cobertura", string.Join(";", coverOutputFiles));
137137
@@ -140,20 +140,17 @@ async Task<bool> run(string outputReportType, string inputReports)
140140
var htmlResult = await run("HtmlInline_AzurePipelines", unifiedXmlFile);
141141
if (htmlResult)
142142
{
143-
reportGeneratorResult.UnifiedXml = fileUtil.ReadAllText(unifiedXmlFile);
144143
reportGeneratorResult.UnifiedHtml = fileUtil.ReadAllText(unifiedHtmlFile);
145144
reportGeneratorResult.Success = true;
146145
}
147146
148147
}
149148
150-
fileUtil.TryDeleteDirectory(tempDirectory);
151-
152149
return reportGeneratorResult;
153150
154151
}
155152
156-
public string ProcessUnifiedHtml(string htmlForProcessing, bool darkMode)
153+
public string ProcessUnifiedHtml(string htmlForProcessing, string reportOutputFolder, bool darkMode)
157154
{
158155
return assemblyUtil.RunInAssemblyResolvingContext(() =>
159156
{
@@ -163,6 +160,7 @@ public string ProcessUnifiedHtml(string htmlForProcessing, bool darkMode)
163160
doc.OptionAutoCloseOnEnd = true;
164161
165162
doc.LoadHtml(htmlForProcessing);
163+
htmlForProcessing = null;
166164
167165
doc.DocumentNode.QuerySelectorAll(".footer").ToList().ForEach(x => x.SetAttributeValue("style", "display:none"));
168166
doc.DocumentNode.QuerySelectorAll(".container").ToList().ForEach(x => x.SetAttributeValue("style", "margin:0;padding:0;border:0"));
@@ -500,7 +498,7 @@ Risk Hotspots
500498
501499
htmlSb.Replace("branchCoverageAvailable = true", "branchCoverageAvailable = false");
502500
503-
return string.Join(
501+
var processed = string.Join(
504502
Environment.NewLine,
505503
htmlSb.ToString().Split('\r', '\n')
506504
.Select(line =>
@@ -566,6 +564,11 @@ Risk Hotspots
566564
return line;
567565
}));
568566

567+
var processedHtmlFile = Path.Combine(reportOutputFolder, "index-processed.html");
568+
File.WriteAllText(processedHtmlFile, processed);
569+
570+
return processed;
571+
569572
});
570573
}
571574
}

FineCodeCoverageTests/CoverageToolOutput_Tests/CoverageToolOutputManager_Tests.cs

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -124,28 +124,21 @@ public void Should_Output_Reports_To_First_Project_CoverageOutputFolder_When_Not
124124
var coverageToolOutputManager = mocker.Create<CoverageToolOutputManager>();
125125
coverageToolOutputManager.SetProjectCoverageOutputFolder(coverageProjects);
126126

127-
coverageToolOutputManager.OutputReports("unified html", "processed report", "unified xml");
128-
129127
var firstProjectOutputFolder = mockProject1.Object.CoverageOutputFolder;
130-
131-
mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine(firstProjectOutputFolder, "index.html"), "unified html"));
132-
mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine(firstProjectOutputFolder, "index-processed.html"), "processed report"));
133-
mocker.Verify<IFileUtil>(f => f.WriteAllText(Path.Combine(firstProjectOutputFolder, "Cobertura.xml"), "unified xml"));
134128

129+
Assert.AreEqual(coverageToolOutputManager.GetReportOutputFolder(), firstProjectOutputFolder);
135130
}
136131

137132
[Test]
138-
public void Should_Output_Reports_To_Provided_When_Not_Provided()
133+
public void Should_Output_Reports_To_Provided_When_Provided()
139134
{
140135
SetUpProviders(true, "Provided", null);
141136
var coverageToolOutputManager = mocker.Create<CoverageToolOutputManager>();
142137
coverageToolOutputManager.SetProjectCoverageOutputFolder(coverageProjects);
143138

144-
coverageToolOutputManager.OutputReports("unified html", "processed report", "unified xml");
139+
var outputFolder = coverageToolOutputManager.GetReportOutputFolder();
145140

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

150143
}
151144

0 commit comments

Comments
 (0)