@@ -14,6 +14,7 @@ import (
1414 "log/slog"
1515 "os"
1616 "path/filepath"
17+ "strings"
1718 "testing"
1819 "testing/synctest"
1920 "time"
@@ -24,6 +25,8 @@ import (
2425
2526var logDir string
2627
28+ type vnetFactory func (* testing.T ) * virtualNetwork
29+
2730func TestMain (m * testing.M ) {
2831 logDir = os .Getenv ("BWE_LOG_DIR" )
2932 if logDir == "" {
@@ -63,111 +66,121 @@ func TestMain(m *testing.M) {
6366}
6467
6568func TestBWE (t * testing.T ) {
66- synctest .Test (t , func (t * testing.T ) {
67- t .Helper ()
68-
69- logger , cleanup := testLogger (t )
70- defer cleanup ()
71-
72- onTrack := make (chan struct {})
73- connected := make (chan struct {})
74- done := make (chan struct {})
75-
76- network := createVirtualNetwork (t )
77- receiver , err := newPeer (
78- registerDefaultCodecs (),
79- setVNet (network .left , []string {"10.0.1.1" }),
80- registerTWCC (),
81- onRemoteTrack (func (track * webrtc.TrackRemote ) {
82- close (onTrack )
83- go func () {
84- buf := make ([]byte , 1500 )
85- for {
86- select {
87- case <- done :
88- return
89- default :
90- _ , _ , err := track .Read (buf )
91- if errors .Is (err , io .EOF ) {
92- return
69+ networks := map [string ]vnetFactory {
70+ "constant_capacity" : createVirtualNetwork (),
71+ }
72+ for name , vnf := range networks {
73+ t .Run (name , func (t * testing.T ) {
74+ synctest .Test (t , func (t * testing.T ) {
75+ t .Helper ()
76+
77+ logger , cleanup := testLogger (t )
78+ defer cleanup ()
79+
80+ onTrack := make (chan struct {})
81+ connected := make (chan struct {})
82+ done := make (chan struct {})
83+
84+ network := vnf (t )
85+
86+ receiver , err := newPeer (
87+ registerDefaultCodecs (),
88+ setVNet (network .left , []string {"10.0.1.1" }),
89+ registerTWCC (),
90+ onRemoteTrack (func (track * webrtc.TrackRemote ) {
91+ close (onTrack )
92+ go func () {
93+ buf := make ([]byte , 1500 )
94+ for {
95+ select {
96+ case <- done :
97+ return
98+ default :
99+ _ , _ , err := track .Read (buf )
100+ if errors .Is (err , io .EOF ) {
101+ return
102+ }
103+ assert .NoError (t , err )
104+ }
93105 }
94- assert .NoError (t , err )
95- }
96- }
106+ }()
107+ }),
108+ registerPacketLogger (logger .With ("vantage-point" , "receiver" )),
109+ registerCCFB (),
110+ )
111+ assert .NoError (t , err )
112+
113+ err = receiver .addRemoteTrack ()
114+ assert .NoError (t , err )
115+
116+ var codec * perfectCodec
117+ sender , err := newPeer (
118+ registerDefaultCodecs (),
119+ onConnected (func () { close (connected ) }),
120+ setVNet (network .right , []string {"10.0.2.1" }),
121+ registerPacketLogger (logger .With ("vantage-point" , "sender" )),
122+ registerRTPFB (),
123+ initGCC (func (rate int ) {
124+ logger .Info ("setting codec target bitrate" , "rate" , rate )
125+ codec .setTargetBitrate (rate )
126+ }),
127+ )
128+ assert .NoError (t , err )
129+
130+ track , err := sender .addLocalTrack ()
131+ assert .NoError (t , err )
132+
133+ codec = newPerfectCodec (track , 1_000_000 )
134+ go func () {
135+ <- connected
136+ codec .start ()
97137 }()
98- }),
99- registerPacketLogger (logger .With ("vantage-point" , "receiver" )),
100- registerCCFB (),
101- )
102- assert .NoError (t , err )
103-
104- err = receiver .addRemoteTrack ()
105- assert .NoError (t , err )
106-
107- var codec * perfectCodec
108- sender , err := newPeer (
109- registerDefaultCodecs (),
110- onConnected (func () { close (connected ) }),
111- setVNet (network .right , []string {"10.0.2.1" }),
112- registerPacketLogger (logger .With ("vantage-point" , "sender" )),
113- registerRTPFB (),
114- initGCC (func (rate int ) {
115- logger .Info ("setting codec target bitrate" , "rate" , rate )
116- codec .setTargetBitrate (rate )
117- }),
118- )
119- assert .NoError (t , err )
120-
121- track , err := sender .addLocalTrack ()
122- assert .NoError (t , err )
123-
124- codec = newPerfectCodec (track , 1_000_000 )
125- go func () {
126- <- connected
127- codec .start ()
128- }()
129-
130- offer , err := sender .createOffer ()
131- assert .NoError (t , err )
132-
133- err = receiver .setRemoteDescription (offer )
134- assert .NoError (t , err )
135-
136- answer , err := receiver .createAnswer ()
137- assert .NoError (t , err )
138-
139- err = sender .setRemoteDescription (answer )
140- assert .NoError (t , err )
141-
142- synctest .Wait ()
143- select {
144- case <- onTrack :
145- case <- time .After (time .Second ):
146- assert .Fail (t , "on track not called" )
147- }
148- time .Sleep (100 * time .Second )
149- close (done )
150-
151- err = codec .Close ()
152- assert .NoError (t , err )
153-
154- err = sender .pc .Close ()
155- assert .NoError (t , err )
156-
157- err = receiver .pc .Close ()
158- assert .NoError (t , err )
159-
160- err = network .Close ()
161- assert .NoError (t , err )
162-
163- synctest .Wait ()
164- })
138+
139+ offer , err := sender .createOffer ()
140+ assert .NoError (t , err )
141+
142+ err = receiver .setRemoteDescription (offer )
143+ assert .NoError (t , err )
144+
145+ answer , err := receiver .createAnswer ()
146+ assert .NoError (t , err )
147+
148+ err = sender .setRemoteDescription (answer )
149+ assert .NoError (t , err )
150+
151+ synctest .Wait ()
152+
153+ select {
154+ case <- onTrack :
155+ case <- time .After (time .Second ):
156+ assert .Fail (t , "on track not called" )
157+ }
158+
159+ time .Sleep (100 * time .Second )
160+ close (done )
161+
162+ err = codec .Close ()
163+ assert .NoError (t , err )
164+
165+ err = sender .pc .Close ()
166+ assert .NoError (t , err )
167+
168+ err = receiver .pc .Close ()
169+ assert .NoError (t , err )
170+
171+ err = network .Close ()
172+ assert .NoError (t , err )
173+
174+ synctest .Wait ()
175+ })
176+ })
177+ }
165178}
166179
167180func testLogger (t * testing.T ) (* slog.Logger , func ()) {
168181 t .Helper ()
169-
170- filename := filepath .Join (logDir , fmt .Sprintf ("%s.jsonl" , t . Name () ))
182+ name := strings . ReplaceAll ( t . Name (), "/" , "-" )
183+ filename := filepath .Join (logDir , fmt .Sprintf ("%s.jsonl" , name ))
171184 file , err := os .Create (filename )
172185 if err != nil {
173186 t .Fatalf ("failed to create log file %q: %v" , filename , err )
0 commit comments