private void VerifyApplicability()

in src/Test.FunctionalTests.BinSkim.Rules/RuleTests.cs [251:340]


        private void VerifyApplicability(
            BinarySkimmer skimmer,
            HashSet<string> applicabilityConditions,
            AnalysisApplicability expectedApplicability = AnalysisApplicability.NotApplicableToSpecifiedTarget,
            bool useDefaultPolicy = false,
            bool bypassExtensionValidation = false,
            string expectedReasonForNotAnalyzing = null)
        {
            string ruleName = skimmer.GetType().Name;
            string testFilesDirectory = GetTestDirectoryFor(ruleName);
            testFilesDirectory = Path.Combine(Environment.CurrentDirectory, "FunctionalTestsData", testFilesDirectory);
            testFilesDirectory = Path.Combine(testFilesDirectory, "NotApplicable");

            var context = new BinaryAnalyzerContext();

            HashSet<string> targets = this.GetTestFilesMatchingConditions(applicabilityConditions);

            if (Directory.Exists(testFilesDirectory))
            {
                foreach (string target in Directory.GetFiles(testFilesDirectory, "*", SearchOption.AllDirectories))
                {
                    if (bypassExtensionValidation || AnalyzeCommand.ValidAnalysisFileExtensions.Contains(Path.GetExtension(target)))
                    {
                        targets.Add(target);
                    }
                }
            }

            var logger = new TestMessageLogger();
            context.Logger = logger;

            var sb = new StringBuilder();

            foreach (string target in targets)
            {
                string extension = Path.GetExtension(target);

                context = this.CreateContext(logger, null, target);
                if (!context.IsValidAnalysisTarget) { continue; }

                if (useDefaultPolicy)
                {
                    context.Policy = new PropertiesDictionary();
                }

                context.Rule = skimmer;

                AnalysisApplicability applicability = skimmer.CanAnalyze(context, out string reasonForNotAnalyzing);

                if (applicability != expectedApplicability)
                {
                    // Generates message such as the following:
                    // "'BA2025:EnableShadowStack' - 'CanAnalyze' did not correctly indicate target applicability
                    // (unexpected return was 'NotApplicableToSpecifiedTarget'): ARM64_CETShadowStack_NotApplicable.exe"
                    sb.AppendLine(
                        string.Format(
                            "'{0}:{1}' - 'CanAnalyze' did not correctly indicate target applicability (unexpected return was '{2}'): {3}",
                            skimmer.Id,
                            ruleName,
                            applicability,
                            Path.GetFileName(target)));

                    continue;
                }

                if (expectedReasonForNotAnalyzing != null && reasonForNotAnalyzing != expectedReasonForNotAnalyzing)
                {
                    // Generates message such as the following:
                    // "'BA2025:EnableShadowStack' - 'CanAnalyze' produced expected outcome but unexpected reason identified
                    // (unexpected return was 'image is an ARM64 binary' but 'test' was expected): ARM64_CETShadowStack_NotApplicable.exe"
                    sb.AppendLine(
                        string.Format(
                            "'{0}:{1}' - 'CanAnalyze' produced expected outcome but unexpected reason identified (unexpected return was '{2}' but '{3}' was expected): {4}",
                            skimmer.Id,
                            ruleName,
                            reasonForNotAnalyzing,
                            expectedReasonForNotAnalyzing,
                            Path.GetFileName(target)));

                    continue;
                }
            }

            if (sb.Length > 0)
            {
                this.testOutputHelper.WriteLine(sb.ToString());
            }

            Assert.Equal(0, sb.Length);
        }