# Copyright 2016-2020 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/>.

# When we intercept a fork/vfork with a catchpoint, the child is left
# stopped.  At that point, if we kill the parent, we should kill the
# child as well.  This test makes sure that works.  See PR gdb/19494.

# The main idea of the test is make sure that when the program stops
# for a fork catchpoint, and the user kills the parent, gdb also kills
# the unfollowed fork child.  Since the child hasn't been added as an
# inferior at that point, we need some other portable way to detect
# that the child is gone.  The test uses a pipe for that.  The program
# forks twice, so you have grandparent, child and grandchild.  The
# grandchild inherits the write side of the pipe.  The grandparent
# hangs reading from the pipe, since nothing ever writes to it.  If,
# when GDB kills the child, it also kills the grandchild, then the
# grandparent's pipe read returns 0/EOF and the test passes.
# Otherwise, if GDB doesn't kill the grandchild, then the pipe read
# never returns and the test times out.

standard_testfile

# Build two programs -- one for fork, and another for vfork.
set testfile_fork "${testfile}-fork"
set testfile_vfork "${testfile}-vfork"

foreach kind {"fork" "vfork"} {
    set compile_options "debug additional_flags=-DFORK=$kind"
    set testfile [set testfile_$kind]
    if {[build_executable $testfile.exp $testfile ${srcfile} \
	     ${compile_options}] == -1} {
	untested "failed to compile"
	return -1
    }
}

# The test proper.  FORK_KIND is either "fork" or "vfork".  EXIT_KIND
# is either "exit" (run the parent to exit) or "kill" (kill parent).

proc do_test {fork_kind exit_kind} {
    global testfile testfile_$fork_kind

    set testfile [set testfile_$fork_kind]

    with_test_prefix "$fork_kind" {
	clean_restart $testfile

	if ![runto_main] {
	    untested "could not run to main"
	    return -1
	}

	gdb_test_no_output "set follow-fork child"
	gdb_test_no_output "set detach-on-fork off"

	gdb_test "catch $fork_kind" "Catchpoint .*($fork_kind).*"

	gdb_test "continue" \
	    "Catchpoint \[0-9\]* \\(${fork_kind}ed process \[0-9\]*\\),.*" \
	    "continue to child ${fork_kind}"

	gdb_test "continue" \
	    "Catchpoint \[0-9\]* \\(${fork_kind}ed process \[0-9\]*\\),.*" \
	    "continue to grandchild ${fork_kind}"

	gdb_test "kill inferior 2" "" "kill child" \
	    "Kill the program being debugged.*y or n. $" "y"

	gdb_test "inferior 1" "Switching to inferior 1 .*" "switch to parent"

	if {$exit_kind == "exit"} {
	    gdb_test "break grandparent_done" "Breakpoint .*"
	    gdb_test "continue" "hit Breakpoint .*, grandparent_done.*"
	} elseif {$exit_kind == "kill"} {
	    gdb_test "kill" "" "kill parent" \
		"Kill the program being debugged.*y or n. $" "y"
	} else {
	    perror "unreachable"
	}
    }
}

foreach_with_prefix fork-kind {"fork" "vfork"} {
    foreach_with_prefix exit-kind {"exit" "kill"} {
	do_test ${fork-kind} ${exit-kind}
    }
}
