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

# Test detaching from a process that is running and has threads
# constantly hitting a breakpoint and stepping over it, in all
# combinations of:
#
#  - maint target non-stop off/on
#  - set non-stop on/off
#  - displaced stepping on/off
#
# This stresses the edge cases of detaching while a displaced step or
# an in-line step over are in progress.
#
# A fail mode is that the inferior process dies after being detached.
# This can happen because e.g.:
#
# - GDB leaves a breakpoint installed behind, or
#
# - GDB leaves a thread running in the displaced step scratch buffer.
#   With no debugger around to run the finish step, the thread runs
#   off of the scratch buffer, with undefined results.
#
# To exercise this, the testcase reattaches to the process shortly
# after detaching, ensuring the process is still alive and well.
#
# In addition, since GDB may pause threads of all processes for
# stepping over a breakpoint, it needs to re-resume all threads if it
# detaches from the process that was just stepping over the
# breakpoint.  To ensure that, the testcase actually runs a second
# process at the same time as the one that is used to test detaching.
# After the first process is detached, the testcase sends a SIGUSR1 to
# the second process.  If threads failed to be resumed, then the
# SIGUSR1 is never reported to the user, resulting in timeout.  The
# threads of this second process will also be constantly stepping over
# a breakpoint, which has helped with exposing further corner case
# bugs.

if {![can_spawn_for_attach]} {
    return 0
}

standard_testfile

set bp_lineno [gdb_get_line_number "Set breakpoint here"]

# The test proper.  See description above.
proc test {condition_eval target_non_stop non_stop displaced} {
    global binfile srcfile
    global gdb_prompt
    global decimal
    global bp_lineno
    global GDBFLAGS

    # Number of threads started by the program.
    set n_threads 10

    save_vars { GDBFLAGS } {
	append GDBFLAGS " -ex \"maint set target-non-stop $target_non_stop\""
	append GDBFLAGS " -ex \"set non-stop $non_stop\""
	append GDBFLAGS " -ex \"set displaced $displaced\""
	append GDBFLAGS " -ex \"set schedule-multiple on\""
	clean_restart $binfile
    }

    set test_spawn_id [spawn_wait_for_attach $binfile]
    set testpid [spawn_id_get_pid $test_spawn_id]

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

    gdb_test "add-inferior" "Added inferior 2.*"
    gdb_test "inferior 2" "Switching to .*"

    gdb_load $binfile
    if ![runto setup_done] then {
	fail "can't run to setup_done"
	kill_wait_spawned_process $test_spawn_id
	return
    }

    gdb_test_no_output "set breakpoint condition-evaluation $condition_eval"

    # Get the PID of the test process.
    set pid_inf2 ""
    gdb_test_multiple "p mypid" "get pid of inferior 2" {
	-re " = ($decimal)\r\n$gdb_prompt $" {
	    set pid_inf2 $expect_out(1,string)
	    pass $gdb_test_name
	}
    }

    set attempts 3
    for {set attempt 1} { $attempt <= $attempts } { incr attempt } {
	with_test_prefix "iter $attempt" {
	    gdb_test "inferior 1" "Switching to .*"

	    with_timeout_factor 2 {
		set attached 0
		set saw_attaching 0
		set eperm 0
		set test "attach"
		gdb_test_multiple "attach $testpid" $test {
		    -re "Attaching to program.*process $testpid\r\n" {
			set saw_attaching 1
			exp_continue
		    }
		    -re "new threads in iteration" {
			# Seen when "set debug libthread_db" is on.
			exp_continue
		    }
		    -re "Reading symbols from|Expanding full symbols from" {
			# Prevent -readnow timeout.
			exp_continue
		    }
		    -re "is a zombie - the process has already terminated.*$gdb_prompt " {
			fail $gdb_test_name
		    }
		    -re "Unable to attach: .*$gdb_prompt " {
			fail $gdb_test_name
		    }
		    -re "\r\n$gdb_prompt " {
			if { $saw_attaching } {
			    set attached 1
			    pass $test
			} else {
			    fail $test
			}
		    }
		}
	    }

	    if {!$attached} {
		kill_wait_spawned_process $test_spawn_id
		return
	    }

	    if {$non_stop} {
		# In non-stop, we will see one stop per thread after
		# the prompt.
		set stops 0
		set tid_re "$::decimal\.$::decimal"
		set test "seen all stops"
		for {set thread 1} { $thread <= $n_threads } { incr thread } {
		    if {[gdb_test_multiple "" $test {
			-re "Thread ${tid_re} ${any} stopped" {
			    incr stops
			}
		    }] != 0} {
			break
		    }
		}

		# If we haven't seen all stops, then the
		# gdb_test_multiple in the loop above will have
		# already issued a FAIL.
		if {$stops != $n_threads} {
		    kill_wait_spawned_process $test_spawn_id
		    return
		}
		pass $test
	    }

	    # Set threads stepping over a breakpoint continuously.
	    gdb_test "break $srcfile:$bp_lineno if 0" "Breakpoint.*" \
		"break LOC if 0"

	    if {$attempt < $attempts} {
		# Kick the time out timer for another round.
		gdb_test "print again = 1" " = 1" "reset timer in the inferior"
		# Show the time we had left in the logs, in case
		# something goes wrong.
		gdb_test "print seconds_left" " = .*"
	    }

	    if {$non_stop} {
		set cont_cmd "continue -a &"
	    } else {
		set cont_cmd "continue &"
	    }

	    set cont_cmd_re [string_to_regexp $cont_cmd]
	    gdb_test_multiple $cont_cmd "" {
		-re "^$cont_cmd_re\r\nContinuing\.\r\n$gdb_prompt " {
		    pass $gdb_test_name
		}
	    }

	    # Wait a bit, to give time for the threads to hit the
	    # breakpoint.
	    sleep 1

	    set running_count 0
	    set interrupted 0
	    gdb_test_multiple "info threads" "all threads running" {
		-re "\\(running\\)" {
		    incr running_count
		    exp_continue
		}
		-re "Cannot execute this command while the target is running.*$gdb_prompt $" {
		    # Testing against a remote server that doesn't do
		    # non-stop mode.  Explicitly interrupt.  This
		    # doesn't test the same code paths in GDB, but
		    # it's still something.
		    set interrupted 1
		    gdb_test_multiple "interrupt" "" {
			-re "$gdb_prompt " {
			    gdb_test_multiple "" $gdb_test_name {
				-re "received signal SIGINT, Interrupt" {
				    pass $gdb_test_name
				}
			    }
			}
		    }
		}
		-re "$gdb_prompt $" {
		    gdb_assert {$running_count == ($n_threads + 1) * 2} $gdb_test_name
		}
	    }

	    gdb_test "detach" "Detaching from.*"

	    if {!$interrupted} {
		# Now test whether inferior 2's thread were really left
		# running.  Currently an inline step-over stops all
		# threads of all processes.  If detach aborts such a step
		# over, then threads of other inferiors should be
		# re-resumed.  Test for that by sending a signal to
		# inferior 2.
		remote_exec target "kill -SIGUSR1 ${pid_inf2}"

		gdb_test_multiple "" "stop with SIGUSR1" {
		    -re "received signal SIGUSR1" {
			pass $gdb_test_name
		    }
		}
	    }

	    delete_breakpoints
	}
    }
    kill_wait_spawned_process $test_spawn_id
}

# The test program exits after a while, in case GDB crashes.  Make it
# wait at least as long as we may wait before declaring a time out
# failure.
set options { "additional_flags=-DTIMEOUT=$timeout" debug pthreads }

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

if ![runto_main] {
    return -1
}

# Probe support for "set breakpoint condition-evaluation target".
# This setting influences who steps over the breakpoint, the (remote)
# target (e.g. gdbserver) or gdb, thus exposing issues on either the
# target or gdb.
set supports_condition_eval_target 1
set cmd "set breakpoint condition-evaluation target"
gdb_test_multiple $cmd "probe condition-evaluation target support" {
    -re "warning: Target does not support breakpoint condition evaluation.\r\nUsing host evaluation mode instead.\r\n$gdb_prompt $" {
	# Target doesn't support breakpoint condition evaluation on
	# its side.
	set supports_condition_eval_target 0
	pass $gdb_test_name
    }
    -re "^$cmd\r\n$gdb_prompt $" {
	pass $gdb_test_name
    }
}

foreach_with_prefix breakpoint-condition-evaluation {"host" "target"} {
    if {!$supports_condition_eval_target && ${breakpoint-condition-evaluation} == "target"} {
	continue
    }

    foreach_with_prefix target-non-stop {"off" "on"} {
	foreach_with_prefix non-stop {"off" "on"} {
	    if {${non-stop} && !${target-non-stop}} {
		# "set non-stop" overrides "maint set
		# target-non-stop", no use testing this combination.
		continue
	    }

	    foreach_with_prefix displaced {"off" "auto"} {
		test ${breakpoint-condition-evaluation} ${target-non-stop} ${non-stop} ${displaced}
	    }
	}
    }
}
