示例#1
0
        public void AddComponent(BaseliningSummary inner)
        {
            AddCounts(inner);

            Components = Components ?? new List <BaseliningSummary>();
            Components.Add(inner);
        }
示例#2
0
        private static int Run(RunOptions options)
        {
            BaseliningTester  tester         = new BaseliningTester();
            BaseliningSummary overallSummary = tester.RunAll(options.TestRootPath);

            return(0);
        }
示例#3
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;
                }
            }
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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);
        }
示例#8
0
        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);
        }
示例#9
0
 public void AddCounts(BaseliningSummary inner)
 {
     ChurnCount     += inner.ChurnCount;
     ResultCount    += inner.ResultCount;
     NewResultTotal += inner.NewResultTotal;
 }