# Copyright 2024-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 . # Test cancellation of a "launch" command. require allow_dap_tests load_lib dap-support.exp # Anything will work, we aren't going to run it. standard_testfile sources.c if {[build_executable ${testfile}.exp $testfile $srcfile] == -1} { return } if {[dap_initialize] == ""} { return } set launch_id [dap_launch $testfile] # Set a breakpoint. This is done to ensure that the launch request is # definitely in the deferred state when we try to cancel it. set line [gdb_get_line_number "Distinguishing comment"] dap_check_request_and_response "set breakpoint by line number" \ setBreakpoints \ [format {o source [o path [%s]] breakpoints [a [o line [i %d]]]} \ [list s $srcfile] $line] set cancel_id [dap_send_request cancel \ [format {o requestId [i %d]} $launch_id]] dap_read_response cancel $cancel_id # The cancellation isn't actually processed until configurationDone is # sent. While this seems fine, it's unclear if gdb should be more # eager here and try to cancel a deferred task before it is # rescheduled. dap_check_request_and_response "configurationDone" configurationDone set resp [lindex [dap_read_response launch $launch_id] 0] gdb_assert {[dict get $resp success] == "false"} \ "launch failed" gdb_assert {[dict get $resp message] == "cancelled"} \ "launch cancelled" dap_shutdown