Split TestLoopbackHostPort into 2 tests

firstly, split into two tests: TestLoopbackHostPortIPv4 and  TestLoopbackHostPortIPv6.
then improve error handling, going to fail with explicit error message when run host
that does not support ipv6 or ipv4
k3s-v1.15.3
hui luo 2019-04-23 14:52:39 -07:00
parent 4b7c607ba4
commit 6b73b5031c
1 changed files with 40 additions and 3 deletions

View File

@ -21,7 +21,15 @@ import (
"testing"
)
func TestLoopbackHostPort(t *testing.T) {
func TestLoopbackHostPortIPv4(t *testing.T) {
_, ipv6only, err := isIPv6LoopbackSupported()
if err != nil {
t.Fatalf("fail to enumerate network interface, %s", err)
}
if ipv6only {
t.Fatalf("no ipv4 loopback interface")
}
host, port, err := LoopbackHostPort("1.2.3.4:443")
if err != nil {
t.Fatalf("unexpected error: %v", err)
@ -43,8 +51,17 @@ func TestLoopbackHostPort(t *testing.T) {
if port != "443" {
t.Fatalf("expected 443 as port, got %q", port)
}
}
func TestLoopbackHostPortIPv6(t *testing.T) {
ipv6, _, err := isIPv6LoopbackSupported()
if err != nil {
t.Fatalf("fail to enumerate network interface, %s", err)
}
if !ipv6 {
t.Fatalf("no ipv6 loopback interface")
}
host, port, err = LoopbackHostPort("[ff06:0:0:0:0:0:0:c3]:443")
host, port, err := LoopbackHostPort("[ff06:0:0:0:0:0:0:c3]:443")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
@ -62,8 +79,28 @@ func TestLoopbackHostPort(t *testing.T) {
if ip := net.ParseIP(host); ip == nil || !ip.IsLoopback() || ip.To4() != nil {
t.Fatalf("expected IPv6 host to be loopback, got %q", host)
}
if port != "443" {
t.Fatalf("expected 443 as port, got %q", port)
}
}
func isIPv6LoopbackSupported() (ipv6 bool, ipv6only bool, err error) {
addrs, err := net.InterfaceAddrs()
if err != nil {
return false, false, err
}
ipv4 := false
for _, address := range addrs {
ipnet, ok := address.(*net.IPNet)
if !ok || !ipnet.IP.IsLoopback() {
continue
}
if ipnet.IP.To4() == nil {
ipv6 = true
continue
}
ipv4 = true
}
ipv6only = ipv6 && !ipv4
return ipv6, ipv6only, nil
}