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

# Copyright 2015-2023 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 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 behaviour.
    -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\r\n\r\nExiting\r\n" {
	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
