blob: cc1dbccf996148b1e2065e9c54e41bcaeb392801 [file] [log] [blame]
<!doctype html>
<meta charset=utf-8>
<meta name="timeout" content="long">
<title>RTCPeerConnection.addTrack multiple times</title>
<script src="../../resources/testharness.js"></script>
<script src="../../resources/testharnessreport.js"></script>
<script src="../../external/wpt/webrtc/RTCPeerConnection-helper.js"></script>
<script>
'use strict';
const reasonableNegotiationTimeMs = 1000; // 1 second
const reasonableTotalTestTimeMs = 2000; // The overall time for a test of this type is 10 secs, so timeout must be small
function maybeLog(arg) {
// Uncomment to log performance data
// console.log(arg);
}
async function doNegotiation(caller, callee) {
const startTime = performance.now();
const offer = await caller.createOffer();
await caller.setLocalDescription(offer);
await callee.setRemoteDescription(offer);
const answer = await callee.createAnswer();
await callee.setLocalDescription(answer);
await caller.setRemoteDescription(answer);
return performance.now() - startTime;
}
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();
const testStartTime = performance.now();
let timeTakenMs = 0;
let count = 0;
while (timeTakenMs < reasonableNegotiationTimeMs &&
performance.now() - testStartTime < reasonableTotalTestTimeMs) {
count += 1;
const transceiver = caller.addTrack(track.clone());
timeTakenMs = await doNegotiation(caller, callee);
maybeLog('Audio: Count ' + count + ', timeTakenMs is ' + timeTakenMs);
assert_equals(callee.getReceivers().length, count);
}
// 6 has been observed on a weak Linux cloudtop in debug mode.
assert_greater_than_equal(count, 5);
}, 'Adding multiple audio tracks with addTrack(), one at a time');
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();
const kTrackCount = 10;
for (let count = 1; count <= kTrackCount; count++) {
const transceiver = caller.addTrack(track.clone());
}
const timeTakenMs = await doNegotiation(caller, callee);
assert_equals(caller.getSenders().length, kTrackCount);
assert_equals(callee.getReceivers().length, kTrackCount);
assert_less_than(timeTakenMs, reasonableNegotiationTimeMs);
}, 'Adding multiple audio tracks with addTrack(), all at once');
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({video: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const testStartTime = performance.now();
let timeTakenMs = 0;
let count = 0;
while (timeTakenMs < reasonableNegotiationTimeMs &&
performance.now() - testStartTime < reasonableTotalTestTimeMs) {
count += 1;
const transceiver = caller.addTrack(track.clone());
timeTakenMs = await doNegotiation(caller, callee);
maybeLog('Video: Count ' + count + ', timeTakenMs is ' + timeTakenMs);
assert_equals(callee.getReceivers().length, count);
}
// 2 has been observed on a weak Linux cloudtop instance in debug mode.
assert_greater_than_equal(count, 2);
}, 'Adding multiple video tracks with addTrack(), one at a time');
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({video: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
// More than 1 second on 3 tracks has been observed
// on a weak Linux cloudtop in debug mode.
const kTrackCount = 2;
for (let count = 1; count <= kTrackCount; count++) {
const transceiver = caller.addTrack(track.clone());
}
const timeTakenMs = await doNegotiation(caller, callee);
assert_equals(caller.getSenders().length, kTrackCount);
assert_equals(callee.getReceivers().length, kTrackCount);
assert_less_than(timeTakenMs, reasonableNegotiationTimeMs);
}, 'Adding multiple video tracks with addTrack(), all at once');
</script>