# Copyright 2025 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 DAP "threads" request.

require allow_shlib_tests allow_dap_tests

load_lib dap-support.exp

standard_testfile

set libname $testfile-solib
set srcfile_lib $srcdir/$subdir/$libname.c
set binfile_lib [standard_output_file $libname.so]

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

if {[dap_initialize] == ""} {
    return
}

set launch_id [dap_launch $testfile]

set obj [dap_check_request_and_response "set breakpoint on all_started function" \
	     setFunctionBreakpoints \
	     {o breakpoints [a [o name [s all_started]]]}]
set fn_bpno [dap_get_breakpoint_number $obj]

dap_check_request_and_response "configurationDone" configurationDone

dap_check_response "launch response" launch $launch_id

lassign [dap_wait_for_event_and_check "stopped at function breakpoint" \
	     stopped \
	     "body reason" breakpoint \
	     "body hitBreakpointIds" $fn_bpno] \
    ignore \
    all_events

# Verify that we saw the correct number of thread events.
set count 0
foreach event $all_events {
    if {[dict get $event type] == "event"
	&& [dict get $event event] == "thread"
	&& [dict get $event body reason] == "started"} {
	incr count
    }
}
gdb_assert {$count == 3} "correct number of thread events"

dap_check_request_and_response "continue" continue \
    {o threadId [i 1]}

# Make sure that the inferior has really re-started -- note that there
# is no "continue" event, because the "continue" request suppresses
# those.
dap_wait_for_event_and_check "output from inferior" output \
    {body output} "sleeping\\n"

lassign [dap_check_request_and_response "threads request" threads] \
    response ignore

gdb_assert {[llength [dict get $response body threads]] == 3} \
    "correct number of threads"

dap_shutdown true
