# This testcase is part of GDB, the GNU debugger.
#
# Copyright 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/>.

# 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
    }
}
