@@ -326,3 +326,202 @@ func checkPCM(t testing.TB, exp, got msdk.PCM16Sample) {
326326 expHit := int (float64 (len (expSamples )) * percHit )
327327 require .True (t , hits >= expHit , "min=%v, max=%v\n got:\n %v" , slices .Min (got ), slices .Max (got ), got )
328328}
329+
330+ func newMediaPair (t testing.TB , opt1 , opt2 * MediaOptions ) (m1 , m2 * MediaPort ) {
331+ if opt1 == nil {
332+ opt1 = & MediaOptions {}
333+ }
334+ if opt2 == nil {
335+ opt2 = & MediaOptions {}
336+ }
337+ c1 , c2 := newUDPPipe ()
338+
339+ opt1 .IP = newIP ("1.1.1.1" )
340+ opt1 .Ports = rtcconfig.PortRange {Start : 10000 }
341+
342+ opt2 .IP = newIP ("2.2.2.2" )
343+ opt2 .Ports = rtcconfig.PortRange {Start : 20000 }
344+
345+ const rate = 16000
346+
347+ log := logger .GetLogger ()
348+
349+ var err error
350+
351+ m1 , err = NewMediaPortWith (log .WithName ("one" ), nil , c1 , opt1 , rate )
352+ require .NoError (t , err )
353+ t .Cleanup (m1 .Close )
354+
355+ m2 , err = NewMediaPortWith (log .WithName ("two" ), nil , c2 , opt2 , rate )
356+ require .NoError (t , err )
357+ t .Cleanup (m2 .Close )
358+
359+ offer , err := m1 .NewOffer (sdp .EncryptionNone )
360+ require .NoError (t , err )
361+ offerData , err := offer .SDP .Marshal ()
362+ require .NoError (t , err )
363+
364+ answer , mc2 , err := m2 .SetOffer (offerData , sdp .EncryptionNone )
365+ require .NoError (t , err )
366+ answerData , err := answer .SDP .Marshal ()
367+ require .NoError (t , err )
368+
369+ mc1 , err := m1 .SetAnswer (offer , answerData , sdp .EncryptionNone )
370+ require .NoError (t , err )
371+
372+ err = m1 .SetConfig (mc1 )
373+ require .NoError (t , err )
374+
375+ err = m2 .SetConfig (mc2 )
376+ require .NoError (t , err )
377+
378+ w2 := m2 .GetAudioWriter ()
379+ require .Equal (t , "Switch(16000) -> G722(encode) -> RTP(16000)" , w2 .String ())
380+
381+ return m1 , m2
382+ }
383+
384+ func TestMediaTimeout (t * testing.T ) {
385+ const (
386+ timeout = time .Second / 4
387+ initial = timeout * 2
388+ dt = timeout / 4
389+ )
390+
391+ t .Run ("initial" , func (t * testing.T ) {
392+ m1 , _ := newMediaPair (t , & MediaOptions {
393+ MediaTimeoutInitial : initial ,
394+ MediaTimeout : timeout ,
395+ }, nil )
396+
397+ m1 .EnableTimeout (true )
398+
399+ targ := time .Now ().Add (initial )
400+ select {
401+ case <- m1 .Timeout ():
402+ t .Fatal ("initial timeout ignored" )
403+ case <- time .After (initial / 2 ):
404+ }
405+
406+ select {
407+ case <- time .After (time .Until (targ ) + dt ):
408+ t .Fatal ("timeout didn't trigger" )
409+ case <- m1 .Timeout ():
410+ }
411+ })
412+
413+ t .Run ("regular" , func (t * testing.T ) {
414+ m1 , m2 := newMediaPair (t , & MediaOptions {
415+ MediaTimeoutInitial : initial ,
416+ MediaTimeout : timeout ,
417+ }, nil )
418+ m1 .EnableTimeout (true )
419+
420+ w2 := m2 .GetAudioWriter ()
421+ err := w2 .WriteSample (msdk.PCM16Sample {0 , 0 })
422+ require .NoError (t , err )
423+
424+ select {
425+ case <- time .After (dt ):
426+ t .Fatal ("no media received" )
427+ case <- m1 .Received ():
428+ }
429+
430+ select {
431+ case <- time .After (2 * timeout + dt ):
432+ t .Fatal ("timeout didn't trigger" )
433+ case <- m1 .Timeout ():
434+ }
435+ })
436+
437+ t .Run ("no timeout" , func (t * testing.T ) {
438+ m1 , m2 := newMediaPair (t , & MediaOptions {
439+ MediaTimeoutInitial : initial ,
440+ MediaTimeout : timeout ,
441+ }, nil )
442+ m1 .EnableTimeout (true )
443+
444+ w2 := m2 .GetAudioWriter ()
445+
446+ for i := 0 ; i < 10 ; i ++ {
447+ err := w2 .WriteSample (msdk.PCM16Sample {0 , 0 })
448+ require .NoError (t , err )
449+
450+ select {
451+ case <- time .After (timeout / 2 ):
452+ case <- m1 .Timeout ():
453+ t .Fatal ("timeout" )
454+ }
455+ }
456+ })
457+
458+ t .Run ("reset timeout" , func (t * testing.T ) {
459+ m1 , m2 := newMediaPair (t , & MediaOptions {
460+ MediaTimeoutInitial : initial ,
461+ MediaTimeout : timeout ,
462+ }, nil )
463+ m1 .EnableTimeout (true )
464+
465+ w2 := m2 .GetAudioWriter ()
466+
467+ for i := 0 ; i < 5 ; i ++ {
468+ err := w2 .WriteSample (msdk.PCM16Sample {0 , 0 })
469+ require .NoError (t , err )
470+
471+ select {
472+ case <- time .After (timeout / 2 ):
473+ case <- m1 .Timeout ():
474+ t .Fatal ("timeout" )
475+ }
476+ }
477+
478+ m1 .SetTimeout (initial , timeout )
479+
480+ targ := time .Now ().Add (initial )
481+ select {
482+ case <- m1 .Timeout ():
483+ t .Fatal ("initial timeout ignored" )
484+ case <- time .After (initial / 2 ):
485+ }
486+
487+ select {
488+ case <- time .After (time .Until (targ ) + dt ):
489+ t .Fatal ("timeout didn't trigger" )
490+ case <- m1 .Timeout ():
491+ }
492+ })
493+
494+ t .Run ("reset" , func (t * testing.T ) {
495+ m1 , m2 := newMediaPair (t , & MediaOptions {
496+ MediaTimeoutInitial : initial ,
497+ MediaTimeout : timeout ,
498+ }, nil )
499+ m1 .EnableTimeout (true )
500+
501+ w2 := m2 .GetAudioWriter ()
502+
503+ for i := 0 ; i < 5 ; i ++ {
504+ err := w2 .WriteSample (msdk.PCM16Sample {0 , 0 })
505+ require .NoError (t , err )
506+
507+ select {
508+ case <- time .After (timeout / 2 ):
509+ case <- m1 .Timeout ():
510+ t .Fatal ("timeout" )
511+ }
512+ }
513+
514+ m1 .SetTimeout (initial , timeout )
515+
516+ for i := 0 ; i < 5 ; i ++ {
517+ err := w2 .WriteSample (msdk.PCM16Sample {0 , 0 })
518+ require .NoError (t , err )
519+
520+ select {
521+ case <- time .After (timeout / 2 ):
522+ case <- m1 .Timeout ():
523+ t .Fatal ("timeout" )
524+ }
525+ }
526+ })
527+ }
0 commit comments