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  }