proc setup {} { save_env # NOTE: Changing dir to $SRCDIR is necessary because file locations in the # ssh config files (e.g. UserKnownHostsFile) are relative to $SRCDIR. assert_bash_exec {cd $SRCDIR/fixtures/ssh} } proc teardown {} { assert_bash_exec {cd $TESTDIR} assert_env_unmodified { /BASH_LINENO=/d /BASH_SOURCE=/d /OLDPWD=/d } } setup set test "Tab should complete both commands and hostname" # Try completion set cmd "ssh -F config ls" send "$cmd\t" set expected "^$cmd\r\n.*ls.*ls_known_host.*\r\n/@$cmd$" expect { -re $expected { pass "$test" } -re /@ { unresolved "$test at prompt" } default { unresolved "$test" } } sync_after_int set test "-F without space shouldn't error" # Try completion set cmd "ssh -F" send "$cmd\t " set expected "^$cmd $" expect { -re "^${cmd}bash: option requires an argument -- F" { fail "$test" } -re "^$cmd\r\n.*\r\n/@" { pass "$test" } -re /@ { unresolved "$test at prompt" } default { unresolved "$test" } } sync_after_int set test "First argument shouldn't complete with commands" # NOTE: This test assumes there's a command "bash" and no host named "bash" set cmd "ssh bas" assert_complete [get_known_hosts "bas"] $cmd $test sync_after_int set test "First argument should complete partial hostname" # Build string list of hostnames, starting with the character of the first # host, unless host starts with a COMP_WORDBREAKS character, e.g. a colon (:). # Hosts starting with a COMP_WORDBREAKS character are left out because these # are exceptional cases, requiring specific tests. set hosts {} set char "" foreach h [get_known_hosts] { set first [string range $h 0 0] if {$char == "" && [string first $first $::COMP_WORDBREAKS] == -1} {set char $first} if {$char != ""} { # Only append unique hostnames starting with $char if {$first == $char && [lsearch -exact $hosts "$h"] == -1} { lappend hosts "$h" } } } assert_complete $hosts "ssh $char" $test -ltrim-colon-completions -expect-cmd-minus "$char" sync_after_int set test "-F should complete filename" assert_complete "-Fspaced\\ \\ conf" "ssh -Fsp" $test sync_after_int teardown