# 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 passing bad files to gdb.  PR symtab/17911

# Note: While we test for specific text in error messages,
# thus perhaps making the test host specific, if your host
# print different text then the plan is to update the expected text
# instead of making this test linux-only or some such.

# There is no such file, but we still use the normal mechanism to pick
# its name and path.
standard_testfile

gdb_exit
gdb_start

set test "non-existent file"
set bad_file $testfile
remote_file host delete $bad_file
gdb_test_multiple "file $bad_file" "$test" {
    -re "No such file or directory.\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

set test "directory"
set bad_file [standard_output_file {}]
remote_exec host "mkdir -p $bad_file"
gdb_test_multiple "file $bad_file" "$test" {
    -re "Is a directory.\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}

set test "neither file nor directory"
set bad_file "/dev/null"
gdb_test_multiple "file $bad_file" "$test" {
    -re "Invalid argument.\[\r\n\]+$gdb_prompt $" {
	pass $test
    }
}
