From 3c0a830eb8ca2e0713a70cf87e82415c1ee0e71b Mon Sep 17 00:00:00 2001 From: Tony Hallett Date: Thu, 8 Jul 2021 13:07:27 +0000 Subject: [PATCH] include threshold options in no riskhotspots messge --- .../ReportGenerator/ReportGeneratorUtil.cs | 201 ++++++++++-------- 1 file changed, 109 insertions(+), 92 deletions(-) diff --git a/FineCodeCoverage/Core/ReportGenerator/ReportGeneratorUtil.cs b/FineCodeCoverage/Core/ReportGenerator/ReportGeneratorUtil.cs index 61799fc8..a86b608f 100644 --- a/FineCodeCoverage/Core/ReportGenerator/ReportGeneratorUtil.cs +++ b/FineCodeCoverage/Core/ReportGenerator/ReportGeneratorUtil.cs @@ -31,24 +31,24 @@ internal class ReportGeneratorResult } [Export(typeof(IReportGeneratorUtil))] - internal partial class ReportGeneratorUtil: IReportGeneratorUtil + internal partial class ReportGeneratorUtil : IReportGeneratorUtil { - private readonly IAssemblyUtil assemblyUtil; - private readonly IProcessUtil processUtil; - private readonly ILogger logger; - private readonly IToolFolder toolFolder; - private readonly IToolZipProvider toolZipProvider; + private readonly IAssemblyUtil assemblyUtil; + private readonly IProcessUtil processUtil; + private readonly ILogger logger; + private readonly IToolFolder toolFolder; + private readonly IToolZipProvider toolZipProvider; private readonly IFileUtil fileUtil; - private readonly IAppOptionsProvider appOptionsProvider; - private const string zipPrefix = "reportGenerator"; + private readonly IAppOptionsProvider appOptionsProvider; + private const string zipPrefix = "reportGenerator"; private const string zipDirectoryName = "reportGenerator"; - public string ReportGeneratorExePath { get; private set; } + public string ReportGeneratorExePath { get; private set; } [ImportingConstructor] public ReportGeneratorUtil( IAssemblyUtil assemblyUtil, - IProcessUtil processUtil, + IProcessUtil processUtil, ILogger logger, IToolFolder toolFolder, IToolZipProvider toolZipProvider, @@ -57,13 +57,13 @@ IAppOptionsProvider appOptionsProvider ) { this.fileUtil = fileUtil; - this.appOptionsProvider = appOptionsProvider; - this.assemblyUtil = assemblyUtil; - this.processUtil = processUtil; - this.logger = logger; - this.toolFolder = toolFolder; - this.toolZipProvider = toolZipProvider; - } + this.appOptionsProvider = appOptionsProvider; + this.assemblyUtil = assemblyUtil; + this.processUtil = processUtil; + this.logger = logger; + this.toolFolder = toolFolder; + this.toolZipProvider = toolZipProvider; + } public void Initialize(string appDataFolder) { @@ -72,7 +72,7 @@ public void Initialize(string appDataFolder) ?? Directory.GetFiles(zipDestination, "*reportGenerator*.exe", SearchOption.AllDirectories).FirstOrDefault(); } - public async Task GenerateAsync(IEnumerable coverOutputFiles,string reportOutputFolder, bool darkMode, bool throwError = false) + public async Task GenerateAsync(IEnumerable coverOutputFiles, string reportOutputFolder, bool darkMode, bool throwError = false) { var title = "ReportGenerator Run"; @@ -82,7 +82,7 @@ public async Task GenerateAsync(IEnumerable cover var reportGeneratorSettings = new List(); reportGeneratorSettings.Add($@"""-targetdir:{reportOutputFolder}"""); - + async Task run(string outputReportType, string inputReports) { var reportTypeSettings = reportGeneratorSettings.ToArray().ToList(); @@ -91,17 +91,14 @@ async Task run(string outputReportType, string inputReports) { reportTypeSettings.Add($@"""-reports:{inputReports}"""); reportTypeSettings.Add($@"""-reporttypes:Cobertura"""); - + } else if (outputReportType.Equals("HtmlInline_AzurePipelines", StringComparison.OrdinalIgnoreCase)) { reportTypeSettings.Add($@"""-reports:{inputReports}"""); reportTypeSettings.Add($@"""-plugins:{typeof(FccLightReportBuilder).Assembly.Location}"""); reportTypeSettings.Add($@"""-reporttypes:{(darkMode ? FccDarkReportBuilder.REPORT_TYPE : FccLightReportBuilder.REPORT_TYPE)}"""); - var options = appOptionsProvider.Get(); - var cyclomaticThreshold = options.ThresholdForCyclomaticComplexity; - var crapScoreThreshold = options.ThresholdForCrapScore; - var nPathThreshold = options.ThresholdForNPathComplexity; + var (cyclomaticThreshold, crapScoreThreshold, nPathThreshold) = HotspotThresholds(); reportTypeSettings.Add($@"""riskHotspotsAnalysisThresholds:metricThresholdForCyclomaticComplexity={cyclomaticThreshold}"""); reportTypeSettings.Add($@"""riskHotspotsAnalysisThresholds:metricThresholdForCrapScore={crapScoreThreshold}"""); @@ -122,10 +119,10 @@ async Task run(string outputReportType, string inputReports) Arguments = string.Join(" ", reportTypeSettings), WorkingDirectory = reportOutputFolder }); - - if(result != null) - { + + if (result != null) + { if (result.ExitCode != 0) { logger.Log($"{title} [reporttype:{outputReportType}] Error", result.Output); @@ -143,11 +140,11 @@ async Task run(string outputReportType, string inputReports) return true; } return false; - + } - + var reportGeneratorResult = new ReportGeneratorResult { Success = false, UnifiedHtml = null, UnifiedXmlFile = unifiedXmlFile }; - + var coberturaResult = await run("Cobertura", string.Join(";", coverOutputFiles)); if (coberturaResult) @@ -157,18 +154,23 @@ async Task run(string outputReportType, string inputReports) { reportGeneratorResult.UnifiedHtml = fileUtil.ReadAllText(unifiedHtmlFile); reportGeneratorResult.Success = true; - } - + } + } return reportGeneratorResult; - + } public string ProcessUnifiedHtml(string htmlForProcessing, string reportOutputFolder, bool darkMode) { return assemblyUtil.RunInAssemblyResolvingContext(() => { + var (cyclomaticThreshold, crapScoreThreshold, nPathThreshold) = HotspotThresholds(); + var noRiskHotspotsHeader = "No risk hotspots that exceed options :"; + var noRiskHotspotsCyclomaticMsg = $"Cyclomatic complexity : {cyclomaticThreshold}"; + var noRiskHotspotsNpathMsg =$"NPath complexity : {nPathThreshold}"; + var noRiskHotspotsCrapMessage = $"Crap score : {crapScoreThreshold}"; var doc = new HtmlDocument(); doc.OptionFixNestedTags = true; @@ -181,7 +183,7 @@ public string ProcessUnifiedHtml(string htmlForProcessing, string reportOutputFo doc.DocumentNode.QuerySelectorAll(".container").ToList().ForEach(x => x.SetAttributeValue("style", "margin:0;padding:0;border:0")); doc.DocumentNode.QuerySelectorAll(".containerleft").ToList().ForEach(x => x.SetAttributeValue("style", "margin:0;padding:0;border:0")); doc.DocumentNode.QuerySelectorAll(".containerleft > h1 , .containerleft > p").ToList().ForEach(x => x.SetAttributeValue("style", "display:none")); - + // DOM changes var table = doc.DocumentNode.QuerySelectorAll("table.overview").First(); @@ -242,29 +244,29 @@ public string ProcessUnifiedHtml(string htmlForProcessing, string reportOutputFo var assembliesReplaced = assemblies.ToString(); htmlSb.Replace(assembliesToReplace, assembliesReplaced); - //is this even present if there are no riskhotspots - var riskHotspotsSearch = "var riskHotspots = ["; - var rhStartIndex = outerHtml.IndexOf(riskHotspotsSearch) + riskHotspotsSearch.Length - 1; - var rhEndIndex = outerHtml.IndexOf("var branchCoverageAvailable"); - var rhToReplace = outerHtml.Substring(rhStartIndex, rhEndIndex - rhStartIndex); - rhEndIndex = rhToReplace.LastIndexOf(']'); - rhToReplace = rhToReplace.Substring(0, rhEndIndex + 1); - - var riskHotspots = JArray.Parse(rhToReplace); - foreach (JObject riskHotspot in riskHotspots) - { - var assembly = riskHotspot["assembly"].ToString(); - var qualifiedClassName = riskHotspot["class"].ToString(); + //is this even present if there are no riskhotspots + var riskHotspotsSearch = "var riskHotspots = ["; + var rhStartIndex = outerHtml.IndexOf(riskHotspotsSearch) + riskHotspotsSearch.Length - 1; + var rhEndIndex = outerHtml.IndexOf("var branchCoverageAvailable"); + var rhToReplace = outerHtml.Substring(rhStartIndex, rhEndIndex - rhStartIndex); + rhEndIndex = rhToReplace.LastIndexOf(']'); + rhToReplace = rhToReplace.Substring(0, rhEndIndex + 1); + + var riskHotspots = JArray.Parse(rhToReplace); + foreach (JObject riskHotspot in riskHotspots) + { + var assembly = riskHotspot["assembly"].ToString(); + var qualifiedClassName = riskHotspot["class"].ToString(); // simplify name var lastIndexOfDotInName = qualifiedClassName.LastIndexOf('.'); if (lastIndexOfDotInName != -1) riskHotspot["class"] = qualifiedClassName.Substring(lastIndexOfDotInName).Trim('.'); var newReportPath = $"#{assembly}{assemblyClassDelimiter}{qualifiedClassName}.html"; - riskHotspot["reportPath"] = newReportPath; - } - var riskHotspotsReplaced = riskHotspots.ToString(); - htmlSb.Replace(rhToReplace, riskHotspotsReplaced); + riskHotspot["reportPath"] = newReportPath; + } + var riskHotspotsReplaced = riskHotspots.ToString(); + htmlSb.Replace(rhToReplace, riskHotspotsReplaced); - htmlSb.Replace(".table-fixed", ".table-fixed-ignore-me"); + htmlSb.Replace(".table-fixed", ".table-fixed-ignore-me"); htmlSb.Replace("", $@"
@@ -618,5 +624,16 @@ Risk Hotspots }); } + + private (int cyclomaticThreshold, int crapScoreThreshold, int nPathThreshold) HotspotThresholds() + { + var options = appOptionsProvider.Get(); + return ( + options.ThresholdForCyclomaticComplexity, + options.ThresholdForCrapScore, + options.ThresholdForNPathComplexity + ); + + } } }