# Copyright (C) 2011 Free Software Foundation, Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

set testfile save-bp
set srcfile ${testfile}.c

if { [prepare_for_testing ${testfile}.exp ${testfile}] } {
    return -1
}

if ![runto_main] {
    untested ${testfile}.exp
    return -1
}
# Delete all breakpoints so that the "runto_main" breakpoint above
# does not interfere with our testing.
delete_breakpoints

# Insert a bunch of breakpoints... The goal is to create breakpoints
# that we are going to try to save in a file and then reload.  So
# try to create a good variety of them.
gdb_breakpoint "break_me"

set loc_bp2 [gdb_get_line_number "BREAK HERE"]
gdb_breakpoint ${srcfile}:${loc_bp2}

set loc_bp3 [gdb_get_line_number "thread-specific"]
gdb_breakpoint "${srcfile}:${loc_bp3} thread 1"

set loc_bp4 [gdb_get_line_number "condition"]
gdb_breakpoint "${srcfile}:${loc_bp4} if i == 1"

set loc_bp5 [gdb_get_line_number "with commands"]
gdb_breakpoint ${srcfile}:${loc_bp5}
gdb_test "commands\nsilent\nend" "End with.*" "add breakpoint commands"

# Now, save the breakpoints into a file...
remote_file host delete "bps"
gdb_test "save breakpoint bps"

# Now start a new debugger session...
clean_restart $testfile
if ![runto_main] {
    fail "cannot restart program"
    return -1
}
# Delete all breakpoints so that the "runto_main" breakpoint above
# does not interfere with our testing.
delete_breakpoints

# ... and restore the breakpoints.
gdb_test "source bps"

# Now, verify that all breakpoints have been created correctly...
set bp_row_start "\[0-9\]+ +breakpoint +keep +y +0x\[0-9a-f\]+ +in"
gdb_test "info break" \
  " *Num +Type +Disp +Enb +Address +What\r\n$bp_row_start break_me at .*$srcfile:\[0-9\]+\r\n$bp_row_start main at .*$srcfile:$loc_bp2\r\n$bp_row_start main at .*$srcfile:$loc_bp3 +thread 1\r\n\[ \t]+stop only in thread 1\r\n$bp_row_start main at .*$srcfile:$loc_bp4\r\n\[ \t\]+stop only if i == 1\r\n$bp_row_start main at .*$srcfile:$loc_bp5\r\n\[ \t\]+silent"
