diff --git a/CHANGELOG.md b/CHANGELOG.md index e49f4cdf..37230366 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -30,6 +30,9 @@ NOTE: Add new changes BELOW THIS COMMENT. ### Fixed - YouTube restricted mode is not enforced by HTTPS queries on Firefox. +- The ability to apply an invalid configuration for private RDNS, which led to + server inoperability. +- Ignoring query log for clients with ClientID set ([#5812]). - Subdomains of `in-addr.arpa` and `ip6.arpa` containing zero-length prefix incorrectly considered invalid when specified for private RDNS upstream servers ([#6854]). @@ -37,6 +40,7 @@ NOTE: Add new changes BELOW THIS COMMENT. ([#6875]). [#5345]: https://github.com/AdguardTeam/AdGuardHome/issues/5345 +[#5812]: https://github.com/AdguardTeam/AdGuardHome/issues/5812 [#6854]: https://github.com/AdguardTeam/AdGuardHome/issues/6854 [#6875]: https://github.com/AdguardTeam/AdGuardHome/issues/6875 diff --git a/go.mod b/go.mod index 5a3ed07b..5c8bbd38 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.22.2 require ( github.com/AdguardTeam/dnsproxy v0.69.1 - github.com/AdguardTeam/golibs v0.23.0 + github.com/AdguardTeam/golibs v0.23.2 github.com/AdguardTeam/urlfilter v0.18.0 github.com/NYTimes/gziphandler v1.1.1 github.com/ameshkov/dnscrypt/v2 v2.2.7 @@ -32,10 +32,10 @@ require ( github.com/stretchr/testify v1.9.0 github.com/ti-mo/netfilter v0.5.1 go.etcd.io/bbolt v1.3.9 - golang.org/x/crypto v0.21.0 - golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 - golang.org/x/net v0.23.0 - golang.org/x/sys v0.18.0 + golang.org/x/crypto v0.22.0 + golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 + golang.org/x/net v0.24.0 + golang.org/x/sys v0.19.0 gopkg.in/natefinch/lumberjack.v2 v2.2.1 gopkg.in/yaml.v3 v3.0.1 howett.net/plist v1.0.1 @@ -58,9 +58,9 @@ require ( github.com/quic-go/qpack v0.4.0 // indirect github.com/u-root/uio v0.0.0-20240224005618-d2acac8f3701 // indirect go.uber.org/mock v0.4.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/sync v0.6.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/sync v0.7.0 // indirect golang.org/x/text v0.14.0 // indirect - golang.org/x/tools v0.19.0 // indirect + golang.org/x/tools v0.20.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect ) diff --git a/go.sum b/go.sum index 6b04e9b2..0153ce9b 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,7 @@ github.com/AdguardTeam/dnsproxy v0.69.1 h1:KiLkKUSrvHeUO/YEf4Bbo/5zyFRIvQstjL7W9G/24pk= github.com/AdguardTeam/dnsproxy v0.69.1/go.mod h1:atO3WeeuyepyhjSt6hC+MF7/IN7TZHfG3/ZwhImHzYs= -github.com/AdguardTeam/golibs v0.23.0 h1:PHz/QhJhLmoaOokkqrPFUgu9Hw4iVAqLtBP0O3g1D3Q= -github.com/AdguardTeam/golibs v0.23.0/go.mod h1:/xZCf6gZZzz7k1qaoJmI+hhxN98kHFr7LJ22j1nLH0c= +github.com/AdguardTeam/golibs v0.23.2 h1:rMjYantwtQ39e8G4zBQ6ZLlm4s3XH30Bc9VxhoOHwao= +github.com/AdguardTeam/golibs v0.23.2/go.mod h1:o9i55Sx6v7qogRQeqaBfmLbC/pZqeMBWi015U5PTDY0= github.com/AdguardTeam/urlfilter v0.18.0 h1:ZZzwODC/ADpjJSODxySrrUnt/fvOCfGFaCW6j+wsGfQ= github.com/AdguardTeam/urlfilter v0.18.0/go.mod h1:IXxBwedLiZA2viyHkaFxY/8mjub0li2PXRg8a3d9Z1s= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= @@ -131,26 +131,26 @@ go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU= go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8 h1:aAcj0Da7eBAtrTp03QXWvm88pSyOt+UgdZw2BFZ+lEw= -golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCRR2hssIjF07kZFEiieALBM/ARQ= +golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= +golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8 h1:ESSUROHIBHg7USnszlcdmjBEwdMj9VUvU+OPk4yl2mc= +golang.org/x/exp v0.0.0-20240409090435-93d18d7e34b8/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= -golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= -golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190322080309-f49334f85ddc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -161,8 +161,8 @@ golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= +golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -172,8 +172,8 @@ golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= diff --git a/internal/aghos/os.go b/internal/aghos/os.go index c357d11d..e04055e4 100644 --- a/internal/aghos/os.go +++ b/internal/aghos/os.go @@ -159,21 +159,11 @@ func NotifyReconfigureSignal(c chan<- os.Signal) { notifyReconfigureSignal(c) } -// NotifyShutdownSignal notifies c on receiving shutdown signals. -func NotifyShutdownSignal(c chan<- os.Signal) { - notifyShutdownSignal(c) -} - // IsReconfigureSignal returns true if sig is a reconfigure signal. func IsReconfigureSignal(sig os.Signal) (ok bool) { return isReconfigureSignal(sig) } -// IsShutdownSignal returns true if sig is a shutdown signal. -func IsShutdownSignal(sig os.Signal) (ok bool) { - return isShutdownSignal(sig) -} - // SendShutdownSignal sends the shutdown signal to the channel. func SendShutdownSignal(c chan<- os.Signal) { sendShutdownSignal(c) diff --git a/internal/aghos/os_unix.go b/internal/aghos/os_unix.go index f52fab02..f2cc4fef 100644 --- a/internal/aghos/os_unix.go +++ b/internal/aghos/os_unix.go @@ -13,26 +13,10 @@ func notifyReconfigureSignal(c chan<- os.Signal) { signal.Notify(c, unix.SIGHUP) } -func notifyShutdownSignal(c chan<- os.Signal) { - signal.Notify(c, unix.SIGINT, unix.SIGQUIT, unix.SIGTERM) -} - func isReconfigureSignal(sig os.Signal) (ok bool) { return sig == unix.SIGHUP } -func isShutdownSignal(sig os.Signal) (ok bool) { - switch sig { - case - unix.SIGINT, - unix.SIGQUIT, - unix.SIGTERM: - return true - default: - return false - } -} - func sendShutdownSignal(_ chan<- os.Signal) { // On Unix we are already notified by the system. } diff --git a/internal/aghos/os_windows.go b/internal/aghos/os_windows.go index 2c2620eb..b9bf8a4c 100644 --- a/internal/aghos/os_windows.go +++ b/internal/aghos/os_windows.go @@ -5,7 +5,6 @@ package aghos import ( "os" "os/signal" - "syscall" "golang.org/x/sys/windows" ) @@ -43,25 +42,10 @@ func notifyReconfigureSignal(c chan<- os.Signal) { signal.Notify(c, windows.SIGHUP) } -func notifyShutdownSignal(c chan<- os.Signal) { - // syscall.SIGTERM is processed automatically. See go doc os/signal, - // section Windows. - signal.Notify(c, os.Interrupt) -} - func isReconfigureSignal(sig os.Signal) (ok bool) { return sig == windows.SIGHUP } -func isShutdownSignal(sig os.Signal) (ok bool) { - switch sig { - case os.Interrupt, syscall.SIGTERM: - return true - default: - return false - } -} - func sendShutdownSignal(c chan<- os.Signal) { c <- os.Interrupt } diff --git a/internal/dnsforward/http.go b/internal/dnsforward/http.go index 1a1a7b31..01fe6720 100644 --- a/internal/dnsforward/http.go +++ b/internal/dnsforward/http.go @@ -1,6 +1,7 @@ package dnsforward import ( + "cmp" "encoding/json" "fmt" "io" @@ -332,6 +333,28 @@ func (req *jsonDNSConfig) checkBootstrap() (err error) { return nil } +// checkPrivateRDNS returns an error if the configuration of the private RDNS is +// not valid. +func (req *jsonDNSConfig) checkPrivateRDNS( + ownAddrs addrPortSet, + sysResolvers SystemResolvers, + privateNets netutil.SubnetSet, +) (err error) { + if (req.UsePrivateRDNS == nil || !*req.UsePrivateRDNS) && req.LocalPTRUpstreams == nil { + return nil + } + + addrs := cmp.Or(req.LocalPTRUpstreams, &[]string{}) + + uc, err := newPrivateConfig(*addrs, ownAddrs, sysResolvers, privateNets, &upstream.Options{}) + err = errors.WithDeferred(err, uc.Close()) + if err != nil { + return fmt.Errorf("private upstream servers: %w", err) + } + + return nil +} + // validateUpstreamDNSServers returns an error if any field of req is invalid. func (req *jsonDNSConfig) validateUpstreamDNSServers( ownAddrs addrPortSet, @@ -349,12 +372,10 @@ func (req *jsonDNSConfig) validateUpstreamDNSServers( } } - if addrs := req.LocalPTRUpstreams; addrs != nil { - uc, err = newPrivateConfig(*addrs, ownAddrs, sysResolvers, privateNets, opts) - err = errors.WithDeferred(err, uc.Close()) - if err != nil { - return fmt.Errorf("private upstream servers: %w", err) - } + err = req.checkPrivateRDNS(ownAddrs, sysResolvers, privateNets) + if err != nil { + // Don't wrap the error since it's informative enough as is. + return err } err = req.checkBootstrap() @@ -440,7 +461,7 @@ func (s *Server) handleSetConfig(w http.ResponseWriter, r *http.Request) { // TODO(e.burkov): Consider prebuilding this set on startup. ourAddrs, err := s.conf.ourAddrsSet() if err != nil { - // TODO(e.burkov): !! Put into openapi + // TODO(e.burkov): Put into openapi aghhttp.Error(r, w, http.StatusInternalServerError, "getting our addresses: %s", err) return diff --git a/internal/dnsforward/stats.go b/internal/dnsforward/stats.go index 220f151c..4344380d 100644 --- a/internal/dnsforward/stats.go +++ b/internal/dnsforward/stats.go @@ -29,7 +29,13 @@ func (s *Server) processQueryLogsAndStats(dctx *dnsContext) (rc resultCode) { log.Debug("dnsforward: client ip for stats and querylog: %s", ipStr) - ids := []string{ipStr, dctx.clientID} + ids := []string{ipStr} + if dctx.clientID != "" { + // Use the ClientID first because it has a higher priority. Filters + // have the same priority, see applyAdditionalFiltering. + ids = []string{dctx.clientID, ipStr} + } + qt, cl := q.Qtype, q.Qclass // Synchronize access to s.queryLog and s.stats so they won't be suddenly diff --git a/internal/filtering/rulelist/engine_test.go b/internal/filtering/rulelist/engine_test.go index 81ab8bf8..9eeda15b 100644 --- a/internal/filtering/rulelist/engine_test.go +++ b/internal/filtering/rulelist/engine_test.go @@ -1,7 +1,6 @@ package rulelist_test import ( - "context" "net/http" "testing" @@ -28,14 +27,12 @@ func TestEngine_Refresh(t *testing.T) { require.NotNil(t, eng) testutil.CleanupAndRequireSuccess(t, eng.Close) - ctx, cancel := context.WithTimeout(context.Background(), testTimeout) - t.Cleanup(cancel) - buf := make([]byte, rulelist.DefaultRuleBufSize) cli := &http.Client{ Timeout: testTimeout, } + ctx := testutil.ContextWithTimeout(t, testTimeout) err := eng.Refresh(ctx, buf, cli, cacheDir, rulelist.DefaultMaxRuleListSize) require.NoError(t, err) diff --git a/internal/filtering/rulelist/filter_test.go b/internal/filtering/rulelist/filter_test.go index 05c1274c..21709583 100644 --- a/internal/filtering/rulelist/filter_test.go +++ b/internal/filtering/rulelist/filter_test.go @@ -1,7 +1,6 @@ package rulelist_test import ( - "context" "net/http" "net/url" "os" @@ -67,14 +66,12 @@ func TestFilter_Refresh(t *testing.T) { require.NotNil(t, f) - ctx, cancel := context.WithTimeout(context.Background(), testTimeout) - t.Cleanup(cancel) - buf := make([]byte, rulelist.DefaultRuleBufSize) cli := &http.Client{ Timeout: testTimeout, } + ctx := testutil.ContextWithTimeout(t, testTimeout) res, err := f.Refresh(ctx, buf, cli, cacheDir, rulelist.DefaultMaxRuleListSize) require.NoError(t, err) diff --git a/internal/next/cmd/signal.go b/internal/next/cmd/signal.go index b3bae338..a9f8543f 100644 --- a/internal/next/cmd/signal.go +++ b/internal/next/cmd/signal.go @@ -8,6 +8,7 @@ import ( "github.com/AdguardTeam/AdGuardHome/internal/next/agh" "github.com/AdguardTeam/AdGuardHome/internal/next/configmgr" "github.com/AdguardTeam/golibs/log" + "github.com/AdguardTeam/golibs/osutil" "github.com/google/renameio/v2/maybe" ) @@ -38,7 +39,7 @@ func (h *signalHandler) handle() { if aghos.IsReconfigureSignal(sig) { h.reconfigure() - } else if aghos.IsShutdownSignal(sig) { + } else if osutil.IsShutdownSignal(sig) { status := h.shutdown() h.removePID() @@ -122,7 +123,8 @@ func newSignalHandler( services: svcs, } - aghos.NotifyShutdownSignal(h.signal) + notifier := osutil.DefaultSignalNotifier{} + osutil.NotifyShutdownSignal(notifier, h.signal) aghos.NotifyReconfigureSignal(h.signal) return h diff --git a/internal/next/dnssvc/dnssvc_test.go b/internal/next/dnssvc/dnssvc_test.go index 48f49b8d..2a46d956 100644 --- a/internal/next/dnssvc/dnssvc_test.go +++ b/internal/next/dnssvc/dnssvc_test.go @@ -1,7 +1,6 @@ package dnssvc_test import ( - "context" "net/netip" "testing" "time" @@ -94,10 +93,8 @@ func TestService(t *testing.T) { }}, } - ctx, cancel := context.WithTimeout(context.Background(), testTimeout) - defer cancel() - cli := &dns.Client{} + ctx := testutil.ContextWithTimeout(t, testTimeout) var resp *dns.Msg require.Eventually(t, func() (ok bool) { @@ -110,10 +107,8 @@ func TestService(t *testing.T) { assert.NotNil(t, resp) }) - ctx, cancel := context.WithTimeout(context.Background(), testTimeout) - defer cancel() + err = svc.Shutdown(testutil.ContextWithTimeout(t, testTimeout)) - err = svc.Shutdown(ctx) require.NoError(t, err) err = upstreamSrv.Shutdown() diff --git a/internal/next/websvc/websvc_test.go b/internal/next/websvc/websvc_test.go index 6a2505d5..cb4c6bc9 100644 --- a/internal/next/websvc/websvc_test.go +++ b/internal/next/websvc/websvc_test.go @@ -109,12 +109,8 @@ func newTestServer( err = svc.Start() require.NoError(t, err) - t.Cleanup(func() { - ctx, cancel := context.WithTimeout(context.Background(), testTimeout) - t.Cleanup(cancel) - - err = svc.Shutdown(ctx) - require.NoError(t, err) + testutil.CleanupAndRequireSuccess(t, func() (err error) { + return svc.Shutdown(testutil.ContextWithTimeout(t, testTimeout)) }) c = svc.Config()