consul/internal/dnsutil/dns_test.go

123 lines
3.0 KiB
Go

// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
package dnsutil
import (
"net"
"testing"
"github.com/stretchr/testify/require"
)
func TestValidLabel(t *testing.T) {
cases := map[string]bool{
"CrEaTeD": true,
"created": true,
"create-deleted": true,
"foo": true,
"": false,
"_foo_": false,
"-foo": false,
"foo-": false,
"-foo-": false,
"-foo-bar-": false,
"no spaces allowed": false,
"thisvaluecontainsalotofcharactersbutnottoomanyandthecaseisatrue": true, // 63 chars
"thisvaluecontainstoomanycharactersandisthusinvalidandtestisfalse": false, // 64 chars
}
t.Run("*", func(t *testing.T) {
t.Run("IsValidLabel", func(t *testing.T) {
require.False(t, IsValidLabel("*"))
})
t.Run("ValidateLabel", func(t *testing.T) {
require.Error(t, ValidateLabel("*"))
})
})
for name, expect := range cases {
t.Run(name, func(t *testing.T) {
t.Run("IsValidDNSLabel", func(t *testing.T) {
require.Equal(t, expect, IsValidLabel(name))
})
t.Run("ValidateLabel", func(t *testing.T) {
if expect {
require.NoError(t, ValidateLabel(name))
} else {
require.Error(t, ValidateLabel(name))
}
})
})
}
}
func TestDNSInvalidRegex(t *testing.T) {
tests := []struct {
desc string
in string
invalid bool
}{
{"Valid Hostname", "testnode", false},
{"Valid Hostname", "test-node", false},
{"Invalid Hostname with special chars", "test#$$!node", true},
{"Invalid Hostname with special chars in the end", "testnode%^", true},
{"Whitespace", " ", true},
{"Only special chars", "./$", true},
}
for _, test := range tests {
t.Run(test.desc, func(t *testing.T) {
if got, want := InvalidNameRe.MatchString(test.in), test.invalid; got != want {
t.Fatalf("Expected %v to return %v", test.in, want)
}
})
}
}
func Test_IPFromARPA(t *testing.T) {
testCases := []struct {
name string
input string
expected net.IP
}{
{
name: "valid ipv4",
input: "4.3.2.1.in-addr.arpa.",
expected: net.ParseIP("1.2.3.4"),
},
{
name: "valid ipv6",
input: "b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa",
expected: net.ParseIP("2001:db8::567:89ab"),
},
{
name: "invalid subdomain",
input: "4.3.2.1.addressplz.arpa",
},
{
name: "invalid ipv4 - invalid octet",
input: "277.3.2.1.in-addr.arpa",
},
{
name: "invalid ipv4 - too short",
input: "3.2.1.in-addr.arpa",
},
{
name: "invalid ipv6 - invalid hex char",
input: "x.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa",
},
{
name: "invalid ipv6 - too long",
input: "d.b.a.9.8.7.6.5.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
actual := IPFromARPA(tc.input)
require.Equal(t, tc.expected, actual)
})
}
}