github.com/letsencrypt/boulder@v0.20251208.0/bdns/problem_test.go (about) 1 package bdns 2 3 import ( 4 "context" 5 "errors" 6 "net" 7 "net/url" 8 "testing" 9 10 "github.com/letsencrypt/boulder/test" 11 "github.com/miekg/dns" 12 ) 13 14 func TestError(t *testing.T) { 15 testCases := []struct { 16 err error 17 expected string 18 }{ 19 { 20 &Error{dns.TypeA, "hostname", makeTimeoutError(), -1, nil}, 21 "DNS problem: query timed out looking up A for hostname", 22 }, { 23 &Error{dns.TypeMX, "hostname", &net.OpError{Err: errors.New("some net error")}, -1, nil}, 24 "DNS problem: networking error looking up MX for hostname", 25 }, { 26 &Error{dns.TypeTXT, "hostname", nil, dns.RcodeNameError, nil}, 27 "DNS problem: NXDOMAIN looking up TXT for hostname - check that a DNS record exists for this domain", 28 }, { 29 &Error{dns.TypeTXT, "hostname", context.DeadlineExceeded, -1, nil}, 30 "DNS problem: query timed out looking up TXT for hostname", 31 }, { 32 &Error{dns.TypeTXT, "hostname", context.Canceled, -1, nil}, 33 "DNS problem: query timed out (and was canceled) looking up TXT for hostname", 34 }, { 35 &Error{dns.TypeCAA, "hostname", nil, dns.RcodeServerFailure, nil}, 36 "DNS problem: SERVFAIL looking up CAA for hostname - the domain's nameservers may be malfunctioning", 37 }, { 38 &Error{dns.TypeA, "hostname", nil, dns.RcodeServerFailure, &dns.EDNS0_EDE{InfoCode: 1, ExtraText: "oh no"}}, 39 "DNS problem: looking up A for hostname: DNSSEC: Unsupported DNSKEY Algorithm: oh no", 40 }, { 41 &Error{dns.TypeA, "hostname", nil, dns.RcodeServerFailure, &dns.EDNS0_EDE{InfoCode: 6, ExtraText: ""}}, 42 "DNS problem: looking up A for hostname: DNSSEC: Bogus", 43 }, { 44 &Error{dns.TypeA, "hostname", nil, dns.RcodeServerFailure, &dns.EDNS0_EDE{InfoCode: 1337, ExtraText: "mysterious"}}, 45 "DNS problem: looking up A for hostname: Unknown Extended DNS Error code 1337: mysterious", 46 }, { 47 &Error{dns.TypeCAA, "hostname", nil, dns.RcodeServerFailure, nil}, 48 "DNS problem: SERVFAIL looking up CAA for hostname - the domain's nameservers may be malfunctioning", 49 }, { 50 &Error{dns.TypeCAA, "hostname", nil, dns.RcodeServerFailure, nil}, 51 "DNS problem: SERVFAIL looking up CAA for hostname - the domain's nameservers may be malfunctioning", 52 }, { 53 &Error{dns.TypeA, "hostname", nil, dns.RcodeFormatError, nil}, 54 "DNS problem: FORMERR looking up A for hostname", 55 }, { 56 &Error{dns.TypeA, "hostname", &url.Error{Op: "GET", URL: "https://example.com/", Err: dohTimeoutError{}}, -1, nil}, 57 "DNS problem: query timed out looking up A for hostname", 58 }, 59 } 60 for _, tc := range testCases { 61 if tc.err.Error() != tc.expected { 62 t.Errorf("got %q, expected %q", tc.err.Error(), tc.expected) 63 } 64 } 65 } 66 67 type dohTimeoutError struct{} 68 69 func (dohTimeoutError) Error() string { 70 return "doh no" 71 } 72 73 func (dohTimeoutError) Timeout() bool { 74 return true 75 } 76 77 func TestWrapErr(t *testing.T) { 78 err := wrapErr(dns.TypeA, "hostname", &dns.Msg{ 79 MsgHdr: dns.MsgHdr{Rcode: dns.RcodeSuccess}, 80 }, nil) 81 test.AssertNotError(t, err, "expected success") 82 83 err = wrapErr(dns.TypeA, "hostname", &dns.Msg{ 84 MsgHdr: dns.MsgHdr{Rcode: dns.RcodeRefused}, 85 }, nil) 86 test.AssertError(t, err, "expected error") 87 88 err = wrapErr(dns.TypeA, "hostname", &dns.Msg{ 89 MsgHdr: dns.MsgHdr{Rcode: dns.RcodeSuccess}, 90 }, errors.New("oh no")) 91 test.AssertError(t, err, "expected error") 92 }