gatus/core/dns_test.go

129 lines
3.1 KiB
Go
Raw Normal View History

2020-11-18 00:55:31 +01:00
package core
import (
"testing"
"time"
2022-06-21 03:25:14 +02:00
"github.com/TwiN/gatus/v4/pattern"
2020-11-18 00:55:31 +01:00
)
func TestIntegrationQuery(t *testing.T) {
tests := []struct {
name string
inputDNS DNS
inputURL string
expectedDNSCode string
expectedBody string
2020-11-18 23:07:38 +01:00
isErrExpected bool
}{
{
name: "test DNS with type A",
inputDNS: DNS{
QueryType: "A",
2020-11-18 23:07:38 +01:00
QueryName: "example.com.",
},
inputURL: "1.1.1.1",
expectedDNSCode: "NOERROR",
expectedBody: "93.184.216.34",
},
{
name: "test DNS with type AAAA",
inputDNS: DNS{
QueryType: "AAAA",
2020-11-18 23:07:38 +01:00
QueryName: "example.com.",
},
inputURL: "1.1.1.1",
expectedDNSCode: "NOERROR",
expectedBody: "2606:2800:220:1:248:1893:25c8:1946",
},
{
name: "test DNS with type CNAME",
inputDNS: DNS{
QueryType: "CNAME",
QueryName: "en.wikipedia.org.",
},
inputURL: "1.1.1.1",
expectedDNSCode: "NOERROR",
expectedBody: "dyna.wikimedia.org.",
},
{
name: "test DNS with type MX",
inputDNS: DNS{
QueryType: "MX",
2020-11-18 23:07:38 +01:00
QueryName: "example.com.",
},
inputURL: "1.1.1.1",
expectedDNSCode: "NOERROR",
expectedBody: ".",
},
{
name: "test DNS with type NS",
inputDNS: DNS{
QueryType: "NS",
2020-11-18 23:07:38 +01:00
QueryName: "example.com.",
},
inputURL: "1.1.1.1",
expectedDNSCode: "NOERROR",
expectedBody: "*.iana-servers.net.",
},
2020-11-18 23:07:38 +01:00
{
name: "test DNS with fake type and retrieve error",
inputDNS: DNS{
QueryType: "B",
QueryName: "example",
2020-11-18 23:07:38 +01:00
},
inputURL: "1.1.1.1",
2020-11-18 23:07:38 +01:00
isErrExpected: true,
},
2020-11-18 00:55:31 +01:00
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
dns := test.inputDNS
result := &Result{}
dns.query(test.inputURL, result)
2020-11-18 23:07:38 +01:00
if test.isErrExpected && len(result.Errors) == 0 {
t.Errorf("there should be errors")
}
if result.DNSRCode != test.expectedDNSCode {
t.Errorf("expected DNSRCode to be %s, got %s", test.expectedDNSCode, result.DNSRCode)
}
if test.inputDNS.QueryType == "NS" {
// Because there are often multiple nameservers backing a single domain, we'll only look at the suffix
if !pattern.Match(test.expectedBody, string(result.body)) {
t.Errorf("got %s, expected result %s,", string(result.body), test.expectedBody)
}
} else {
if string(result.body) != test.expectedBody {
t.Errorf("got %s, expected result %s,", string(result.body), test.expectedBody)
}
}
})
time.Sleep(5 * time.Millisecond)
2020-11-18 00:55:31 +01:00
}
}
2020-11-18 00:55:31 +01:00
func TestEndpoint_ValidateAndSetDefaultsWithNoDNSQueryName(t *testing.T) {
defer func() { recover() }()
dns := &DNS{
QueryType: "A",
QueryName: "",
2020-11-18 00:55:31 +01:00
}
2021-05-19 05:27:43 +02:00
err := dns.validateAndSetDefault()
if err == nil {
t.Fatal("Should've returned an error because endpoint's dns didn't have a query name, which is a mandatory field for dns")
2021-05-19 05:27:43 +02:00
}
}
2020-11-18 00:55:31 +01:00
func TestEndpoint_ValidateAndSetDefaultsWithInvalidDNSQueryType(t *testing.T) {
defer func() { recover() }()
dns := &DNS{
QueryType: "B",
QueryName: "example.com",
2020-11-18 00:55:31 +01:00
}
2021-05-19 05:27:43 +02:00
err := dns.validateAndSetDefault()
if err == nil {
t.Fatal("Should've returned an error because endpoint's dns query type is invalid, it needs to be a valid query name like A, AAAA, CNAME...")
2021-05-19 05:27:43 +02:00
}
2020-11-18 00:55:31 +01:00
}