#   Copyright 1997, 1999, 2007, 2008, 2009, 2010
#   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/>.

if { [is_remote target] || ![isnative] } then {
    continue
}


global srcfile
set testfile "foll-fork"
set srcfile ${testfile}.c
set binfile ${objdir}/${subdir}/${testfile}

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     untested foll-fork.exp
     return -1
}



# Until "set follow-fork-mode" and "catch fork" are implemented on
# other targets...
#
if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then {
    continue
}

proc check_fork_catchpoints {} {
  global gdb_prompt

  # Verify that the system supports "catch fork".
  gdb_test "catch fork" "Catchpoint \[0-9\]* \\(fork\\)" "insert first fork catchpoint"
  set has_fork_catchpoints 0
  gdb_test_multiple "continue" "continue to first fork catchpoint" {
    -re ".*Your system does not support fork catchpoints.*$gdb_prompt $" {
      unsupported "continue to first fork catchpoint"
    }
    -re ".*Catchpoint.*$gdb_prompt $" {
      set has_fork_catchpoints 1
      pass "continue to first fork catchpoint"
    }
  }

  if {$has_fork_catchpoints == 0} {
    unsupported "fork catchpoints"
    return -code return
  }
}

proc default_fork_parent_follow {} {
    global gdb_prompt

    gdb_test "show follow-fork" \
	"Debugger response to a program call of fork or vfork is \"parent\".*" \
	"default show parent follow, no catchpoints"

    gdb_test "next 2" \
	"Detaching after fork from.*" \
	"default parent follow, no catchpoints"

    # The child has been detached; allow time for any output it might
    # generate to arrive, so that output doesn't get confused with
    # any expected debugger output from a subsequent testpoint.
    #
    exec sleep 1
}

proc explicit_fork_parent_follow {} {
    global gdb_prompt

    gdb_test_no_output "set follow-fork parent"

    gdb_test "show follow-fork" \
	"Debugger response to a program call of fork or vfork is \"parent\"." \
	"explicit show parent follow, no catchpoints"

    gdb_test "next 2" "Detaching after fork from.*" \
	"explicit parent follow, no catchpoints"

    # The child has been detached; allow time for any output it might
    # generate to arrive, so that output doesn't get confused with
    # any expected debugger output from a subsequent testpoint.
    #
    exec sleep 1
}

proc explicit_fork_child_follow {} {
    global gdb_prompt

    gdb_test_no_output "set follow-fork child"

    gdb_test "show follow-fork" \
	"Debugger response to a program call of fork or vfork is \"child\"." \
	"explicit show child follow, no catchpoints"

    gdb_test "next 2" "Attaching after.* fork to.*" \
	"explicit child follow, no catchpoints"

    # The child has been detached; allow time for any output it might
    # generate to arrive, so that output doesn't get confused with
    # any gdb_expected debugger output from a subsequent testpoint.
    #
    exec sleep 1
}

proc catch_fork_child_follow {} {
    global gdb_prompt
    global srcfile

    set bp_after_fork [gdb_get_line_number "set breakpoint here"]

    gdb_test "catch fork" "Catchpoint \[0-9\]* \\(fork\\)" \
	"explicit child follow, set catch fork"

    # Verify that the catchpoint is mentioned in an "info breakpoints",
    # and further that the catchpoint mentions no process id.
    #
    set test_name "info shows catchpoint without pid"
    gdb_test_multiple "info breakpoints" "$test_name" {
	-re ".*catchpoint.*keep y.*fork\[\r\n\]+$gdb_prompt $" {
	    pass "$test_name"
	}
    }

    gdb_test "continue" \
	"Catchpoint \[0-9\]* \\(forked process \[0-9\]*\\),.*" \
	"explicit child follow, catch fork"

    # Verify that the catchpoint is mentioned in an "info breakpoints",
    # and further that the catchpoint managed to capture a process id.
    #
    set test_name "info shows catchpoint without pid"
    gdb_test_multiple "info breakpoints" "$test_name" {
	-re ".*catchpoint.*keep y.*fork, process.*$gdb_prompt $" {
	    pass "$test_name"
	}
    }

    gdb_test_no_output "set follow-fork child"

    gdb_test "tbreak ${srcfile}:$bp_after_fork" \
	"Temporary breakpoint.*, line $bp_after_fork.*" \
	"set follow-fork child, tbreak"

    gdb_test "continue" \
	"Attaching after.* fork to.* at .*$bp_after_fork.*" \
	"set follow-fork child, hit tbreak"

    # The parent has been detached; allow time for any output it might
    # generate to arrive, so that output doesn't get confused with
    # any expected debugger output from a subsequent testpoint.
    #
    exec sleep 1

    gdb_test "delete breakpoints" \
	"" \
	"set follow-fork child, cleanup" \
	"Delete all breakpoints.*$" \
	"y"
}

proc catch_fork_unpatch_child {} {
    global gdb_prompt
    global srcfile

    set bp_exit [gdb_get_line_number "at exit"]

    gdb_test "break callee" "file .*$srcfile, line .*" \
	"unpatch child, break at callee"
    gdb_test "catch fork" "Catchpoint \[0-9\]* \\(fork\\)" \
	"unpatch child, set catch fork"

    gdb_test "continue" \
	"Catchpoint \[0-9\]* \\(forked process \[0-9\]*\\),.*" \
	"unpatch child, catch fork"

    # Delete all breakpoints and catchpoints.
    delete_breakpoints

    # Force $srcfile as the current GDB source can be in glibc sourcetree.
    gdb_test "break $srcfile:$bp_exit" \
	"Breakpoint .*file .*$srcfile, line .*" \
	"unpatch child, breakpoint at exit call"

    gdb_test_no_output "set follow-fork child" \
	"unpatch child, set follow-fork child"

    set test "unpatch child, unpatched parent breakpoints from child"
    gdb_test_multiple "continue" $test {
	-re "at exit.*$gdb_prompt $" {
	    pass "$test"
	}
	-re "SIGTRAP.*$gdb_prompt $" {
	    fail "$test"

	    # Explicitly kill this child, so we can continue gracefully
	    # with further testing...
	    send_gdb "kill\n"
	    gdb_expect {
		-re ".*Kill the program being debugged.*y or n. $" {
		    send_gdb "y\n"
		    gdb_expect -re "$gdb_prompt $" {}
		}
	    }
	}
    }
}

proc tcatch_fork_parent_follow {} {
    global gdb_prompt
    global srcfile

    set bp_after_fork [gdb_get_line_number "set breakpoint here"]

    gdb_test "catch fork" "Catchpoint \[0-9\]* \\(fork\\)" \
	"explicit parent follow, set tcatch fork"

# ??rehrauer: I don't yet know how to get the id of the tcatch
# via this script, so that I can add a -do list to it.  For now,
# do the follow stuff after the catch happens.

    gdb_test "continue" \
	"Catchpoint \[0-9\]* \\(forked process \[0-9\]*\\),.*" \
	"explicit parent follow, tcatch fork"

    gdb_test_no_output "set follow-fork parent"

    gdb_test "tbreak ${srcfile}:$bp_after_fork" \
	"Temporary breakpoint.*, line $bp_after_fork.*" \
	"set follow-fork parent, tbreak"

    gdb_test "continue" \
	"Detaching after fork from.* at .*$bp_after_fork.*" \
	"set follow-fork parent, hit tbreak"

    # The child has been detached; allow time for any output it might
    # generate to arrive, so that output doesn't get confused with
    # any expected debugger output from a subsequent testpoint.
    #
    exec sleep 1

    gdb_test "delete breakpoints" \
	"" \
	"set follow-fork parent, cleanup" \
	"Delete all breakpoints.*$" \
	"y"
}

proc do_fork_tests {} {
    global gdb_prompt

    # Verify that help is available for "set follow-fork-mode".
    #
    gdb_test "help set follow-fork-mode" \
	"Set debugger response to a program call of fork or vfork..*
A fork or vfork creates a new process.  follow-fork-mode can be:.*
.*parent  - the original process is debugged after a fork.*
.*child   - the new process is debugged after a fork.*
The unfollowed process will continue to run..*
By default, the debugger will follow the parent process..*" \
	"help set follow-fork"

    # Verify that we can set follow-fork-mode, using an abbreviation
    # for both the flag and its value.
    #
    gdb_test_no_output "set follow-fork ch"

    gdb_test "show follow-fork" \
	"Debugger response to a program call of fork or vfork is \"child\".*" \
	"set follow-fork, using abbreviations"

    # Verify that we cannot set follow-fork-mode to nonsense.
    #
    gdb_test "set follow-fork chork" "Undefined item: \"chork\".*" \
	"set follow-fork to nonsense is prohibited"

    gdb_test_no_output "set follow-fork parent" "reset parent"

    # Check that fork catchpoints are supported, as an indicator for whether
    # fork-following is supported.
    if [runto_main] then { check_fork_catchpoints }

    # Test the default behaviour, which is to follow the parent of a
    # fork, and detach from the child.  Do this without catchpoints.
    #
    if [runto_main] then { default_fork_parent_follow }

    # Test the ability to explicitly follow the parent of a fork, and
    # detach from the child.  Do this without catchpoints.
    #
    if [runto_main] then { explicit_fork_parent_follow }

    # Test the ability to follow the child of a fork, and detach from
    # the parent.  Do this without catchpoints.
    #
    if [runto_main] then { explicit_fork_child_follow }

    # Test the ability to follow both child and parent of a fork.  Do
    # this without catchpoints.
    # ??rehrauer: NYI.  Will add testpoints here when implemented.
    #

    # Test the ability to have the debugger ask the user at fork-time
    # whether to follow the parent, child or both.  Do this without
    # catchpoints.
    # ??rehrauer: NYI.  Will add testpoints here when implemented.
    #

    # Test the ability to catch a fork, specify that the child be
    # followed, and continue.  Make the catchpoint permanent.
    #
    if [runto_main] then { catch_fork_child_follow }

    # Test that parent breakpoints are successfully detached from the
    # child at fork time, even if the user removes them from the
    # breakpoints list after stopping at a fork catchpoint.
    if [runto_main] then { catch_fork_unpatch_child }

    # Test the ability to catch a fork, specify via a -do clause that
    # the parent be followed, and continue.  Make the catchpoint temporary.
    #
    if [runto_main] then { tcatch_fork_parent_follow }
}

# Start with a fresh gdb

gdb_exit
gdb_start
gdb_reinitialize_dir $srcdir/$subdir
gdb_load ${binfile}

# The "Detaching..." and "Attaching..." messages may be hidden by
# default.
gdb_test_no_output "set verbose"

# This is a test of gdb's ability to follow the parent, child or both
# parent and child of a Unix fork() system call.
#
do_fork_tests

return 0
