public void AddComponent(BaseliningSummary inner) { AddCounts(inner); Components = Components ?? new List <BaseliningSummary>(); Components.Add(inner); }
private static int Run(RunOptions options) { BaseliningTester tester = new BaseliningTester(); BaseliningSummary overallSummary = tester.RunAll(options.TestRootPath); return(0); }
public BaseliningSummary RunAll(string rootPath) { BaseliningSummary overallSummary = RunUnder(Path.Combine(rootPath, InputFolderName)); Directory.CreateDirectory(Path.Combine(rootPath, OutputFolderName)); using (StreamWriter writer = File.CreateText(Path.Combine(rootPath, OutputFolderName, SummaryFileName))) { overallSummary.Write(writer); } return(overallSummary); }
public void Write(SarifLog newBaselineLog, SarifLog baselineLog, BaseliningSummary summary) { Dictionary <string, Result> baselineResultsByGuid = new Dictionary <string, Result>(); foreach (Result result in baselineLog.EnumerateResults()) { baselineResultsByGuid[result.CorrelationGuid ?? result.Guid] = result; } Writer.WriteLine(); Writer.WriteLine($" {summary}"); foreach (Result result in newBaselineLog.EnumerateResults()) { switch (result.BaselineState) { case BaselineState.Absent: Write('-', result.Guid); break; case BaselineState.New: Write('+', result.Guid); break; case BaselineState.Unchanged: case BaselineState.Updated: // Find and write old Result from previous Baseline (to get pre-merged properties) Result previousResult = null; baselineResultsByGuid.TryGetValue(result.CorrelationGuid, out previousResult); if (previousResult == null) { // Write '?' for the Previous if we couldn't look it up Write('=', result.Guid); Write('?', result.CorrelationGuid); } else if (result.Guid != previousResult.Guid) { // Only Log Unchanged results from the latest log (with a new Guid) Write('=', result.Guid); Write(' ', previousResult.Guid); } break; } } }
public BaseliningSummary RunSeries(string seriesPath, string reportingName, int debugLogIndex = -1, int debugResultIndex = -1) { string outputLogPath = Path.ChangeExtension(seriesPath.Replace($"\\{InputFolderName}\\", $"\\{OutputFolderName}\\"), ".log"); BaseliningSummary seriesSummary = new BaseliningSummary(Path.GetFileName(seriesPath)); Directory.CreateDirectory(Path.GetDirectoryName(outputLogPath)); using (Stream outputStream = File.Create(outputLogPath)) using (BaseliningDetailLogger logger = new BaseliningDetailLogger(seriesPath, outputStream)) { // Load the original baseline SarifLog baseline = LoadBaseline(seriesPath); // Baseline each log in order foreach (LogInSeries current in LoadSeriesLogs(seriesPath)) { if (debugLogIndex == current.LogIndex && Debugger.IsAttached) { Debugger.Break(); DebugResultComparison(baseline, current.Log, $"{debugLogIndex:d3} {debugResultIndex:d3}"); } SarifLog newBaseline = Baseline(baseline, current.Log); if (debugLogIndex == current.LogIndex) { List <Result> absentResults = newBaseline.EnumerateResults().Where((r) => r.BaselineState == BaselineState.Absent).ToList(); List <Result> newResults = newBaseline.EnumerateResults().Where((r) => r.BaselineState == BaselineState.New).ToList(); } BaseliningSummary fileSummary = new BaseliningSummary(Path.GetFileNameWithoutExtension(current.FilePath)); fileSummary.Add(newBaseline, baseline, current.Log); seriesSummary.AddCounts(fileSummary); logger.Write(newBaseline, baseline, fileSummary); baseline = newBaseline; } } EnrichSeries(seriesPath); string comparisonResult = CompareToExpected(outputLogPath); Console.WriteLine($" - {comparisonResult}{seriesSummary.ToString(reportingName)}"); return(seriesSummary); }
public BaseliningSummary RunUnder(string folderPath, string reportingName) { BaseliningSummary folderSummary = new BaseliningSummary(Path.GetFileName(folderPath)); // Recurse on subfolders, if found foreach (string subfolder in Directory.EnumerateDirectories(folderPath, "*", SearchOption.TopDirectoryOnly)) { BaseliningSummary part = RunUnder(subfolder, Path.Combine(reportingName, Path.GetFileName(subfolder))); folderSummary.AddComponent(part); } // Run series for leaf folders if (Directory.EnumerateFiles(folderPath).Any()) { BaseliningSummary seriesSummary = RunSeries(folderPath, reportingName); folderSummary.AddCounts(seriesSummary); } return(folderSummary); }
public BaseliningSummary RunUnder(string folderPath) { BaseliningSummary folderSummary = new BaseliningSummary(Path.GetFileName(folderPath)); // Recurse on subfolders, if found foreach (string subfolder in Directory.EnumerateDirectories(folderPath, "*", SearchOption.TopDirectoryOnly)) { BaseliningSummary part = RunUnder(subfolder); folderSummary.AddComponent(part); } // Look for logs and sort in Ordinal order if (Directory.EnumerateFiles(folderPath).Any()) { BaseliningSummary seriesSummary = RunSeries(folderPath); folderSummary.AddCounts(seriesSummary); } return(folderSummary); }
public BaseliningSummary RunAll(string rootPath) { // Clear prior output DeleteAndCreateDirectory(Path.Combine(rootPath, OutputFolderName)); DeleteAndCreateDirectory(Path.Combine(rootPath, OutputDebugFolderName)); // Run all series BaseliningSummary overallSummary = RunUnder(Path.Combine(rootPath, InputFolderName), InputFolderName); // Write overall summary using (StreamWriter writer = File.CreateText(Path.Combine(rootPath, OutputFolderName, SummaryFileName))) { overallSummary.Write(writer); } Console.WriteLine(overallSummary); // Write investigation and accept instructions Console.WriteLine(); Console.WriteLine($"REVIEW: windiff \"{Path.GetFullPath(Path.Combine(rootPath, BaseliningTester.ExpectedDebugFolderName))}\" \"{Path.GetFullPath(Path.Combine(rootPath, BaseliningTester.OutputDebugFolderName))}\""); Console.WriteLine($"ACCEPT: robocopy /MIR \"{Path.GetFullPath(Path.Combine(rootPath, BaseliningTester.OutputFolderName))}\" \"{Path.GetFullPath(Path.Combine(rootPath, BaseliningTester.ExpectedFolderName))}\""); return(overallSummary); }
public void AddCounts(BaseliningSummary inner) { ChurnCount += inner.ChurnCount; ResultCount += inner.ResultCount; NewResultTotal += inner.NewResultTotal; }