#   Copyright (C) 1997 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 2 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */

# Please email any bugs, comments, and/or additions to this file to:
# bug-gdb@prep.ai.mit.edu

if $tracelevel then {
	strace $tracelevel
	}

set prms_id 0
set bug_id 0

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

if  { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } {
     gdb_suppress_entire_file "Testcase compile failed, so all tests in this file will automatically fail."
}



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

proc default_fork_parent_follow {} {
   global gdb_prompt

   send_gdb "show follow\n"
   gdb_expect {
      -re "Debugger response to a program call of fork or vfork is \"parent\"..*$gdb_prompt $"\
                      {pass "default show parent follow, no catchpoints"}
      -re "$gdb_prompt $" {fail "default show parent follow, no catchpoints"}
      timeout         {fail "(timeout) default show parent follow, no catchpoints"}
   }
   send_gdb "next 2\n"
   gdb_expect {
      -re "Detaching after fork from.*$gdb_prompt $"\
                      {pass "default parent follow, no catchpoints"}
      -re "$gdb_prompt $" {fail "default parent follow, no catchpoints"}
      timeout         {fail "(timeout) 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

   send_gdb "set follow parent\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow parent"}
      timeout         {fail "(timeout) set follow parent"}
   }
   send_gdb "show follow\n"
   gdb_expect {
      -re "Debugger response to a program call of fork or vfork is \"parent\"..*$gdb_prompt $"\
                      {pass "explicit show parent follow, no catchpoints"}
      -re "$gdb_prompt $" {fail "explicit show parent follow, no catchpoints"}
      timeout         {fail "(timeout) explicit show parent follow, no catchpoints"}
   }
   send_gdb "next 2\n"
   gdb_expect {
      -re "Detaching after fork from.*$gdb_prompt $"\
                      {pass "explicit parent follow, no catchpoints"}
      -re "$gdb_prompt $" {fail "explicit parent follow, no catchpoints"}
      timeout         {fail "(timeout) 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

   send_gdb "set follow child\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow child"}
      timeout         {fail "(timeout) set follow child"}
   }
   send_gdb "show follow\n"
   gdb_expect {
      -re "Debugger response to a program call of fork or vfork is \"child\"..*$gdb_prompt $"\
                      {pass "explicit show child follow, no catchpoints"}
      -re "$gdb_prompt $" {fail "explicit show child follow, no catchpoints"}
      timeout         {fail "(timeout) explicit show child follow, no catchpoints"}
   }
   send_gdb "next 2\n"
   gdb_expect {
      -re "Detaching from program:.*Attaching after fork to.*$gdb_prompt $"\
                      {pass "explicit child follow, no catchpoints"}
      -re "$gdb_prompt $" {fail "explicit child follow, no catchpoints"}
      timeout         {fail "(timeout) 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

   send_gdb "catch fork\n"
   gdb_expect {
      -re "Catchpoint .*(fork).*$gdb_prompt $"\
                      {pass "explicit child follow, set catch fork"}
      -re "$gdb_prompt $" {fail "explicit child follow, set catch fork"}
      timeout         {fail "(timeout) 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.
   #
   send_gdb "info breakpoints\n"
   gdb_expect {
     -re ".*catch fork.*keep y.*$gdb_prompt $"\
                     {pass "info shows catchpoint without pid"}
     -re ".*catch fork.*process .*$gdb_prompt $"\
                     {fail "info shows catchpoint without pid"}
     -re "$gdb_prompt $" {fail "info shows catchpoint without pid"}
     timeout         {fail "(timeout) info shows catchpoint without pid"}
   }

   send_gdb "continue\n"
   gdb_expect {
      -re "Catchpoint.*(forked process.*),.*in _fork_sys.*$gdb_prompt $"\
                      {pass "explicit child follow, catch fork"}
      -re "$gdb_prompt $" {fail "explicit child follow, catch fork"}
      timeout         {fail "(timeout) 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.
   #
   send_gdb "info breakpoints\n"
   gdb_expect {
     -re ".*catch fork .*process \[0-9\]+.*$gdb_prompt $"\
                     {pass "info shows catchpoint pid"}
     -re "$gdb_prompt $" {fail "info shows catchpoint pid"}
     timeout         {fail "(timeout) info shows catchpoint pid"}
   }

   send_gdb "set follow child\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow child"}
      timeout         {fail "(timeout) set follow child"}
   }
   send_gdb "tbreak 24\n"
   gdb_expect {
      -re "Breakpoint.*, line 24.*$gdb_prompt $"\
                      {pass "set follow child, tbreak"}
      -re "$gdb_prompt $" {fail "set follow child, tbreak"}
      timeout         {fail "(timeout) set follow child, tbreak"}
   }
   send_gdb "continue\n"
   gdb_expect {
      -re ".*Detaching from program:.*Attaching after fork to.* at .*24.*$gdb_prompt $"\
                      {pass "set follow child, hit tbreak"}
      -re "$gdb_prompt $" {fail "set follow child, hit tbreak"}
      timeout         {fail "(timeout) set follow child, 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
   send_gdb "delete breakpoints\n"
   gdb_expect {
      -re "Delete all breakpoints.*$" {
         send_gdb "y\n"
         gdb_expect {
            -re "$gdb_prompt $"\
                    {pass "set follow child, cleanup"}
            timeout {fail "(timeout) set follow child, cleanup"}
         }
      }
      -re "$gdb_prompt $" {fail "set follow child, cleanup"}
      timeout         {fail "(timeout) set follow child, cleanup"}
   }
}

proc tcatch_fork_parent_follow {} {
   global gdb_prompt

   send_gdb "catch fork\n"
   gdb_expect {
      -re "Catchpoint .*(fork).*$gdb_prompt $"\
                      {pass "explicit parent follow, set tcatch fork"}
      -re "$gdb_prompt $" {fail "explicit parent follow, set tcatch fork"}
      timeout         {fail "(timeout) 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.

   send_gdb "continue\n"
   gdb_expect {
      -re ".*in _fork_sys.*$gdb_prompt $"\
                      {pass "explicit parent follow, tcatch fork"}
      -re "$gdb_prompt $" {fail "explicit parent follow, tcatch fork"}
      timeout         {fail "(timeout) explicit parent follow, tcatch fork"}
   }
   send_gdb "set follow parent\n"
   gdb_expect {
      -re "$gdb_prompt $" {pass "set follow parent"}
      timeout         {fail "(timeout) set follow parent"}
   }
   send_gdb "tbreak 24\n"
   gdb_expect {
      -re "Breakpoint.*, line 24.*$gdb_prompt $"\
                      {pass "set follow parent, tbreak"}
      -re "$gdb_prompt $" {fail "set follow parent, tbreak"}
      timeout         {fail "(timeout) set follow child, tbreak"}
   }
   send_gdb "continue\n"
   gdb_expect {
      -re ".*Detaching after fork from.* at .*24.*$gdb_prompt $"\
                      {pass "set follow parent, hit tbreak"}
      -re "$gdb_prompt $" {fail "set follow parent, hit tbreak"}
      timeout         {fail "(timeout) set follow 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
   send_gdb "delete breakpoints\n"
   gdb_expect {
      -re "Delete all breakpoints.*$" {
         send_gdb "y\n"
         gdb_expect {
            -re "$gdb_prompt $"\
                    {pass "set follow parent, cleanup"}
            timeout {fail "(timeout) set follow parent, cleanup"}
         }
      }
      -re "$gdb_prompt $" {fail "set follow parent, cleanup"}
      timeout         {fail "(timeout) set follow parent, cleanup"}
   }
}

proc do_fork_tests {} {
   global gdb_prompt

   # Verify that help is available for "set follow-fork-mode".
   #
   send_gdb "help set follow-fork-mode\n"
   gdb_expect {
      -re "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.*
.*ask     - the debugger will ask for one of the above choices.*
For \"parent\" or \"child\", the unfollowed process will run free..*
By default, the debugger will follow the parent process..*$gdb_prompt $"\
                      { pass "help set follow" }
      -re "$gdb_prompt $" { fail "help set follow" }
      timeout         { fail "(timeout) help set follow" }
   }

   # Verify that we can set follow-fork-mode, using an abbreviation
   # for both the flag and its value.
   #
   send_gdb "set follow ch\n"
   send_gdb "show fol\n"
   gdb_expect {
     -re "Debugger response to a program call of fork or vfork is \"child\".*$gdb_prompt $"\
             {pass "set follow, using abbreviations"}
     timeout {fail "(timeout) set follow, using abbreviations"}
   }

   # Verify that we cannot set follow-fork-mode to nonsense.
   #
   send_gdb "set follow chork\n"
   gdb_expect {
     -re "Undefined item: \"chork\".*$gdb_prompt $"\
                     {pass "set follow to nonsense is prohibited"}
     -re "$gdb_prompt $" {fail "set follow to nonsense is prohibited"}
     timeout         {fail "(timeout) set follow to nonsense is prohibited"}
   }
   send_gdb "set follow parent\n"
   gdb_expect {
     -re "$gdb_prompt $" {pass "set follow to nonsense is prohibited (reset parent)"}
     timeout         {fail "set follow to nonsense is prohibited (reset parent)"}
   }

   # 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 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}


# 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
