@@ -10,6 +10,7 @@ import (
1010 "bufio"
1111 "bytes"
1212 "context"
13+ "crypto/rand"
1314 "errors"
1415 "fmt"
1516 "io"
@@ -2062,14 +2063,13 @@ func TestPeerConnection_Simulcast_RTX(t *testing.T) { //nolint:cyclop
20622063 assert .NotZero (t , ridID )
20632064 assert .NotZero (t , rsid )
20642065
2065- err = signalPairWithModification (pcOffer , pcAnswer , func (sdp string ) string {
2066+ assert . NoError ( t , signalPairWithModification (pcOffer , pcAnswer , func (sdp string ) string {
20662067 // Original chrome sdp contains no ssrc info https://pastebin.com/raw/JTjX6zg6
20672068 re := regexp .MustCompile ("(?m)[\r \n ]+^.*a=ssrc.*$" )
20682069 res := re .ReplaceAllString (sdp , "" )
20692070
20702071 return res
2071- })
2072- assert .NoError (t , err )
2072+ }))
20732073
20742074 // padding only packets should not affect simulcast probe
20752075 var sequenceNumber uint16
@@ -2493,3 +2493,113 @@ func Test_PeerConnection_RTX_E2E(t *testing.T) { //nolint:cyclop
24932493 closePairNow (t , pcOffer , pcAnswer )
24942494 assert .NoError (t , wan .Stop ())
24952495}
2496+
2497+ // Simulcast probe would lose packets. This test asserts that we don't drop
2498+ // any packets during the probe
2499+ func TestPeerConnection_Simulcast_Probe_PacketLoss (t * testing.T ) { //nolint:cyclop
2500+ t .Skip ()
2501+
2502+ lim := test .TimeOut (time .Second * 30 )
2503+ defer lim .Stop ()
2504+
2505+ report := test .CheckRoutines (t )
2506+ defer report ()
2507+
2508+ const rtpPktCount = 10
2509+ pcOffer , pcAnswer , wan := createVNetPair (t , nil )
2510+
2511+ rids := []string {"a" , "b" , "c" }
2512+ vp8WriterA , err := NewTrackLocalStaticRTP (
2513+ RTPCodecCapability {MimeType : MimeTypeVP8 }, "video" , "pion2" , WithRTPStreamID (rids [0 ]),
2514+ )
2515+ assert .NoError (t , err )
2516+
2517+ vp8WriterB , err := NewTrackLocalStaticRTP (
2518+ RTPCodecCapability {MimeType : MimeTypeVP8 }, "video" , "pion2" , WithRTPStreamID (rids [1 ]),
2519+ )
2520+ assert .NoError (t , err )
2521+
2522+ vp8WriterC , err := NewTrackLocalStaticRTP (
2523+ RTPCodecCapability {MimeType : MimeTypeVP8 }, "video" , "pion2" , WithRTPStreamID (rids [2 ]),
2524+ )
2525+ assert .NoError (t , err )
2526+
2527+ sender , err := pcOffer .AddTrack (vp8WriterA )
2528+ assert .NoError (t , err )
2529+ assert .NotNil (t , sender )
2530+
2531+ assert .NoError (t , sender .AddEncoding (vp8WriterB ))
2532+ assert .NoError (t , sender .AddEncoding (vp8WriterC ))
2533+
2534+ expectedBuffers := [][]byte {
2535+ make ([]byte , outboundMTU * rtpPktCount ),
2536+ make ([]byte , outboundMTU * rtpPktCount ),
2537+ make ([]byte , outboundMTU * rtpPktCount ),
2538+ }
2539+ for i := range expectedBuffers {
2540+ _ , err := rand .Read (expectedBuffers [i ])
2541+ assert .NoError (t , err )
2542+ }
2543+
2544+ pcAnswer .OnTrack (func (trackRemote * TrackRemote , _ * RTPReceiver ) {
2545+ actualBuffer := []byte {}
2546+
2547+ for i := 0 ; i < rtpPktCount ; i ++ {
2548+ pkt , _ , err := trackRemote .ReadRTP ()
2549+ assert .NoError (t , err )
2550+
2551+ actualBuffer = append (actualBuffer , pkt .Payload ... )
2552+ fmt .Println (pkt .SequenceNumber )
2553+ }
2554+
2555+ assert .Equal (t , actualBuffer , expectedBuffers [0 ])
2556+ })
2557+
2558+ var midID , ridID uint8
2559+ for _ , extension := range sender .GetParameters ().HeaderExtensions {
2560+ switch extension .URI {
2561+ case sdp .SDESMidURI :
2562+ midID = uint8 (extension .ID ) //nolint:gosec // G115
2563+ case sdp .SDESRTPStreamIDURI :
2564+ ridID = uint8 (extension .ID ) //nolint:gosec // G115
2565+ }
2566+ }
2567+ assert .NotZero (t , midID )
2568+ assert .NotZero (t , ridID )
2569+
2570+ assert .NoError (t , signalPairWithModification (pcOffer , pcAnswer , func (sdp string ) string {
2571+ // Original chrome sdp contains no ssrc info https://pastebin.com/raw/JTjX6zg6
2572+ re := regexp .MustCompile ("(?m)[\r \n ]+^.*a=ssrc.*$" )
2573+ res := re .ReplaceAllString (sdp , "" )
2574+
2575+ return res
2576+ }))
2577+
2578+ peerConnectionConnected := untilConnectionState (PeerConnectionStateConnected , pcOffer , pcAnswer )
2579+ peerConnectionConnected .Wait ()
2580+
2581+ for sequenceNumber := uint16 (0 ); sequenceNumber < rtpPktCount ; sequenceNumber ++ {
2582+ for i , track := range []* TrackLocalStaticRTP {vp8WriterA } {
2583+ pkt := & rtp.Packet {
2584+ Header : rtp.Header {
2585+ Version : 2 ,
2586+ PayloadType : 96 ,
2587+ SequenceNumber : sequenceNumber ,
2588+ },
2589+ }
2590+
2591+ // Make sure that packets for Stream received before MID/RID don't get dropped
2592+ if sequenceNumber > 3 {
2593+ assert .NoError (t , pkt .SetExtension (midID , []byte ("0" )))
2594+ assert .NoError (t , pkt .SetExtension (ridID , []byte (track .RID ())))
2595+ }
2596+
2597+ offset := int (sequenceNumber ) * outboundMTU
2598+ pkt .Payload = expectedBuffers [i ][offset : offset + outboundMTU ]
2599+ assert .NoError (t , track .WriteRTP (pkt ))
2600+ }
2601+ }
2602+
2603+ assert .NoError (t , wan .Stop ())
2604+ closePairNow (t , pcOffer , pcAnswer )
2605+ }
0 commit comments