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

# Copyright 2016-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 GDB's ability to properly connect to GDBserver with no pre-opened
# symbol file.  If GDB is buggy, it will drop the connection when
# it attempts to open the symbol file indicated by GDBserver and fails.
#
# This test is only meaningful for standard remote connections.

load_lib gdbserver-support.exp

standard_testfile

if { [skip_gdbserver_tests] } {
    return 0
}

if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } {
    return -1
}

# Test connecting GDB to GDBserver without loading a symbol file.
#
# SYSROOT is the desired sysroot string
#
# ACTION is the action to perform to the symbol file on the target.
# It can be either "permission" to deny access to the file or "delete"
# to remove the file.
#
proc connect_no_symbol_file { sysroot action } {
    global binfile

    with_test_prefix "setup" {
	# Copy the symbol file to the target.
	gdb_remote_download target $binfile.bak $binfile 

	# Make sure we're disconnected, in case we're testing with an
	# extended-remote board, therefore already connected.
	gdb_test "disconnect" ".*"

	# Discard any symbol files that we have opened.
	gdb_test "file" ".*" "discard symbol table" \
	    {Discard symbol table from `.*'\? \(y or n\) } "y"

	# Set sysroot to something non-target and possibly also invalid so that
	# GDB is unable to open the symbol file.
	gdb_test_no_output "set sysroot $sysroot" "adjust sysroot"

	set target_exec [gdbserver_download_current_prog]

	# Start GDBserver.
	set res [gdbserver_start "" $target_exec]

	set gdbserver_protocol [lindex $res 0]
	set gdbserver_gdbport [lindex $res 1]

	# Perform test actions to the symbol file on the target.
	if { $action == "delete" } then {
	  remote_file target delete $binfile
	} elseif { $action == "permission" } {
	  remote_spawn target "chmod 000 $binfile"
	}
       
	# Connect to GDBserver.
	gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport
    }

    # Check if GDB succeeded connecting to GDBserver by attempting to detach
    # from the process.
    gdb_test "detach" \
	".*Detaching from program: , process.*Ending remote debugging.*" \
	"connection to GDBserver succeeded"
}

# Make sure we have the original symbol file in a safe place to copy from.
gdb_remote_download host $binfile $binfile.bak

# Run the test with different permutations.
foreach_with_prefix sysroot {"" "target:"} {
    foreach_with_prefix action {"permission" "delete"} {
	connect_no_symbol_file $sysroot $action
    }
}
