66 "crypto/x509"
77 "io"
88 "net"
9- "sync/atomic"
109 "testing"
1110 "time"
1211
@@ -17,6 +16,7 @@ import (
1716 "github.com/AdguardTeam/golibs/testutil/servicetest"
1817 "github.com/miekg/dns"
1918 "github.com/quic-go/quic-go"
19+ "github.com/stretchr/testify/assert"
2020 "github.com/stretchr/testify/require"
2121)
2222
@@ -143,10 +143,9 @@ func TestQuicProxy_largePackets(t *testing.T) {
143143 requireResponse (t , msg , resp )
144144}
145145
146- func TestQuicProxy_truncatedRequestUsesOnlyReadBytes (t * testing.T ) {
146+ func TestQuicProxy_truncatedRequest (t * testing.T ) {
147147 serverConfig , caPem := newTLSConfig (t )
148148
149- var handled atomic.Bool
150149 conf := & Config {
151150 Logger : slogutil .NewDiscardLogger (),
152151 QUICListenAddr : []* net.UDPAddr {net .UDPAddrFromAddrPort (localhostAnyPort )},
@@ -156,27 +155,15 @@ func TestQuicProxy_truncatedRequestUsesOnlyReadBytes(t *testing.T) {
156155 RatelimitSubnetLenIPv4 : 24 ,
157156 RatelimitSubnetLenIPv6 : 64 ,
158157 RequestHandler : & TestRequestHandler {
159- OnHandle : func (p * Proxy , dctx * DNSContext ) (err error ) {
160- handled .Store (true )
161- resp := (& dns.Msg {}).SetReply (dctx .Req )
162- resp .Answer = []dns.RR {& dns.A {
163- Hdr : dns.RR_Header {
164- Name : dctx .Req .Question [0 ].Name ,
165- Rrtype : dns .TypeA ,
166- Class : dns .ClassINET ,
167- },
168- A : net.IP {8 , 8 , 8 , 8 },
169- }}
170- dctx .Res = resp
171-
172- return nil
158+ OnHandle : func (p * Proxy , d * DNSContext ) (_ error ) {
159+ panic (testutil .UnexpectedCall (p , d ))
173160 },
174161 },
175162 }
176163
177164 dnsProxy := mustNew (t , conf )
178165
179- req := & dns.Msg {
166+ req := ( & dns.Msg {
180167 MsgHdr : dns.MsgHdr {
181168 Id : 0 ,
182169 RecursionDesired : true ,
@@ -186,8 +173,7 @@ func TestQuicProxy_truncatedRequestUsesOnlyReadBytes(t *testing.T) {
186173 Qtype : dns .TypeA ,
187174 Qclass : dns .ClassINET ,
188175 }},
189- }
190- req .SetEdns0 (4096 , false )
176+ }).SetEdns0 (4096 , false )
191177
192178 packed , err := req .Pack ()
193179 require .NoError (t , err )
@@ -203,36 +189,39 @@ func TestQuicProxy_truncatedRequestUsesOnlyReadBytes(t *testing.T) {
203189
204190 servicetest .RequireRun (t , dnsProxy , testTimeout )
205191
192+ addr := dnsProxy .Addr (ProtoQUIC )
193+
206194 roots := x509 .NewCertPool ()
207- roots .AppendCertsFromPEM (caPem )
195+ require .True (t , roots .AppendCertsFromPEM (caPem ))
196+
208197 tlsConfig := & tls.Config {
209198 ServerName : tlsServerName ,
210199 RootCAs : roots ,
211200 NextProtos : append ([]string {NextProtoDQ }, compatProtoDQ ... ),
212201 }
213202
214- addr := dnsProxy .Addr (ProtoQUIC )
215- conn , err := quic .DialAddrEarly (context .Background (), addr .String (), tlsConfig , nil )
203+ ctx := testutil .ContextWithTimeout (t , testTimeout )
204+
205+ conn , err := quic .DialAddrEarly (ctx , addr .String (), tlsConfig , nil )
216206 require .NoError (t , err )
217207 testutil .CleanupAndRequireSuccess (t , func () (err error ) {
218208 return conn .CloseWithError (DoQCodeNoError , "" )
219209 })
220210
221- truncLen := len (packed ) - 5
211+ truncLen := len (packed ) - len ( packed ) / 2
222212 require .Greater (t , truncLen , 0 )
213+
223214 truncated := packed [:truncLen ]
224215 reqBuf := proxyutil .AddPrefix (truncated )
225216 require .Greater (t , len (reqBuf ), minDNSPacketSize )
226217
227- stream , err := conn .OpenStreamSync (context .Background ())
228- require .NoError (t , err )
229- _ , err = stream .Write (reqBuf )
218+ stream , err := conn .OpenStreamSync (ctx )
230219 require .NoError (t , err )
231- _ = stream .Close ( )
220+ testutil . CleanupAndRequireSuccess ( t , stream .Close )
232221
233- require . Never ( t , func () bool {
234- return handled . Load ( )
235- }, testTimeout , 10 * time . Millisecond )
222+ n , err := stream . Write ( reqBuf )
223+ require . NoError ( t , err )
224+ assert . Greater ( t , n , minDNSPacketSize )
236225}
237226
238227// newTestResponse creates a test response for the specified request.
0 commit comments