X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=driver.py;h=f909a45c65a515da0b2a15ac8fa3cc5f9a88a2f4;hb=3386fbd0792fa8810fbef8aa1903bdc089d0d4ef;hp=a78be5b9fcfe9bfc73f346ec168e837f413c5819;hpb=accd3917f73ef5e77541d7125041cf8361fbe899;p=apitrace-tests diff --git a/driver.py b/driver.py index a78be5b..f909a45 100755 --- a/driver.py +++ b/driver.py @@ -24,14 +24,14 @@ # ##########################################################################/ -'''Common test suite code.''' +'''Main test driver.''' -import math import optparse import os.path +import platform import re -import signal +import shutil import subprocess import sys import time @@ -57,10 +57,17 @@ def _get_build_path(path): sys.exit(1) return path +def _get_build_program(program): + if platform.system() == 'Windows': + program += '.exe' + return _get_build_path(program) + class TestCase: + api = 'gl' max_frames = None + trace_file = None def __init__(self, name, args, cwd=None, build=None, results = '.'): self.name = name @@ -78,44 +85,75 @@ class TestCase: p = popen(self.args, cwd=self.cwd) p.wait() if p.returncode: - sys.stdout.write('SKIP (application faied)\n') - sys.exit(0) + self.skip('application returned code %i' % p.returncode) + + api_map = { + 'gl': 'gl', + 'egl_gl': 'egl', + 'egl_gles1': 'egl', + 'egl_gles2': 'egl', + } def trace(self): - self.trace_file = os.path.abspath(os.path.join(self.results, self.name + '.trace')) - ld_preload = _get_build_path('glxtrace.so') + if self.trace_file is None: + self.trace_file = os.path.abspath(os.path.join(self.results, self.name + '.trace')) + if os.path.exists(self.trace_file): + os.remove(self.trace_file) + else: + trace_dir = os.path.dirname(self.trace_file) + if not os.path.exists(trace_dir): + os.makedirs(trace_dir) + cmd = self.args env = os.environ.copy() - env['LD_PRELOAD'] = ld_preload - env['TRACE_FILE'] = self.trace_file + + system = platform.system() + local_wrapper = None + if system == 'Windows': + wrapper = _get_build_path('wrappers/opengl32.dll') + local_wrapper = os.path.join(os.path.dirname(self.args[0]), os.path.basename(wrapper)) + shutil.copy(wrapper, local_wrapper) + env['TRACE_FILE'] = self.trace_file + else: + apitrace = _get_build_program('apitrace') + cmd = [ + apitrace, 'trace', + '--api', self.api_map[self.api], + '--output', self.trace_file, + '--' + ] + cmd if self.max_frames is not None: env['TRACE_FRAMES'] = str(self.max_frames) - p = popen(self.args, env=env, cwd=self.cwd) - p.wait() + try: + p = popen(cmd, env=env, cwd=self.cwd) + p.wait() + finally: + if local_wrapper is not None: + os.remove(local_wrapper) if not os.path.exists(self.trace_file): - sys.stdout.write('FAIL (trace file missing)\n') - sys.exit(1) + self.fail('no trace file generated\n') call_re = re.compile(r'^([0-9]+) (\w+)\(') def dump(self): - cmd = [_get_build_path('tracedump'), '--color=never', self.trace_file] + cmd = [_get_build_program('apitrace'), 'dump', '--color=never', self.trace_file] p = popen(cmd, stdout=subprocess.PIPE) swapbuffers = 0 flushes = 0 ref_line = '' + src_lines = [] if self.ref_dump is not None: ref = open(self.ref_dump, 'rt') ref_line = ref.readline().rstrip() for line in p.stdout: line = line.rstrip() + print line mo = self.call_re.match(line) - assert mo if mo: call_no = int(mo.group(1)) function_name = mo.group(2) @@ -124,24 +162,31 @@ class TestCase: if function_name in ('glFlush', 'glFinish'): flushes += 1 src_line = line[mo.start(2):] - sys.stdout.write(src_line + '\n') - if ref_line: - if src_line == ref_line: - ref_line = ref.readline().rstrip() + else: + src_line = line + if ref_line: + if src_line == ref_line: + sys.stdout.write(src_line + '\n') + ref_line = ref.readline().rstrip() + src_lines = [] + else: + src_lines.append(src_line) + p.wait() if p.returncode != 0: - sys.stdout.write('FAIL (tracedump)\n') - sys.exit(1) + self.fail('`apitrace dump` returned code %i' % p.returncode) if ref_line: - sys.stdout.write('FAIL expected %s\n' % ref_line) - + if src_lines: + self.fail('missing call `%s` (found `%s`)' % (ref_line, src_lines[0])) + else: + self.fail('missing call %s' % ref_line) def run(self): self.standalone() self.trace() self.dump() - sys.stdout.write('PASS\n') + self.pass_() return ref_prefix = os.path.abspath(os.path.join(self.results, self.name + '.ref.')) @@ -195,6 +240,23 @@ class TestCase: sys.stdout.write('FAIL (snapshot)\n') return + def fail(self, reason=None): + self._exit('FAIL', 1, reason) + + def skip(self, reason=None): + self._exit('SKIP', 0, reason) + + def pass_(self, reason=None): + self._exit('PASS', 0, reason) + + def _exit(self, status, code, reason=None): + if reason is None: + reason = '' + else: + reason = ' (%s)' % reason + sys.stdout.write('%s%s\n' % (status, reason)) + sys.exit(code) + def main(): @@ -204,6 +266,10 @@ def main(): optparser = optparse.OptionParser( usage='\n\t%prog [options] -- program [args] ...', version='%%prog') + optparser.add_option( + '-a', '--api', metavar='API', + type='string', dest='api', default='gl', + help='api to trace') optparser.add_option( '-B', '--build', metavar='PATH', type='string', dest='build', default='..', @@ -214,7 +280,7 @@ def main(): help='change to directory') optparser.add_option( '-R', '--results', metavar='PATH', - type='string', dest='results', default='results', + type='string', dest='results', default='.', help='results directory [default=%default]') optparser.add_option( '--ref-dump', metavar='PATH', @@ -232,6 +298,7 @@ def main(): build = options.build, results = options.results, ) + test.api = options.api test.ref_dump = options.ref_dump test.run()