[Piglit] [PATCH 32/35] Add script to serialize profiles to XML
Dylan Baker
dylan at pnwbakers.com
Wed Apr 4 22:27:20 UTC 2018
This script loads a python module and creates an XML profiles. It will
be used at build time to serialize the built-in profiles. It currently
cannot serialize integrated suites (such as dEQP or IGC), but it could
be extended to do so.
---
tests/serializer.py | 149 +++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 149 insertions(+)
create mode 100644 tests/serializer.py
diff --git a/tests/serializer.py b/tests/serializer.py
new file mode 100644
index 0000000..58b3a14
--- /dev/null
+++ b/tests/serializer.py
@@ -0,0 +1,149 @@
+# encoding=utf-8
+# Copyright © 2018 Intel Corporation
+
+# Permission is hereby granted, free of charge, to any person obtaining a copy
+# of this software and associated documentation files (the "Software"), to deal
+# in the Software without restriction, including without limitation the rights
+# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the Software is
+# furnished to do so, subject to the following conditions:
+
+# The above copyright notice and this permission notice shall be included in
+# all copies or substantial portions of the Software.
+
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+# SOFTWARE.
+
+"""Script for taking profiles in python format and serializing them to XML."""
+
+import argparse
+import os
+import sys
+import xml.etree.cElementTree as et
+
+import six
+
+sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), '..'))
+
+from framework.test.piglit_test import (
+ PiglitGLTest, PiglitCLTest, ASMParserTest, BuiltInConstantsTest,
+ CLProgramTester,
+)
+from framework.test.shader_test import ShaderTest, MultiShaderTest
+from framework.test.glsl_parser_test import GLSLParserTest
+from framework.profile import load_test_profile
+from framework.options import OPTIONS
+
+
+def parser():
+ """Parse command line arguments."""
+ parser = argparse.ArgumentParser()
+ parser.add_argument('name')
+ parser.add_argument('input')
+ parser.add_argument('output')
+ parser.add_argument('--no-process-isolation', action='store_true')
+ parser.add_argument('--glsl-arb-compat', action='store_true')
+ args = parser.parse_args()
+ return args
+
+
+def _serialize_skips(test, elem):
+ if getattr(test, 'gl_required', None):
+ et.SubElement(elem, 'option', name='gl_required',
+ value=repr(test.gl_required))
+ if getattr(test, 'gl_version', None):
+ et.SubElement(elem, 'option', name='gl_version',
+ value=repr(test.gl_version))
+ if getattr(test, 'gles_version', None):
+ et.SubElement(elem, 'option', name='gles_version',
+ value=repr(test.gles_version))
+ if getattr(test, 'glsl_version', None):
+ et.SubElement(elem, 'option', name='glsl_version',
+ value=repr(test.glsl_version))
+ if getattr(test, 'glsl_es_version', None):
+ et.SubElement(elem, 'option', name='glsl_es_version',
+ value=repr(test.glsl_es_version))
+
+
+def serializer(name, profile, outfile):
+ """Take each test in the profile and write it out into the xml."""
+ # TODO: This is going to take a lot of memory
+ root = et.Element('PiglitTestList', count=six.text_type(len(profile)),
+ name=name)
+ for name, test in profile.itertests():
+ if isinstance(test, PiglitGLTest):
+ elem = et.SubElement(root, 'Test', type='gl', name=name)
+ if test.require_platforms:
+ et.SubElement(elem, 'option', name='require_platforms',
+ value=repr(test.require_platforms))
+ if test.exclude_platforms:
+ et.SubElement(elem, 'option', name='exclude_platforms',
+ value=repr(test.exclude_platforms))
+ _serialize_skips(test, elem)
+ elif isinstance(test, BuiltInConstantsTest):
+ elem = et.SubElement(root, 'Test', type='gl_builtin', name=name)
+ elif isinstance(test, GLSLParserTest):
+ elem = et.SubElement(root, 'Test', type='glsl_parser', name=name)
+ _serialize_skips(test, elem)
+ elif isinstance(test, ASMParserTest):
+ elem = et.SubElement(root, 'Test', type='asm_parser', name=name)
+ et.SubElement(elem, 'option', name='type_',
+ value=repr(test.command[1]))
+ et.SubElement(elem, 'option', name='filename',
+ value=repr(test.filename))
+ continue
+ elif isinstance(test, ShaderTest):
+ elem = et.SubElement(root, 'Test', type='shader', name=name)
+ _serialize_skips(test, elem)
+ elif isinstance(test, MultiShaderTest):
+ elem = et.SubElement(root, 'Test', type='multi_shader', name=name)
+ et.SubElement(elem, 'option', name='prog', value=repr(test.prog))
+ et.SubElement(elem, 'option', name='files', value=repr(test.files))
+ et.SubElement(elem, 'option', name='subtests', value=repr(test.subtests))
+ skips = et.SubElement(elem, 'Skips')
+ for s in test.skips:
+ skip = et.SubElement(skips, 'Skip')
+ _serialize_skips(s, skip)
+ continue
+ elif isinstance(test, CLProgramTester):
+ elem = et.SubElement(root, 'Test', type='cl_prog', name=name)
+ et.SubElement(elem, 'option', name='filename',
+ value=repr(test.filename))
+ continue
+ elif isinstance(test, PiglitCLTest):
+ elem = et.SubElement(root, 'Test', type='cl', name=name)
+ et.SubElement(elem, 'option', name='command', value=repr(test._command))
+ continue
+ else:
+ continue
+
+ et.SubElement(elem, 'option', name='command', value=repr(test._command))
+ et.SubElement(elem, 'option', name='run_concurrent',
+ value=repr(test.run_concurrent))
+ if test.cwd:
+ et.SubElement(elem, 'option', name='cwd', value=test.cwd)
+ if test.env:
+ env = et.SubElement(elem, 'environment')
+ for k, v in six.iteritems(test.env):
+ et.SubElement(env, 'env', name=k, value=v)
+
+ tree = et.ElementTree(root)
+ tree.write(outfile, encoding='utf-8', xml_declaration=True)
+
+
+def main():
+ args = parser()
+ OPTIONS.process_isolation = not args.no_process_isolation
+ if args.glsl_arb_compat:
+ os.environ['PIGLIT_FORCE_GLSLPARSER_DESKTOP'] = 'true'
+ profile = load_test_profile(args.input, python=True)
+ serializer(args.name, profile, args.output)
+
+
+if __name__ == '__main__':
+ main()
--
git-series 0.9.1
More information about the Piglit
mailing list