| OLD | NEW |
| 1 # Copyright 2003-2004, 2007-2012 Free Software Foundation, Inc. | 1 # Copyright 2003-2013 Free Software Foundation, Inc. |
| 2 | 2 |
| 3 # This program is free software; you can redistribute it and/or modify | 3 # This program is free software; you can redistribute it and/or modify |
| 4 # it under the terms of the GNU General Public License as published by | 4 # it under the terms of the GNU General Public License as published by |
| 5 # the Free Software Foundation; either version 3 of the License, or | 5 # the Free Software Foundation; either version 3 of the License, or |
| 6 # (at your option) any later version. | 6 # (at your option) any later version. |
| 7 # | 7 # |
| 8 # This program is distributed in the hope that it will be useful, | 8 # This program is distributed in the hope that it will be useful, |
| 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 11 # GNU General Public License for more details. | 11 # GNU General Public License for more details. |
| 12 # | 12 # |
| 13 # You should have received a copy of the GNU General Public License | 13 # You should have received a copy of the GNU General Public License |
| 14 # along with this program. If not, see <http://www.gnu.org/licenses/>. | 14 # along with this program. If not, see <http://www.gnu.org/licenses/>. |
| 15 | 15 |
| 16 # This file was written by Joel Brobecker (brobecker@gnat.com), derived | 16 # This file was written by Joel Brobecker (brobecker@gnat.com), derived |
| 17 # from xfullpath.exp. | 17 # from xfullpath.exp. |
| 18 | 18 |
| 19 | 19 load_lib selftest-support.exp |
| 20 # are we on a target board | |
| 21 if { [is_remote target] || ![isnative] } then { | |
| 22 return | |
| 23 } | |
| 24 | |
| 25 proc setup_test { executable } { | |
| 26 global gdb_prompt | |
| 27 global timeout | |
| 28 | |
| 29 # load yourself into the debugger | |
| 30 # This can take a relatively long time, particularly for testing where | |
| 31 # the executable is being accessed over a network, or where gdb does not | |
| 32 # support partial symbols for a particular target and has to load the | |
| 33 # entire symbol table. Set the timeout to 10 minutes, which should be | |
| 34 # adequate for most environments (it *has* timed out with 5 min on a | |
| 35 # SPARCstation SLC under moderate load, so this isn't unreasonable). | |
| 36 # After gdb is started, set the timeout to 30 seconds for the duration | |
| 37 # of this test, and then back to the original value. | |
| 38 | |
| 39 set oldtimeout $timeout | |
| 40 set timeout 600 | |
| 41 verbose "Timeout is now $timeout seconds" 2 | |
| 42 | |
| 43 global gdb_file_cmd_debug_info | |
| 44 set gdb_file_cmd_debug_info "unset" | |
| 45 | |
| 46 set result [gdb_load $executable] | |
| 47 set timeout $oldtimeout | |
| 48 verbose "Timeout is now $timeout seconds" 2 | |
| 49 | |
| 50 if { $result != 0 } then { | |
| 51 » return -1 | |
| 52 } | |
| 53 | |
| 54 if { $gdb_file_cmd_debug_info != "debug" } then { | |
| 55 » untested "No debug information, skipping testcase." | |
| 56 » return -1 | |
| 57 } | |
| 58 | |
| 59 # Set a breakpoint at main | |
| 60 gdb_test "break captured_main" \ | |
| 61 "Breakpoint.*at.* file.*, line.*" \ | |
| 62 "breakpoint in captured_main" | |
| 63 | |
| 64 # run yourself | |
| 65 # It may take a very long time for the inferior gdb to start (lynx), | |
| 66 # so we bump it back up for the duration of this command. | |
| 67 set timeout 600 | |
| 68 | |
| 69 set description "run until breakpoint at captured_main" | |
| 70 gdb_test_multiple "run -nw" "$description" { | |
| 71 -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.* at .*
main.c:.*$gdb_prompt $" { | |
| 72 pass "$description" | |
| 73 } | |
| 74 -re "Starting program.*Breakpoint \[0-9\]+,.*captured_main .data.*$gdb_p
rompt $" { | |
| 75 xfail "$description (line numbers scrambled?)" | |
| 76 } | |
| 77 -re "vfork: No more processes.*$gdb_prompt $" { | |
| 78 fail "$description (out of virtual memory)" | |
| 79 set timeout $oldtimeout | |
| 80 verbose "Timeout is now $timeout seconds" 2 | |
| 81 return -1 | |
| 82 } | |
| 83 -re ".*$gdb_prompt $" { | |
| 84 fail "$description" | |
| 85 set timeout $oldtimeout | |
| 86 verbose "Timeout is now $timeout seconds" 2 | |
| 87 return -1 | |
| 88 } | |
| 89 } | |
| 90 | |
| 91 set timeout $oldtimeout | |
| 92 verbose "Timeout is now $timeout seconds" 2 | |
| 93 | |
| 94 return 0 | |
| 95 } | |
| 96 | 20 |
| 97 proc attach_first_observer { message } { | 21 proc attach_first_observer { message } { |
| 98 gdb_test_no_output "set \$first_obs = observer_attach_test_notification (&ob
server_test_first_notification_function)" \ | 22 gdb_test_no_output "set \$first_obs = observer_attach_test_notification (&ob
server_test_first_notification_function)" \ |
| 99 "$message; attach first observer" | 23 "$message; attach first observer" |
| 100 } | 24 } |
| 101 | 25 |
| 102 proc attach_second_observer { message } { | 26 proc attach_second_observer { message } { |
| 103 gdb_test_no_output "set \$second_obs = observer_attach_test_notification (&o
bserver_test_second_notification_function)" \ | 27 gdb_test_no_output "set \$second_obs = observer_attach_test_notification (&o
bserver_test_second_notification_function)" \ |
| 104 "$message; attach second observer" | 28 "$message; attach second observer" |
| 105 } | 29 } |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 152 } | 76 } |
| 153 reset_counters $message | 77 reset_counters $message |
| 154 # Call observer_notify_test_notification. Note that this procedure | 78 # Call observer_notify_test_notification. Note that this procedure |
| 155 # takes one argument, but this argument is ignored by the observer | 79 # takes one argument, but this argument is ignored by the observer |
| 156 # callbacks we have installed. So we just pass an arbitrary value. | 80 # callbacks we have installed. So we just pass an arbitrary value. |
| 157 gdb_test_no_output "call observer_notify_test_notification (0)" \ | 81 gdb_test_no_output "call observer_notify_test_notification (0)" \ |
| 158 "$message; sending notification" | 82 "$message; sending notification" |
| 159 check_counters $first $second $third $message | 83 check_counters $first $second $third $message |
| 160 } | 84 } |
| 161 | 85 |
| 162 proc test_observer { executable } { | 86 proc test_observer {} { |
| 163 | |
| 164 set setup_result [setup_test $executable] | |
| 165 if {$setup_result <0} then { | |
| 166 return -1 | |
| 167 } | |
| 168 | |
| 169 # First, try sending a notification without any observer attached. | 87 # First, try sending a notification without any observer attached. |
| 170 test_notifications 0 0 0 "no observer attached" | 88 test_notifications 0 0 0 "no observer attached" |
| 171 | 89 |
| 172 # Now, attach one observer, and send a notification. | 90 # Now, attach one observer, and send a notification. |
| 173 test_notifications 0 1 0 "second observer attached" \ | 91 test_notifications 0 1 0 "second observer attached" \ |
| 174 attach_second_observer | 92 attach_second_observer |
| 175 | 93 |
| 176 # Remove the observer, and send a notification. | 94 # Remove the observer, and send a notification. |
| 177 test_notifications 0 0 0 "second observer detached" \ | 95 test_notifications 0 0 0 "second observer detached" \ |
| 178 detach_second_observer | 96 detach_second_observer |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 test_notifications 1 0 0 "second observer removed" \ | 133 test_notifications 1 0 0 "second observer removed" \ |
| 216 detach_second_observer | 134 detach_second_observer |
| 217 | 135 |
| 218 # Remove the first observer, no more observers. | 136 # Remove the first observer, no more observers. |
| 219 test_notifications 0 0 0 "first observer removed" \ | 137 test_notifications 0 0 0 "first observer removed" \ |
| 220 detach_first_observer | 138 detach_first_observer |
| 221 | 139 |
| 222 return 0 | 140 return 0 |
| 223 } | 141 } |
| 224 | 142 |
| 225 # Find a pathname to a file that we would execute if the shell was asked | 143 do_self_tests captured_main test_observer |
| 226 # to run $arg using the current PATH. | |
| 227 | |
| 228 proc find_gdb { arg } { | |
| 229 | |
| 230 # If the arg directly specifies an existing executable file, then | |
| 231 # simply use it. | |
| 232 | |
| 233 if [file executable $arg] then { | |
| 234 » return $arg | |
| 235 } | |
| 236 | |
| 237 set result [which $arg] | |
| 238 if [string match "/" [ string range $result 0 0 ]] then { | |
| 239 » return $result | |
| 240 } | |
| 241 | |
| 242 # If everything fails, just return the unqualified pathname as default | |
| 243 # and hope for best. | |
| 244 | |
| 245 return $arg | |
| 246 } | |
| 247 | |
| 248 # Run the test with self. | |
| 249 # Copy the file executable file in case this OS doesn't like to edit its own | |
| 250 # text space. | |
| 251 | |
| 252 set GDB_FULLPATH [find_gdb $GDB] | |
| 253 | |
| 254 # Remove any old copy lying around. | |
| 255 remote_file host delete x$tool | |
| 256 | |
| 257 gdb_start | |
| 258 set file [remote_download host $GDB_FULLPATH x$tool] | |
| 259 set result [test_observer $file]; | |
| 260 gdb_exit; | |
| 261 catch "remote_file host delete $file"; | |
| 262 | |
| 263 if {$result <0} then { | |
| 264 warning "Couldn't test self" | |
| 265 return -1 | |
| 266 } | |
| OLD | NEW |