From 01a0fc14cbb6c57b73e9aeba830c575707646d78 Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Tue, 29 May 2018 15:42:07 +0200 Subject: [PATCH 1/3] Raise ReframeSyntaxError if check parsing fails * Raise a `ReframeSyntaxError` with a descriptive message if parsing of a `RegressionTest` fails. * Create the corresponding unittest. --- reframe/frontend/loader.py | 11 +++++++++-- .../resources/checks_unlisted/invalid_syntax_check.py | 6 ++++++ unittests/test_loader.py | 8 +++++++- 3 files changed, 22 insertions(+), 3 deletions(-) create mode 100644 unittests/resources/checks_unlisted/invalid_syntax_check.py diff --git a/reframe/frontend/loader.py b/reframe/frontend/loader.py index c00ca426f7..2c43349623 100644 --- a/reframe/frontend/loader.py +++ b/reframe/frontend/loader.py @@ -10,7 +10,9 @@ import reframe.core.debug as debug import reframe.utility as util -from reframe.core.exceptions import NameConflictError, RegressionTestLoadError +from reframe.core.exceptions import (NameConflictError, + RegressionTestLoadError, + ReframeSyntaxError) from reframe.core.logging import getlogger @@ -79,7 +81,12 @@ def _validate_source(self, filename): further tests and finalizes and validation.""" with open(filename, 'r') as f: - source_tree = ast.parse(f.read()) + try: + source_tree = ast.parse(f.read()) + except SyntaxError as e: + message = ('\nRegression check syntax error:\n{0}Line: {1}\n' + 'File: {2}'.format(e.text, e.lineno, filename)) + raise ReframeSyntaxError(message) validator = RegressionCheckValidator() validator.visit(source_tree) diff --git a/unittests/resources/checks_unlisted/invalid_syntax_check.py b/unittests/resources/checks_unlisted/invalid_syntax_check.py new file mode 100644 index 0000000000..0e62f81758 --- /dev/null +++ b/unittests/resources/checks_unlisted/invalid_syntax_check.py @@ -0,0 +1,6 @@ +import reframe as rfm + + +@rfm.simple_test +class InvalidSyntaxTest(rfm.RegressionTest: + pass diff --git a/unittests/test_loader.py b/unittests/test_loader.py index 9f2547b65a..57ffbba17e 100644 --- a/unittests/test_loader.py +++ b/unittests/test_loader.py @@ -2,7 +2,8 @@ import unittest from reframe.core.exceptions import (ConfigError, NameConflictError, - RegressionTestLoadError) + RegressionTestLoadError, + ReframeSyntaxError) from reframe.core.systems import System from reframe.frontend.loader import RegressionCheckLoader @@ -58,3 +59,8 @@ def test_conflicted_checks(self): def test_load_error(self): self.assertRaises(OSError, self.loader.load_from_file, 'unittests/resources/checks/foo.py') + + def test_load_invalid_sytax(self): + self.assertRaises(ReframeSyntaxError, self.loader.load_from_file, + 'unittests/resources/checks_unlisted/' + 'invalid_syntax_check.py') From b9231b29036c6e8a39aec6da55813ba7dca49434 Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Thu, 31 May 2018 14:04:27 +0200 Subject: [PATCH 2/3] Address PR comments --- reframe/frontend/loader.py | 10 ++-------- unittests/test_loader.py | 12 +++++++----- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/reframe/frontend/loader.py b/reframe/frontend/loader.py index 2c43349623..221c88c9a4 100644 --- a/reframe/frontend/loader.py +++ b/reframe/frontend/loader.py @@ -11,8 +11,7 @@ import reframe.core.debug as debug import reframe.utility as util from reframe.core.exceptions import (NameConflictError, - RegressionTestLoadError, - ReframeSyntaxError) + RegressionTestLoadError) from reframe.core.logging import getlogger @@ -81,12 +80,7 @@ def _validate_source(self, filename): further tests and finalizes and validation.""" with open(filename, 'r') as f: - try: - source_tree = ast.parse(f.read()) - except SyntaxError as e: - message = ('\nRegression check syntax error:\n{0}Line: {1}\n' - 'File: {2}'.format(e.text, e.lineno, filename)) - raise ReframeSyntaxError(message) + source_tree = ast.parse(f.read(), filename) validator = RegressionCheckValidator() validator.visit(source_tree) diff --git a/unittests/test_loader.py b/unittests/test_loader.py index 57ffbba17e..80143a7ed1 100644 --- a/unittests/test_loader.py +++ b/unittests/test_loader.py @@ -2,8 +2,7 @@ import unittest from reframe.core.exceptions import (ConfigError, NameConflictError, - RegressionTestLoadError, - ReframeSyntaxError) + RegressionTestLoadError) from reframe.core.systems import System from reframe.frontend.loader import RegressionCheckLoader @@ -61,6 +60,9 @@ def test_load_error(self): 'unittests/resources/checks/foo.py') def test_load_invalid_sytax(self): - self.assertRaises(ReframeSyntaxError, self.loader.load_from_file, - 'unittests/resources/checks_unlisted/' - 'invalid_syntax_check.py') + invalid_check = ('unittests/resources/checks_unlisted/' + 'invalid_syntax_check.py') + with self.assertRaises(SyntaxError) as e: + self.loader.load_from_file(invalid_check) + + self.assertEqual(e.exception.filename, invalid_check) From c449faf56291ca08ab387ed38ee80c95f92633ad Mon Sep 17 00:00:00 2001 From: Theofilos Manitaras Date: Fri, 1 Jun 2018 07:53:04 +0200 Subject: [PATCH 3/3] Address PR comments (version 2) --- reframe/frontend/loader.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/reframe/frontend/loader.py b/reframe/frontend/loader.py index 221c88c9a4..c072330efb 100644 --- a/reframe/frontend/loader.py +++ b/reframe/frontend/loader.py @@ -10,8 +10,7 @@ import reframe.core.debug as debug import reframe.utility as util -from reframe.core.exceptions import (NameConflictError, - RegressionTestLoadError) +from reframe.core.exceptions import NameConflictError, RegressionTestLoadError from reframe.core.logging import getlogger