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

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

load_lib gdbserver-support.exp

standard_testfile

if { [skip_gdbserver_tests] } {
    return 0
}

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
