# Copyright (C) 2016-2021 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/>.

# Regression test for PR threads/19461 (strange "info thread" behavior
# in non-stop).  GDB used to miss updating the parent/child running
# states after a fork.

standard_testfile

# The test proper.

proc do_test { detach_on_fork follow_fork non_stop schedule_multiple } {
    global GDBFLAGS
    global srcfile testfile
    global gdb_prompt

    save_vars { GDBFLAGS } {
	append GDBFLAGS " -ex \"set non-stop $non_stop\""

	if {[prepare_for_testing "failed to prepare" \
		 $testfile $srcfile {debug}] == -1} {
	    return -1
	}
    }

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

    # If debugging with target remote, check whether the all-stop
    # variant of the RSP is being used.  If so, we can't run the
    # all-stop tests.
    if { [target_info exists gdb_protocol]
	 && ([target_info gdb_protocol] == "remote"
	     || [target_info gdb_protocol] == "extended-remote")} {

	set test "maint show target-non-stop"
	gdb_test_multiple "maint show target-non-stop" $test {
	    -re "(is|currently) on.*$gdb_prompt $" {
	    }
	    -re "(is|currently) off.*$gdb_prompt $" {
		unsupported "can't issue info threads while target is running"
		return 0
	    }
	}
    }

    # We want to catch "[New inferior ...]" below, to avoid sleeping.
    if {$detach_on_fork == "off" || $follow_fork == "child"} {
	gdb_test_no_output "set print inferior-events on"
    }

    gdb_test_no_output "set detach-on-fork $detach_on_fork"

    gdb_test_no_output "set follow-fork $follow_fork"
    if {$non_stop == "off"} {
	gdb_test_no_output "set schedule-multiple $schedule_multiple"
    }

    # If we're detaching from the parent (or child), then tell it to
    # exit itself when its child (or parent) exits.  If we stay
    # attached, we take care of killing it.
    if {$detach_on_fork == "on"} {
	gdb_test "print exit_if_relative_exits = 1" " = 1"
    }

    set test "continue &"
    gdb_test_multiple $test $test {
	-re "$gdb_prompt " {
	    pass $test
	}
    }

    if {$detach_on_fork == "off" || $follow_fork == "child"} {
	set test "fork child appears"
	gdb_test_multiple "" $test {
	    -re "\\\[New inferior " {
		pass $test
	    }
	}
    } else {
	# All we can do is wait a little bit for the parent to fork.
	sleep 1
    }

    set not_nl "\[^\r\n\]*"

    if {$detach_on_fork == "on" && $follow_fork == "child"} {
	gdb_test "info threads" \
	    "  2.1 ${not_nl}\\\(running\\\).*No selected thread.*"
    } elseif {$detach_on_fork == "on"} {
	gdb_test "info threads" \
	    "\\\* 1 ${not_nl}\\\(running\\\)"
    } elseif {$non_stop == "on" || $schedule_multiple == "on"} {
	# Both parent and child should be marked running, and the
	# parent should be selected.
	gdb_test "info threads" \
	    [multi_line \
		 "\\\* 1.1 ${not_nl} \\\(running\\\)${not_nl}" \
		 "  2.1 ${not_nl} \\\(running\\\)"]
    } else {
	set test "only $follow_fork marked running"
	gdb_test_multiple "info threads" $test {
	    -re "\\\(running\\\)${not_nl}\\\(running\\\)\r\n$gdb_prompt $" {
		fail $test
	    }
	    -re "\\\* 1.1 ${not_nl}\\\(running\\\)\r\n  2.1 ${not_nl}\r\n$gdb_prompt $" {
		gdb_assert [string eq $follow_fork "parent"] $test
	    }
	    -re "\\\* 1.1 ${not_nl}\r\n  2.1 ${not_nl}\\\(running\\\)\r\n$gdb_prompt $" {
		gdb_assert [string eq $follow_fork "child"] $test
	    }
	}
    }

    # We don't want to see "Inferior exited" in reaction to the kills.
    gdb_test_no_output "set print inferior-events off"

    # Kill both parent and child.
    if {$detach_on_fork == "off" || $follow_fork == "parent"} {
	gdb_test_no_output "kill inferior 1" "kill parent"
    }
    if {$detach_on_fork == "off" || $follow_fork == "child"} {
	gdb_test_no_output "kill inferior 2" "kill child"
    }
}

# Exercise all permutations of:
#
#  set detach-on-fork off|on
#  set follow-fork parent|child
#  set non-stop on|off
#  set schedule-multiple on|off

foreach_with_prefix detach-on-fork {"off" "on"} {
    foreach_with_prefix follow-fork {"parent" "child"} {
	with_test_prefix "non-stop" {
	    do_test ${detach-on-fork} ${follow-fork} "on" "-"
	}
	with_test_prefix "all-stop" {
	    foreach_with_prefix schedule-multiple {"on" "off"} {
		do_test ${detach-on-fork} ${follow-fork} "off" ${schedule-multiple}
	    }
	}
    }
}
