X-Git-Url: https://git.cworth.org/git?p=apitrace-tests;a=blobdiff_plain;f=driver.py;h=60699099e2b9623693131839c292f44e26df989a;hp=9c0b62283daa5900a7b4f708dedb96e796d0adf6;hb=762e0405c83651873f6ab5266916dc7619a772a3;hpb=fad1150a4ee17cbd61ced0c735f9566486ca4ee0 diff --git a/driver.py b/driver.py index 9c0b622..6069909 100755 --- a/driver.py +++ b/driver.py @@ -65,31 +65,38 @@ def _get_build_program(program): class TestCase: - max_frames = None + cmd = None + cwd = None + api = 'gl' + max_frames = None trace_file = None - def __init__(self, name, args, cwd=None, build=None, results = '.'): - self.name = name - self.args = args - self.cwd = cwd - self.build = build - self.results = results - - if not os.path.exists(results): - os.makedirs(results) - expected_dump = None def standalone(self): - p = popen(self.args, cwd=self.cwd) + if not self.cmd: + return + + p = popen(self.cmd, cwd=self.cwd) p.wait() if p.returncode: self.skip('application returned code %i' % p.returncode) + api_map = { + 'gl': 'gl', + 'egl_gl': 'egl', + 'egl_gles1': 'egl', + 'egl_gles2': 'egl', + } + def trace(self): + if not self.cmd: + return + if self.trace_file is None: - self.trace_file = os.path.abspath(os.path.join(self.results, self.name + '.trace')) + name = os.path.basename(self.cmd[0]) + self.trace_file = os.path.abspath(os.path.join(self.results, name + '.trace')) if os.path.exists(self.trace_file): os.remove(self.trace_file) else: @@ -97,27 +104,29 @@ class TestCase: if not os.path.exists(trace_dir): os.makedirs(trace_dir) + cmd = self.cmd env = os.environ.copy() 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)) + local_wrapper = os.path.join(os.path.dirname(self.cmd[0]), os.path.basename(wrapper)) shutil.copy(wrapper, local_wrapper) - elif system == 'Darwin': - wrapper = _get_build_path('wrappers/OpenGL') - env['DYLD_LIBRARY_PATH'] = os.path.dirname(wrapper) + env['TRACE_FILE'] = self.trace_file else: - wrapper = _get_build_path('glxtrace.so') - env['LD_PRELOAD'] = wrapper - - env['TRACE_FILE'] = self.trace_file + 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) try: - p = popen(self.args, env=env, cwd=self.cwd) + p = popen(cmd, env=env, cwd=self.cwd) p.wait() finally: if local_wrapper is not None: @@ -137,13 +146,14 @@ class TestCase: 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() + sys.stdout.write(line + '\n') mo = self.call_re.match(line) - assert mo if mo: call_no = int(mo.group(1)) function_name = mo.group(2) @@ -152,20 +162,39 @@ class TestCase: if function_name in ('glFlush', 'glFinish'): flushes += 1 src_line = line[mo.start(2):] - if ref_line: - if src_line == ref_line: - sys.stdout.write(src_line + '\n') - 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: self.fail('`apitrace dump` returned code %i' % p.returncode) if ref_line: - self.fail('missing call %s' % 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 retrace(self): + retrace = self.api_map[self.api] + 'retrace' + args = [_get_build_path(retrace)] + args += [self.trace_file] + p = popen(args, stdout=subprocess.PIPE) + p.wait() + if p.returncode != 0: + self.fail('`%s` returned code %i' % (retrace, p.returncode)) def run(self): self.standalone() self.trace() self.dump() + self.retrace() self.pass_() return @@ -178,7 +207,9 @@ class TestCase: if not os.path.isfile(trace): sys.stdout.write('SKIP (no trace)\n') return - args = [_get_build_path('glretrace')] + + retrace = self.api_map[self.api] + 'retrace' + args = [_get_build_path(retrace)] if swapbuffers: args += ['-db'] frames = swapbuffers @@ -245,8 +276,12 @@ def main(): # Parse command line options optparser = optparse.OptionParser( - usage='\n\t%prog [options] -- program [args] ...', + usage='\n\t%prog [options] -- [TRACE|PROGRAM] ...', 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='..', @@ -266,16 +301,21 @@ def main(): (options, args) = optparser.parse_args(sys.argv[1:]) if not args: - optparser.error('program must be specified') - - test = TestCase( - name = os.path.basename(args[0]), - args = args, - cwd = options.cwd, - build = options.build, - results = options.results, - ) + optparser.error('an argument must be specified') + + if not os.path.exists(options.results): + os.makedirs(options.results) + + test = TestCase() + + if args[0].endswith('.trace'): + test.trace_file = args[0] + else: + test.cmd = args + test.cwd = options.cwd + test.api = options.api test.ref_dump = options.ref_dump + test.results = options.results test.run()