@@ -195,3 +195,40 @@ func TestMarkActiveNotBlocking(t *testing.T) {
195195 }
196196 wg .Wait ()
197197}
198+
199+ func TestZeroBytePayload (t * testing.T ) {
200+ sessionID := uuid .New ()
201+ cfdConn , originConn := net .Pipe ()
202+ transport := & mockQUICTransport {
203+ reqChan : newDatagramChannel (1 ),
204+ respChan : newDatagramChannel (1 ),
205+ }
206+ log := zerolog .Nop ()
207+ session := newSession (sessionID , transport , cfdConn , & log )
208+
209+ ctx , cancel := context .WithCancel (context .Background ())
210+ errGroup , ctx := errgroup .WithContext (ctx )
211+ errGroup .Go (func () error {
212+ // Read from underlying conn and send to transport
213+ closedByRemote , err := session .Serve (ctx , time .Minute * 2 )
214+ require .Equal (t , context .Canceled , err )
215+ require .False (t , closedByRemote )
216+ return nil
217+ })
218+
219+ errGroup .Go (func () error {
220+ // Write to underlying connection
221+ n , err := originConn .Write ([]byte {})
222+ require .NoError (t , err )
223+ require .Equal (t , 0 , n )
224+ return nil
225+ })
226+
227+ receivedSessionID , payload , err := transport .respChan .Receive (ctx )
228+ require .NoError (t , err )
229+ require .Len (t , payload , 0 )
230+ require .Equal (t , sessionID , receivedSessionID )
231+
232+ cancel ()
233+ require .NoError (t , errGroup .Wait ())
234+ }
0 commit comments