Skip to content

Commit

Permalink
Fix #430 (#431)
Browse files Browse the repository at this point in the history
  • Loading branch information
gfs committed Feb 16, 2022
1 parent 210990c commit c150a8f
Show file tree
Hide file tree
Showing 12 changed files with 341 additions and 51 deletions.
2 changes: 1 addition & 1 deletion AppInspector/AppInspector.Commands.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@
<PackageReference Include="CommandLineParser" Version="2.8.0" />
<PackageReference Include="DotLiquid" Version="2.2.595" />
<PackageReference Include="Glob" Version="1.1.9" />
<PackageReference Include="Microsoft.CST.OAT" Version="1.1.16" />
<PackageReference Include="Microsoft.CST.OAT" Version="1.2.4" />
<PackageReference Include="Microsoft.CST.RecursiveExtractor" Version="1.1.6" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NLog" Version="4.7.13" />
Expand Down
4 changes: 2 additions & 2 deletions AppInspector/RulesVerifier.cs
Original file line number Diff line number Diff line change
Expand Up @@ -179,9 +179,9 @@ public bool CheckIntegrity(Rule rule)
{
if (int.TryParse(splits[0], out int int1) && int.TryParse(splits[1], out int int2))
{
if (int1 == 0 && int2 == 0)
if (int1 > 0 && int2 < 0)
{
_logger?.Error("At least one finding region specifier must be non 0. {0}", rule.Id);
_logger?.Error("The finding region must have a negative number or 0 for the lines before and a positive number or 0 for lines after. {0}", rule.Id);
return false;
}
}
Expand Down
2 changes: 1 addition & 1 deletion RulesEngine/AppInspector.RulesEngine.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.CST.OAT" Version="1.1.16" />
<PackageReference Include="Microsoft.CST.OAT" Version="1.2.4" />
<PackageReference Include="Microsoft.CST.RecursiveExtractor" Version="1.1.6" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="NLog" Version="4.7.13" />
Expand Down
2 changes: 1 addition & 1 deletion RulesEngine/RuleProcessor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public RuleProcessorOptions()
{
}
public bool Parallel = true;
public Confidence confidenceFilter;
public Confidence confidenceFilter = Confidence.Unspecified | Confidence.Low | Confidence.Medium | Confidence.High;
public Logger? logger;
public bool allowAllTagsInBuildFiles = false;

Expand Down
2 changes: 1 addition & 1 deletion RulesEngine/Ruleset.cs
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@ public IEnumerable<ConvertedOatRule> GetUniversalRules()
Label = clauseNumber.ToString(CultureInfo.InvariantCulture),
Invert = condition.NegateFinding,
Arguments = condition.Pattern.Modifiers?.ToList() ?? new List<string>(),
FindingOnly = false,
FindingRegion = true,
CustomOperation = "Within",
Before = argList[0],
After = argList[1],
Expand Down
1 change: 1 addition & 0 deletions RulesEngine/WithinClause.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,6 @@ public WithinClause(string? field = null) : base(Operation.Custom, field)
public bool FindingOnly { get; set; }
public bool SameLineOnly { get; set; }
public PatternScope[] Scopes { get; set; } = new PatternScope[1] { PatternScope.All };
public bool FindingRegion { get; set; }
}
}
18 changes: 14 additions & 4 deletions RulesEngine/WithinOperation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public OperationResult WithinOperationDelegate(Clause c, object? state1, object?
toRemove.Add((clauseNum, capture));
}
}
else
else if (wc.FindingRegion)
{
var startLine = tc.GetLocation(capture.Index).Line;
// Before is already a negative number
Expand All @@ -94,6 +94,7 @@ public OperationResult WithinOperationDelegate(Clause c, object? state1, object?
tcc.Result.RemoveAll(x => toRemove.Contains(x));
}
}
// In the case that we have inverted the lambda, the captures are null and thus the passed list will be empty. We thus need to invert this again to get true correctly in that case.
return new OperationResult(passed.Any() ^ wc.Invert, passed.Any() ? new TypedClauseCapture<List<Boundary>>(wc, passed) : null);

OperationResult ProcessLambda(string target, Boundary targetBoundary)
Expand Down Expand Up @@ -122,7 +123,8 @@ OperationResult ProcessLambda(string target, Boundary targetBoundary)
}
}
}
return new OperationResult(boundaries.Any(), boundaries.Any() ? new TypedClauseCapture<List<Boundary>>(wc, boundaries) : null);
// Invert the result of the operation if requested
return new OperationResult(boundaries.Any() ^ wc.Invert, boundaries.Any() ? new TypedClauseCapture<List<Boundary>>(wc, boundaries) : null);
}
}
return new OperationResult(false, null);
Expand All @@ -142,9 +144,17 @@ public IEnumerable<Violation> WithinValidationDelegate(CST.OAT.Rule rule, Clause
}
if (clause is WithinClause wc)
{
if (!wc.FindingOnly && !wc.SameLineOnly && (wc.Before == 0 && wc.After == 0))
if (!wc.FindingOnly && !wc.SameLineOnly && !wc.FindingRegion)
{
yield return new Violation($"Either FindingOnly, SameLineOnly or some Combination of Before and After being set to non-zero values", rule, clause);
yield return new Violation($"Either FindingOnly, SameLineOnly or Finding Region must be set", rule, clause);
}
if (wc.FindingRegion && wc.Before > 0)
{
yield return new Violation($"The first parameter for finding region, representing number of lines before, must be 0 or negative", rule, clause);
}
if (wc.FindingRegion && wc.After < 0)
{
yield return new Violation($"The second parameter for finding region, representing number of lines after, must be 0 or positive", rule, clause);
}
if (!wc.Data?.Any() ?? true)
{
Expand Down
8 changes: 4 additions & 4 deletions UnitTest.Commands/Tests_CLI/TestAnalyzeCmd.cs
Original file line number Diff line number Diff line change
Expand Up @@ -219,8 +219,8 @@ public void ExpectedTagCountDupsAllowed_Pass()
string content = File.ReadAllText(Path.Combine(Helper.GetPath(Helper.AppPath.testOutput), @"output.txt"));
var result = JsonConvert.DeserializeObject<AnalyzeResult>(content);
Assert.IsNotNull(result);
Assert.AreEqual(10, result.Metadata.TotalMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(11, result.Metadata.TotalMatchesCount);
Assert.AreEqual(7, result.Metadata.UniqueMatchesCount);

args = string.Format(@"analyze -s {0} -f json -o {1} -g none",
Path.Combine(Helper.GetPath(Helper.AppPath.testSource), @"unzipped\simple\mainduptags.cpp"),
Expand All @@ -232,8 +232,8 @@ public void ExpectedTagCountDupsAllowed_Pass()
content = File.ReadAllText(Path.Combine(Helper.GetPath(Helper.AppPath.testOutput), @"output.txt"));
result = JsonConvert.DeserializeObject<AnalyzeResult>(content);
Assert.IsNotNull(result);
Assert.AreEqual(10, result.Metadata.TotalMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(11, result.Metadata.TotalMatchesCount);
Assert.AreEqual(7, result.Metadata.UniqueMatchesCount);
}

[TestMethod]
Expand Down
4 changes: 2 additions & 2 deletions UnitTest.Commands/Tests_CLI/TestAnalyzeTagsOnlyCmd.cs
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ public void ExpectedTagCountDupsAllowed_Pass()
Assert.IsNotNull(result);
Assert.AreEqual(0, result.Metadata.TotalMatchesCount);
Assert.AreEqual(0, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueTags.Count);
Assert.AreEqual(7, result.Metadata.UniqueTags.Count);

args = string.Format(@"analyze -s {0} -f json -o {1} -g none -t",
Path.Combine(Helper.GetPath(Helper.AppPath.testSource), @"unzipped\simple\mainduptags.cpp"),
Expand All @@ -246,7 +246,7 @@ public void ExpectedTagCountDupsAllowed_Pass()
Assert.IsNotNull(result);
Assert.AreEqual(0, result.Metadata.TotalMatchesCount);
Assert.AreEqual(0, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueTags.Count);
Assert.AreEqual(7, result.Metadata.UniqueTags.Count);

}

Expand Down
20 changes: 10 additions & 10 deletions UnitTest.Commands/Tests_NuGet/TestAnalyzeCmd.cs
Original file line number Diff line number Diff line change
Expand Up @@ -368,8 +368,8 @@ public async Task ExpectedTagCountAsync_Pass()
AnalyzeCommand command = new(options);
AnalyzeResult result = await command.GetResultAsync(new CancellationToken());
Assert.AreEqual(AnalyzeResult.ExitCode.Success, result.ResultCode);
Assert.AreEqual(10, result.Metadata.TotalMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(11, result.Metadata.TotalMatchesCount);
Assert.AreEqual(7, result.Metadata.UniqueMatchesCount);
}

[TestMethod]
Expand All @@ -387,8 +387,8 @@ public void ScanUnknownFileTypesTest_Include()
Assert.AreEqual(2, result.Metadata.TotalFiles);
Assert.AreEqual(0, result.Metadata.FilesSkipped);
Assert.AreEqual(2, result.Metadata.FilesAffected);
Assert.AreEqual(67, result.Metadata.TotalMatchesCount);
Assert.AreEqual(21, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(68, result.Metadata.TotalMatchesCount);
Assert.AreEqual(22, result.Metadata.UniqueMatchesCount);
}

[TestMethod]
Expand All @@ -407,8 +407,8 @@ public void ScanUnknownFileTypesTest_Exclude()
Assert.AreEqual(2, result.Metadata.TotalFiles);
Assert.AreEqual(1, result.Metadata.FilesSkipped);
Assert.AreEqual(1, result.Metadata.FilesAffected);
Assert.AreEqual(35, result.Metadata.TotalMatchesCount);
Assert.AreEqual(20, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(36, result.Metadata.TotalMatchesCount);
Assert.AreEqual(21, result.Metadata.UniqueMatchesCount);
}

[TestMethod]
Expand Down Expand Up @@ -458,16 +458,16 @@ public void ExpectedTagCountDupsAllowed_Pass()
AnalyzeCommand command = new(options);
AnalyzeResult result = command.GetResult();
Assert.AreEqual(AnalyzeResult.ExitCode.Success, result.ResultCode);
Assert.AreEqual(10, result.Metadata.TotalMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(11, result.Metadata.TotalMatchesCount);
Assert.AreEqual(7, result.Metadata.UniqueMatchesCount);


options.SingleThread = false;
command = new AnalyzeCommand(options);
result = command.GetResult();
Assert.AreEqual(AnalyzeResult.ExitCode.Success, result.ResultCode);
Assert.AreEqual(10, result.Metadata.TotalMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(11, result.Metadata.TotalMatchesCount);
Assert.AreEqual(7, result.Metadata.UniqueMatchesCount);
}

[TestMethod]
Expand Down
47 changes: 22 additions & 25 deletions UnitTest.Commands/Tests_NuGet/TestAnalyzeTagsOnlyCmd.cs
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,7 @@ public async Task ExpectedTagCountAsync()
Assert.AreEqual(AnalyzeResult.ExitCode.Success, result.ResultCode);
Assert.AreEqual(0, result.Metadata.TotalMatchesCount);
Assert.AreEqual(0, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueTags.Count);
Assert.AreEqual(7, result.Metadata.UniqueTags.Count);
}

[TestMethod]
Expand All @@ -306,14 +306,14 @@ public void ExpectedTagCountTwoFiles()
AnalyzeResult result = command.GetResult();
Assert.AreEqual(result.ResultCode, AnalyzeResult.ExitCode.Success);
Assert.AreEqual(0, result.Metadata.TotalMatchesCount);
Assert.AreEqual(7, result.Metadata.UniqueTags.Count);
Assert.AreEqual(8, result.Metadata.UniqueTags.Count);

options.SingleThread = false;
command = new AnalyzeCommand(options);
result = command.GetResult();
Assert.AreEqual(result.ResultCode, AnalyzeResult.ExitCode.Success);
Assert.AreEqual(0, result.Metadata.TotalMatchesCount);
Assert.AreEqual(7, result.Metadata.UniqueTags.Count);
Assert.AreEqual(8, result.Metadata.UniqueTags.Count);
}

[TestMethod]
Expand All @@ -327,34 +327,31 @@ public void ExpectedTagCount()
TagsOnly = true
};

try
{
AnalyzeCommand command = new(options);
AnalyzeResult result = command.GetResult();
Assert.AreEqual(AnalyzeResult.ExitCode.Success, result.ResultCode);
Assert.AreEqual(0, result.Metadata.TotalMatchesCount);
Assert.AreEqual(0, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueTags.Count);
}
catch (Exception)
{
Assert.Fail();
}
AnalyzeCommand command = new(options);
AnalyzeResult result = command.GetResult();
Assert.AreEqual(AnalyzeResult.ExitCode.Success, result.ResultCode);
Assert.AreEqual(0, result.Metadata.TotalMatchesCount);
Assert.AreEqual(0, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(7, result.Metadata.UniqueTags.Count);

options.SingleThread = false;
try
{
}

[TestMethod]
public void ExpectedTagCountMultiThread()
{
AnalyzeOptions options = new()
{
SourcePath = new string[1] { Path.Combine(Helper.GetPath(Helper.AppPath.testSource), @"unzipped\simple\mainduptags.cpp") },
FilePathExclusions = Array.Empty<string>(), //allow source under unittest path
SingleThread = false,
TagsOnly = true
};
AnalyzeCommand command = new(options);
AnalyzeResult result = command.GetResult();
Assert.AreEqual(AnalyzeResult.ExitCode.Success, result.ResultCode);
Assert.AreEqual(0, result.Metadata.TotalMatchesCount);
Assert.AreEqual(0, result.Metadata.UniqueMatchesCount);
Assert.AreEqual(6, result.Metadata.UniqueTags.Count);
}
catch (Exception)
{
Assert.Fail();
}
Assert.AreEqual(7, result.Metadata.UniqueTags.Count);
}

[TestMethod]
Expand Down

0 comments on commit c150a8f

Please sign in to comment.