From 2f3ac1ea76c5405d18ea5214ae4c795648dc47de Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 2 Sep 2015 23:12:14 +0200 Subject: test_gdb: fix regex to parse gdb version for SUSE Linux Entreprise Mention also the detected GDB version on verbose mode and on error (if the major version is smaller than 7). --- Lib/test/test_gdb.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index c57875c..9884f19 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -28,12 +28,19 @@ except OSError: # This is what "no gdb" looks like. There may, however, be other # errors that manifest this way too. raise unittest.SkipTest("Couldn't find gdb on the path") -gdb_version_number = re.search(b"^GNU gdb [^\d]*(\d+)\.(\d)", gdb_version) +# Regex to parse: +# 'GNU gdb (GDB; SUSE Linux Enterprise 12) 7.7\n' -> 7.7 +# 'GNU gdb (GDB) Fedora 7.9.1-17.fc22\n' -> 7.9 +gdb_version_number = re.search(b"^GNU gdb .*? (\d+)\.(\d)", gdb_version) +if not gdb_version_number: + raise Exception("unable to parse GDB version: %a" % gdb_version) gdb_major_version = int(gdb_version_number.group(1)) gdb_minor_version = int(gdb_version_number.group(2)) if gdb_major_version < 7: - raise unittest.SkipTest("gdb versions before 7.0 didn't support python embedding" - " Saw:\n" + gdb_version.decode('ascii', 'replace')) + raise unittest.SkipTest("gdb versions before 7.0 didn't support python " + "embedding. Saw %s.%s:\n%s" + % (gdb_major_version, gdb_minor_version, + gdb_version.decode('ascii', 'replace'))) if not sysconfig.is_python_build(): raise unittest.SkipTest("test_gdb only works on source builds at the moment.") @@ -878,7 +885,7 @@ class PyLocalsTests(DebuggerTests): def test_main(): if support.verbose: - print("GDB version:") + print("GDB version %s.%s:" % (gdb_major_version, gdb_minor_version)) for line in os.fsdecode(gdb_version).splitlines(): print(" " * 4 + line) run_unittest(PrettyPrintTests, -- cgit v0.12 From 5b6b4a8c344cb70dca67109989f430733c74cfce Mon Sep 17 00:00:00 2001 From: Victor Stinner Date: Wed, 2 Sep 2015 23:19:55 +0200 Subject: test_gdb: use subprocess.Popen context manager to fix ResourceWarning warnings when the test is interrupted (or fail). --- Lib/test/test_gdb.py | 49 +++++++++++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/Lib/test/test_gdb.py b/Lib/test/test_gdb.py index 9884f19..664d08c 100644 --- a/Lib/test/test_gdb.py +++ b/Lib/test/test_gdb.py @@ -21,26 +21,32 @@ except ImportError: from test import support from test.support import run_unittest, findfile, python_is_optimized -try: - gdb_version, _ = subprocess.Popen(["gdb", "-nx", "--version"], - stdout=subprocess.PIPE).communicate() -except OSError: - # This is what "no gdb" looks like. There may, however, be other - # errors that manifest this way too. - raise unittest.SkipTest("Couldn't find gdb on the path") -# Regex to parse: -# 'GNU gdb (GDB; SUSE Linux Enterprise 12) 7.7\n' -> 7.7 -# 'GNU gdb (GDB) Fedora 7.9.1-17.fc22\n' -> 7.9 -gdb_version_number = re.search(b"^GNU gdb .*? (\d+)\.(\d)", gdb_version) -if not gdb_version_number: - raise Exception("unable to parse GDB version: %a" % gdb_version) -gdb_major_version = int(gdb_version_number.group(1)) -gdb_minor_version = int(gdb_version_number.group(2)) +def get_gdb_version(): + try: + proc = subprocess.Popen(["gdb", "-nx", "--version"], + stdout=subprocess.PIPE, + universal_newlines=True) + with proc: + version = proc.communicate()[0] + except OSError: + # This is what "no gdb" looks like. There may, however, be other + # errors that manifest this way too. + raise unittest.SkipTest("Couldn't find gdb on the path") + + # Regex to parse: + # 'GNU gdb (GDB; SUSE Linux Enterprise 12) 7.7\n' -> 7.7 + # 'GNU gdb (GDB) Fedora 7.9.1-17.fc22\n' -> 7.9 + match = re.search("^GNU gdb .*? (\d+)\.(\d)", version) + if match is None: + raise Exception("unable to parse GDB version: %r" % version) + return (version, int(match.group(1)), int(match.group(2))) + +gdb_version, gdb_major_version, gdb_minor_version = get_gdb_version() if gdb_major_version < 7: raise unittest.SkipTest("gdb versions before 7.0 didn't support python " "embedding. Saw %s.%s:\n%s" % (gdb_major_version, gdb_minor_version, - gdb_version.decode('ascii', 'replace'))) + gdb_version)) if not sysconfig.is_python_build(): raise unittest.SkipTest("test_gdb only works on source builds at the moment.") @@ -66,9 +72,12 @@ def run_gdb(*args, **env_vars): base_cmd = ('gdb', '--batch', '-nx') if (gdb_major_version, gdb_minor_version) >= (7, 4): base_cmd += ('-iex', 'add-auto-load-safe-path ' + checkout_hook_path) - out, err = subprocess.Popen(base_cmd + args, - stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=env, - ).communicate() + proc = subprocess.Popen(base_cmd + args, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=env) + with proc: + out, err = proc.communicate() return out.decode('utf-8', 'replace'), err.decode('utf-8', 'replace') # Verify that "gdb" was built with the embedded python support enabled: @@ -886,7 +895,7 @@ class PyLocalsTests(DebuggerTests): def test_main(): if support.verbose: print("GDB version %s.%s:" % (gdb_major_version, gdb_minor_version)) - for line in os.fsdecode(gdb_version).splitlines(): + for line in gdb_version.splitlines(): print(" " * 4 + line) run_unittest(PrettyPrintTests, PyListTests, -- cgit v0.12