Re: [rfa][testsuite] Consolidade Python test functions in lib/gdb.exp.

Thiago Jung Bauermann
2009-05-18T04:38:14Z

Hi,

Sorry about taking so long to get back to this patch.

El lun, 20-04-2009 a las 11:13 -0600, Tom Tromey escribiÃ³:
> >>>>> "Thiago" == Thiago Jung Bauermann <bauerman@br.ibm.com> writes:
> Thiago> This is a cleanup on the testcases in gdb.python. Currently,
> Thiago> they define the same test functions in each .exp. I put them
> Thiago> in lib/gdb.exp instead.
>
> It looks like the GDB style is to put specific support functions into
> a new file, e.g., "mi-support.exp". So perhaps we should add
> "python-support.exp"... WDYT?

Reasonable. Done.

> Thiago> +# Return 1 if Python scripting is supported in GDB, 0 if not.
> Thiago> +proc python_supported { } {
> Thiago> + global gdb_prompt
>
> I think this proc should do the test only once per runtest invocation,
> and just return a cached result in subsequent calls.

Good idea. Done.

I also reordered calling of python_supported in the testcases to avoid
needlessly compiling test binaries when Python is not supported.

Ok to commit?
--
[]'s
Thiago Jung Bauermann
IBM Linux Technology Center

gdb/testsuite/
* lib/python-support.exp: New file.
* lib/gdb.exp: Load python-support.exp.
* gdb.python/python-cmd.exp: Use Python test functions from
lib/python-support.exp instead of defining its own functions.
* gdb.python/python-frame.exp: Likewise.
* gdb.python/python-function.exp: Likewise.
* gdb.python/python-value.exp: Likewise.
* gdb.python/python.exp: Likewise.

Index: gdb.git/gdb/testsuite/gdb.python/python-cmd.exp
===================================================================
--- gdb.git.orig/gdb/testsuite/gdb.python/python-cmd.exp 2009-05-18 01:22:45.000000000 -0300
+++ gdb.git/gdb/testsuite/gdb.python/python-cmd.exp 2009-05-18 01:22:47.000000000 -0300
@@ -20,36 +20,15 @@ if $tracelevel then {
strace $tracelevel
}

-# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}...
-# Run a test named NAME, consisting of multiple lines of input.
-# After each input line INPUT, search for result line RESULT.
-# Succeed if all results are seen; fail otherwise.
-proc gdb_py_test_multiple {name args} {
- global gdb_prompt
- foreach {input result} $args {
- if {[gdb_test_multiple $input "$name - $input" {
- -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" {
- pass "$name - $input"
- }
- }]} {
- return 1
- }
- }
- return 0
-}
-
# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

-gdb_test_multiple "python print 'hello, world!'" "verify python support" {
- -re "not supported.*$gdb_prompt $" {
- unsupported "python support is disabled"
- return -1
- }
- -re "$gdb_prompt $" {}
+if ![python_supported] then {
+ unsupported "python support is disabled"
+ return -1
}

# Test a simple command.
Index: gdb.git/gdb/testsuite/gdb.python/python-frame.exp
===================================================================
--- gdb.git.orig/gdb/testsuite/gdb.python/python-frame.exp 2009-05-18 01:22:45.000000000 -0300
+++ gdb.git/gdb/testsuite/gdb.python/python-frame.exp 2009-05-18 01:23:23.000000000 -0300
@@ -20,40 +20,28 @@ if $tracelevel then {
strace $tracelevel
}

+# Start with a fresh gdb.
+
+gdb_exit
+gdb_start
+gdb_reinitialize_dir $srcdir/$subdir
+
+if ![python_supported] then {
+ unsupported "python support is disabled"
+ return -1
+}
+
set testfile "python-frame"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}
+
if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
untested "Couldn't compile ${srcfile}"
return -1
}

-# Run a command in GDB, and report a failure if a Python exception is thrown.
-# If report_pass is true, report a pass if no exception is thrown.
-proc gdb_py_test_silent_cmd {cmd name report_pass} {
- global gdb_prompt
-
- gdb_test_multiple $cmd $name {
- -re "Traceback.*$gdb_prompt $" { fail $name }
- -re "$gdb_prompt $" { if $report_pass { pass $name } }
- }
-}
-
-# Start with a fresh gdb.
-
-gdb_exit
-gdb_start
-gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

-gdb_test_multiple "python print 'hello, world!'" "verify python support" {
- -re "not supported.*$gdb_prompt $" {
- unsupported "python support is disabled"
- return -1
- }
- -re "$gdb_prompt $" {}
-}
-
# The following tests require execution.

if ![runto_main] then {
Index: gdb.git/gdb/testsuite/gdb.python/python-function.exp
===================================================================
--- gdb.git.orig/gdb/testsuite/gdb.python/python-function.exp 2009-05-18 01:22:45.000000000 -0300
+++ gdb.git/gdb/testsuite/gdb.python/python-function.exp 2009-05-18 01:22:47.000000000 -0300
@@ -20,36 +20,15 @@ if $tracelevel then {
strace $tracelevel
}

-# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}...
-# Run a test named NAME, consisting of multiple lines of input.
-# After each input line INPUT, search for result line RESULT.
-# Succeed if all results are seen; fail otherwise.
-proc gdb_py_test_multiple {name args} {
- global gdb_prompt
- foreach {input result} $args {
- if {[gdb_test_multiple $input "$name - $input" {
- -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" {
- pass "$name - $input"
- }
- }]} {
- return 1
- }
- }
- return 0
-}
-
# Start with a fresh gdb.

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

-gdb_test_multiple "python print 'hello, world!'" "verify python support" {
- -re "not supported.*$gdb_prompt $" {
- unsupported "python support is disabled"
- return -1
- }
- -re "$gdb_prompt $" {}
+if ![python_supported] then {
+ unsupported "python support is disabled"
+ return -1
}

gdb_py_test_multiple "input convenience function" \
Index: gdb.git/gdb/testsuite/gdb.python/python-value.exp
===================================================================
--- gdb.git.orig/gdb/testsuite/gdb.python/python-value.exp 2009-05-18 01:22:45.000000000 -0300
+++ gdb.git/gdb/testsuite/gdb.python/python-value.exp 2009-05-18 01:23:23.000000000 -0300
@@ -20,43 +20,6 @@ if $tracelevel then {
strace $tracelevel
}

-set testfile "python-value"
-set srcfile ${testfile}.c
-set binfile ${objdir}/${subdir}/${testfile}
-if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
- untested "Couldn't compile ${srcfile}"
- return -1
-}
-
-# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}...
-# Run a test named NAME, consisting of multiple lines of input.
-# After each input line INPUT, search for result line RESULT.
-# Succeed if all results are seen; fail otherwise.
-proc gdb_py_test_multiple {name args} {
- global gdb_prompt
- foreach {input result} $args {
- if {[gdb_test_multiple $input "$name - $input" {
- -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" {
- pass "$name - $input"
- }
- }]} {
- return 1
- }
- }
- return 0
-}
-
-# Run a command in GDB, and report a failure if a Python exception is thrown.
-# If report_pass is true, report a pass if no exception is thrown.
-proc gdb_py_test_silent_cmd {cmd name report_pass} {
- global gdb_prompt
-
- gdb_test_multiple $cmd $name {
- -re "Traceback.*$gdb_prompt $" { fail $name }
- -re "$gdb_prompt $" { if $report_pass { pass $name } }
- }
-}
-
proc test_value_creation {} {
global gdb_prompt

@@ -242,16 +205,23 @@ proc test_value_in_inferior {} {
gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
-gdb_load ${binfile}

-gdb_test_multiple "python print 'hello, world!'" "verify python support" {
- -re "not supported.*$gdb_prompt $" {
- unsupported "python support is disabled"
- return -1
- }
- -re "$gdb_prompt $" {}
+if ![python_supported] then {
+ unsupported "python support is disabled"
+ return -1
+}
+
+set testfile "python-value"
+set srcfile ${testfile}.c
+set binfile ${objdir}/${subdir}/${testfile}
+
+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
+ untested "Couldn't compile ${srcfile}"
+ return -1
}

+gdb_load ${binfile}
+
test_value_creation
test_value_numeric_ops
test_value_boolean
Index: gdb.git/gdb/testsuite/lib/gdb.exp
===================================================================
--- gdb.git.orig/gdb/testsuite/lib/gdb.exp 2009-05-18 01:22:45.000000000 -0300
+++ gdb.git/gdb/testsuite/lib/gdb.exp 2009-05-18 01:22:47.000000000 -0300
@@ -27,6 +27,7 @@ if {$tool == ""} {
}

load_lib libgloss.exp
+load_lib python-support.exp

global GDB

@@ -2946,4 +2947,3 @@ proc get_hexadecimal_valueof { exp defau
proc get_sizeof { type default } {
return [get_integer_valueof "sizeof (${type})" $default]
}
-
Index: gdb.git/gdb/testsuite/gdb.python/python.exp
===================================================================
--- gdb.git.orig/gdb/testsuite/gdb.python/python.exp 2009-05-18 01:22:45.000000000 -0300
+++ gdb.git/gdb/testsuite/gdb.python/python.exp 2009-05-18 01:22:47.000000000 -0300
@@ -26,30 +26,9 @@ gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir

-gdb_test_multiple "python print 23" "verify python support" {
- -re "not supported.*$gdb_prompt $" {
- unsupported "python support is disabled"
- return -1
- }
- -re "$gdb_prompt $" {}
-}
-
-# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}...
-# Run a test named NAME, consisting of multiple lines of input.
-# After each input line INPUT, search for result line RESULT.
-# Succeed if all results are seen; fail otherwise.
-proc gdb_py_test_multiple {name args} {
- global gdb_prompt
- foreach {input result} $args {
- if {[gdb_test_multiple $input "$name - $input" {
- -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" {
- pass "$name - $input"
- }
- }]} {
- return 1
- }
- }
- return 0
+if ![python_supported] then {
+ unsupported "python support is disabled"
+ return -1
}

gdb_py_test_multiple "multi-line python command" \
Index: gdb.git/gdb/testsuite/lib/python-support.exp
===================================================================
--- /dev/null 1970-01-01 00:00:00.000000000 +0000
+++ gdb.git/gdb/testsuite/lib/python-support.exp 2009-05-18 01:29:07.000000000 -0300
@@ -0,0 +1,53 @@
+global python_supported_saved
+
+# Return 1 if Python scripting is supported in GDB, 0 if not.
+proc python_supported { } {
+ global gdb_prompt
+ global python_supported_saved
+
+ if [info exists python_supported_saved] {
+ verbose "python_supported: returning saved $python_supported_saved" 2
+ return $python_supported_saved
+ }
+
+ gdb_test_multiple "python print 'hello, world!'" "verify python support" {
+ -re "not supported.*$gdb_prompt $" {
+ return [set python_supported_saved 0]
+ }
+ -re "$gdb_prompt $" {
+ return [set python_supported_saved 1]
+ }
+ }
+
+ return [set python_supported_saved 0]
+}
+
+# Run a command in GDB, and report a failure if a Python exception is thrown.
+# If report_pass is true, report a pass if no exception is thrown.
+proc gdb_py_test_silent_cmd {cmd name report_pass} {
+ global gdb_prompt
+
+ gdb_test_multiple $cmd $name {
+ -re "Traceback.*$gdb_prompt $" { fail $name }
+ -re "$gdb_prompt $" { if $report_pass { pass $name } }
+ }
+}
+
+# Usage: gdb_py_test_multiple NAME INPUT RESULT {INPUT RESULT}...
+# Run a test named NAME, consisting of multiple lines of input.
+# After each input line INPUT, search for result line RESULT.
+# Succeed if all results are seen; fail otherwise.
+proc gdb_py_test_multiple {name args} {
+ global gdb_prompt
+
+ foreach {input result} $args {
+ if {[gdb_test_multiple $input "$name - $input" {
+ -re "\[\r\n\]*($result)\[\r\n\]+($gdb_prompt | *>)$" {
+ pass "$name - $input"
+ }
+ }]} {
+ return 1
+ }
+ }
+ return 0
+}