@@ -68,13 +68,9 @@ test("RTCAudioSink should send even ondata when ondata is defined in ontrack eve
6868 // console.log('pcB: onicegatheringstatechange:', e.target.iceGatheringState);
6969 // };
7070
71- pcB . ontrack = ( e ) =>
72- setTimeout ( ( ) => {
73- sink = new RTCAudioSink ( e . track ) ;
74- sink . addEventListener ( "data" , ( ) => {
75- ondataDidFired += 1 ;
76- } ) ;
77- } , 1 ) ;
71+ var TARGET = 5 ;
72+ var received = 0 ;
73+ var interval ;
7874
7975 setupPerfectNegotiation ( pcA , pcB , true ) ;
8076 setupPerfectNegotiation ( pcB , pcA , false ) ;
@@ -83,29 +79,51 @@ test("RTCAudioSink should send even ondata when ondata is defined in ontrack eve
8379 const track = source . createTrack ( ) ;
8480 pcA . addTrack ( track ) ;
8581
82+ function done ( ) {
83+ clearInterval ( interval ) ;
84+ if ( sink ) sink . stop ( ) ;
85+ track . stop ( ) ;
86+ pcA . close ( ) ;
87+ pcB . close ( ) ;
88+ }
89+
90+ pcB . ontrack = ( e ) =>
91+ setTimeout ( ( ) => {
92+ sink = new RTCAudioSink ( e . track ) ;
93+ sink . addEventListener ( "data" , ( ) => {
94+ ondataDidFired += 1 ;
95+ if ( ondataDidFired >= TARGET && received === 0 ) {
96+ received = ondataDidFired ;
97+ done ( ) ;
98+ t . ok (
99+ received >= TARGET ,
100+ "RTCAudioSink fired at least " + TARGET + " times" ,
101+ ) ;
102+ t . end ( ) ;
103+ }
104+ } ) ;
105+ } , 1 ) ;
106+
86107 const sampleRate = 8000 ;
87108 const samples = new Int16Array ( sampleRate / 100 ) ;
88109 for ( let n = 0 ; n < samples . length ; n ++ ) {
89110 samples [ n ] = Math . random ( ) * 0xffff ;
90111 }
91112
92- const interval = setInterval ( ( ) => {
113+ interval = setInterval ( ( ) => {
93114 source . onData ( { samples, sampleRate } ) ;
94115 } , 10 ) ;
95116
96117 setTimeout ( ( ) => {
97- clearInterval ( interval ) ;
98- // yes > 9 and not 10 because some random thing in eventloop and setinterval/timeout result in values to be 9||10||11
99- t . ok (
100- ondataDidFired >= 9 ,
101- "RTCAudioSink should have fired 10 time in 100ms"
102- ) ;
103- sink . stop ( ) ;
104- track . stop ( ) ;
105- pcA . close ( ) ;
106- pcB . close ( ) ;
107- t . end ( ) ;
108- } , 105 ) ;
118+ if ( received === 0 ) {
119+ // Prevent a late data event (where ondataDidFired reaches TARGET
120+ // after this timeout) from calling done()/t.end() a second time.
121+ received = - 1 ;
122+ done ( ) ;
123+ t . fail ( "RTCAudioSink only fired " + ondataDidFired + " times in 2s" ) ;
124+ t . end ( ) ;
125+ }
126+ } , 2000 ) ;
109127} ) ;
110128
111129test ( "RTCAudioSink should send ondata events when defined outside ontrack" , ( t ) => {
@@ -150,32 +168,52 @@ test("RTCAudioSink should send ondata events when defined outside ontrack", (t)
150168 pcA . addTrack ( track ) ;
151169
152170 const sink = new RTCAudioSink ( track ) ;
153- sink . addEventListener ( "data" , ( ) => {
154- ondataDidFired += 1 ;
155- } ) ;
156171
157172 const sampleRate = 8000 ;
158173 const samples = new Int16Array ( sampleRate / 100 ) ;
159174 for ( let n = 0 ; n < samples . length ; n ++ ) {
160175 samples [ n ] = Math . random ( ) * 0xffff ;
161176 }
162- const interval = setInterval ( ( ) => {
163- source . onData ( { samples, sampleRate } ) ;
164- } , 10 ) ;
165177
166- setTimeout ( ( ) => {
178+ var TARGET = 5 ;
179+ var received = 0 ;
180+ var interval ;
181+
182+ function done ( ) {
167183 clearInterval ( interval ) ;
168- // TODO(jack): yes >= 9 and not 10 because some random thing in eventloop and setinterval/timeout result in values to be 9||10||11
169- t . ok (
170- ondataDidFired >= 9 ,
171- "RTCAudioSink should have fired 10 time in 100ms"
172- ) ;
173184 sink . stop ( ) ;
174185 track . stop ( ) ;
175186 pcA . close ( ) ;
176187 pcB . close ( ) ;
177- t . end ( ) ;
178- } , 105 ) ;
188+ }
189+
190+ sink . addEventListener ( "data" , ( ) => {
191+ ondataDidFired += 1 ;
192+ if ( ondataDidFired >= TARGET && received === 0 ) {
193+ received = ondataDidFired ;
194+ done ( ) ;
195+ t . ok (
196+ received >= TARGET ,
197+ "RTCAudioSink fired at least " + TARGET + " times" ,
198+ ) ;
199+ t . end ( ) ;
200+ }
201+ } ) ;
202+
203+ interval = setInterval ( ( ) => {
204+ source . onData ( { samples, sampleRate } ) ;
205+ } , 10 ) ;
206+
207+ setTimeout ( ( ) => {
208+ if ( received === 0 ) {
209+ // Prevent a late data event (where ondataDidFired reaches TARGET
210+ // after this timeout) from calling done()/t.end() a second time.
211+ received = - 1 ;
212+ done ( ) ;
213+ t . fail ( "RTCAudioSink only fired " + ondataDidFired + " times in 2s" ) ;
214+ t . end ( ) ;
215+ }
216+ } , 2000 ) ;
179217} ) ;
180218
181219/**
0 commit comments