gdb/gdb-testsuite-pagination-re...

416 lines
12 KiB
Diff

http://sourceware.org/ml/gdb-patches/2014-07/msg00553.html
Subject: [testsuite patch] Fix paginate-*.exp race for "read1"
--17pEHd4RhPHOinZp
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Hi Pedro,
these testcase have racy results:
gdb.base/double-prompt-target-event-error.exp
gdb.base/paginate-after-ctrl-c-running.exp
gdb.base/paginate-bg-execution.exp
gdb.base/paginate-execution-startup.exp
gdb.base/paginate-inferior-exit.exp
reproducible with "read1" from:
reproducer for races of expect incomplete reads
http://sourceware.org/bugzilla/show_bug.cgi?id=12649
# Prevent gdb_test_multiple considering an error -re "<return>" match.
# For unknown reason -notransfer -re "<return>" { exp_continue } does not
# prevent it.
Tested on Fedora 20 x86_64 and Fedora Rawhide x86_64 that -notransfer does not
work there:
expect-5.45-10.fc20.x86_64
expect-5.45-16.fc21.x86_64
Sure if someone gets -notransfer working this patch could be dropped.
Jan
--17pEHd4RhPHOinZp
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline; filename=1
gdb/testsuite/
2014-07-22 Jan Kratochvil <jan.kratochvil@redhat.com>
* gdb.base/double-prompt-target-event-error.exp: Use
gdb_test_pagination.
* gdb.base/paginate-after-ctrl-c-running.exp: Likewise.
* gdb.base/paginate-bg-execution.exp: Likewise.
* gdb.base/paginate-execution-startup.exp: Likewise.
* gdb.base/paginate-inferior-exit.exp: Likewise.
* lib/gdb.exp (pagination_prompt): Remove.
(gdb_test_pagination): New.
diff --git a/gdb/testsuite/gdb.base/double-prompt-target-event-error.exp b/gdb/testsuite/gdb.base/double-prompt-target-event-error.exp
index 5571cdf..803e256 100644
--- a/gdb/testsuite/gdb.base/double-prompt-target-event-error.exp
+++ b/gdb/testsuite/gdb.base/double-prompt-target-event-error.exp
@@ -28,7 +28,7 @@ if {[prepare_for_testing "failed to prepare" $testfile $srcfile debug] == -1} {
proc cancel_pagination_in_target_event { command } {
global binfile srcfile
- global gdb_prompt pagination_prompt
+ global gdb_prompt
set testline [gdb_get_line_number "after sleep"]
@@ -60,25 +60,23 @@ proc cancel_pagination_in_target_event { command } {
# Wait for pagination prompt after the "Continuing" line,
# indicating the program was running and then stopped.
+ global saw_continuing
set saw_continuing 0
set test "continue to pagination"
- gdb_test_multiple "$command" $test {
- -re "$pagination_prompt$" {
- if {$saw_continuing} {
- pass $test
- } else {
- send_gdb "\n"
- exp_continue
- }
+ gdb_test_pagination $command $test {
+ global saw_continuing
+ if {$saw_continuing} {
+ pass $test
+ } else {
+ send_gdb "\n"
+ exp_continue
}
+ } {
-re "Continuing" {
+ global saw_continuing
set saw_continuing 1
exp_continue
}
- -notransfer -re "<return>" {
- # Otherwise gdb_test_multiple considers this an error.
- exp_continue
- }
}
# We're now stopped in a pagination query while handling a
@@ -88,15 +86,20 @@ proc cancel_pagination_in_target_event { command } {
send_gdb "\003p 1\n"
set test "no double prompt"
- gdb_test_multiple "" $test {
- -re "$gdb_prompt.*$gdb_prompt.*$gdb_prompt $" {
- fail $test
- }
- -re "$gdb_prompt .* = 1\r\n$gdb_prompt $" {
+ global saw_prompt
+ set saw_prompt 0
+ gdb_test_pagination "" $test {
+ exp_continue
+ } {
+ -re " = 1\r\n$gdb_prompt $" {
pass $test
}
- -notransfer -re "<return>" {
- # Otherwise gdb_test_multiple considers this an error.
+ -re "\r\n$gdb_prompt " {
+ global saw_prompt
+ if { $saw_prompt != 0 } {
+ fail $test
+ }
+ set saw_prompt 1
exp_continue
}
}
diff --git a/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp b/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp
index 0ed8c92..3323fe7 100644
--- a/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp
+++ b/gdb/testsuite/gdb.base/paginate-after-ctrl-c-running.exp
@@ -24,7 +24,6 @@ if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
proc test_ctrlc_while_target_running_paginates {} {
global binfile srcfile
- global gdb_prompt pagination_prompt
set testline [gdb_get_line_number "after sleep"]
@@ -61,19 +60,13 @@ proc test_ctrlc_while_target_running_paginates {} {
# the user can respond to the pagination query.
set test "got prompt"
set saw_pagination_prompt 0
- gdb_test_multiple "" $test {
- -re "$pagination_prompt$" {
- set saw_pagination_prompt 1
- send_gdb "\n"
- exp_continue
- }
+ gdb_test_pagination "" $test {
+ send_gdb "\n"
+ exp_continue
+ } {
-re "$gdb_prompt $" {
gdb_assert $saw_pagination_prompt $test
}
- -notransfer -re "<return>" {
- # Otherwise gdb_test_multiple considers this an error.
- exp_continue
- }
}
# Confirm GDB can still process input.
diff --git a/gdb/testsuite/gdb.base/paginate-bg-execution.exp b/gdb/testsuite/gdb.base/paginate-bg-execution.exp
index dcff8ad..3ba46a3 100644
--- a/gdb/testsuite/gdb.base/paginate-bg-execution.exp
+++ b/gdb/testsuite/gdb.base/paginate-bg-execution.exp
@@ -27,7 +27,6 @@ if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
proc test_bg_execution_pagination_return {} {
global binfile
- global pagination_prompt
with_test_prefix "paginate" {
clean_restart $binfile
@@ -43,21 +42,12 @@ proc test_bg_execution_pagination_return {} {
gdb_test "continue&" "Continuing\."
- set test "pagination handled, breakpoint hit"
- set saw_pagination_prompt 0
- gdb_test_multiple "" $test {
- -re "$pagination_prompt$" {
- set saw_pagination_prompt 1
- send_gdb "\n"
- exp_continue
- }
- -notransfer -re "<return>" {
- # Otherwise gdb_test_multiple considers this an
- # error.
- exp_continue
- }
+ gdb_test_pagination "" "pagination handled, breakpoint hit" {
+ send_gdb "\n"
+ exp_continue
+ } {
-re "after sleep\[^\r\n\]+\r\n$" {
- gdb_assert $saw_pagination_prompt $test
+ gdb_assert { $saw_pagination_prompt == 3 } $test
}
}
@@ -75,7 +65,7 @@ proc test_bg_execution_pagination_return {} {
proc test_bg_execution_pagination_cancel { how } {
global binfile
- global gdb_prompt pagination_prompt
+ global gdb_prompt
with_test_prefix "cancel with $how" {
clean_restart $binfile
@@ -92,14 +82,8 @@ proc test_bg_execution_pagination_cancel { how } {
gdb_test "continue&" "Continuing\."
set test "continue& paginates"
- gdb_test_multiple "" $test {
- -re "$pagination_prompt$" {
- pass $test
- }
- -notransfer -re "<return>" {
- # Otherwise gdb_test_multiple considers this an error.
- exp_continue
- }
+ gdb_test_pagination "" $test {
+ pass $test
}
set test "cancel pagination"
diff --git a/gdb/testsuite/gdb.base/paginate-execution-startup.exp b/gdb/testsuite/gdb.base/paginate-execution-startup.exp
index dc713ec..4dc2376 100644
--- a/gdb/testsuite/gdb.base/paginate-execution-startup.exp
+++ b/gdb/testsuite/gdb.base/paginate-execution-startup.exp
@@ -76,7 +76,6 @@ proc probe_can_run_cmdline {} {
proc test_fg_execution_pagination_return {} {
global file_arg
global saved_gdbflags GDBFLAGS
- global gdb_prompt pagination_prompt
set GDBFLAGS $saved_gdbflags
append GDBFLAGS " -ex \"set height 2\""
@@ -92,10 +91,9 @@ proc test_fg_execution_pagination_return {} {
fail $test
return $res
}
- gdb_test_multiple "" $test {
- -re "$pagination_prompt$" {
- pass $test
- }
+ gdb_test_pagination "" $test {
+ pass $test
+ } {
-re "$gdb_prompt $" {
fail $test
}
@@ -103,20 +101,13 @@ proc test_fg_execution_pagination_return {} {
send_gdb "\n"
- set saw_pagination_prompt 0
set test "send \\n to GDB"
- gdb_test_multiple "" $test {
- -re "$pagination_prompt$" {
- set saw_pagination_prompt 1
- send_gdb "\n"
- exp_continue
- }
- -notransfer -re "<return>" {
- # Otherwise gdb_test_multiple considers this an error.
- exp_continue
- }
+ gdb_test_pagination "" $test {
+ send_gdb "\n"
+ exp_continue
+ } {
-re "$gdb_prompt $" {
- gdb_assert $saw_pagination_prompt $test
+ gdb_assert { $saw_pagination_prompt == 3 } $test
}
}
@@ -133,7 +124,7 @@ proc test_fg_execution_pagination_return {} {
proc test_fg_execution_pagination_cancel { how } {
global file_arg
global saved_gdbflags GDBFLAGS
- global gdb_prompt pagination_prompt
+ global gdb_prompt
set GDBFLAGS $saved_gdbflags
@@ -150,14 +141,8 @@ proc test_fg_execution_pagination_cancel { how } {
fail $test
return $res
}
- gdb_test_multiple "" $test {
- -re "$pagination_prompt$" {
- pass $test
- }
- -notransfer -re "<return>" {
- # Otherwise gdb_test_multiple considers this an error.
- exp_continue
- }
+ gdb_test_pagination "" $test {
+ pass $test
}
set test "cancel pagination"
diff --git a/gdb/testsuite/gdb.base/paginate-inferior-exit.exp b/gdb/testsuite/gdb.base/paginate-inferior-exit.exp
index 0e37be9..d43a245 100644
--- a/gdb/testsuite/gdb.base/paginate-inferior-exit.exp
+++ b/gdb/testsuite/gdb.base/paginate-inferior-exit.exp
@@ -26,7 +26,7 @@ if {[build_executable "failed to prepare" $testfile $srcfile debug] == -1} {
#
proc test_paginate_inferior_exited {} {
global binfile
- global gdb_prompt pagination_prompt
+ global gdb_prompt
global inferior_exited_re
with_test_prefix "paginate" {
@@ -45,23 +45,18 @@ proc test_paginate_inferior_exited {} {
# Wait for the "Starting program" line, indicating the program
# is running.
set saw_starting 0
- gdb_test_multiple "continue" $test {
- -re "$pagination_prompt" {
- if {$saw_starting} {
- pass $test
- } else {
- send_gdb "\n"
- exp_continue
- }
+ gdb_test_pagination "continue" $test {
+ if {$saw_starting} {
+ pass $test
+ } else {
+ send_gdb "\n"
+ exp_continue
}
+ } {
-re "Continuing" {
set saw_starting 1
exp_continue
}
- -notransfer -re "<return>" {
- # Otherwise gdb_test_multiple considers this an error.
- exp_continue
- }
}
# We're now stopped in a pagination output while handling a
diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp
index 7a00efb..d953a50 100644
--- a/gdb/testsuite/lib/gdb.exp
+++ b/gdb/testsuite/lib/gdb.exp
@@ -70,9 +70,6 @@ if ![info exists gdb_prompt] then {
set gdb_prompt "\[(\]gdb\[)\]"
}
-# A regexp that matches the pagination prompt.
-set pagination_prompt "---Type <return> to continue, or q <return> to quit---"
-
# The variable fullname_syntax_POSIX is a regexp which matches a POSIX
# absolute path ie. /foo/
set fullname_syntax_POSIX {/[^\n]*/}
@@ -4846,5 +4843,46 @@ proc capture_command_output { command prefix } {
return $output_string
}
+# Prevent gdb_test_multiple considering an error -re "<return>" match.
+# For unknown reason -notransfer -re "<return>" { exp_continue } does not
+# prevent it.
+
+proc gdb_test_pagination { command test { code_prompt3 {} } { code_append {} } } {
+ global pagination_prompt1 pagination_prompt2 pagination_prompt3
+ global gdb_prompt
+
+ # A regexp that matches the pagination prompt.
+ set pagination_prompt1 "---Type <return"
+ set pagination_prompt2 "> to continue, or q <return"
+ set pagination_prompt3 "> to quit---"
+
+ append code_append {
+ -re "${pagination_prompt1}" {
+ if { $saw_pagination_prompt != 0 && $saw_pagination_prompt != 3 } {
+ fail "$test (1)"
+ }
+ set saw_pagination_prompt 1
+ exp_continue
+ }
+ -re "${pagination_prompt2}" {
+ if { $saw_pagination_prompt != 1 } {
+ fail "$test (2)"
+ }
+ set saw_pagination_prompt 2
+ exp_continue
+ }
+ -re "${pagination_prompt3}$" {
+ if { $saw_pagination_prompt != 2 } {
+ fail "$test (3)"
+ }
+ set saw_pagination_prompt 3
+ eval $code_prompt3
+ }
+ }
+
+ set saw_pagination_prompt 0
+ gdb_test_multiple $command $test $code_append
+}
+
# Always load compatibility stuff.
load_lib future.exp
--17pEHd4RhPHOinZp--