mirror of
https://github.com/AdguardTeam/dnsproxy.git
synced 2026-10-12 02:01:26 +00:00
Pull request #408: ADG-8967-upd-golibs
Merge in GO/dnsproxy from ADG-8967-upd-golibs to master Squashed commit of the following: commit 4d65445abc60d8c64ffdedd24006f78f2d9abcba Author: f.setrakov <[email protected]> Date: Wed Oct 8 13:16:53 2025 +0300 all: rm default loggers commit 06be98ffdcbcabefd2f178f029c244ccd5244be7 Author: f.setrakov <[email protected]> Date: Tue Oct 7 19:07:59 2025 +0300 all: imp tests, upd golibs to tag commit e5894f62069324f017aba158b78eeca6d0da028f Author: f.setrakov <[email protected]> Date: Tue Oct 7 09:48:55 2025 +0300 upstream: imp tests commit 8e68b3987ede2633a471574a6841f45af938d2bd Author: f.setrakov <[email protected]> Date: Fri Oct 3 19:17:18 2025 +0300 all: upd golibs
This commit is contained in:
@@ -3,7 +3,7 @@ module github.com/AdguardTeam/dnsproxy
|
||||
go 1.25.1
|
||||
|
||||
require (
|
||||
github.com/AdguardTeam/golibs v0.34.1
|
||||
github.com/AdguardTeam/golibs v0.35.0
|
||||
github.com/ameshkov/dnscrypt/v2 v2.4.0
|
||||
github.com/ameshkov/dnsstamps v1.0.3
|
||||
github.com/beefsack/go-rate v0.0.0-20220214233405-116f4ca011a0
|
||||
@@ -14,7 +14,7 @@ require (
|
||||
// when TestUpstreamDoH_serverRestart/http3/second_try keeps failing.
|
||||
github.com/quic-go/quic-go v0.53.0
|
||||
github.com/stretchr/testify v1.11.1
|
||||
golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect
|
||||
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b // indirect
|
||||
golang.org/x/net v0.44.0
|
||||
golang.org/x/sys v0.36.0
|
||||
gonum.org/v1/gonum v0.16.0
|
||||
|
||||
@@ -4,8 +4,12 @@ cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI=
|
||||
cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ=
|
||||
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
|
||||
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
|
||||
github.com/AdguardTeam/golibs v0.34.1 h1:RyBpZiXnJqlO3T+xjWldlxsEZDelmaFfKvXiJHDZZFQ=
|
||||
github.com/AdguardTeam/golibs v0.34.1/go.mod h1:K4C2EbfSEM1zY5YXoti9SfbTAHN/kIX97LpDtCwORrM=
|
||||
github.com/AdguardTeam/golibs v0.34.2-0.20251002170933-067fe882809b h1:qHsD0KwCAK4gDmobKpDyacAfscWJ6Ii392uc0DkRo6o=
|
||||
github.com/AdguardTeam/golibs v0.34.2-0.20251002170933-067fe882809b/go.mod h1:y552twxCtvOD8KKQ7ESjo10KZBAE+HSj24yAuAvz9IA=
|
||||
github.com/AdguardTeam/golibs v0.34.2-0.20251003135644-84486c1440c1 h1:2lQwC1hZq2b9zbu279+YgkBTTsOlYWWQR9Q0Cr+5vWg=
|
||||
github.com/AdguardTeam/golibs v0.34.2-0.20251003135644-84486c1440c1/go.mod h1:y552twxCtvOD8KKQ7ESjo10KZBAE+HSj24yAuAvz9IA=
|
||||
github.com/AdguardTeam/golibs v0.35.0 h1:O990+tbZ5W5yB0ybtaUJy4FUb0bXxyzeUC7t8cr1pCg=
|
||||
github.com/AdguardTeam/golibs v0.35.0/go.mod h1:y552twxCtvOD8KKQ7ESjo10KZBAE+HSj24yAuAvz9IA=
|
||||
github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
|
||||
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
|
||||
@@ -137,8 +141,8 @@ go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
|
||||
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
|
||||
golang.org/x/crypto v0.42.0 h1:chiH31gIWm57EkTXpwnqf8qeuMUi0yekh6mT2AvFlqI=
|
||||
golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8=
|
||||
golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 h1:SbTAbRFnd5kjQXbczszQ0hdk3ctwYf3qBNH9jIsGclE=
|
||||
golang.org/x/exp v0.0.0-20250813145105-42675adae3e6/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
|
||||
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b h1:DXr+pvt3nC887026GRP39Ej11UATqWDmWuS99x26cD0=
|
||||
golang.org/x/exp v0.0.0-20250819193227-8b4c13bb791b/go.mod h1:4QTo5u+SEIbbKW1RacMZq1YEfOBqeXa19JeshGi+zc4=
|
||||
golang.org/x/exp/typeparams v0.0.0-20250911091902-df9299821621 h1:Yl4H5w2RV7L/dvSHp2GerziT5K2CORgFINPaMFxWGWw=
|
||||
golang.org/x/exp/typeparams v0.0.0-20250911091902-df9299821621/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms=
|
||||
golang.org/x/mod v0.28.0 h1:gQBtGhjxykdjY9YhZpSlZIsbnaE2+PgjfLWUQTnoZ1U=
|
||||
|
||||
+11
-4
@@ -39,7 +39,7 @@ func createProxyConfig(
|
||||
return nil, err
|
||||
}
|
||||
|
||||
hosts, err := handler.ReadHosts(hostsFiles)
|
||||
hosts, err := handler.ReadHosts(ctx, l, hostsFiles)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("reading hosts files: %w", err)
|
||||
}
|
||||
@@ -228,7 +228,7 @@ func initBootstrap(
|
||||
|
||||
switch len(resolvers) {
|
||||
case 0:
|
||||
etcHosts, hostsErr := upstream.NewDefaultHostsResolver(osutil.RootDirFS(), l)
|
||||
etcHosts, hostsErr := upstream.NewDefaultHostsResolver(ctx, osutil.RootDirFS(), l)
|
||||
if hostsErr != nil {
|
||||
l.ErrorContext(ctx, "creating default hosts resolver", slogutil.KeyError, hostsErr)
|
||||
|
||||
@@ -268,7 +268,11 @@ func (conf *configuration) initEDNS(
|
||||
}
|
||||
|
||||
// initBogusNXDomain inits BogusNXDomain structure.
|
||||
func (conf *configuration) initBogusNXDomain(ctx context.Context, l *slog.Logger, config *proxy.Config) {
|
||||
func (conf *configuration) initBogusNXDomain(
|
||||
ctx context.Context,
|
||||
l *slog.Logger,
|
||||
config *proxy.Config,
|
||||
) {
|
||||
if len(conf.BogusNXDomain) == 0 {
|
||||
return
|
||||
}
|
||||
@@ -507,7 +511,10 @@ func loadServersList(sources []string) []string {
|
||||
|
||||
// hostsFiles returns the list of hosts files to resolve from. It's empty if
|
||||
// resolving from hosts files is disabled.
|
||||
func (conf *configuration) hostsFiles(ctx context.Context, l *slog.Logger) (paths []string, err error) {
|
||||
func (conf *configuration) hostsFiles(
|
||||
ctx context.Context,
|
||||
l *slog.Logger,
|
||||
) (paths []string, err error) {
|
||||
if !conf.HostsFileEnabled {
|
||||
l.DebugContext(ctx, "hosts files are disabled")
|
||||
|
||||
|
||||
@@ -20,6 +20,9 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// testLogger is a common logger for tests.
|
||||
var testLogger = slogutil.NewDiscardLogger()
|
||||
|
||||
// TODO(e.burkov): Remove when [hostsfile.DefaultStorage] stops using [log].
|
||||
func TestMain(m *testing.M) {
|
||||
testutil.DiscardLogOutput(m)
|
||||
@@ -87,7 +90,8 @@ func TestDefault_resolveFromHosts(t *testing.T) {
|
||||
absPath, err := filepath.Abs(path.Join("testdata", t.Name(), "hosts"))
|
||||
require.NoError(t, err)
|
||||
|
||||
strg, err := ReadHosts([]string{absPath, relPath})
|
||||
ctx := testutil.ContextWithTimeout(t, defaultTimeout)
|
||||
strg, err := ReadHosts(ctx, testLogger, []string{absPath, relPath})
|
||||
require.NoError(t, err)
|
||||
|
||||
hdlr := NewDefault(&DefaultConfig{
|
||||
@@ -185,7 +189,6 @@ func TestDefault_resolveFromHosts(t *testing.T) {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
ctx := testutil.ContextWithTimeout(t, defaultTimeout)
|
||||
resp := hdlr.resolveFromHosts(ctx, tc.req)
|
||||
if tc.wantAns == nil {
|
||||
assert.Nil(t, resp)
|
||||
|
||||
@@ -3,6 +3,7 @@ package handler
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"log/slog"
|
||||
"net/netip"
|
||||
"os"
|
||||
"slices"
|
||||
@@ -35,13 +36,19 @@ func (emptyStorage) ByName(_ string) (addrs []netip.Addr) {
|
||||
|
||||
// ReadHosts reads the hosts files from the file system and returns a storage
|
||||
// with parsed records. strg is always usable even if an error occurred.
|
||||
func ReadHosts(paths []string) (strg hostsfile.Storage, err error) {
|
||||
func ReadHosts(
|
||||
ctx context.Context,
|
||||
l *slog.Logger,
|
||||
paths []string,
|
||||
) (strg hostsfile.Storage, err error) {
|
||||
// Don't check the error since it may only appear when any readers used.
|
||||
defaultStrg, _ := hostsfile.NewDefaultStorage()
|
||||
defaultStrg, _ := hostsfile.NewDefaultStorage(ctx, &hostsfile.DefaultStorageConfig{
|
||||
Logger: l,
|
||||
})
|
||||
|
||||
var errs []error
|
||||
for _, path := range paths {
|
||||
err = readHostsFile(defaultStrg, path)
|
||||
err = readHostsFile(ctx, defaultStrg, path)
|
||||
if err != nil {
|
||||
// Don't wrap the error since it's informative enough as is.
|
||||
errs = append(errs, err)
|
||||
@@ -64,7 +71,7 @@ func ReadHosts(paths []string) (strg hostsfile.Storage, err error) {
|
||||
}
|
||||
|
||||
// readHostsFile reads the hosts file at path and parses it into strg.
|
||||
func readHostsFile(strg *hostsfile.DefaultStorage, path string) (err error) {
|
||||
func readHostsFile(ctx context.Context, strg *hostsfile.DefaultStorage, path string) (err error) {
|
||||
// #nosec G304 -- Trust the file path from the configuration file.
|
||||
f, err := os.Open(path)
|
||||
if err != nil {
|
||||
@@ -74,7 +81,7 @@ func readHostsFile(strg *hostsfile.DefaultStorage, path string) (err error) {
|
||||
|
||||
defer func() { err = errors.WithDeferred(err, f.Close()) }()
|
||||
|
||||
err = hostsfile.Parse(strg, f, nil)
|
||||
err = hostsfile.Parse(ctx, strg, f, nil)
|
||||
if err != nil {
|
||||
return fmt.Errorf("parsing hosts file %q: %w", path, err)
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AdguardTeam/golibs/errors"
|
||||
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
||||
"github.com/AdguardTeam/golibs/netutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/ameshkov/dnscrypt/v2"
|
||||
@@ -45,7 +44,7 @@ func startTestDNSCryptServer(
|
||||
ProviderName: rc.ProviderName,
|
||||
ResolverCert: cert,
|
||||
Handler: h,
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
}
|
||||
testutil.CleanupAndRequireSuccess(tb, func() (err error) {
|
||||
ctx, cancel := context.WithTimeout(context.Background(), timeout)
|
||||
@@ -95,7 +94,7 @@ func TestUpstreamDNSCrypt(t *testing.T) {
|
||||
// AdGuard DNS (DNSCrypt)
|
||||
address := "sdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20"
|
||||
u, err := AddressToUpstream(address, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: dialTimeout,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -141,7 +140,7 @@ func TestDNSCrypt_Exchange_truncated(t *testing.T) {
|
||||
srvStamp := startTestDNSCryptServer(t, rc, h)
|
||||
|
||||
u, err := AddressToUpstream(srvStamp.String(), &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: timeout,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -173,7 +172,7 @@ func TestDNSCrypt_Exchange_deadline(t *testing.T) {
|
||||
|
||||
// Use a shorter timeout to speed up the test.
|
||||
u, err := AddressToUpstream(srvStamp.String(), &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: 100 * time.Millisecond,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -204,7 +203,7 @@ func TestDNSCrypt_Exchange_dialFail(t *testing.T) {
|
||||
|
||||
// Use a shorter timeout to speed up the test.
|
||||
u, err = AddressToUpstream(srvStamp.String(), &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: 100 * time.Millisecond,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -227,7 +226,7 @@ func TestDNSCrypt_Exchange_dialFail(t *testing.T) {
|
||||
|
||||
// Use a shorter timeout to speed up the test.
|
||||
u, err = AddressToUpstream(srvStamp.String(), &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: 100 * time.Millisecond,
|
||||
VerifyDNSCryptCertificate: func(cert *dnscrypt.Cert) (err error) {
|
||||
return validationErr
|
||||
|
||||
@@ -15,7 +15,6 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/miekg/dns"
|
||||
"github.com/quic-go/quic-go"
|
||||
@@ -77,7 +76,7 @@ func TestUpstreamDoH(t *testing.T) {
|
||||
|
||||
var lastState tls.ConnectionState
|
||||
opts := &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
HTTPVersions: tc.httpVersions,
|
||||
VerifyConnection: func(state tls.ConnectionState) (err error) {
|
||||
@@ -186,7 +185,7 @@ func TestUpstreamDoH_raceReconnect(t *testing.T) {
|
||||
// race test.
|
||||
address := fmt.Sprintf("https://%s/dns-query", srv.addr)
|
||||
opts := &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
HTTPVersions: tc.httpVersions,
|
||||
Timeout: timeout,
|
||||
@@ -232,7 +231,7 @@ func TestUpstreamDoH_serverRestart(t *testing.T) {
|
||||
|
||||
var err error
|
||||
u, err = AddressToUpstream(upsAddr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
HTTPVersions: tc.httpVersions,
|
||||
Timeout: 100 * time.Millisecond,
|
||||
@@ -281,7 +280,7 @@ func TestUpstreamDoH_0RTT(t *testing.T) {
|
||||
tracer := &quicTracer{}
|
||||
address := fmt.Sprintf("h3://%s/dns-query", srv.addr)
|
||||
u, err := AddressToUpstream(address, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
QUICTracer: tracer.TracerForConnection,
|
||||
})
|
||||
|
||||
@@ -33,7 +33,7 @@ func TestUpstreamDoQ(t *testing.T) {
|
||||
address := fmt.Sprintf("quic://%s", srv.addr)
|
||||
var lastState tls.ConnectionState
|
||||
opts := &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
VerifyConnection: func(state tls.ConnectionState) error {
|
||||
lastState = state
|
||||
|
||||
@@ -89,7 +89,7 @@ func TestUpstream_Exchange_quicServerCloseConn(t *testing.T) {
|
||||
// Create a DNS-over-QUIC upstream.
|
||||
address := fmt.Sprintf("quic://%s", srv.addr)
|
||||
u, err := AddressToUpstream(address, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
RootCAs: rootCAs,
|
||||
})
|
||||
|
||||
@@ -154,7 +154,7 @@ func TestUpstreamDoQ_serverRestart(t *testing.T) {
|
||||
u, err = AddressToUpstream(
|
||||
upsStr,
|
||||
&Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
RootCAs: rootCAs,
|
||||
Timeout: 100 * time.Millisecond,
|
||||
},
|
||||
@@ -191,7 +191,7 @@ func TestUpstreamDoQ_0RTT(t *testing.T) {
|
||||
tracer := &quicTracer{}
|
||||
address := fmt.Sprintf("quic://%s", srv.addr)
|
||||
u, err := AddressToUpstream(address, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
QUICTracer: tracer.TracerForConnection,
|
||||
RootCAs: rootCAs,
|
||||
})
|
||||
@@ -414,7 +414,7 @@ func startDoQServer(t *testing.T, tlsConf *tls.Config, port int) (s *testDoQServ
|
||||
listener: listen,
|
||||
// TODO(d.kolyshev): Add a concurrent safe [slog.Handler] wrapper for
|
||||
// [testing.TB] log function.
|
||||
logger: slogutil.NewDiscardLogger(),
|
||||
logger: testLogger,
|
||||
conns: map[*quic.Conn]struct{}{},
|
||||
connsMu: &sync.Mutex{},
|
||||
}
|
||||
|
||||
@@ -11,7 +11,6 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/miekg/dns"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -31,7 +30,7 @@ func TestUpstream_dnsOverTLS(t *testing.T) {
|
||||
// Create a DoT upstream that we'll be testing.
|
||||
addr := fmt.Sprintf("tls://127.0.0.1:%d", srv.port)
|
||||
u, err := AddressToUpstream(addr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -58,7 +57,7 @@ func TestUpstream_dnsOverTLS_race(t *testing.T) {
|
||||
// Creating a DoT upstream that we will be testing.
|
||||
addr := fmt.Sprintf("tls://127.0.0.1:%d", srv.port)
|
||||
u, err := AddressToUpstream(addr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -101,7 +100,7 @@ func TestUpstream_dnsOverTLS_poolReconnect(t *testing.T) {
|
||||
Host: srv.srv.Listener.Addr().String(),
|
||||
}).String()
|
||||
u, err := AddressToUpstream(addr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
VerifyConnection: func(state tls.ConnectionState) error {
|
||||
lastState = state
|
||||
@@ -150,7 +149,7 @@ func TestUpstream_dnsOverTLS_poolDeadline(t *testing.T) {
|
||||
Host: srv.srv.Listener.Addr().String(),
|
||||
}).String()
|
||||
u, err := AddressToUpstream(addr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
@@ -277,7 +276,7 @@ func BenchmarkDoTUpstream(b *testing.B) {
|
||||
}).String()
|
||||
|
||||
u, err := AddressToUpstream(addr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
InsecureSkipVerify: true,
|
||||
})
|
||||
require.NoError(b, err)
|
||||
|
||||
@@ -30,7 +30,11 @@ func NewHostsResolver(hosts hostsfile.Storage) (hr *HostsResolver) {
|
||||
// provided by the [hostsfile.DefaultHostsPaths] and read from rootFSys. In
|
||||
// case the file by any default path doesn't exist it adds a log debug record.
|
||||
// If l is nil, [slog.Default] is used.
|
||||
func NewDefaultHostsResolver(rootFSys fs.FS, l *slog.Logger) (hr *HostsResolver, err error) {
|
||||
func NewDefaultHostsResolver(
|
||||
ctx context.Context,
|
||||
rootFSys fs.FS,
|
||||
l *slog.Logger,
|
||||
) (hr *HostsResolver, err error) {
|
||||
if l == nil {
|
||||
l = slog.Default()
|
||||
}
|
||||
@@ -41,9 +45,12 @@ func NewDefaultHostsResolver(rootFSys fs.FS, l *slog.Logger) (hr *HostsResolver,
|
||||
}
|
||||
|
||||
// The error is always nil here since no readers passed.
|
||||
strg, _ := hostsfile.NewDefaultStorage()
|
||||
strg, _ := hostsfile.NewDefaultStorage(ctx, &hostsfile.DefaultStorageConfig{
|
||||
Logger: l,
|
||||
})
|
||||
|
||||
for _, filename := range paths {
|
||||
err = parseHostsFile(rootFSys, strg, filename, l)
|
||||
err = parseHostsFile(ctx, rootFSys, strg, filename, l)
|
||||
if err != nil {
|
||||
// Don't wrap the error since it's already informative enough as is.
|
||||
return nil, err
|
||||
@@ -54,11 +61,17 @@ func NewDefaultHostsResolver(rootFSys fs.FS, l *slog.Logger) (hr *HostsResolver,
|
||||
}
|
||||
|
||||
// parseHostsFile reads a single hosts file from fsys and parses it into hosts.
|
||||
func parseHostsFile(fsys fs.FS, hosts hostsfile.Set, filename string, l *slog.Logger) (err error) {
|
||||
func parseHostsFile(
|
||||
ctx context.Context,
|
||||
fsys fs.FS,
|
||||
hosts hostsfile.Set,
|
||||
filename string,
|
||||
l *slog.Logger,
|
||||
) (err error) {
|
||||
f, err := fsys.Open(filename)
|
||||
if err != nil {
|
||||
if errors.Is(err, fs.ErrNotExist) {
|
||||
l.Debug("hosts file does not exist", "filename", filename)
|
||||
l.DebugContext(ctx, "hosts file does not exist", "filename", filename)
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -69,7 +82,7 @@ func parseHostsFile(fsys fs.FS, hosts hostsfile.Set, filename string, l *slog.Lo
|
||||
|
||||
defer func() { err = errors.WithDeferred(err, f.Close()) }()
|
||||
|
||||
return hostsfile.Parse(hosts, f, nil)
|
||||
return hostsfile.Parse(ctx, hosts, f, nil)
|
||||
}
|
||||
|
||||
// type check
|
||||
|
||||
@@ -8,7 +8,6 @@ import (
|
||||
|
||||
"github.com/AdguardTeam/dnsproxy/upstream"
|
||||
"github.com/AdguardTeam/golibs/hostsfile"
|
||||
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
@@ -35,7 +34,8 @@ func TestHostsResolver_LookupNetIP(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
hr, err := upstream.NewDefaultHostsResolver(fsys, slogutil.NewDiscardLogger())
|
||||
ctx := testutil.ContextWithTimeout(t, testTimeout)
|
||||
hr, err := upstream.NewDefaultHostsResolver(ctx, fsys, testLogger)
|
||||
require.NoError(t, err)
|
||||
|
||||
testCases := []struct {
|
||||
@@ -93,7 +93,8 @@ func TestHostsResolver_LookupNetIP(t *testing.T) {
|
||||
for _, tc := range testCases {
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
var addrs []netip.Addr
|
||||
addrs, err = hr.LookupNetIP(context.Background(), tc.net, tc.host)
|
||||
ctx = testutil.ContextWithTimeout(t, testTimeout)
|
||||
addrs, err = hr.LookupNetIP(ctx, tc.net, tc.host)
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, tc.wantAddrs, addrs)
|
||||
|
||||
@@ -6,7 +6,6 @@ import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/miekg/dns"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -24,7 +23,7 @@ func TestExchangeParallel(t *testing.T) {
|
||||
|
||||
for _, s := range upstreamList {
|
||||
u, err := AddressToUpstream(s, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: timeout,
|
||||
})
|
||||
if err != nil {
|
||||
|
||||
@@ -9,7 +9,6 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/AdguardTeam/golibs/errors"
|
||||
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/miekg/dns"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -29,7 +28,7 @@ func TestUpstream_plainDNS(t *testing.T) {
|
||||
|
||||
addr := fmt.Sprintf("127.0.0.1:%d", srv.port)
|
||||
u, err := AddressToUpstream(addr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
testutil.CleanupAndRequireSuccess(t, u.Close)
|
||||
@@ -51,7 +50,7 @@ func TestUpstream_plainDNS_badID(t *testing.T) {
|
||||
|
||||
addr := fmt.Sprintf("127.0.0.1:%d", srv.port)
|
||||
u, err := AddressToUpstream(addr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
// Use a shorter timeout to speed up the test.
|
||||
Timeout: 100 * time.Millisecond,
|
||||
})
|
||||
@@ -126,7 +125,7 @@ func TestUpstream_plainDNS_fallbackToTCP(t *testing.T) {
|
||||
|
||||
addr := fmt.Sprintf("127.0.0.1:%d", srv.port)
|
||||
u, err := AddressToUpstream(addr, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
// Use a shorter timeout to speed up the test.
|
||||
Timeout: 100 * time.Millisecond,
|
||||
})
|
||||
|
||||
@@ -10,7 +10,6 @@ import (
|
||||
"github.com/AdguardTeam/dnsproxy/internal/dnsproxytest"
|
||||
"github.com/AdguardTeam/dnsproxy/upstream"
|
||||
"github.com/AdguardTeam/golibs/errors"
|
||||
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
||||
"github.com/AdguardTeam/golibs/testutil"
|
||||
"github.com/miekg/dns"
|
||||
"github.com/stretchr/testify/assert"
|
||||
@@ -49,7 +48,7 @@ func TestNewUpstreamResolver_validity(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
withTimeoutOpt := &upstream.Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: 3 * time.Second,
|
||||
}
|
||||
|
||||
|
||||
@@ -28,6 +28,9 @@ import (
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// testLogger is common logger for tests.
|
||||
var testLogger = slogutil.NewDiscardLogger()
|
||||
|
||||
// TODO(ameshkov): Make tests here not depend on external servers.
|
||||
|
||||
// TODO(d.kolyshev): Remove this after quic-go has migrated to slog.
|
||||
@@ -52,14 +55,14 @@ func TestUpstream_bootstrapTimeout(t *testing.T) {
|
||||
testutil.CleanupAndRequireSuccess(t, udpListener.Close)
|
||||
|
||||
rslv, err := NewUpstreamResolver(udpListener.LocalAddr().String(), &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: timeout,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
// Create an upstream that uses this faulty bootstrap.
|
||||
u, err := AddressToUpstream("tls://random-domain-name", &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Bootstrap: NewCachingResolver(rslv),
|
||||
Timeout: timeout,
|
||||
})
|
||||
@@ -114,7 +117,7 @@ func TestUpstreams(t *testing.T) {
|
||||
|
||||
const upsTimeout = 10 * time.Second
|
||||
|
||||
l := slogutil.NewDiscardLogger()
|
||||
l := testLogger
|
||||
|
||||
googleRslv, err := NewUpstreamResolver("8.8.8.8:53", &Options{
|
||||
Logger: l,
|
||||
@@ -234,7 +237,7 @@ func TestAddressToUpstream(t *testing.T) {
|
||||
require.NoError(t, err)
|
||||
|
||||
opt := &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Bootstrap: NewCachingResolver(cloudflareRslv),
|
||||
}
|
||||
|
||||
@@ -385,13 +388,13 @@ func TestUpstreamDoTBootstrap(t *testing.T) {
|
||||
for _, tc := range upstreams {
|
||||
t.Run(tc.address, func(t *testing.T) {
|
||||
rslv, err := NewUpstreamResolver(tc.bootstrap, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Timeout: timeout,
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
u, err := AddressToUpstream(tc.address, &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Bootstrap: NewCachingResolver(rslv),
|
||||
Timeout: timeout,
|
||||
})
|
||||
@@ -432,7 +435,7 @@ func TestUpstreamsInvalidBootstrap(t *testing.T) {
|
||||
bootstrap: []string{"1.2.3.4:55", "8.8.8.8"},
|
||||
}}
|
||||
|
||||
l := slogutil.NewDiscardLogger()
|
||||
l := testLogger
|
||||
|
||||
for _, tc := range upstreams {
|
||||
t.Run(tc.address, func(t *testing.T) {
|
||||
@@ -519,7 +522,7 @@ func TestAddressToUpstream_StaticResolver(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
opts := &Options{
|
||||
Logger: slogutil.NewDiscardLogger(),
|
||||
Logger: testLogger,
|
||||
Bootstrap: tc.rslv,
|
||||
Timeout: timeout,
|
||||
InsecureSkipVerify: true,
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
package upstream_test
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/AdguardTeam/golibs/logutil/slogutil"
|
||||
)
|
||||
|
||||
// testTimeout is common timeout for tests.
|
||||
const testTimeout = 1 * time.Second
|
||||
|
||||
// testLogger is common logger for tests.
|
||||
var testLogger = slogutil.NewDiscardLogger()
|
||||
Reference in New Issue
Block a user