in src/Test.FunctionalTests.BinSkim.Rules/RuleTests.cs [45:169]
private void Verify(
BinarySkimmer skimmer,
IEnumerable<string> additionalTestFiles,
bool useDefaultPolicy,
bool expectToPass,
bool bypassExtensionValidation = false)
{
var targets = new List<string>();
string ruleName = skimmer.GetType().Name;
string testFilesDirectory = GetTestDirectoryFor(ruleName);
testFilesDirectory = Path.Combine(Environment.CurrentDirectory, "FunctionalTestsData", testFilesDirectory);
testFilesDirectory = Path.Combine(testFilesDirectory, expectToPass ? "Pass" : "Fail");
Assert.True(Directory.Exists(testFilesDirectory), $"Test directory '{testFilesDirectory}' should exist.");
foreach (string target in Directory.GetFiles(testFilesDirectory, "*", SearchOption.AllDirectories))
{
if (bypassExtensionValidation || AnalyzeCommand.ValidAnalysisFileExtensions.Contains(Path.GetExtension(target)))
{
targets.Add(target);
}
}
if (additionalTestFiles != null)
{
foreach (string additionalTestFile in additionalTestFiles)
{
targets.Add(additionalTestFile);
}
}
var context = new BinaryAnalyzerContext();
var logger = new TestMessageLogger();
context.Logger = logger;
PropertiesDictionary policy = null;
if (useDefaultPolicy)
{
policy = new PropertiesDictionary();
}
context.Policy = policy;
skimmer.Initialize(context);
foreach (string target in targets)
{
context = this.CreateContext(logger, policy, target);
if (!context.IsValidAnalysisTarget) { continue; }
context.Rule = skimmer;
if (skimmer.CanAnalyze(context, out string reasonForNotAnalyzing) != AnalysisApplicability.ApplicableToSpecifiedTarget)
{
continue;
}
skimmer.Analyze(context);
}
HashSet<string> expected = expectToPass ? logger.PassTargets : logger.FailTargets;
HashSet<string> other = expectToPass ? logger.FailTargets : logger.PassTargets;
HashSet<string> configErrors = logger.ConfigurationErrorTargets;
string expectedText = expectToPass ? "success" : "failure";
string actualText = expectToPass ? "failed" : "succeeded";
var sb = new StringBuilder();
foreach (string target in targets)
{
if (expected.Contains(target))
{
expected.Remove(target);
continue;
}
bool missingEntirely = !other.Contains(target);
if (missingEntirely &&
!expectToPass &&
target.Contains("Pdb") &&
configErrors.Contains(target))
{
missingEntirely = false;
configErrors.Remove(target);
continue;
}
if (missingEntirely)
{
// Generates message such as the following:
// "Expected 'BA2025:EnableShadowStack' success but saw no result at all for file: Native_x64_CETShadowStack_Disabled.exe"
sb.AppendLine(
string.Format(
"Expected '{0}:{1}' {2} but saw no result at all for file: {3}",
skimmer.Id,
ruleName,
expectedText,
Path.GetFileName(target)));
}
else
{
other.Remove(target);
// Generates message such as the following:
// "Expected 'BA2025:EnableShadowStack' success but check failed for: Native_x64_CETShadowStack_Disabled.exe"
sb.AppendLine(
string.Format(
"Expected '{0}:{1}' {2} but check {3} for: {4}",
skimmer.Id,
ruleName,
expectedText,
actualText,
Path.GetFileName(target)));
}
}
if (sb.Length > 0)
{
this.testOutputHelper.WriteLine(sb.ToString());
}
Assert.Equal(0, sb.Length);
Assert.Empty(expected);
Assert.Empty(other);
}