From a5a4c85eca95a31547e94d220c0e1a5ce4adf22d Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 28 Aug 2016 02:05:14 +0300 Subject: [PATCH] Can run tests under gdb. --- mesontest.py | 43 +++++++++++++++++++++++++++++-------------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/mesontest.py b/mesontest.py index b43852a3a..6fda88d6b 100755 --- a/mesontest.py +++ b/mesontest.py @@ -31,6 +31,26 @@ parser.add_argument('--list', default=False, dest='list', action='store_true', help='List available tests.') parser.add_argument('tests', nargs='*') +def gdbrun(test): + child_env = os.environ.copy() + child_env.update(test.env) + # On success will exit cleanly. On failure gdb will ask user + # if they really want to exit. + exe = test.fname + args = test.cmd_args + if len(args) > 0: + argset = ['-ex', 'set args ' + ' '.join(args)] + else: + argset = [] + cmd = ['gdb', '--quiet'] + argset + ['-ex', 'run', '-ex', 'quit'] + exe + # FIXME a ton of stuff. run_single_test grabs stdout & co, + # which we do not want to do when running under gdb. + p = subprocess.Popen(cmd, + env=child_env, + cwd=test.workdir, + ) + p.communicate() + def run(args): datafile = 'meson-private/meson_test_setup.dat' options = parser.parse_args(args) @@ -48,22 +68,17 @@ def run(args): return 0 for t in tests: if t.name in options.tests: - if options.gdb: - # On success will exit cleanly. On failure gdb will ask user - # if they really want to exit. - wrap = ['gdb', '--quiet', '-ex', 'run', '-ex', 'quit'] - # FIXME a ton of stuff. run_single_test grabs stdout & co, - # which we do not want to do when running under gdb. for i in range(options.repeat): print('Running: %s %d/%d' % (t.name, i+1, options.repeat)) - res = meson_test.run_single_test(wrap, t) - if (res.returncode == 0 and res.should_fail) or \ - (res.returncode != 0 and not res.should_fail): - print(res.stdo) - print(res.stde) - print(res.returncode) - print(res.should_fail) - raise RuntimeError('Test failed.') + if options.gdb: + gdbrun(t) + else: + res = meson_test.run_single_test(wrap, t) + if (res.returncode == 0 and res.should_fail) or \ + (res.returncode != 0 and not res.should_fail): + print(res.stdo) + print(res.stde) + raise RuntimeError('Test failed.') if __name__ == '__main__': sys.exit(run(sys.argv[1:]))