# This testcase is part of GDB, the GNU debugger.

# Copyright 2015-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 starting gdbserver passing it the name of a non-existing
# program.

load_lib gdbserver-support.exp

standard_testfile

require allow_gdbserver_tests

set gdbserver [find_gdbserver]
if { $gdbserver == "" } {
    fail "could not find gdbserver"
    return
}

# Fire off gdbserver.  The port doesn't really matter, gdbserver tries
# to spawn the program before opening the connection.
set spawn_id [remote_spawn target "$gdbserver stdio non-existing-program"]

set eol {[\r\n]}

set msg "gdbserver exits cleanly"
set saw_exiting 0
expect {
    # This is what we get on ptrace-based targets with
    # startup-with-shell disabled (e.g., when the SHELL variable is
    # unset).
    -re "stdin/stdout redirected.*gdbserver: Cannot exec non-existing-program\r\ngdbserver: Error: No such file or directory\r\n\r\nDuring startup program exited with code 127\.\r\nExiting\r\n" {
	set saw_exiting 1
	exp_continue
    }
    # Likewise, but with startup-with-shell enabled, which is the
    # default behavior.
    -re "stdin/stdout redirected.*exec: non-existing-program: not found\r\nDuring startup program exited with code 127\.\r\nExiting\r\n" {
	set saw_exiting 1
	exp_continue
    }
    # This is what we get on Windows.
    -re "Error creating process.*$eol+Exiting$eol+" {
	set saw_exiting 1
	exp_continue
    }
    -re "A problem internal to GDBserver has been detected" {
	fail "$msg (GDBserver internal error)"
	wait
    }
    eof {
	gdb_assert $saw_exiting $msg
	wait
    }
    timeout {
	fail "$msg (timeout)"
    }
}

# expect defaults to spawn_id in many places.  Avoid confusing any
# following code.
unset spawn_id
