Update web-platform-tests to revision 60220357131c65146444da1f54624d5b54d0975d

This commit is contained in:
WPT Sync Bot 2018-07-18 15:43:58 +00:00 committed by Tom Servo
parent c45192614c
commit 775b784f79
2144 changed files with 58115 additions and 29658 deletions

View file

@ -1,3 +1,4 @@
spec: https://w3c.github.io/webrtc-pc/
suggested_reviewers:
- snuggs
- agouaillard

View file

@ -119,7 +119,9 @@
const offer = await caller.createOffer();
await caller.setLocalDescription(offer);
await callee.setRemoteDescription(offer);
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
callee.addTrack(track);
const answer = await callee.createAnswer();
await callee.setLocalDescription(answer);

View file

@ -3,6 +3,7 @@
<title>RTCPeerConnection addTrack does not deadlock</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="RTCPeerConnection-helper.js"></script>
<script>
'use strict';
@ -12,7 +13,7 @@
promise_test(async t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const stream = await navigator.mediaDevices.getUserMedia(
const stream = await getNoiseStream(
{audio: false, video: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const videoTrack = stream.getVideoTracks()[0];

View file

@ -11,7 +11,7 @@
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateMediaStreamTrack
// getNoiseStream()
/*
5.1. RTCPeerConnection Interface Extensions
@ -41,7 +41,7 @@
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
@ -64,7 +64,7 @@
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
@ -96,7 +96,7 @@
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
@ -113,7 +113,7 @@
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
@ -137,7 +137,7 @@
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
@ -171,7 +171,9 @@
assert_equals(transceiver.sender.track, null);
assert_equals(transceiver.direction, 'recvonly');
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = pc.addTrack(track);
assert_equals(sender, transceiver.sender);
@ -188,7 +190,9 @@
assert_equals(transceiver.sender.track, null);
assert_equals(transceiver.direction, 'sendrecv');
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = pc.addTrack(track);
assert_equals(sender.track, track);
@ -201,8 +205,10 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const transceiver =
caller.addTransceiver(generateMediaStreamTrack('audio'));
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = caller.addTransceiver(track);
{
const offer = await caller.createOffer();
await caller.setLocalDescription(offer);
@ -227,7 +233,7 @@
// |transceiver.sender| is currently not used for sending, but it should not
// be reused because it has been used for sending before.
const sender = caller.addTrack(generateMediaStreamTrack('audio'));
const sender = caller.addTrack(track);
assert_true(sender != null);
assert_not_equals(sender, transceiver.sender);
}, 'addTrack with existing sender that has been used to send should create new sender');
@ -240,7 +246,9 @@
assert_equals(transceiver.sender.track, null);
assert_equals(transceiver.direction, 'recvonly');
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = pc.addTrack(track);
assert_equals(sender.track, track);

View file

@ -15,7 +15,7 @@
// generateAnswer()
// countAudioLine()
// countVideoLine()
// assert_session_desc_equals()
// assert_session_desc_similar()
/*
* 4.3.2. createOffer()
@ -54,8 +54,8 @@
pc.setLocalDescription(offer)
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
assert_session_desc_similar(pc.localDescription, offer);
assert_session_desc_similar(pc.pendingLocalDescription, offer);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer']);

View file

@ -78,10 +78,13 @@
});
}, 'getStats() with track added via addTrack should succeed');
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
pc.addTransceiver(track);
return pc.getStats(track);
@ -238,7 +241,7 @@
const dataChannel = pc1.createDataChannel('test-channel');
return navigator.mediaDevices.getUserMedia({
return getNoiseStream({
audio: true,
video: true
})

View file

@ -93,12 +93,12 @@ function isSimilarSessionDescription(sessionDesc1, sessionDesc2) {
}
}
function assert_session_desc_equals(sessionDesc1, sessionDesc2) {
function assert_session_desc_similar(sessionDesc1, sessionDesc2) {
assert_true(isSimilarSessionDescription(sessionDesc1, sessionDesc2),
'Expect both session descriptions to have the same count of media lines');
}
function assert_session_desc_not_equals(sessionDesc1, sessionDesc2) {
function assert_session_desc_not_similar(sessionDesc1, sessionDesc2) {
assert_false(isSimilarSessionDescription(sessionDesc1, sessionDesc2),
'Expect both session descriptions to have different count of media lines');
}
@ -350,12 +350,110 @@ function generateMediaStreamTrack(kind) {
return track;
}
// Obtain a MediaStreamTrack of kind using getUserMedia.
// These media tracks will be continually updated with deterministic "noise" in
// order to ensure UAs do not cease transmission in response to apparent
// silence.
//
// > Many codecs and systems are capable of detecting "silence" and changing
// > their behavior in this case by doing things such as not transmitting any
// > media.
//
// Source: https://w3c.github.io/webrtc-pc/#offer-answer-options
const trackFactories = {
// Share a single context between tests to avoid exceeding resource limits
// without requiring explicit destruction.
audioContext: null,
/**
* Given a set of requested media types, determine if the user agent is
* capable of procedurally generating a suitable media stream.
*
* @param {object} requested
* @param {boolean} [requested.audio] - flag indicating whether the desired
* stream should include an audio track
* @param {boolean} [requested.video] - flag indicating whether the desired
* stream should include a video track
*
* @returns {boolean}
*/
canCreate(requested) {
const supported = {
audio: !!window.MediaStreamAudioDestinationNode,
video: !!HTMLCanvasElement.prototype.captureStream
};
return (!requested.audio || supported.audio) &&
(!requested.video || supported.video);
},
audio() {
const ctx = trackFactories.audioContext = trackFactories.audioContext ||
new AudioContext();
const oscillator = ctx.createOscillator();
const dst = oscillator.connect(ctx.createMediaStreamDestination());
oscillator.start();
return dst.stream.getAudioTracks()[0];
},
video({width = 640, height = 480} = {}) {
const canvas = Object.assign(
document.createElement("canvas"), {width, height}
);
const ctx = canvas.getContext('2d');
const stream = canvas.captureStream();
let count = 0;
setInterval(() => {
ctx.fillStyle = `rgb(${count%255}, ${count*count%255}, ${count%255})`;
count += 1;
ctx.fillRect(0, 0, width, height);
}, 100);
if (document.body) {
document.body.appendChild(canvas);
} else {
document.addEventListener('DOMContentLoaded', () => {
document.body.appendChild(canvas);
});
}
return stream.getVideoTracks()[0];
}
};
// Generate a MediaStream bearing the specified tracks.
//
// @param {object} [caps]
// @param {boolean} [caps.audio] - flag indicating whether the generated stream
// should include an audio track
// @param {boolean} [caps.video] - flag indicating whether the generated stream
// should include a video track
async function getNoiseStream(caps = {}) {
if (!trackFactories.canCreate(caps)) {
return navigator.mediaDevices.getUserMedia(caps);
}
const tracks = [];
if (caps.audio) {
tracks.push(trackFactories.audio());
}
if (caps.video) {
tracks.push(trackFactories.video());
}
return new MediaStream(tracks);
}
// Obtain a MediaStreamTrack of kind using procedurally-generated streams (and
// falling back to `getUserMedia` when the user agent cannot generate the
// requested streams).
// Return Promise of pair of track and associated mediaStream.
// Assumes that there is at least one available device
// to generate the track.
function getTrackFromUserMedia(kind) {
return navigator.mediaDevices.getUserMedia({ [kind]: true })
return getNoiseStream({ [kind]: true })
.then(mediaStream => {
const [track] = mediaStream.getTracks();
return [track, mediaStream];

View file

@ -12,7 +12,6 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateAnswer
// generateMediaStreamTrack
/*
5.1. RTCPeerConnection Interface Extensions
@ -35,22 +34,23 @@
5.1. removeTrack
3. If connection's [[isClosed]] slot is true, throw an InvalidStateError.
*/
test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = pc.addTransceiver(track);
const { sender } = transceiver;
pc.close();
assert_throws('InvalidStateError', () => pc.removeTrack(sender));
}, 'addTransceiver - Calling removeTrack when connection is closed should throw InvalidStateError');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = pc.addTrack(track, stream);
@ -59,23 +59,24 @@
assert_throws('InvalidStateError', () => pc.removeTrack(sender));
}, 'addTrack - Calling removeTrack when connection is closed should throw InvalidStateError');
test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = pc.addTransceiver(track);
const { sender } = transceiver;
const pc2 = new RTCPeerConnection();
pc2.close();
assert_throws('InvalidStateError', () => pc2.removeTrack(sender));
}, 'addTransceiver - Calling removeTrack on different connection that is closed should throw InvalidStateError');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = pc.addTrack(track, stream);
@ -89,22 +90,23 @@
5.1. removeTrack
4. If sender was not created by connection, throw an InvalidAccessError.
*/
test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = pc.addTransceiver(track);
const { sender } = transceiver;
const pc2 = new RTCPeerConnection();
assert_throws('InvalidAccessError', () => pc2.removeTrack(sender));
}, 'addTransceiver - Calling removeTrack on different connection should throw InvalidAccessError');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = pc.addTrack(track, stream);
@ -117,9 +119,11 @@
5.1. removeTrack
7. Set sender.track to null.
*/
test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = pc.addTransceiver(track);
const { sender } = transceiver;
@ -130,14 +134,13 @@
pc.removeTrack(sender);
assert_equals(sender.track, null);
assert_equals(transceiver.direction, 'recvonly');
}, 'addTransceiver - Calling removeTrack with valid sender should set sender.track to null');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
const stream = await getNoiseStream({ audio: true });
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = pc.addTrack(track, stream);
@ -159,7 +162,9 @@
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = caller.addTransceiver(track);
const { sender } = transceiver;
@ -192,7 +197,9 @@
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = pc.addTransceiver(track, { direction: 'sendonly' });
const { sender } = transceiver;
@ -224,7 +231,9 @@
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = caller.addTransceiver(track, { direction: 'recvonly' });
const { sender } = transceiver;
@ -256,7 +265,9 @@
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const transceiver = pc.addTransceiver(track, { direction: 'inactive' });
const { sender } = transceiver;

View file

@ -13,7 +13,7 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer
// generateAnswer
// assert_session_desc_equals
// assert_session_desc_similar
/*
4.3.2. Interface Definition
@ -73,11 +73,11 @@
pc.setLocalDescription(answer)
.then(() => {
assert_equals(pc.signalingState, 'stable');
assert_session_desc_equals(pc.localDescription, answer);
assert_session_desc_equals(pc.remoteDescription, offer);
assert_session_desc_similar(pc.localDescription, answer);
assert_session_desc_similar(pc.remoteDescription, offer);
assert_session_desc_equals(pc.currentLocalDescription, answer);
assert_session_desc_equals(pc.currentRemoteDescription, offer);
assert_session_desc_similar(pc.currentLocalDescription, answer);
assert_session_desc_similar(pc.currentRemoteDescription, offer);
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
@ -105,11 +105,11 @@
pc.setLocalDescription({ type: 'answer' })
.then(() => {
assert_equals(pc.signalingState, 'stable');
assert_session_desc_equals(pc.localDescription, answer);
assert_session_desc_equals(pc.remoteDescription, offer);
assert_session_desc_similar(pc.localDescription, answer);
assert_session_desc_similar(pc.remoteDescription, offer);
assert_session_desc_equals(pc.currentLocalDescription, answer);
assert_session_desc_equals(pc.currentRemoteDescription, offer);
assert_session_desc_similar(pc.currentLocalDescription, answer);
assert_session_desc_similar(pc.currentRemoteDescription, offer);
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);

View file

@ -12,8 +12,8 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer
// assert_session_desc_not_equals
// assert_session_desc_equals
// assert_session_desc_not_similar
// assert_session_desc_similar
/*
4.3.2. Interface Definition
@ -67,8 +67,8 @@
pc.setLocalDescription(offer)
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
assert_session_desc_similar(pc.localDescription, offer);
assert_session_desc_similar(pc.pendingLocalDescription, offer);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer']);
@ -89,8 +89,8 @@
pc.setLocalDescription({ type: 'offer' })
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
assert_session_desc_similar(pc.localDescription, offer);
assert_session_desc_similar(pc.pendingLocalDescription, offer);
assert_equals(pc.currentLocalDescription, null);
}));
}, 'setLocalDescription with type offer and null sdp should use lastOffer generated from createOffer');
@ -126,7 +126,7 @@
.then(offer1 =>
pc.createOffer({ offerToReceiveVideo: true })
.then(offer2 => {
assert_session_desc_not_equals(offer1, offer2);
assert_session_desc_not_similar(offer1, offer2);
return promise_rejects(t, 'InvalidModificationError',
pc.setLocalDescription(offer1));
}));
@ -147,10 +147,10 @@
.then(offer2 =>
pc.setLocalDescription(offer2)
.then(offer2 => {
assert_session_desc_not_equals(offer1, offer2);
assert_session_desc_not_similar(offer1, offer2);
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_equals(pc.localDescription, offer2);
assert_session_desc_equals(pc.pendingLocalDescription, offer2);
assert_session_desc_similar(pc.localDescription, offer2);
assert_session_desc_similar(pc.pendingLocalDescription, offer2);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer']);

View file

@ -13,7 +13,7 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer
// generateAnswer
// assert_session_desc_equals
// assert_session_desc_similar
/*
4.3.2. Interface Definition
@ -97,12 +97,12 @@
.then(() => {
assert_equals(pc.signalingState, 'have-local-pranswer');
assert_session_desc_equals(pc.remoteDescription, offer);
assert_session_desc_equals(pc.pendingRemoteDescription, offer);
assert_session_desc_similar(pc.remoteDescription, offer);
assert_session_desc_similar(pc.pendingRemoteDescription, offer);
assert_equals(pc.currentRemoteDescription, null);
assert_session_desc_equals(pc.localDescription, pranswer);
assert_session_desc_equals(pc.pendingLocalDescription, pranswer);
assert_session_desc_similar(pc.localDescription, pranswer);
assert_session_desc_similar(pc.pendingLocalDescription, pranswer);
assert_equals(pc.currentLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
@ -152,11 +152,11 @@
.then(() => pc.setLocalDescription(answer))
.then(() => {
assert_equals(pc.signalingState, 'stable');
assert_session_desc_equals(pc.localDescription, answer);
assert_session_desc_equals(pc.remoteDescription, offer);
assert_session_desc_similar(pc.localDescription, answer);
assert_session_desc_similar(pc.remoteDescription, offer);
assert_session_desc_equals(pc.currentLocalDescription, answer);
assert_session_desc_equals(pc.currentRemoteDescription, offer);
assert_session_desc_similar(pc.currentLocalDescription, answer);
assert_session_desc_similar(pc.currentRemoteDescription, offer);
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);

View file

@ -11,7 +11,7 @@
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
// assert_session_desc_equals
// assert_session_desc_similar
/*
4.3.2. Interface Definition

View file

@ -12,8 +12,8 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer
// assert_session_desc_not_equals
// assert_session_desc_equals
// assert_session_desc_not_similar
// assert_session_desc_similar
/*
4.3.2. Interface Definition
@ -63,10 +63,10 @@
pc.setLocalDescription(offer2)
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_not_equals(offer1, offer2);
assert_session_desc_equals(pc.localDescription, offer2);
assert_session_desc_equals(pc.currentLocalDescription, offer1);
assert_session_desc_equals(pc.pendingLocalDescription, offer2);
assert_session_desc_not_similar(offer1, offer2);
assert_session_desc_similar(pc.localDescription, offer2);
assert_session_desc_similar(pc.currentLocalDescription, offer1);
assert_session_desc_similar(pc.pendingLocalDescription, offer2);
assert_array_equals(states, ['have-local-offer', 'stable', 'have-local-offer']);
})));
@ -89,9 +89,9 @@
pc.setLocalDescription(offer)
.then(() => {
assert_equals(pc.signalingState, 'have-local-offer');
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.currentLocalDescription, answer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
assert_session_desc_similar(pc.localDescription, offer);
assert_session_desc_similar(pc.currentLocalDescription, answer);
assert_session_desc_similar(pc.pendingLocalDescription, offer);
assert_array_equals(states, ['have-remote-offer', 'stable', 'have-local-offer']);
})));

View file

@ -13,7 +13,7 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer()
// generateAnswer()
// assert_session_desc_equals()
// assert_session_desc_similar()
/*
4.3.2. Interface Definition
@ -73,11 +73,11 @@
.then(() => {
assert_equals(pc.signalingState, 'stable');
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.remoteDescription, answer);
assert_session_desc_similar(pc.localDescription, offer);
assert_session_desc_similar(pc.remoteDescription, answer);
assert_session_desc_equals(pc.currentLocalDescription, offer);
assert_session_desc_equals(pc.currentRemoteDescription, answer);
assert_session_desc_similar(pc.currentLocalDescription, offer);
assert_session_desc_similar(pc.currentRemoteDescription, answer);
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);

View file

@ -11,7 +11,7 @@
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
// assert_session_desc_equals()
// assert_session_desc_similar()
/*
4.3.2. Interface Definition
@ -65,8 +65,8 @@
return pc2.setRemoteDescription(offer)
.then(() => {
assert_equals(pc2.signalingState, 'have-remote-offer');
assert_session_desc_equals(pc2.remoteDescription, offer);
assert_session_desc_equals(pc2.pendingRemoteDescription, offer);
assert_session_desc_similar(pc2.remoteDescription, offer);
assert_session_desc_similar(pc2.pendingRemoteDescription, offer);
assert_equals(pc2.currentRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer']);
@ -91,8 +91,8 @@
.then(() => pc2.setRemoteDescription(offer))
.then(() => {
assert_equals(pc2.signalingState, 'have-remote-offer');
assert_session_desc_equals(pc2.remoteDescription, offer);
assert_session_desc_equals(pc2.pendingRemoteDescription, offer);
assert_session_desc_similar(pc2.remoteDescription, offer);
assert_session_desc_similar(pc2.pendingRemoteDescription, offer);
assert_equals(pc2.currentRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer']);
@ -117,14 +117,14 @@
.then(()=> {
return pc1.createOffer({ offerToReceiveAudio: true })
.then(offer2 => {
assert_session_desc_not_equals(offer1, offer2);
assert_session_desc_not_similar(offer1, offer2);
return pc2.setRemoteDescription(offer1)
.then(() => pc2.setRemoteDescription(offer2))
.then(() => {
assert_equals(pc2.signalingState, 'have-remote-offer');
assert_session_desc_equals(pc2.remoteDescription, offer2);
assert_session_desc_equals(pc2.pendingRemoteDescription, offer2);
assert_session_desc_similar(pc2.remoteDescription, offer2);
assert_session_desc_similar(pc2.pendingRemoteDescription, offer2);
assert_equals(pc2.currentRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer']);

View file

@ -13,7 +13,7 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer
// generateAnswer
// assert_session_desc_equals
// assert_session_desc_similar
/*
4.3.2. Interface Definition
@ -97,12 +97,12 @@
.then(() => {
assert_equals(pc.signalingState, 'have-remote-pranswer');
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
assert_session_desc_similar(pc.localDescription, offer);
assert_session_desc_similar(pc.pendingLocalDescription, offer);
assert_equals(pc.currentLocalDescription, null);
assert_session_desc_equals(pc.remoteDescription, pranswer);
assert_session_desc_equals(pc.pendingRemoteDescription, pranswer);
assert_session_desc_similar(pc.remoteDescription, pranswer);
assert_session_desc_similar(pc.pendingRemoteDescription, pranswer);
assert_equals(pc.currentRemoteDescription, null);
assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer']);
@ -151,12 +151,12 @@
.then(() => {
assert_equals(pc.signalingState, 'stable');
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.currentLocalDescription, offer);
assert_session_desc_similar(pc.localDescription, offer);
assert_session_desc_similar(pc.currentLocalDescription, offer);
assert_equals(pc.pendingLocalDescription, null);
assert_session_desc_equals(pc.remoteDescription, answer);
assert_session_desc_equals(pc.currentRemoteDescription, answer);
assert_session_desc_similar(pc.remoteDescription, answer);
assert_session_desc_similar(pc.currentRemoteDescription, answer);
assert_equals(pc.pendingRemoteDescription, null);
assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer', 'stable']);

View file

@ -12,7 +12,7 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer
// assert_session_desc_equals
// assert_session_desc_similar
/*
4.3.2. Interface Definition

View file

@ -23,7 +23,7 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
caller.addTrack(localStream.getTracks()[0]);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
@ -41,7 +41,7 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
@ -64,7 +64,7 @@
t.add_cleanup(() => callee.close());
let eventSequence = '';
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
@ -82,8 +82,8 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const localStreams = await Promise.all([
navigator.mediaDevices.getUserMedia({audio: true}),
navigator.mediaDevices.getUserMedia({audio: true}),
getNoiseStream({audio: true}),
getNoiseStream({audio: true}),
]);
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
caller.addTrack(localStreams[1].getTracks()[0], localStreams[0]);
@ -126,8 +126,8 @@
t.add_cleanup(() => callee.close());
let eventSequence = '';
const localStreams = await Promise.all([
navigator.mediaDevices.getUserMedia({audio: true}),
navigator.mediaDevices.getUserMedia({audio: true}),
getNoiseStream({audio: true}),
getNoiseStream({audio: true}),
]);
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
const remoteStreams = [];
@ -158,8 +158,8 @@
t.add_cleanup(() => callee.close());
let eventSequence = '';
const localStreams = await Promise.all([
navigator.mediaDevices.getUserMedia({audio: true}),
navigator.mediaDevices.getUserMedia({audio: true}),
getNoiseStream({audio: true}),
getNoiseStream({audio: true}),
]);
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
const remoteStreams = [];
@ -187,8 +187,8 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const localStreams = await Promise.all([
navigator.mediaDevices.getUserMedia({audio: true}),
navigator.mediaDevices.getUserMedia({audio: true}),
getNoiseStream({audio: true}),
getNoiseStream({audio: true}),
]);
caller.addTrack(localStreams[0].getTracks()[0],
localStreams[0], localStreams[1]);
@ -215,7 +215,7 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
caller.addTrack(localStream.getTracks()[0]);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
@ -232,7 +232,7 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
const sender = caller.addTrack(localStream.getTracks()[0]);
const ontrackPromise = addEventListenerPromise(t, callee, 'track');
@ -250,7 +250,7 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
const [track] = localStream.getTracks();
const sender = caller.addTrack(track, localStream);
@ -279,7 +279,7 @@
t.add_cleanup(() => callee.close());
let eventSequence = '';
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
@ -306,7 +306,7 @@
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
@ -332,7 +332,7 @@
t.add_cleanup(() => callee.close());
let eventSequence = '';
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
await getNoiseStream({audio: true});
t.add_cleanup(() => localStream.getTracks().forEach(track => track.stop()));
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
@ -356,7 +356,7 @@
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
const stream = await getNoiseStream({audio: true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const sender = pc.addTrack(stream.getTracks()[0]);
pc.removeTrack(sender);

View file

@ -11,8 +11,8 @@
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
// assert_session_desc_not_equals()
// assert_session_desc_equals()
// assert_session_desc_not_similar()
// assert_session_desc_similar()
/*
4.3.2. Interface Definition
@ -116,10 +116,10 @@
await pc.setLocalDescription(await pc.createAnswer());
const offer2 = await pc2.createOffer({ offerToReceiveVideo: true });
await pc.setRemoteDescription(offer2);
assert_session_desc_not_equals(offer1, offer2);
assert_session_desc_equals(pc.remoteDescription, offer2);
assert_session_desc_equals(pc.currentRemoteDescription, offer1);
assert_session_desc_equals(pc.pendingRemoteDescription, offer2);
assert_session_desc_not_similar(offer1, offer2);
assert_session_desc_similar(pc.remoteDescription, offer2);
assert_session_desc_similar(pc.currentRemoteDescription, offer1);
assert_session_desc_similar(pc.pendingRemoteDescription, offer2);
}, 'Calling setRemoteDescription() again after one round of remote-offer/local-answer should succeed');
promise_test(async t => {
@ -136,8 +136,8 @@
await pc.setRemoteDescription(answer);
await pc.setRemoteDescription(await pc2.createOffer());
assert_equals(pc.remoteDescription.sdp, pc.pendingRemoteDescription.sdp);
assert_session_desc_equals(pc.remoteDescription, offer);
assert_session_desc_equals(pc.currentRemoteDescription, answer);
assert_session_desc_similar(pc.remoteDescription, offer);
assert_session_desc_similar(pc.currentRemoteDescription, answer);
}, 'Switching role from offerer to answerer after going back to stable state should succeed');
/*

View file

@ -12,6 +12,7 @@
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCRtpParameters-helper.js:
// doOfferAnswerExchange
// validateSenderRtpParameters
/*
@ -80,10 +81,13 @@
with a newly created InvalidModificationError. Note that this also applies
to transactionId.
*/
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -99,10 +103,11 @@
sender.setParameters(param));
}, 'setParameters() with codec.payloadType modified should reject with InvalidModificationError');
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -118,10 +123,11 @@
sender.setParameters(param));
}, 'setParameters() with codec.mimeType modified should reject with InvalidModificationError');
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -137,10 +143,11 @@
sender.setParameters(param));
}, 'setParameters() with codec.clockRate modified should reject with InvalidModificationError');
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -156,11 +163,11 @@
sender.setParameters(param));
}, 'setParameters() with codec.channels modified should reject with InvalidModificationError');
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -176,11 +183,11 @@
sender.setParameters(param));
}, 'setParameters() with codec.sdpFmtpLine modified should reject with InvalidModificationError');
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -197,37 +204,4 @@
sender.setParameters(param));
}, 'setParameters() with new codecs inserted should reject with InvalidModificationError');
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
validateSenderRtpParameters(param);
const { codecs } = param;
// skip and pass test if there is less than 2 codecs
if(codecs.length >= 2) {
const tmp = codecs[0];
codecs[0] = codecs[1];
codecs[1] = tmp;
}
return sender.setParameters(param);
}, 'setParameters with reordered codecs should succeed');
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
validateSenderRtpParameters(param);
const { codecs } = param;
param.codecs = codecs.slice(1);
return sender.setParameters(param);
}, 'setParameters with dropped codec should succeed');
</script>

View file

@ -12,6 +12,7 @@
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCRtpParameters-helper.js:
// doOfferAnswerExchange
// validateSenderRtpParameters
/*
@ -114,9 +115,12 @@
Otherwise, set it to a list containing a single RTCRtpEncodingParameters
with active set to true.
*/
test(() => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = transceiver.sender.getParameters();
validateSenderRtpParameters(param);
const { encodings } = param;
@ -125,9 +129,11 @@
assert_equals(encoding.active, true);
}, 'addTransceiver() with undefined sendEncodings should have default encoding parameter with active set to true');
test(() => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio', { sendEncodings: [] });
await doOfferAnswerExchange(t, pc);
const param = transceiver.sender.getParameters();
validateSenderRtpParameters(param);
@ -151,8 +157,9 @@
5.2. getParameters
- encodings is set to the value of the [[send encodings]] internal slot.
*/
test(() => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio', {
sendEncodings: [{
dtx: 'enabled',
@ -164,6 +171,7 @@
rid: 'foo'
}]
});
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -190,10 +198,12 @@
with a newly created InvalidModificationError. Note that this also applies
to transactionId.
*/
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -208,10 +218,12 @@
sender.setParameters(param));
}, `sender.setParameters() with mismatch number of encodings should reject with InvalidModificationError`);
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -221,32 +233,11 @@
sender.setParameters(param));
}, `sender.setParameters() with encodings unset should reject with InvalidModificationError`);
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
validateSenderRtpParameters(param);
const encoding = getFirstEncoding(param);
const { ssrc } = encoding;
// ssrc may not be set since it is optional
if(ssrc === undefined) {
encoding.ssrc = 2;
} else {
// If it is set, increase the number by 1 to make it different from original
encoding.ssrc = ssrc + 1;
}
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `setParameters() with modified encoding.ssrc field should reject with InvalidModificationError`);
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -265,34 +256,13 @@
sender.setParameters(param));
}, `setParameters() with modified encoding.rtx field should reject with InvalidModificationError`);
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
validateSenderRtpParameters(param);
const encoding = getFirstEncoding(param);
const { fec } = encoding;
if(fec === undefined) {
encoding.fec = { ssrc: 2 };
} else if(fec.ssrc === undefined) {
fec.ssrc = 2;
} else {
fec.ssrc += 1;
}
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `setParameters() with modified encoding.fec field should reject with InvalidModificationError`);
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio', {
sendEncodings: [{ rid: 'foo' }],
});
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -311,10 +281,11 @@
value less than 1.0, abort these steps and return a promise rejected with
a newly created RangeError.
*/
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -325,10 +296,11 @@
sender.setParameters(param));
}, `setParameters() with encoding.scaleResolutionDownBy field set to less than 1.0 should reject with RangeError`);
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -346,52 +318,76 @@
}, `setParameters() with encoding.scaleResolutionDownBy field set to greater than 1.0 should succeed`);
// Helper function to test that modifying an encoding field should succeed
function test_modified_encoding(field, value1, value2, desc) {
promise_test(t => {
function test_modified_encoding(kind, field, value1, value2, desc) {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio', {
const { sender } = pc.addTransceiver(kind, {
sendEncodings: [{
[field]: value1
}]
});
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
const encoding = getFirstEncoding(param);
const param1 = sender.getParameters();
validateSenderRtpParameters(param1);
const encoding1 = getFirstEncoding(param1);
assert_equals(encoding[field], value1);
encoding[field] = value2;
assert_equals(encoding1[field], value1);
encoding1[field] = value2;
return sender.setParameters(param)
.then(() => {
const param = sender.getParameters();
validateSenderRtpParameters(param);
const encoding = getFirstEncoding(param);
assert_equals(encoding[field], value2);
});
}, desc);
await sender.setParameters(param1);
const param2 = sender.getParameters();
validateSenderRtpParameters(param2);
const encoding2 = getFirstEncoding(param2);
assert_equals(encoding2[field], value2);
}, desc + ' with RTCRtpTransceiverInit');
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver(kind);
await doOfferAnswerExchange(t, pc);
const initParam = sender.getParameters();
validateSenderRtpParameters(initParam);
initParam.encodings[0][field] = value1;
await sender.setParameters(initParam);
const param1 = sender.getParameters();
validateSenderRtpParameters(param1);
const encoding1 = getFirstEncoding(param1);
assert_equals(encoding1[field], value1);
encoding1[field] = value2;
await sender.setParameters(param1);
const param2 = sender.getParameters();
validateSenderRtpParameters(param2);
const encoding2 = getFirstEncoding(param2);
assert_equals(encoding2[field], value2);
}, desc + ' without RTCRtpTransceiverInit');
}
test_modified_encoding('dtx', 'enabled', 'disabled',
test_modified_encoding('audio', 'dtx', 'enabled', 'disabled',
'setParameters() with modified encoding.dtx should succeed');
test_modified_encoding('dtx', 'enabled', undefined,
test_modified_encoding('audio', 'dtx', 'enabled', undefined,
'setParameters() with unset encoding.dtx should succeed');
test_modified_encoding('active', true, false,
test_modified_encoding('audio', 'active', false, true,
'setParameters() with modified encoding.active should succeed');
test_modified_encoding('priority', 'very-low', 'high',
test_modified_encoding('audio', 'priority', 'very-low', 'high',
'setParameters() with modified encoding.priority should succeed');
test_modified_encoding('ptime', 2, 4,
test_modified_encoding('audio', 'ptime', 2, 4,
'setParameters() with modified encoding.ptime should succeed');
test_modified_encoding('maxBitrate', 2, 4,
test_modified_encoding('audio', 'maxBitrate', 10000, 20000,
'setParameters() with modified encoding.maxBitrate should succeed');
test_modified_encoding('maxBitrate', 24, 16,
test_modified_encoding('video', 'maxFramerate', 24, 16,
'setParameters() with modified encoding.maxFramerate should succeed');
</script>

View file

@ -8,6 +8,19 @@
// This file depends on dictionary-helper.js which should
// be loaded from the main HTML file.
// An offer/answer exchange is necessary for getParameters() to have any
// negotiated parameters to return.
async function doOfferAnswerExchange(t, caller) {
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
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);
}
/*
Validates the RTCRtpParameters returned from RTCRtpSender.prototype.getParameters

View file

@ -12,6 +12,7 @@
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCRtpParameters-helper.js:
// doOfferAnswerExchange
// validateSenderRtpParameters
/*
@ -60,9 +61,10 @@
- transactionId is set to a new unique identifier, used to match this
getParameters call to a setParameters call that may occur later.
*/
test(() => {
promise_test(async t => {
const pc = new RTCPeerConnection();
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param1 = sender.getParameters();
const param2 = sender.getParameters();
@ -83,10 +85,11 @@
with a newly created InvalidModificationError. Note that this also applies
to transactionId.
*/
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -98,10 +101,11 @@
sender.setParameters(param));
}, `sender.setParameters() with transaction ID different from last getParameters() should reject with InvalidModificationError`);
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -112,24 +116,26 @@
sender.setParameters(param));
}, `sender.setParameters() with transaction ID unset should reject with InvalidModificationError`);
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
return sender.setParameters(param)
.then(() =>
promise_rejects(t, 'InvalidModificationError',
promise_rejects(t, 'InvalidStateError',
sender.setParameters(param)));
}, `setParameters() twice with the same parameters should reject with InvalidModificationError`);
}, `setParameters() twice with the same parameters should reject with InvalidStateError`);
promise_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param1 = sender.getParameters();
const param2 = sender.getParameters();

View file

@ -62,7 +62,7 @@
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const stream = await navigator.mediaDevices.getUserMedia({audio:true});
const stream = await getNoiseStream({audio:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
caller.addTrack(track, stream);

View file

@ -57,7 +57,7 @@
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const stream = await navigator.mediaDevices.getUserMedia({audio:true});
const stream = await getNoiseStream({audio:true});
t.add_cleanup(() => stream.getTracks().forEach(track => track.stop()));
const [track] = stream.getTracks();
const sender = caller.addTrack(track, stream);

View file

@ -79,7 +79,7 @@
// Asynchoronously generate MediaStreamTrack from getUserMedia
function asyncInitMediaStreamTrack() {
return navigator.mediaDevices.getUserMedia({ audio: true })
return getNoiseStream({ audio: true })
.then(mediaStream => {
idlTestObjects.mediaStreamTrack = mediaStream.getTracks()[0];
});
@ -109,7 +109,7 @@
const idlArray = new IdlArray();
let webrtcIdl = fetch('/interfaces/webrtc-pc.idl').then(r => r.text());
let mediacaptureMainIdl = fetch('/interfaces/mediacapture-main.idl').then(r => r.text());
let mediacaptureMainIdl = fetch('/interfaces/mediacapture-streams.idl').then(r => r.text());
idlArray.add_untested_idls(mediacaptureMainIdl, { only: ['MediaStreamConstraints'] });
idlArray.add_idls(webrtcIdl);

View file

@ -1,23 +1,15 @@
<!doctype html>
<!--
To run this test, you must have a webcam and a microphone or use
fake devices by specifying
--use-fake-device-for-media-stream --use-fake-ui-for-media-stream
for Chrome or by setting the
media.navigator.streams.fake
property to true in Firefox.
-->
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>RTCPeerConnection Connection Test</title>
<script src="RTCPeerConnection-helper.js"></script>
</head>
<body>
<div id="log"></div>
<div>
<video id="local-view" autoplay="autoplay"></video>
<video id="remote-view" autoplay="autoplay"/>
<video id="local-view" muted autoplay="autoplay"></video>
<video id="remote-view" muted autoplay="autoplay"/>
</video>
</div>
@ -38,7 +30,7 @@ property to true in Firefox.
test.done();
});
function getUserMediaOkCallback(localStream) {
function getNoiseStreamOkCallback(localStream) {
gFirstConnection = new RTCPeerConnection(null);
gFirstConnection.onicecandidate = onIceCandidateToFirst;
localStream.getTracks().forEach(function(track) {
@ -111,8 +103,8 @@ property to true in Firefox.
// This function starts the test.
test.step(function() {
navigator.mediaDevices.getUserMedia({ video: true, audio: true })
.then(test.step_func(getUserMediaOkCallback), failed('getUserMedia'));
getNoiseStream({ video: true, audio: true })
.then(test.step_func(getNoiseStreamOkCallback), failed('getNoiseStream'));
});
</script>