check / check (push) Successful in 1m11s
The watcher tests used a stand-in resolver and the resolver timeout test a stand-in DNS client, against the rule that DNS is never mocked. Watcher tests that look something up in DNS now run the real resolver against live servers, each attempt on a new watcher. A DNS change is tested by saving values live DNS never returns (names under .invalid, 192.0.2.1) in the state a check starts from, or by marking a real nameserver failed. The timeout test queries 192.0.2.1, where nothing answers. The live-DNS retry and concurrency limit moved from the resolver tests to internal/livedns, so both packages share them. NewFromLoggerWithClient had no other use and is gone. TESTING.md now states the README's rule. Model: opus-5-5
49 lines
975 B
Go
49 lines
975 B
Go
package resolver
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/miekg/dns"
|
|
)
|
|
|
|
// DNSClient sends one DNS message to a nameserver and returns the
|
|
// reply. The resolver holds one for UDP and one for TCP.
|
|
type DNSClient interface {
|
|
ExchangeContext(
|
|
ctx context.Context,
|
|
msg *dns.Msg,
|
|
addr string,
|
|
) (*dns.Msg, time.Duration, error)
|
|
}
|
|
|
|
// udpClient wraps a real dns.Client for production use.
|
|
type udpClient struct {
|
|
timeout time.Duration
|
|
}
|
|
|
|
func (c *udpClient) ExchangeContext(
|
|
ctx context.Context,
|
|
msg *dns.Msg,
|
|
addr string,
|
|
) (*dns.Msg, time.Duration, error) {
|
|
cl := &dns.Client{Timeout: c.timeout}
|
|
|
|
return cl.ExchangeContext(ctx, msg, addr)
|
|
}
|
|
|
|
// tcpClient wraps a real dns.Client using TCP.
|
|
type tcpClient struct {
|
|
timeout time.Duration
|
|
}
|
|
|
|
func (c *tcpClient) ExchangeContext(
|
|
ctx context.Context,
|
|
msg *dns.Msg,
|
|
addr string,
|
|
) (*dns.Msg, time.Duration, error) {
|
|
cl := &dns.Client{Net: "tcp", Timeout: c.timeout}
|
|
|
|
return cl.ExchangeContext(ctx, msg, addr)
|
|
}
|