From 0b42b0350fdf2a178c474ed0f4115e1e74009435 Mon Sep 17 00:00:00 2001 From: Oluwatoni Solarin-Sodara Date: Tue, 15 May 2018 10:53:15 +0100 Subject: [PATCH] improve performance of filter expression validation --- src/coverlet.core/Coverage.cs | 1 + .../Helpers/InstrumentationHelper.cs | 67 +++++++++---------- .../Helpers/InstrumentationHelperTests.cs | 15 +++++ 3 files changed, 48 insertions(+), 35 deletions(-) diff --git a/src/coverlet.core/Coverage.cs b/src/coverlet.core/Coverage.cs index b058eea..1d06533 100644 --- a/src/coverlet.core/Coverage.cs +++ b/src/coverlet.core/Coverage.cs @@ -30,6 +30,7 @@ namespace Coverlet.Core { string[] modules = InstrumentationHelper.GetCoverableModules(_module); string[] excludedFiles = InstrumentationHelper.GetExcludedFiles(_rules); + _filters = _filters?.Where(f => InstrumentationHelper.IsValidFilterExpression(f)).ToArray(); foreach (var module in modules) { diff --git a/src/coverlet.core/Helpers/InstrumentationHelper.cs b/src/coverlet.core/Helpers/InstrumentationHelper.cs index a6c9d7c..7e81716 100644 --- a/src/coverlet.core/Helpers/InstrumentationHelper.cs +++ b/src/coverlet.core/Helpers/InstrumentationHelper.cs @@ -81,6 +81,38 @@ namespace Coverlet.Core.Helpers 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) @@ -91,9 +123,6 @@ namespace Coverlet.Core.Helpers foreach (var filter in filters) { - if (!IsValidFilterExpression(filter)) - continue; - string modulePattern = filter.Substring(1, filter.IndexOf(']') - 1); string typePattern = filter.Substring(filter.IndexOf(']') + 1); @@ -116,9 +145,6 @@ namespace Coverlet.Core.Helpers foreach (var filter in filters) { - if (!IsValidFilterExpression(filter)) - continue; - string typePattern = filter.Substring(filter.IndexOf(']') + 1); string modulePattern = filter.Substring(1, filter.IndexOf(']') - 1); @@ -191,35 +217,6 @@ namespace Coverlet.Core.Helpers 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). diff --git a/test/coverlet.core.tests/Helpers/InstrumentationHelperTests.cs b/test/coverlet.core.tests/Helpers/InstrumentationHelperTests.cs index 0bbaf32..4b67409 100644 --- a/test/coverlet.core.tests/Helpers/InstrumentationHelperTests.cs +++ b/test/coverlet.core.tests/Helpers/InstrumentationHelperTests.cs @@ -50,6 +50,21 @@ namespace Coverlet.Core.Helpers.Tests 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() {