summaryrefslogtreecommitdiff
path: root/tests/deqp_gles3.py
diff options
context:
space:
mode:
authorDylan Baker <baker.dylan.c@gmail.com>2015-05-21 10:02:47 -0700
committerDylan Baker <baker.dylan.c@gmail.com>2015-06-01 10:23:57 -0700
commit50347735cd0c76f5ef8fb52d3492e8e9e637ccb1 (patch)
tree5e3faeb887db336bcb23bd6b1877ccedec822d8d /tests/deqp_gles3.py
parent437048a118cd008375286b73c9a558a57039cabd (diff)
tests/deqp_gles3.py: use framework/tests/deqp.py
This changes the existing deqp_gles3 integration to use the generic framework in the piglit core.
Diffstat (limited to 'tests/deqp_gles3.py')
-rw-r--r--tests/deqp_gles3.py150
1 files changed, 33 insertions, 117 deletions
diff --git a/tests/deqp_gles3.py b/tests/deqp_gles3.py
index 0ed6a6104..574a5e518 100644
--- a/tests/deqp_gles3.py
+++ b/tests/deqp_gles3.py
@@ -1,4 +1,4 @@
-# Copyright 2014 Intel Corporation
+# Copyright 2014, 2015 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
@@ -18,18 +18,25 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
-import os
-import subprocess
+"""Piglit integrations for dEQP GLES3 tests."""
+
import xml.etree.cElementTree as ET
-# Piglit modules
-from framework import core, grouptools
-from framework.profile import Test, TestProfile
+from framework.test import deqp
__all__ = ['profile']
+# Path to the deqp-gles3 executable.
+_DEQP_GLES3_EXE = deqp.get_option('PIGLIT_DEQP_GLES3_EXE',
+ ('deqp-gles3', 'exe'))
-def get_test_case(root, root_group, outputfile):
+# Path to the xml file which contained the case list of the subset of dEQP
+# and marked as must pass in CTS.
+_DEQP_MUSTPASS = deqp.get_option('PIGLIT_DEQP_MUSTPASS',
+ ('deqp-gles3', 'mustpasslist'))
+
+
+def _get_test_case(root, root_group, outputfile):
"""Parser the test case list of Google Android CTS,
and store the test case list to dEQP-GLES3-cases.txt
"""
@@ -39,132 +46,41 @@ def get_test_case(root, root_group, outputfile):
outputfile.write('TEST: {}\n'.format('.'.join(root_group)))
del root_group[-1]
else:
- get_test_case(child, root_group, outputfile)
+ _get_test_case(child, root_group, outputfile)
del root_group[-1]
-def load_test_hierarchy(input, output):
+def _load_test_hierarchy(mustpass, case_list):
"""Google have added a subset of dEQP to CTS test, the case list is stored
at some xml files. Such as: com.drawelements.deqp.gles3.xml This function
is used to parser the file, and generate a new dEQP-GLES3-cases.txt which
only contain the subset of dEQP.
"""
- tree = ET.parse(input)
+ tree = ET.parse(mustpass)
root = tree.getroot()
root_group = []
- with open(output, 'w') as f:
- get_test_case(root, root_group, f)
+ with open(case_list, 'w') as f:
+ _get_test_case(root, root_group, f)
-def get_option(env_varname, config_option):
- """Query the given environment variable and then piglit.conf for the
- option. Return None if the option is unset.
- """
- opt = os.environ.get(env_varname, None)
- if opt is not None:
- return opt
+def filter_mustpass(caselist_path):
+ """Filter tests that are not in the DEQP_MUSTPASS profile."""
+ if _DEQP_MUSTPASS is not None:
+ _load_test_hierarchy(_DEQP_MUSTPASS, caselist_path)
- opt = core.PIGLIT_CONFIG.safe_get(config_option[0], config_option[1])
-
- return opt
-
-
-# Path to the deqp-gles3 executable.
-DEQP_GLES3_EXE = get_option('PIGLIT_DEQP_GLES3_EXE', ('deqp-gles3', 'exe'))
-
-# Path to the xml file which contained the case list of the subset of dEQP
-# and marked as must pass in CTS.
-DEQP_MUSTPASS = get_option('PIGLIT_DEQP_MUSTPASS',
- ('deqp-gles3', 'mustpasslist'))
-
-DEQP_GLES3_EXTRA_ARGS = get_option('PIGLIT_DEQP_GLES3_EXTRA_ARGS',
- ('deqp-gles3', 'extra_args'))
-
-
-def gen_caselist_txt():
- """Generate dEQP-GLES3-cases.txt and return its path."""
- # dEQP is stupid (2014-12-07):
- # 1. To generate the caselist file, dEQP requires that the process's
- # current directory must be that same as that of the executable.
- # Otherwise, it fails to find its data files.
- # 2. dEQP creates the caselist file in the process's current directory
- # and provides no option to change its location.
- # 3. dEQP creates a GL context when generating the caselist. Therefore,
- # the caselist must be generated on the test target rather than the
- # build host. In other words, when the build host and test target
- # differ then we cannot pre-generate the caselist on the build host:
- # we must *dynamically* generate it during the testrun.
- basedir = os.path.dirname(DEQP_GLES3_EXE)
- caselist_path = os.path.join(basedir, 'dEQP-GLES3-cases.txt')
- subprocess.check_call(
- [DEQP_GLES3_EXE, '--deqp-runmode=txt-caselist'],
- cwd=basedir)
- if DEQP_MUSTPASS is not None:
- load_test_hierarchy(DEQP_MUSTPASS, caselist_path)
- assert os.path.exists(caselist_path)
return caselist_path
-def iter_deqp_test_cases():
- """Iterate over original dEQP GLES3 testcase names."""
- caselist_path = gen_caselist_txt()
- with open(caselist_path) as caselist_file:
- for i, line in enumerate(caselist_file):
- if line.startswith('GROUP:'):
- continue
- elif line.startswith('TEST:'):
- yield line[len('TEST:'):].strip()
- else:
- raise Exception(
- '{0}:{1}: ill-formed line'.format(caselist_path, i))
-
-
-class DEQPTest(Test):
-
- __RESULT_MAP = {"Pass": "pass",
- "Fail": "fail",
- "QualityWarning": "warn",
- "InternalError": "fail",
- "Crash": "crash",
- "NotSupported": "skip"}
-
- def __init__(self, case_name):
- command = [DEQP_GLES3_EXE, '--deqp-case=' + case_name]
- if DEQP_GLES3_EXTRA_ARGS is not None:
- command.extend(DEQP_GLES3_EXTRA_ARGS.split())
- super(DEQPTest, self).__init__(command)
-
- # dEQP's working directory must be the same as that of the executable,
- # otherwise it cannot find its data files (2014-12-07).
- self.cwd = os.path.dirname(DEQP_GLES3_EXE)
-
- def interpret_result(self):
- if self.result['returncode'] != 0:
- self.result['result'] = 'fail'
- return
-
- for line in self.result['out'].split('\n'):
- line = line.lstrip()
- for k, v in DEQPTest.__RESULT_MAP.iteritems():
- if line.startswith(k):
- self.result['result'] = v
- return
-
- # We failed to parse the test output. Fallback to 'fail'.
- self.result['result'] = 'fail'
-
-
-def add_tests():
- if DEQP_GLES3_EXE is None:
- return
-
- for deqp_testname in iter_deqp_test_cases():
- # dEQP uses '.' as the testgroup separator.
- piglit_testname = deqp_testname.replace('.', grouptools.SEPARATOR)
+class DEQPGLES3Test(deqp.DEQPBaseTest):
+ deqp_bin = _DEQP_GLES3_EXE
+ extra_args = deqp.get_option('PIGLIT_DEQP_GLES3_EXTRA_ARGS',
+ ('deqp-gles3', 'extra_args')).split() or []
- test = DEQPTest(deqp_testname)
- profile.test_list[piglit_testname] = test
+ def __init__(self, *args, **kwargs):
+ super(DEQPGLES3Test, self).__init__(*args, **kwargs)
-profile = TestProfile()
-add_tests()
+profile = deqp.make_profile( # pylint: disable=invalid-name
+ deqp.iter_deqp_test_cases(filter_mustpass(
+ deqp.gen_caselist_txt(_DEQP_GLES3_EXE, 'dEQP-GLES3-cases.txt'))),
+ DEQPGLES3Test)