Skip to content

Commit

Permalink
improve performance of filter expression validation
Browse files Browse the repository at this point in the history
  • Loading branch information
tonerdo committed May 15, 2018
1 parent 928f05d commit 0b42b03
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 35 deletions.
1 change: 1 addition & 0 deletions src/coverlet.core/Coverage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public void PrepareModules()
{
string[] modules = InstrumentationHelper.GetCoverableModules(_module);
string[] excludedFiles = InstrumentationHelper.GetExcludedFiles(_rules);
_filters = _filters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray();

foreach (var module in modules)
{
Expand Down
67 changes: 32 additions & 35 deletions src/coverlet.core/Helpers/InstrumentationHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,38 @@ public static void DeleteHitsFile(string path)
RetryHelper.Retry(() => File.Delete(path), retryStrategy, 10);
}

public static bool IsValidFilterExpression(string filter)
{
if (filter == null)
return false;

if (!filter.StartsWith("["))
return false;

if (!filter.Contains("]"))
return false;

if (filter.Count(f => f == '[') > 1)
return false;

if (filter.Count(f => f == ']') > 1)
return false;

if (filter.IndexOf(']') < filter.IndexOf('['))
return false;

if (filter.IndexOf(']') - filter.IndexOf('[') == 1)
return false;

if (filter.EndsWith("]"))
return false;

if (new Regex(@"[^\w*]").IsMatch(filter.Replace(".", "").Replace("[", "").Replace("]", "")))
return false;

return true;
}

public static bool IsModuleExcluded(string module, string[] filters)
{
if (filters == null)
Expand All @@ -91,9 +123,6 @@ public static bool IsModuleExcluded(string module, string[] filters)

foreach (var filter in filters)
{
if (!IsValidFilterExpression(filter))
continue;

string modulePattern = filter.Substring(1, filter.IndexOf(']') - 1);
string typePattern = filter.Substring(filter.IndexOf(']') + 1);

Expand All @@ -116,9 +145,6 @@ public static bool IsTypeExcluded(string module, string type, string[] filters)

foreach (var filter in filters)
{
if (!IsValidFilterExpression(filter))
continue;

string typePattern = filter.Substring(filter.IndexOf(']') + 1);
string modulePattern = filter.Substring(1, filter.IndexOf(']') - 1);

Expand Down Expand Up @@ -191,35 +217,6 @@ TimeSpan retryStrategy()
return retryStrategy;
}

private static bool IsValidFilterExpression(string filter)
{
if (!filter.StartsWith("["))
return false;

if (!filter.Contains("]"))
return false;

if (filter.Count(f => f == '[') > 1)
return false;

if (filter.Count(f => f == ']') > 1)
return false;

if (filter.IndexOf(']') < filter.IndexOf('['))
return false;

if (filter.IndexOf(']') - filter.IndexOf('[') == 1)
return false;

if (filter.EndsWith("]"))
return false;

if (new Regex(@"[^\w*]").IsMatch(filter.Replace(".", "").Replace("[", "").Replace("]", "")))
return false;

return true;
}

private static string WildcardToRegex(string pattern)
{
return "^" + Regex.Escape(pattern).
Expand Down
15 changes: 15 additions & 0 deletions test/coverlet.core.tests/Helpers/InstrumentationHelperTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,21 @@ public void TestCopyCoverletDependency()
Directory.Delete(directory.FullName, true);
}

[Fact]
public void TestIsValidFilterExpression()
{
Assert.True(InstrumentationHelper.IsValidFilterExpression("[*]*"));
Assert.True(InstrumentationHelper.IsValidFilterExpression("[*]*core"));
Assert.True(InstrumentationHelper.IsValidFilterExpression("[assembly]*"));
Assert.True(InstrumentationHelper.IsValidFilterExpression("[*]type"));
Assert.True(InstrumentationHelper.IsValidFilterExpression("[assembly]type"));
Assert.False(InstrumentationHelper.IsValidFilterExpression("[*]"));
Assert.False(InstrumentationHelper.IsValidFilterExpression("[-]*"));
Assert.False(InstrumentationHelper.IsValidFilterExpression("*"));
Assert.False(InstrumentationHelper.IsValidFilterExpression("]["));
Assert.False(InstrumentationHelper.IsValidFilterExpression(null));
}

[Fact]
public void TestDontCopyCoverletDependency()
{
Expand Down

0 comments on commit 0b42b03

Please sign in to comment.