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);
}