summaryrefslogtreecommitdiffstats
path: root/test/t/unit/test_unit_known_hosts.py
diff options
context:
space:
mode:
Diffstat (limited to 'test/t/unit/test_unit_known_hosts.py')
-rw-r--r--test/t/unit/test_unit_known_hosts.py155
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