#   Copyright 1997-2022 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/>.

# Various tests of gdb's ability to follow the parent or child of a
# Unix vfork system call.  A vfork parent is blocked until the child
# either execs or exits --- since those events take somewhat different
# code paths in GDB, both variants are exercised.

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

standard_testfile

set compile_options debug

if {[build_executable $testfile.exp $testfile $srcfile $compile_options] == -1} {
    untested "failed to compile main testcase"
    return -1
}

set testfile2 "vforked-prog"
set srcfile2 ${testfile2}.c

if {[build_executable $testfile.exp $testfile2 $srcfile2 $compile_options] == -1} {
    untested "failed to compile secondary testcase"
    return -1
}

# A few of these tests require a little more time than the standard
# timeout allows.
set oldtimeout $timeout
set timeout [expr "$timeout + 10"]

# Start with a fresh GDB, with verbosity enabled, and run to main.  On
# error, behave as "return", so we don't try to continue testing with
# a borked session.
proc setup_gdb {} {
    global testfile srcfile

    clean_restart $testfile

    if ![runto_main] {
	return -code return
    }

    set tbreak_line [gdb_get_line_number " VFORK " $srcfile]
    gdb_test "tbreak ${tbreak_line}"
    gdb_continue_to_breakpoint ".*"
}

proc check_vfork_catchpoints {} {
  global gdb_prompt
  global has_vfork_catchpoints

  setup_gdb

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

  if {$has_vfork_catchpoints == 0} {
    unsupported "vfork catchpoints"
    return -code return
  }
}

proc vfork_parent_follow_through_step {} {
  with_test_prefix "vfork parent follow, through step" {
   global gdb_prompt

   setup_gdb

   gdb_test_no_output "set follow-fork parent"

   set test "step"
   gdb_test_multiple "next" $test {
       -re "\\\[Detaching after vfork from.*if \\(pid == 0\\).*$gdb_prompt " {
	   pass $test
       }
   }
   # 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 vfork_parent_follow_to_bp {} {
  with_test_prefix "vfork parent follow, to bp" {
   global gdb_prompt
   global srcfile

   setup_gdb

   gdb_test_no_output "set follow-fork parent"

   set bp_location [gdb_get_line_number "I'm the proud parent of child"]
   gdb_test "break ${srcfile}:${bp_location}" ".*" "break, vfork to bp"

   set test "continue to bp"
   gdb_test_multiple "continue" $test {
       -re ".*\\\[Detaching after vfork from child process.*Breakpoint.*${bp_location}.*$gdb_prompt " {
	   pass $test
       }
   }
   # 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 vfork_child_follow_to_exit {} {
  with_test_prefix "vfork child follow, to exit" {
   global gdb_prompt

   setup_gdb

   gdb_test_no_output "set follow-fork child"

   set test "continue to child exit"
   gdb_test_multiple "continue" $test {
      -re "Couldn't get registers.*$gdb_prompt " {
	  # PR gdb/14766
	  fail "$test"
      }
       -re "\\\[Attaching after.* vfork to.*\\\[Detaching vfork parent .* after child exit.*$gdb_prompt " {
	  pass $test
      }
   }
   # The parent 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 vfork_and_exec_child_follow_to_main_bp {} {
  with_test_prefix "vfork and exec child follow, to main bp" {
   global gdb_prompt
   global srcfile2

   setup_gdb

   gdb_test_no_output "set follow-fork child"

   set linenum [gdb_get_line_number "Hello from vforked-prog" ${srcfile2}]

   set test "continue to bp"
   gdb_test_multiple "continue" $test {
      -re "\\\[Attaching after.* vfork to.*\\\[Detaching vfork parent.*xecuting new program.*Breakpoint.*vforked-prog.c:${linenum}.*$gdb_prompt " {
	  pass $test
      }
   }
   # The parent 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 vfork_and_exec_child_follow_through_step {} {
  with_test_prefix "vfork and exec child follow, through step" {
   global gdb_prompt
   global srcfile2

   setup_gdb

   gdb_test_no_output "set follow-fork child"

   set test "step over vfork"

   # The ideal support is to be able to debug the child even
   # before it execs.  Thus, "next" lands on the next line after
   # the vfork.
   gdb_test_multiple "next" $test {
       -re "\\\[Attaching after .* vfork to child.*if \\(pid == 0\\).*$gdb_prompt " {
	   pass "$test"
       }
   }
   # 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
}}

proc continue_to_vfork {} {
   global gdb_prompt

   # A vfork catchpoint may stop in either "vfork" or "_vfork".
   set test "continue to vfork"
   gdb_test_multiple "continue" $test {
      -re "vfork \\(\\) at .*$gdb_prompt $" {
	  pass $test
      }
      -re "0x\[0-9a-fA-F\]*.*(vfork|__kernel_v?syscall).*$gdb_prompt " {
	  pass $test
      }
   }
}

proc tcatch_vfork_then_parent_follow {} {
  with_test_prefix "vfork parent follow, finish after tcatch vfork" {
   global gdb_prompt
   global srcfile

   setup_gdb

   gdb_test_no_output "set follow-fork parent"

   gdb_test "tcatch vfork" "Catchpoint .*(vfork).*"

   continue_to_vfork

   set linenum [gdb_get_line_number "pid = vfork ();"]
   set test "finish"
   gdb_test_multiple "finish" $test {
      -re "Run till exit from.*vfork.*0x\[0-9a-fA-F\]* in main .* at .*${srcfile}:${linenum}.*$gdb_prompt " {
	  pass $test
      }
      -re "Run till exit from.*__kernel_v?syscall.*0x\[0-9a-fA-F\]* in vfork .*$gdb_prompt " {
	  send_gdb "finish\n"
	  exp_continue
      }
   }
   # 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 tcatch_vfork_then_child_follow_exec {} {
  with_test_prefix "vfork child follow, finish after tcatch vfork" {
   global gdb_prompt
   global srcfile
   global srcfile2

   setup_gdb

   gdb_test_no_output "set follow-fork child"

   gdb_test "tcatch vfork" "Catchpoint .*(vfork).*"

   continue_to_vfork

   set linenum1 [gdb_get_line_number "pid = vfork ();"]
   set linenum2 [gdb_get_line_number "Hello from vforked-prog" ${srcfile2}]

   set test "finish"
   gdb_test_multiple "finish" $test {
      -re "Run till exit from.*vfork.*${srcfile}:${linenum1}.*$gdb_prompt " {
	  pass $test
      }
      -re "Run till exit from.*__kernel_v?syscall.*0x\[0-9a-fA-F\]* in vfork .*$gdb_prompt " {
	  send_gdb "finish\n"
	  exp_continue
      }
      -re "Run till exit from.*vfork.*${srcfile2}:${linenum2}.*$gdb_prompt " {
	  pass "$test (followed exec)"
      }
   }
   # 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
}}

proc tcatch_vfork_then_child_follow_exit {} {
  with_test_prefix "vfork child follow, finish after tcatch vfork" {
   global gdb_prompt
   global srcfile

   setup_gdb

   gdb_test_no_output "set follow-fork child"

   gdb_test "tcatch vfork" "Catchpoint .*(vfork).*"

   continue_to_vfork

   set test "finish"
   gdb_test_multiple "finish" $test {
      -re "Run till exit from.*vfork.*exited normally.*$gdb_prompt " {
	  setup_kfail "gdb/14762" *-*-*
	  fail $test
      }
      -re "Run till exit from.*vfork.*pid = vfork \\(\\).*$gdb_prompt " {
	  pass $test
      }
      -re "Run till exit from.*__kernel_v?syscall.*0x\[0-9a-fA-F\]* in vfork .*$gdb_prompt " {
	  send_gdb "finish\n"
	  exp_continue
      }
   }
   # 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
}}

proc vfork_relations_in_info_inferiors { variant } {
  with_test_prefix "vfork relations in info inferiors" {
   global gdb_prompt

   setup_gdb

   gdb_test_no_output "set follow-fork child"

   set test "step over vfork"
   gdb_test_multiple "next" $test {
       -re "\\\[Attaching after .* vfork to child.*if \\(pid == 0\\).*$gdb_prompt " {
	   pass "$test"
       }
   }

   gdb_test "info inferiors" \
       ".*is vfork parent of inferior 2.*is vfork child of inferior 1" \
       "info inferiors shows vfork parent/child relation"

   if { $variant == "exec" } {
       global srcfile2

       set linenum [gdb_get_line_number "Hello from vforked-prog" ${srcfile2}]
       set test "continue to bp"
       gdb_test_multiple "continue" $test {
	   -re ".*xecuting new program.*Breakpoint.*vforked-prog.c:${linenum}.*$gdb_prompt " {
	       pass $test
	   }
       }
   } else {
       set test "continue to child exit"
       gdb_test_multiple "continue" $test {
	   -re "exited normally.*$gdb_prompt " {
	       pass $test
	   }
       }
   }

   set test "vfork relation no longer appears in info inferiors"
   gdb_test_multiple "info inferiors" $test {
       -re -wrap "is vfork child of inferior 1.*" {
	   fail $test
       }
       -re -wrap "is vfork parent of inferior 2.*" {
	   fail $test
       }
       -re -wrap "" {
	   pass $test
       }
   }
}}

proc do_vfork_and_follow_parent_tests {} {
   global gdb_prompt

   # Try following the parent process by stepping through a call to
   # vfork.  Do this without catchpoints.
   vfork_parent_follow_through_step

   # Try following the parent process by setting a breakpoint on the
   # other side of a vfork, and running to that point.  Do this
   # without catchpoints.
   vfork_parent_follow_to_bp

   # Try catching a vfork, and stepping out to the parent.
   #
   tcatch_vfork_then_parent_follow
}

proc do_vfork_and_follow_child_tests_exec {} {
   # Try following the child process by just continuing through the
   # vfork, and letting the parent's breakpoint on "main" be auto-
   # magically reset in the child.
   #
   vfork_and_exec_child_follow_to_main_bp

   # Try following the child process by stepping through a call to
   # vfork.  The child also executes an exec.  Since the child cannot
   # be debugged until after it has exec'd, and since there's a bp on
   # "main" in the parent, and since the bp's for the parent are
   # recomputed in the exec'd child, the step through a vfork should
   # land us in the "main" for the exec'd child, too.
   #
   vfork_and_exec_child_follow_through_step

   # Try catching a vfork, and stepping out to the child.
   #
   tcatch_vfork_then_child_follow_exec

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

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

   # Step over a vfork in the child, do "info inferiors" and check the
   # parent/child relation is displayed.  Run the child over the exec,
   # and confirm the relation is no longer displayed in "info
   # inferiors".
   #
   vfork_relations_in_info_inferiors "exec"
}

proc do_vfork_and_follow_child_tests_exit {} {
   # Try following the child process by just continuing through the
   # vfork, and letting the child exit.
   #
   vfork_child_follow_to_exit

   # Try catching a vfork, and stepping out to the child.
   #
   tcatch_vfork_then_child_follow_exit

   # Step over a vfork in the child, do "info inferiors" and check the
   # parent/child relation is displayed.  Run the child to completion,
   # and confirm the relation is no longer displayed in "info
   # inferiors".
   #
   vfork_relations_in_info_inferiors "exit"
}

with_test_prefix "check vfork support" {
    # Check that vfork catchpoints are supported, as an indicator for
    # whether vfork-following is supported.
    check_vfork_catchpoints
}

# Follow parent and follow child vfork tests with a child that execs.
with_test_prefix "exec" {
    # These are tests of gdb's ability to follow the parent of a Unix
    # vfork system call.  The child will subsequently call a variant
    # of the Unix exec system call.
    do_vfork_and_follow_parent_tests

    # These are tests of gdb's ability to follow the child of a Unix
    # vfork system call.  The child will subsequently call a variant
    # of a Unix exec system call.
    #
    do_vfork_and_follow_child_tests_exec
}

# Switch to test the case of the child exiting.  We can't use
# standard_testfile here because we don't want to overwrite the binary
# of the previous tests.
set testfile "foll-vfork-exit"
set srcfile ${testfile}.c
set binfile [standard_output_file ${testfile}]

if {[build_executable $testfile.exp $testfile $srcfile] == -1} {
    untested "failed to build $testfile"
    return
}

# Follow parent and follow child vfork tests with a child that exits.
with_test_prefix "exit" {
    # These are tests of gdb's ability to follow the parent of a Unix
    # vfork system call.  The child will subsequently exit.
    do_vfork_and_follow_parent_tests

    # These are tests of gdb's ability to follow the child of a Unix
    # vfork system call.  The child will subsequently exit.
    #
    do_vfork_and_follow_child_tests_exit
}

set timeout $oldtimeout
return 0
