From 775c7204345e9539a60302feb8d576775da04760 Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Fri, 12 Apr 2019 13:45:45 +0200 Subject: [PATCH 1/3] Handle invalid regexes used in cli to filter checks * Throw a `ReframeError` if an invalid regex is passed to one of the filtering functions. * Add corresponding unittests. --- reframe/frontend/check_filters.py | 15 ++++++++++++--- unittests/test_check_filters.py | 16 ++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/reframe/frontend/check_filters.py b/reframe/frontend/check_filters.py index a16bce3f9b..0580b4b238 100644 --- a/reframe/frontend/check_filters.py +++ b/reframe/frontend/check_filters.py @@ -2,10 +2,19 @@ import reframe.core.runtime as rt import reframe.utility.sanity as util +from reframe.core.exceptions import ReframeError + + +def re_compile(patt): + try: + regex = re.compile(patt) + return regex + except re.error: + raise ReframeError("invalid regex: '%s'" % patt) def have_name(patt): - regex = re.compile(patt) + regex = re_compile(patt) def _fn(c): return regex.match(c.name) @@ -21,7 +30,7 @@ def _fn(c): def have_tag(patt): - regex = re.compile(patt) + regex = re_compile(patt) def _fn(c): return any(regex.match(p) for p in c.tags) @@ -30,7 +39,7 @@ def _fn(c): def have_prgenv(patt): - regex = re.compile(patt) + regex = re_compile(patt) def _fn(c): if '*' in c.valid_prog_environs: diff --git a/unittests/test_check_filters.py b/unittests/test_check_filters.py index 6cde2560f9..2cb5ce47b3 100644 --- a/unittests/test_check_filters.py +++ b/unittests/test_check_filters.py @@ -5,6 +5,7 @@ import reframe.utility.sanity as sn import unittests.fixtures as fixtures from reframe.core.pipeline import RegressionTest +from reframe.core.exceptions import ReframeError class TestCheckFilters(unittest.TestCase): @@ -90,3 +91,18 @@ def test_have_gpu_only(self): def test_have_cpu_only(self): self.assertEqual(1, self.count_checks(filters.have_cpu_only())) + + def test_invalid_regex(self): + # We need to explicitly call `evaluate` to trigger the exception + # to make sure the exception is triggered in all cases + with self.assertRaises(ReframeError): + self.count_checks(filters.have_name('*foo')).evaluate() + + with self.assertRaises(ReframeError): + self.count_checks(filters.have_not_name('*foo')).evaluate() + + with self.assertRaises(ReframeError): + self.count_checks(filters.have_tag('*foo')).evaluate() + + with self.assertRaises(ReframeError): + self.count_checks(filters.have_prgenv('*foo')).evaluate() From f89942ee8df091318f90c999aa67b7914109c366 Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Fri, 12 Apr 2019 14:40:49 +0200 Subject: [PATCH 2/3] Fix unittest comment --- unittests/test_check_filters.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unittests/test_check_filters.py b/unittests/test_check_filters.py index 2cb5ce47b3..d077f31c41 100644 --- a/unittests/test_check_filters.py +++ b/unittests/test_check_filters.py @@ -93,8 +93,8 @@ def test_have_cpu_only(self): self.assertEqual(1, self.count_checks(filters.have_cpu_only())) def test_invalid_regex(self): - # We need to explicitly call `evaluate` to trigger the exception - # to make sure the exception is triggered in all cases + # We need to explicitly call `evaluate` to make sure the exception + # is triggered in all cases with self.assertRaises(ReframeError): self.count_checks(filters.have_name('*foo')).evaluate() From d817ea0183ffa8eaae441c292d242e29971d5cdf Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Mon, 15 Apr 2019 09:57:48 +0200 Subject: [PATCH 3/3] Address PR comments --- reframe/frontend/check_filters.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reframe/frontend/check_filters.py b/reframe/frontend/check_filters.py index 0580b4b238..9bb57534ae 100644 --- a/reframe/frontend/check_filters.py +++ b/reframe/frontend/check_filters.py @@ -7,8 +7,7 @@ def re_compile(patt): try: - regex = re.compile(patt) - return regex + return re.compile(patt) except re.error: raise ReframeError("invalid regex: '%s'" % patt)