Files
sousa-gecko/testing/web-platform/tests/webrtc/RTCRtpReceiver-getStats.https.html
T
Jan-Ivar Bruaroey 75e09c903f Bug 2016479 - Isolate WPT single-browser-failures in webrtc into ?interop-2026 variant. r=jgraham,bwc
WebRTC is part of Interop 2026, with focus on /webrtc subtests only failing in a
single engine out of three: count=2(status:pass).

But the label:interop-2026-webrtc can only be applied to tests, not subtests, which
overcounts the number of subtests we agreed to include by a couple hundred.

One option would be to split 42 test files in two over this. Another is to add META
variants ?interop-2026 and ?rest to those same files (letting them be labeled).

This is that second option. Avoids test duplication, touches a minimal number of
lines, preserves git blame (at the cost of ignoring some indentation lint for a
while), and is easily reversible.

Some overcounting remains in idlharness which can only narrow to affected interfaces.

Differential Revision: https://phabricator.services.mozilla.com/D283558
2026-02-18 20:52:32 +00:00

129 lines
5.5 KiB
HTML

<!doctype html>
<meta charset=utf-8>
<meta name="variant" content="?interop-2026">
<meta name="variant" content="?rest">
<meta name="timeout" content="long">
<title>RTCRtpReceiver.prototype.getStats</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
'use strict';
const rest = !new URLSearchParams(location.search).has("interop-2026");
const interop2026 = !new URLSearchParams(location.search).has("rest");
if (interop2026) {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const stream = await getNoiseStream({audio:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
callee.addTrack(track, stream);
const { receiver } = caller.addTransceiver('audio');
exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);
await listenToConnected(callee);
await waitForTrackUnmuted(receiver.track);
const statsReport = await receiver.getStats();
assert_true(!![...statsReport.values()].find(({type}) => type === 'inbound-rtp'));
}, 'receiver.getStats() via addTransceiver should return stats report containing inbound-rtp stats');
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const stream = await getNoiseStream({audio:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
caller.addTrack(track, stream);
exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);
const receiver = callee.getReceivers()[0];
await listenToConnected(callee);
await waitForTrackUnmuted(receiver.track);
const statsReport = await receiver.getStats();
assert_true(!![...statsReport.values()].find(({type}) => type === 'inbound-rtp'));
}, 'receiver.getStats() via addTrack should return stats report containing inbound-rtp stats');
} // interop2026
if (rest) {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const stream = await getNoiseStream({audio:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
caller.addTrack(track, stream);
exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);
const [receiver] = callee.getReceivers();
await listenToConnected(callee);
await waitForTrackUnmuted(receiver.track);
const [transceiver] = callee.getTransceivers();
const statsPromiseFirst = receiver.getStats();
transceiver.stop();
const statsReportFirst = await statsPromiseFirst;
const statsReportSecond = await receiver.getStats();
assert_true(!![...statsReportFirst.values()].find(({type}) => type === 'inbound-rtp'));
assert_false(!![...statsReportSecond.values()].find(({type}) => type === 'inbound-rtp'));
}, 'receiver.getStats() should work on a stopped transceiver but not have inbound-rtp objects');
} // rest
if (interop2026) {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const stream = await getNoiseStream({audio:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
caller.addTrack(track, stream);
exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);
const [receiver] = callee.getReceivers();
await listenToConnected(callee);
await waitForTrackUnmuted(receiver.track);
const statsReportFirst = await receiver.getStats();
callee.close();
const statsReportSecond = await receiver.getStats();
assert_true(!![...statsReportFirst.values()].find(({type}) => type === 'inbound-rtp'));
assert_false(!![...statsReportSecond.values()].find(({type}) => type === 'inbound-rtp'));
}, 'receiver.getStats() should work with a closed PeerConnection but not have inbound-rtp objects');
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const stream = await getNoiseStream({audio:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
caller.addTrack(track, stream);
exchangeIceCandidates(caller, callee);
await exchangeOfferAnswer(caller, callee);
const receiver = callee.getReceivers()[0];
await listenToConnected(callee);
await waitForTrackUnmuted(receiver.track);
const statsReport = await receiver.getStats();
assert_true(!![...statsReport.values()].find(({type}) => type === 'candidate-pair'));
assert_true(!![...statsReport.values()].find(({type}) => type === 'local-candidate'));
assert_true(!![...statsReport.values()].find(({type}) => type === 'remote-candidate'));
}, 'receiver.getStats() should return stats report containing ICE candidate stats');
} // interop2026
</script>