# Copyright (C) 2019-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/>.  */

# Test following a vfork child that exits, when the vfork parent is a
# threaded program, and it's a non-main thread that vforks.

standard_testfile

if {[build_executable "failed to prepare" $testfile $srcfile {debug pthreads}]} {
    return -1
}

# DETACH indicates whether "set detach-on-fork" is enabled.  It is
# either "on" or "off".

proc test_vfork {detach} {
    global binfile

    clean_restart $binfile

    if ![runto_main] then {
	fail "can't run to main"
	return 0
    }

    gdb_test_no_output "set follow-fork-mode child"
    gdb_test_no_output "set detach-on-fork $detach"

    if {$detach == "off"} {
	gdb_test "continue" \
	    [multi_line \
		 "Attaching after .* vfork to child .*" \
		 ".*New inferior 2 .*" \
		 ".*Inferior 2 .*exited normally.*"]
    } else {
	gdb_test "continue" \
	    [multi_line \
		 "Attaching after .* vfork to child .*" \
		 ".*New inferior 2 .*" \
		 ".*Detaching vfork parent process .* after child exit.*" \
		 ".*Inferior 1 .* detached.*" \
		 ".*Inferior 2 .*exited normally.*"]
    }
}

foreach_with_prefix detach-on-fork {"off" "on"} {
    test_vfork ${detach-on-fork}
}
