Skip to content

Commit fb18a98

Browse files
committed
fix(test): replace time-based audio sink assertions with event-count-based
The timing approach was flakey due to event loop timing jitter.
1 parent b479125 commit fb18a98

1 file changed

Lines changed: 72 additions & 34 deletions

File tree

test/rtcaudiosink.js

Lines changed: 72 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -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

111129
test("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

Comments
 (0)