mirror of
https://github.com/mozilla/gecko-dev.git
synced 2025-11-11 21:58:41 +02:00
Automatic update from web-platform-tests Deflake RTCPeerConnection-track-stats.https.html. This CL does the following: 1. Add a test that verifies we have a succeeded candidate pair in getStats() as soon as iceConnectionState is "connected". This is currently flaky (https://crbug.com/926170) and marked as such. 2. Add workaround to RTCPeerConnection-track-stats.https.html so that it does not flake due to 1), and mark it not flaky. 3. Move shared helper functions to RTCPeerConnection-helper.js. 4. Add test coverage for making sure we can become connected in the recvonly use case. This requires changing the prefix to ".https.html" of "RTCPeerConnection-iceConnectionState". // Already reviewed by jonasolsson@chromium.org TBR=guidou@chromium.org Bug: 922955, 926170 Change-Id: I828e46273a84447c817595a466a5e143bde30eca Reviewed-on: https://chromium-review.googlesource.com/c/1442201 Reviewed-by: Henrik Boström <hbos@chromium.org> Commit-Queue: Henrik Boström <hbos@chromium.org> Cr-Commit-Position: refs/heads/master@{#627421} -- wpt-commits: 7179024d5dfb231073c7319948499d7e30f671cb wpt-pr: 15133
96 lines
4.1 KiB
HTML
96 lines
4.1 KiB
HTML
<!doctype html>
|
||
<meta charset=utf-8>
|
||
<!-- This file contains two tests that wait for 10 seconds each. -->
|
||
<meta name="timeout" content="long">
|
||
<title>RTCRtpReceiver.prototype.getSynchronizationSources</title>
|
||
<script src="/resources/testharness.js"></script>
|
||
<script src="/resources/testharnessreport.js"></script>
|
||
<script src="RTCPeerConnection-helper.js"></script>
|
||
<script>
|
||
'use strict';
|
||
|
||
async function initiateSingleTrackCallAndReturnReceiver(t, kind) {
|
||
const pc1 = new RTCPeerConnection();
|
||
t.add_cleanup(() => pc1.close());
|
||
const pc2 = new RTCPeerConnection();
|
||
t.add_cleanup(() => pc2.close());
|
||
|
||
const stream = await navigator.mediaDevices.getUserMedia({[kind]:true});
|
||
const [track] = stream.getTracks();
|
||
t.add_cleanup(() => track.stop());
|
||
pc1.addTrack(track, stream);
|
||
|
||
exchangeIceCandidates(pc1, pc2);
|
||
const trackEvent = await exchangeOfferAndListenToOntrack(t, pc1, pc2);
|
||
await exchangeAnswer(pc1, pc2);
|
||
return trackEvent.receiver;
|
||
}
|
||
|
||
for (const kind of ['audio', 'video']) {
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
await listenForSSRCs(t, receiver);
|
||
}, '[' + kind + '] getSynchronizationSources() eventually returns a ' +
|
||
'non-empty list');
|
||
|
||
promise_test(async t => {
|
||
const startTime = performance.now();
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.timestamp, 'number');
|
||
assert_true(ssrc.timestamp >= startTime);
|
||
}, '[' + kind + '] RTCRtpSynchronizationSource.timestamp is a number');
|
||
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
// Wait for packets to start flowing.
|
||
await listenForSSRCs(t, receiver);
|
||
// Wait for 10 seconds.
|
||
await new Promise(resolve => t.step_timeout(resolve, 10000));
|
||
let earliestTimestamp = undefined;
|
||
let latestTimestamp = undefined;
|
||
for (const ssrc of await listenForSSRCs(t, receiver)) {
|
||
if (earliestTimestamp == undefined || earliestTimestamp > ssrc.timestamp)
|
||
earliestTimestamp = ssrc.timestamp;
|
||
if (latestTimestamp == undefined || latestTimestamp < ssrc.timestamp)
|
||
latestTimestamp = ssrc.timestamp;
|
||
}
|
||
assert_true(latestTimestamp - earliestTimestamp <= 10000);
|
||
}, '[' + kind + '] getSynchronizationSources() does not contain SSRCs ' +
|
||
'older than 10 seconds');
|
||
|
||
promise_test(async t => {
|
||
const startTime = performance.timeOrigin + performance.now();
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
const endTime = performance.timeOrigin + performance.now();
|
||
assert_true(startTime <= ssrc.timestamp && ssrc.timestamp <= endTime);
|
||
}, '[' + kind + '] RTCRtpSynchronizationSource.timestamp is comparable to ' +
|
||
'performance.timeOrigin + performance.now()');
|
||
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, kind);
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.source, 'number');
|
||
}, '[' + kind + '] RTCRtpSynchronizationSource.source is a number');
|
||
}
|
||
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, 'audio');
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.audioLevel, 'number');
|
||
assert_greater_than_equal(ssrc.audioLevel, 0);
|
||
assert_less_than_equal(ssrc.audioLevel, 1);
|
||
}, '[audio-only] RTCRtpSynchronizationSource.audioLevel is a number [0, 1]');
|
||
|
||
// This test only passes if the implementation is sending the RFC 6464 extension
|
||
// header and the "vad" extension attribute is not "off", otherwise
|
||
// voiceActivityFlag is absent. TODO: Consider moving this test to an
|
||
// optional-to-implement subfolder?
|
||
promise_test(async t => {
|
||
const receiver = await initiateSingleTrackCallAndReturnReceiver(t, 'audio');
|
||
const [ssrc] = await listenForSSRCs(t, receiver);
|
||
assert_equals(typeof ssrc.voiceActivityFlag, 'boolean');
|
||
}, '[audio-only] RTCRtpSynchronizationSource.voiceActivityFlag is a boolean');
|
||
|
||
</script>
|