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

# This test checks that inserting a dprintf and detaching does not crash
# the program.
#
# Related bug: https://sourceware.org/bugzilla/show_bug.cgi?id=17012

load_lib gdbserver-support.exp

# The test relies on "detach/attach".
if { [use_gdb_stub] } then {
    return 0
}

standard_testfile
set escapedbinfile [string_to_regexp ${binfile}]

if [build_executable "failed to prepare for dprintf-detach" \
    ${testfile} ${srcfile} {debug}] {
    return -1
}

proc dprintf_detach_test { breakpoint_always_inserted dprintf_style disconnected_dprintf } {
    set test_prefix "bai=${breakpoint_always_inserted} ds=${dprintf_style} dd=${disconnected_dprintf}"
    global binfile decimal gdb_prompt escapedbinfile

    with_test_prefix "$test_prefix" {
	# Start with a clean gdb
	clean_restart ${binfile}

	gdb_test_no_output "set breakpoint always-inserted ${breakpoint_always_inserted}"
	gdb_test_no_output "set dprintf-style ${dprintf_style}"
	gdb_test_no_output "set disconnected-dprintf ${disconnected_dprintf}"

	if ![runto_main] {
	    return -1
	}

	# Get PID of test program.
	set inferior_pid -1
	set test "get inferior process ID"
	gdb_test_multiple "call (int) getpid ()" $test {
	    -re ".* = ($decimal).*$gdb_prompt $" {
		set inferior_pid $expect_out(1,string)
		pass $test
	    }
	}

	if {$inferior_pid == -1} {
	    return
	}

	# Add a dprintf and detach.
	gdb_test "dprintf function, \"hello\"" "Dprintf .*" "dprintf insertion"
	gdb_test "detach" "Detaching from program: .*$escapedbinfile, .*" "detach program"

	gdb_exit

	# Check that the process still exists by attaching a new gdb to it.
	clean_restart ${binfile}
	set test "re-attach to inferior"
	set is_gdbserver [target_is_gdbserver]

	if { $is_gdbserver == 1 } {
		setup_kfail "*-*-*" "server/17302"
	} else {
		# Give some time for the ex-inferior to run and hopefully not crash.
		sleep 1
	}

	gdb_test "attach $inferior_pid" "Attaching to program: $escapedbinfile, process $inferior_pid.*Reading symbols from.*" "$test"
    }
}

foreach breakpoint_always_inserted { "on" "off" } {
    foreach dprintf_style { "gdb" "call" "agent" } {
	foreach disconnected_dprintf { "on" "off" } {
	    dprintf_detach_test $breakpoint_always_inserted $dprintf_style $disconnected_dprintf
	}
    }
}
