linkerd2/controller/destination/resolver_test.go

111 lines
2.6 KiB
Go

package destination
import (
"fmt"
"reflect"
"testing"
"github.com/runconduit/conduit/controller/util"
common "github.com/runconduit/conduit/controller/gen/common"
)
func TestEchoIpV4Resolver(t *testing.T) {
somePort := 666
thingsThatAreIpV4s := []string{"127.0.0.1", "0.0.0.0", "200.0.12.12"}
thingsThatAreNotIpV4s := []string{"some.service.name", "example.org", "conduit.io", "1", "-",
"fe80::a0ca:e86c:898e:52d5%utun0", "::1"}
t.Run("Says it can resolve only if host is parseable as an IPv4", func(t *testing.T) {
resolver := &echoIpV4Resolver{}
for _, ip := range thingsThatAreIpV4s {
canResolve, err := resolver.canResolve(ip, somePort)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if !canResolve {
t.Fatalf("Expected IP resolver to resolve host [%s], but it couldnt", ip)
}
}
for _, ip := range thingsThatAreNotIpV4s {
canResolve, err := resolver.canResolve(ip, somePort)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
if canResolve {
t.Fatalf("Expected IPv4 resolver to NOT resolve host [%s], but it could", ip)
}
}
})
t.Run("Resolves by returning IP and port sent in as parameters until context is cancelled", func(t *testing.T) {
resolver := &echoIpV4Resolver{}
for _, expectedIpAdded := range thingsThatAreIpV4s {
done := make(chan bool, 1)
listener, cancelFn := newCollectUpdateListener()
go func() {
err := resolver.streamResolution(expectedIpAdded, somePort, listener)
done <- true
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
}()
cancelFn()
<-done
if len(listener.added) != 1 {
t.Fatalf("Expected added to contain 1 element, got: %v", listener.added)
}
actualTcpAddressAdded := listener.added[0]
expectedIp, err := util.ParseIPV4(expectedIpAdded)
if err != nil {
t.Fatalf("Unexpected error: %v", err)
}
expectedTcpAddressAdded := common.TcpAddress{
Ip: expectedIp,
Port: uint32(somePort),
}
if !reflect.DeepEqual(actualTcpAddressAdded, expectedTcpAddressAdded) {
t.Fatalf("Expected [%+v] added addresses for IPv4 resolver, got: %+v", expectedTcpAddressAdded, listener)
}
if len(listener.removed) != 0 {
t.Fatalf("Expected no removed addresses for IPv4 resolver, got: %+v", listener)
}
}
})
}
func TestIsIPAddress(t *testing.T) {
testCases := []struct {
host string
result bool
}{
{"8.8.8.8", true},
{"example.com", false},
}
for i, tc := range testCases {
t.Run(fmt.Sprintf("%d: %+v", i, tc.host), func(t *testing.T) {
isIP, _ := isIPAddress(tc.host)
if isIP != tc.result {
t.Fatalf("Unexpected result: %+v", isIP)
}
})
}
}