gecko-dev/testing/web-platform/tests/webrtc/RTCRtpReceiver-getSynchronizationSources.https.html
Henrik Boström 31ed4baf2c Bug 1527044 [wpt PR 15133] - Deflake RTCPeerConnection-track-stats.https.html., a=testonly
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
2019-02-26 12:05:20 +00:00

96 lines
4.1 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!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>