@@ -376,6 +376,134 @@ func TestAgentCloseAbortsBlockedUDPMuxWrite(t *testing.T) {
376376 require .NoError (t , <- runErr )
377377}
378378
379+ func TestAgentCloseAbortsBlockedUDPMuxSrflxGatherWrite (t * testing.T ) {
380+ defer test .CheckRoutines (t )()
381+ defer test .TimeOut (2 * time .Second ).Stop ()
382+
383+ udpConn := newDeadlineBlockingPacketConn ()
384+ udpMux := NewUniversalUDPMuxDefault (UniversalUDPMuxParams {UDPConn : udpConn })
385+ defer func () {
386+ _ = udpMux .Close ()
387+ }()
388+
389+ agent , err := NewAgent (& AgentConfig {
390+ NetworkTypes : []NetworkType {NetworkTypeUDP4 },
391+ CandidateTypes : []CandidateType {CandidateTypeServerReflexive },
392+ Urls : []* stun.URI {{
393+ Scheme : stun .SchemeTypeSTUN ,
394+ Host : "192.0.2.2" ,
395+ Port : 3478 ,
396+ }},
397+ UDPMuxSrflx : udpMux ,
398+ })
399+ require .NoError (t , err )
400+
401+ require .NoError (t , agent .OnCandidate (func (Candidate ) {}))
402+ require .NoError (t , agent .GatherCandidates ())
403+
404+ select {
405+ case <- udpConn .writeStarted :
406+ case <- time .After (time .Second ):
407+ require .FailNow (t , "timed out waiting for UDP mux srflx gather write to block" )
408+ }
409+
410+ closeErr := make (chan error , 1 )
411+ go func () {
412+ closeErr <- agent .Close ()
413+ }()
414+
415+ select {
416+ case err := <- closeErr :
417+ require .NoError (t , err )
418+ case <- time .After (time .Second ):
419+ require .FailNow (t , "agent close did not abort blocked UDP mux srflx gather write" )
420+ }
421+ }
422+
423+ func TestAgentCloseDoesNotAbortOtherAgentUDPMuxSrflxGatherWrite (t * testing.T ) { //nolint:cyclop
424+ defer test .CheckRoutines (t )()
425+ defer test .TimeOut (2 * time .Second ).Stop ()
426+
427+ udpConn := newDeadlineBlockingPacketConn ()
428+ udpMux := NewUniversalUDPMuxDefault (UniversalUDPMuxParams {UDPConn : udpConn })
429+ defer func () {
430+ _ = udpMux .Close ()
431+ }()
432+
433+ newSrflxAgent := func (t * testing.T ) * Agent {
434+ t .Helper ()
435+
436+ agent , err := NewAgent (& AgentConfig {
437+ NetworkTypes : []NetworkType {NetworkTypeUDP4 },
438+ CandidateTypes : []CandidateType {CandidateTypeServerReflexive },
439+ Urls : []* stun.URI {{
440+ Scheme : stun .SchemeTypeSTUN ,
441+ Host : "192.0.2.2" ,
442+ Port : 3478 ,
443+ }},
444+ UDPMuxSrflx : udpMux ,
445+ })
446+ require .NoError (t , err )
447+
448+ return agent
449+ }
450+
451+ agent1 := newSrflxAgent (t )
452+ defer func () {
453+ _ = agent1 .Close ()
454+ }()
455+
456+ agent2 := newSrflxAgent (t )
457+ defer func () {
458+ _ = agent2 .Close ()
459+ }()
460+
461+ require .NoError (t , agent2 .OnCandidate (func (Candidate ) {}))
462+ require .NoError (t , agent2 .GatherCandidates ())
463+
464+ select {
465+ case <- udpConn .writeStarted :
466+ case <- time .After (time .Second ):
467+ require .FailNow (t , "timed out waiting for second agent UDP mux srflx gather write to block" )
468+ }
469+
470+ closeErr := make (chan error , 1 )
471+ go func () {
472+ closeErr <- agent1 .Close ()
473+ }()
474+
475+ select {
476+ case err := <- closeErr :
477+ require .NoError (t , err )
478+ case <- time .After (time .Second ):
479+ require .FailNow (t , "first agent close blocked" )
480+ }
481+
482+ select {
483+ case <- udpConn .writeDeadlineSet :
484+ require .FailNow (t , "first agent close aborted another agent's UDP mux srflx gather write" )
485+ case <- time .After (200 * time .Millisecond ):
486+ }
487+
488+ secondCloseErr := make (chan error , 1 )
489+ go func () {
490+ secondCloseErr <- agent2 .Close ()
491+ }()
492+
493+ select {
494+ case <- udpConn .writeDeadlineSet :
495+ case <- time .After (time .Second ):
496+ require .FailNow (t , "second agent close did not abort its own UDP mux srflx gather write" )
497+ }
498+
499+ select {
500+ case err := <- secondCloseErr :
501+ require .NoError (t , err )
502+ case <- time .After (time .Second ):
503+ require .FailNow (t , "second agent close blocked" )
504+ }
505+ }
506+
379507func TestAgentCloseClearsSharedUDPMuxAbortDeadlineForOtherAgent (t * testing.T ) { //nolint:cyclop
380508 defer test .CheckRoutines (t )()
381509 defer test .TimeOut (2 * time .Second ).Stop ()
0 commit comments