| # This testcase is part of GDB, the GNU debugger. |
| |
| # Copyright 2017-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/>. |
| |
| if { [use_gdb_stub] } { |
| untested "skipping tests due to use_gdb_stub" |
| return |
| } |
| |
| standard_testfile |
| |
| if { [prepare_for_testing "failed to prepare" $testfile $srcfile debug] } { |
| return -1 |
| } |
| |
| # Test that tilde expansion works fine. |
| |
| proc_with_prefix test_tilde_expansion { } { |
| global decimal gdb_prompt hex |
| |
| gdb_test_no_output "set cwd ~/" "set inferior cwd to ~/ dir" |
| |
| if { ![runto_main] } { |
| return -1 |
| } |
| |
| gdb_breakpoint [gdb_get_line_number "break-here"] |
| gdb_continue_to_breakpoint "break-here" ".* break-here .*" |
| |
| set home "" |
| set test "print home var" |
| gdb_test_multiple "print home" $test { |
| -re "\\\$$decimal = $hex \"\(.+\)\"\r\n$gdb_prompt $" { |
| set home $expect_out(1,string) |
| pass $test |
| } |
| } |
| |
| if { $home == "" } { |
| untested "could not retrieve home var" |
| return |
| } |
| |
| set curdir "" |
| set test "print dir var" |
| gdb_test_multiple "print dir" $test { |
| -re "\\\$$decimal = \"\(.+\)\"\(, .*repeats.*\)?\r\n$gdb_prompt $" { |
| set curdir $expect_out(1,string) |
| pass $test |
| } |
| } |
| |
| if { $curdir == "" } { |
| untested "could not retrieve dir var" |
| return |
| } |
| |
| gdb_assert [string equal $curdir $home] \ |
| "successfully chdir'd into home" |
| } |
| |
| # The temporary directory that we will use to start the inferior. |
| set tmpdir [standard_output_file ""] |
| |
| # Test that when we "set cwd" the inferior will be started under the |
| # correct working directory and GDB will not be affected by this. |
| |
| proc_with_prefix test_cd_into_dir { } { |
| global decimal gdb_prompt tmpdir |
| |
| set gdb_cwd_before_run "" |
| set test "pwd before run" |
| gdb_test_multiple "pwd" $test { |
| -re "Working directory \(.*\)\.\r\n$gdb_prompt $" { |
| set gdb_cwd_before_run $expect_out(1,string) |
| pass $test |
| } |
| } |
| |
| if { $gdb_cwd_before_run == "" } { |
| untested "could not obtain GDB cwd before run" |
| return |
| } |
| |
| # This test only makes sense if $tmpdir != $gdb_cwd_before_run |
| if { ![gdb_assert ![string equal $tmpdir $gdb_cwd_before_run] \ |
| "make sure that tmpdir and GDB's cwd are different"] } { |
| return -1 |
| } |
| |
| gdb_test_no_output "set cwd $tmpdir" "set inferior cwd to temp dir" |
| |
| if { ![runto_main] } { |
| return -1 |
| } |
| |
| gdb_breakpoint [gdb_get_line_number "break-here"] |
| gdb_continue_to_breakpoint "break-here" ".* break-here .*" |
| |
| gdb_test "print dir" "\\\$$decimal = \"$tmpdir\", .*" \ |
| "inferior cwd is correctly set" |
| |
| set gdb_cwd_after_run "" |
| set test "pwd after run" |
| gdb_test_multiple "pwd" $test { |
| -re "Working directory \(.*\)\.\r\n$gdb_prompt $" { |
| set gdb_cwd_after_run $expect_out(1,string) |
| pass $test |
| } |
| } |
| |
| if { $gdb_cwd_after_run == "" } { |
| untested "could not obtain GDB cwd after run" |
| return |
| } |
| |
| gdb_assert [string equal $gdb_cwd_before_run $gdb_cwd_after_run] \ |
| "GDB cwd is unchanged after running inferior" |
| } |
| |
| # Test that executing "set cwd" without arguments will reset the |
| # inferior's cwd setting to its previous state. |
| |
| proc_with_prefix test_cwd_reset { } { |
| global decimal gdb_prompt tmpdir |
| |
| set gdb_cwd "" |
| set test "GDB cwd" |
| gdb_test_multiple "pwd" $test { |
| -re "Working directory \(.*\)\.\r\n$gdb_prompt $" { |
| set gdb_cwd $expect_out(1,string) |
| } |
| } |
| |
| if { $gdb_cwd == "" } { |
| untested "could not obtain GDB cwd" |
| return |
| } |
| |
| # This test only makes sense if $tmpdir != $gdb_cwd. |
| if { ![gdb_assert ![string equal $tmpdir $gdb_cwd] \ |
| "make sure that tmpdir and GDB's cwd are different"] } { |
| return -1 |
| } |
| |
| gdb_test_no_output "set cwd $tmpdir" "set inferior cwd to temp dir" |
| |
| with_test_prefix "running with set cwd" { |
| if { ![runto_main] } { |
| return -1 |
| } |
| } |
| |
| gdb_breakpoint [gdb_get_line_number "break-here"] |
| gdb_continue_to_breakpoint "break-here" ".* break-here .*" |
| |
| gdb_test "print dir" "\\\$$decimal = \"$tmpdir\", .*" \ |
| "inferior cwd is correctly set" |
| |
| # Reset the inferior's cwd. |
| gdb_test_no_output "set cwd" "resetting inferior cwd" |
| |
| with_test_prefix "running without set cwd" { |
| if { ![runto_main] } { |
| return -1 |
| } |
| } |
| |
| gdb_breakpoint [gdb_get_line_number "break-here"] |
| gdb_continue_to_breakpoint "break-here" ".* break-here .*" |
| |
| gdb_test "print dir" "\\\$$decimal = \"$gdb_cwd\", .*" \ |
| "inferior cwd got reset correctly" |
| } |
| |
| test_cd_into_dir |
| clean_restart $binfile |
| test_tilde_expansion |
| clean_restart $binfile |
| test_cwd_reset |