# This testcase is part of GDB, the GNU debugger.
#
# 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 how GDB handles the case where a target either doesn't use 'T'
# packets at all or doesn't include a thread-id in a 'T' packet, AND,
# where the test program contains multiple threads.
#
# In general if multiple threads are executing and the target doesn't
# include a thread-id in its stop response then GDB will not be able
# to correctly figure out which thread the stop applies to.
#
# However, this test covers a very specific case, there are multiple
# threads but only a single thread is actually executing.  So, when
# the stop comes from the target, without a thread-id, GDB should be
# able to correctly figure out which thread has stopped.

load_lib gdbserver-support.exp

if { [skip_gdbserver_tests] } {
    verbose "skipping gdbserver tests"
    return -1
}

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

# Run the tests with different features of GDBserver disabled.
# TARGET_NON_STOP is passed to "maint set target-non-stop".
proc run_test { target_non_stop disable_feature } {
    global binfile gdb_prompt decimal hex
    global GDBFLAGS

    save_vars { GDBFLAGS } {
	append GDBFLAGS " -ex \"maint set target-non-stop $target_non_stop\""

	# If GDB and GDBserver are both running locally, set the sysroot to avoid
	# reading files via the remote protocol.
	if { ![is_remote host] && ![is_remote target] } {
	    set GDBFLAGS "$GDBFLAGS -ex \"set sysroot\""
	}

	clean_restart ${binfile}
    }

    # Make sure we're disconnected, in case we're testing with an
    # extended-remote board, therefore already connected.
    gdb_test "disconnect" ".*"

    set packet_arg ""
    if { $disable_feature != "" } {
	set packet_arg "--disable-packet=${disable_feature}"
    }
    set res [gdbserver_start $packet_arg $binfile]
    set gdbserver_protocol [lindex $res 0]
    set gdbserver_gdbport [lindex $res 1]

    # Disable XML-based thread listing, and multi-process extensions.
    gdb_test_no_output "set remote threads-packet off"
    gdb_test_no_output "set remote multiprocess-feature-packet off"

    set res [gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport]
    if ![gdb_assert {$res == 0} "connect"] {
	return
    }

    # There should be only one thread listed at this point.
    gdb_test_multiple "info threads" "" {
	-re "2 Thread.*$gdb_prompt $" {
	    fail $gdb_test_name
	}
	-re "has terminated.*$gdb_prompt $" {
	    fail $gdb_test_name
	}
	-re "\\\* 1\[\t \]*Thread\[^\r\n\]*\r\n$gdb_prompt $" {
	    pass $gdb_test_name
	}
    }

    gdb_breakpoint "unlock_worker"
    gdb_continue_to_breakpoint "run to unlock_worker"

    # There should be two threads at this point with thread 1 selected.
    gdb_test "info threads" \
	"\\\* 1\[\t \]*Thread\[^\r\n\]*\r\n  2\[\t \]*Thread\[^\r\n\]*" \
	"second thread should now exist"

    # Switch threads.
    gdb_test "thread 2" ".*" "switch to second thread"

    # Now turn on scheduler-locking so that when we step thread 2 only
    # that one thread will be set running.
    gdb_test_no_output "set scheduler-locking on"

    # Single step thread 2.  Only the one thread will step.  When the
    # thread stops, if the stop packet doesn't include a thread-id
    # then GDB should still understand which thread stopped.
    gdb_test_multiple "stepi" "" {
	-re -wrap "Thread 1 received signal SIGTRAP.*" {
	    fail $gdb_test_name
	}
	-re -wrap "$hex.*$decimal.*while \\(worker_blocked\\).*" {
	    pass $gdb_test_name
	}
    }

    # Check that thread 2 is still selected.
    gdb_test "info threads" \
	"  1\[\t \]*Thread\[^\r\n\]*\r\n\\\* 2\[\t \]*Thread\[^\r\n\]*" \
	"second thread should still be selected after stepi"

    # Turn scheduler locking off again so that when we continue all
    # threads will be set running.
    gdb_test_no_output "set scheduler-locking off"

    # Continue until exit.  The server sends a 'W' with no PID.
    # Bad GDB gave an error like below when target is nonstop:
    #  (gdb) c
    #  Continuing.
    #  No process or thread specified in stop reply: W00
    gdb_continue_to_end "" continue 1
}

# Disable different features within gdbserver:
#
# Tthread: Start GDBserver, with ";thread:NNN" in T stop replies disabled,
#          emulating old gdbservers when debugging single-threaded programs.
#
# T: Start GDBserver with the entire 'T' stop reply packet disabled,
#    GDBserver will instead send the 'S' stop reply.
#
# Also test both all-stop and non-stop variants of the remote
# protocol.
foreach_with_prefix target-non-stop {"off" "on"} {
    foreach_with_prefix to_disable { "" Tthread T } {
	run_test ${target-non-stop} $to_disable
    }
}
