diff options
Diffstat (limited to 'test/t/unit/test_unit_known_hosts.py')
-rw-r--r-- | test/t/unit/test_unit_known_hosts.py | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/test/t/unit/test_unit_known_hosts.py b/test/t/unit/test_unit_known_hosts.py new file mode 100644 index 0000000..b0f715b --- /dev/null +++ b/test/t/unit/test_unit_known_hosts.py @@ -0,0 +1,155 @@ +from itertools import chain + +import pytest + +from conftest import assert_bash_exec, bash_env_saved + + +@pytest.mark.bashcomp( + cmd=None, + ignore_env="^[+-](COMPREPLY|BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE)=", +) +class TestUnitCompgenKnownHosts: + @pytest.mark.parametrize( + "prefix,colon_flag,hostfile", + [("", "", True), ("", "", False), ("user@", "c", True)], + ) + def test_basic( + self, bash, hosts, avahi_hosts, prefix, colon_flag, hostfile + ): + expected = ( + "%s%s%s" % (prefix, x, ":" if colon_flag else "") + for x in chain( + hosts if hostfile else avahi_hosts, + # fixtures/_known_hosts/config + "gee hus jar #not-a-comment".split(), + # fixtures/_known_hosts/known_hosts + ( + "doo", + "ike", + "jub", + "10.0.0.1", + "kyl", + "100.0.0.2", + "10.10.0.3", + "blah", + "fd00:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:5555", + "fe80::123:0xff:dead:beef%eth0", + "1111:2222:3333:4444:5555:6666:xxxx:abab", + "11xx:2222:3333:4444:5555:6666:xxxx:abab", + "::42", + ), + ) + ) + assert_bash_exec( + bash, + "unset -v BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE" + if hostfile + else "BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE=", + ) + output = assert_bash_exec( + bash, + "_comp_compgen_known_hosts -a%sF _known_hosts/config '%s'; " + r'printf "%%s\n" "${COMPREPLY[@]}"; unset -v COMPREPLY' + % (colon_flag, prefix), + want_output=True, + ) + assert sorted(set(output.split())) == sorted(expected) + + @pytest.mark.parametrize( + "family,result", + ( + ("4", "127.0.0.1 localhost"), + ("6", "::1 localhost"), + ("46", "localhost"), + ), + ) + def test_ip_filtering(self, bash, family, result): + assert_bash_exec( + bash, + "unset -v COMPREPLY BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE", + ) + output = assert_bash_exec( + bash, + "BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE= " + "_comp_compgen_known_hosts -%sF _known_hosts/localhost_config ''; " + r'printf "%%s\n" "${COMPREPLY[@]}"' % family, + want_output=True, + ) + assert sorted(set(output.strip().split())) == sorted(result.split()) + + def test_consecutive_spaces(self, bash, hosts): + expected = hosts.copy() + # fixtures/_known_hosts/spaced conf + expected.extend("gee hus #not-a-comment".split()) + # fixtures/_known_hosts/known_hosts2 + expected.extend("two two2 two3 two4".split()) + # fixtures/_known_hosts_/spaced known_hosts + expected.extend("doo ike".split()) + + output = assert_bash_exec( + bash, + "unset -v COMPREPLY BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE; " + "_comp_compgen_known_hosts -aF '_known_hosts/spaced conf' ''; " + r'printf "%s\n" "${COMPREPLY[@]}"', + want_output=True, + ) + assert sorted(set(output.strip().split())) == sorted(expected) + + def test_files_starting_with_tilde(self, bash, hosts): + expected = hosts.copy() + # fixtures/_known_hosts/known_hosts2 + expected.extend("two two2 two3 two4".split()) + # fixtures/_known_hosts/known_hosts3 + expected.append("three") + # fixtures/_known_hosts/known_hosts4 + expected.append("four") + + with bash_env_saved(bash) as bash_env: + bash_env.write_variable("HOME", bash.cwd) + output = assert_bash_exec( + bash, + "unset -v COMPREPLY BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE;" + " _comp_compgen_known_hosts -aF _known_hosts/config_tilde ''; " + r'printf "%s\n" "${COMPREPLY[@]}"', + want_output=True, + ) + + assert sorted(set(output.strip().split())) == sorted(expected) + + def test_included_configs(self, bash, hosts): + expected = hosts.copy() + # fixtures/_known_hosts/config_include_recursion + expected.append("recursion") + # fixtures/_known_hosts/.ssh/config_relative_path + expected.append("relative_path") + # fixtures/_known_hosts/.ssh/config_asterisk_* + expected.extend("asterisk_1 asterisk_2".split()) + # fixtures/_known_hosts/.ssh/config_question_mark + expected.append("question_mark") + + with bash_env_saved(bash) as bash_env: + bash_env.write_variable("HOME", "%s/_known_hosts" % bash.cwd) + output = assert_bash_exec( + bash, + "unset -v COMPREPLY BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE;" + " _comp_compgen_known_hosts -aF _known_hosts/config_include ''; " + r'printf "%s\n" "${COMPREPLY[@]}"', + want_output=True, + ) + assert sorted(set(output.strip().split())) == sorted(expected) + + def test_no_globbing(self, bash): + with bash_env_saved(bash) as bash_env: + bash_env.write_variable("HOME", "%s/_known_hosts" % bash.cwd) + bash_env.chdir("_known_hosts") + output = assert_bash_exec( + bash, + "unset -v COMPREPLY BASH_COMPLETION_KNOWN_HOSTS_WITH_HOSTFILE;" + " _comp_compgen_known_hosts -aF config ''; " + r'printf "%s\n" "${COMPREPLY[@]}"', + want_output=True, + ) + completion = sorted(set(output.strip().split())) + assert "gee" in completion + assert "gee-filename-canary" not in completion |