[Piglit] [patch v3 15/15] glsl_parser_test.py: Only allow [A-Za-z0-9_\.\! ]+ in config values

Dylan Baker baker.dylan.c at gmail.com
Mon Jul 28 17:34:25 PDT 2014


This restricts all keys to this set of values, it is a little lax in
some cases, but represents the lowest common denominator for all of the
keys. This should help to limit the number of errors from authors
creating tests.

Signed-off-by: Dylan Baker <baker.dylan.c at gmail.com>
---
 framework/glsl_parser_test.py             | 13 +++++-
 framework/tests/glsl_parser_test_tests.py | 73 +++++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+), 1 deletion(-)

diff --git a/framework/glsl_parser_test.py b/framework/glsl_parser_test.py
index 9d768fe..1277c07 100644
--- a/framework/glsl_parser_test.py
+++ b/framework/glsl_parser_test.py
@@ -152,7 +152,8 @@ class GLSLParserTest(PiglitTest):
 
         is_header = re.compile(r'(//|/\*|\*)\s*\[end config\]')
         is_metadata = re.compile(
-            r'(//|/\*|\*)\s*(?P<key>[a-z_]*)\:\s(?P<value>[A-Za-z0-9._ ]*)')
+            r'(//|/\*|\*)\s*(?P<key>[a-z_]*)\:\s(?P<value>.*)')
+        bad_values = re.compile(r'(?![\w\.\! ]).*')
 
         for line in lines:
             # If strip renendered '' that means we had a blank newline,
@@ -177,6 +178,16 @@ class GLSLParserTest(PiglitTest):
                         'Duplicate entry for key {0} in file {1}'.format(
                             match.group('key'), filepath))
                 else:
+                    bad = bad_values.search(match.group('value'))
+                    # XXX: this always seems to return a match object, even
+                    # when the match is ''
+                    if bad.group():
+                        raise GLSLParserException(
+                            'Bad character "{0}" in file: "{1}", '
+                            'line: "{2}". Only alphanumerics, _, and space '
+                            'are allowed'.format(
+                                bad.group()[0], filepath, line))
+
                     # Otherwise add the key to the set of found keys, and add
                     # it to the dictionary that will be returned
                     self.__found_keys.add(match.group('key'))
diff --git a/framework/tests/glsl_parser_test_tests.py b/framework/tests/glsl_parser_test_tests.py
index 22a1f2c..b8af98c 100644
--- a/framework/tests/glsl_parser_test_tests.py
+++ b/framework/tests/glsl_parser_test_tests.py
@@ -255,3 +255,76 @@ def test_duplicate_entries():
             ''.join(x[1] for x in content), value)
 
         yield check_no_duplicates, test, name
+
+
+def check_bad_character(tfile):
+    """ Check for bad characters """
+    with nt.assert_raises(glsl.GLSLParserException) as e:
+        glsl.GLSLParserTest(tfile)
+
+        # Obviously this isn't a perfect check, but it should be close enough
+        if not e.exception.message.startswith('Bad character "'):
+            raise AssertionError(e.exception)
+
+
+ at utils.nose_generator
+def glslparser_exetensions_seperators():
+    """ GlslParserTest() can only have [A-Za-z_] as characters
+
+    This test generates a number of tests that should catch the majority of
+    errors relating to seperating extensions in the config block of a
+    glslparser test
+
+    """
+    problems = [
+        ('comma seperator', '// require_extensions: ARB_ham, ARB_turkey\n'),
+        ('semi-colon seperator', '// require_extensions: ARB_ham; ARB_turkey\n'),
+        ('trailing semi-colon', '// require_extensions: ARB_ham ARB_turkey\n;'),
+        ('Non-alpha character', '// require_extensions: ARB_$$$\n'),
+    ]
+
+    content = ('// [config]\n'
+               '// expect_result: pass\n'
+               '// glsl_version: 1.00\n'
+               '{}'
+               '// [end config]\n')
+
+    for name, value in problems:
+        test = content.format(value)
+        with utils.with_tempfile(test) as tfile:
+            check_bad_character.description = (
+                'require_extensions: {0} should raise an error'.format(name))
+            yield check_bad_character, tfile
+
+
+def check_good_extension(file_, desc):
+    """ A good extension should not raise a GLSLParserException """
+    try:
+        glsl.GLSLParserTest(file_)
+    except glsl.GLSLParserException:
+        nt.ok_(False,
+               'GLSLParserException was raised by "required_extensions: {}"'
+               ', but should not'.format(desc))
+
+
+ at utils.nose_generator
+def test_good_extensions():
+    """ Generates tests with good extensions which shouldn't raise errors """
+    content = ('// [config]\n'
+               '// expect_result: pass\n'
+               '// glsl_version: 1.00\n'
+               '// require_extensions: {}\n'
+               '// [end config]\n')
+    options = [
+        'GL_EXT_texture_array',
+        'GL_EXT_texture_array ARB_example',
+        '!GL_ARB_ham_sandwhich',
+    ]
+
+    for x in options:
+        test = content.format(x)
+        check_good_extension.description = \
+            'require_extension {} is valid'.format(x)
+
+        with utils.with_tempfile(test) as tfile:
+            yield check_good_extension, tfile, x
-- 
2.0.2



More information about the Piglit mailing list