Update web-platform-tests to revision be959408023fe02cf79abe70f6018598a7004a88

This commit is contained in:
WPT Sync Bot 2018-06-11 21:57:51 -04:00
parent a76777b115
commit 761c8bc2a9
171 changed files with 2434 additions and 907 deletions

View file

@ -109,6 +109,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio', {
direction: 'recvonly'
});
@ -126,6 +127,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio', {
direction: 'inactive'
});
@ -166,6 +168,7 @@
let dtmfSender;
let sender;
let pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia('audio')
.then(([track, mediaStream]) => {
sender = pc.addTrack(track, mediaStream);

View file

@ -232,6 +232,7 @@
*/
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio', { direction: 'sendrecv' });
const dtmfSender = transceiver.sender.dtmf;
@ -279,7 +280,6 @@
dtmfSender.addEventListener('tonechange', onToneChange);
dtmfSender.insertDTMF('ABCD', 100, 70);
}, `Setting transceiver.currentDirection to recvonly in the middle of tonechange events should stop future tonechange events from firing`);
/* Section 7.3 - Tone change event */

View file

@ -11,6 +11,7 @@
// have IDs set according to the rules in rtcweb-data-channel.
promise_test(test => {
const pc = new RTCPeerConnection;
test.add_cleanup(() => pc.close());
const channel = pc.createDataChannel('');
return pc.createOffer()
.then(offer => pc.setLocalDescription(offer))
@ -35,6 +36,7 @@ promise_test(test => {
promise_test(test => {
const pc = new RTCPeerConnection;
test.add_cleanup(() => pc.close());
const channel = pc.createDataChannel('');
return pc.createOffer()
.then(offer => pc.setLocalDescription(offer))

View file

@ -38,7 +38,9 @@
*/
async_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
pc1.createDataChannel('test');
exchangeIceCandidates(pc1, pc2);

View file

@ -120,7 +120,9 @@
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
return createDataChannelPair(pc1, pc2)
.then(([channel1, channel2]) => {
@ -165,7 +167,9 @@
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
pc1.createDataChannel('');
// setRemoteDescription(answer) without the other peer

View file

@ -142,6 +142,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, new TypeError(),
@ -157,6 +159,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return promise_rejects(t, 'InvalidStateError',
pc.addIceCandidate({
candidate: candidateStr1,
@ -170,6 +174,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr1,
@ -180,6 +186,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate(new RTCIceCandidate({
candidate: candidateStr1,
@ -190,6 +198,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({ sdpMid }));
}, 'Add candidate with only valid sdpMid should succeed');
@ -197,6 +207,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({ sdpMLineIndex }));
}, 'Add candidate with only valid sdpMLineIndex should succeed');
@ -212,6 +224,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr1,
@ -226,6 +240,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr2,
@ -242,6 +258,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr1,
@ -257,6 +275,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr1,
@ -291,6 +311,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr1,
@ -318,6 +340,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, new TypeError(),
@ -331,6 +355,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, new TypeError(),
@ -342,6 +368,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, new TypeError(),
@ -355,6 +383,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, new TypeError(),
@ -364,6 +394,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, new TypeError(),
@ -385,6 +417,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, 'OperationError',
@ -405,6 +439,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, 'OperationError',
@ -420,6 +456,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr1,
@ -432,6 +470,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() => pc.addIceCandidate({
candidate: candidateStr2,
@ -455,6 +495,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, 'OperationError',
@ -475,6 +517,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, 'OperationError',
@ -487,6 +531,8 @@ a=rtcp-rsize
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(sessionDesc)
.then(() =>
promise_rejects(t, 'OperationError',

View file

@ -40,6 +40,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
@ -67,6 +69,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
@ -102,6 +106,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
@ -122,6 +128,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
@ -149,6 +157,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();

View file

@ -38,6 +38,8 @@
promise_test(function(t) {
var pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp}))
.then(function() {
assert_true(pc.canTrickleIceCandidates, 'canTrickleIceCandidates property is true after setRemoteDescription');
@ -47,6 +49,8 @@
promise_test(function(t) {
var pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription(new RTCSessionDescription({type: 'offer', sdp: sdp.replace('a=ice-options:trickle\r\n', '')}))
.then(function() {
assert_false(pc.canTrickleIceCandidates, 'canTrickleIceCandidates property is false after setRemoteDescription');

View file

@ -107,8 +107,11 @@
*/
async_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
const onConnectionStateChange = t.step_func(() => {
const { connectionState } = pc1;
if(connectionState === 'connected') {
@ -136,7 +139,6 @@
exchangeIceCandidates(pc1, pc2);
doSignalingHandshake(pc1, pc2);
}, 'connection with one data channel should eventually have connected connection state');
/*

View file

@ -24,6 +24,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return promise_rejects(t, 'InvalidStateError',
pc.createAnswer());
}, 'createAnswer() with null remoteDescription should reject with InvalidStateError');
@ -36,6 +37,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer => pc.setRemoteDescription(offer))
.then(() => pc.createAnswer())
@ -51,6 +54,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return generateOffer({ pc, data: true })
.then(offer => pc.setRemoteDescription(offer))
.then(() => {

View file

@ -362,6 +362,7 @@ test(() => {
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const channel1 = pc.createDataChannel('channel');
assert_equals(channel1.id, null,
'Expect initial id to be null');

View file

@ -21,6 +21,7 @@
// Start testing
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const dummy = pc.createDataChannel('foo'); // Just to have something to offer
return pc.createOffer(offerToReceiveFalse)
@ -33,6 +34,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer(offerToReceiveTrue)
.then(() => {
assert_equals(pc.getTransceivers().length, 1,
@ -47,6 +50,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer(offerToReceiveTrue)
.then(() => {
assert_equals(pc.getTransceivers().length, 1,
@ -67,6 +72,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia(kind)
.then(([track, stream]) => {
pc.addTrack(track, stream);
@ -91,6 +98,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia(kind)
.then(([track, stream]) => {
pc.addTrack(track, stream);
@ -110,6 +119,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
pc.addTransceiver(kind, {direction: 'recvonly'});
return pc.createOffer(offerToReceiveFalse)
@ -126,8 +137,11 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
return getTrackFromUserMedia(kind)
.then(([track, stream]) => {
pc.addTrack(track, stream);
@ -154,6 +168,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveAudio: true, offerToReceiveVideo: true })
.then(() => {
assert_equals(pc.getTransceivers().length, 2,

View file

@ -15,7 +15,6 @@
// generateAnswer()
// countAudioLine()
// countVideoLine()
// test_state_change_event()
// assert_session_desc_equals()
/*
@ -31,6 +30,8 @@
promise_test(t => {
const pc = new RTCPeerConnection()
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer => {
assert_equals(typeof offer, 'object',
@ -43,7 +44,10 @@
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-local-offer']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer =>
@ -53,11 +57,14 @@
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer']);
}));
}, 'createOffer() and then setLocalDescription() should succeed');
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
pc.close();
return promise_rejects(t, 'InvalidStateError',
@ -78,6 +85,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const promise = pc.createOffer();
pc.addTransceiver('audio');
@ -122,6 +130,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer1 => {
assert_equals(countAudioLine(offer1.sdp), 1,
@ -149,6 +159,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer1 => {
assert_equals(countVideoLine(offer1.sdp), 1,
@ -165,6 +177,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({
offerToReceiveAudio: true,
offerToReceiveVideo: false

View file

@ -41,11 +41,13 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.getStats();
}, 'getStats() with no argument should succeed');
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.getStats(null);
}, 'getStats(null) should succeed');
@ -59,6 +61,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia('audio')
.then(([track, mediaStream]) => {
return promise_rejects(t, 'InvalidAccessError', pc.getStats(track));
@ -67,6 +70,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia('audio')
.then(([track, mediaStream]) => {
pc.addTrack(track, mediaStream);
@ -76,6 +80,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack();
pc.addTransceiver(track);
@ -84,6 +89,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia('audio')
.then(([track, mediaStream]) => {
// addTransceiver allows adding same track multiple times
@ -100,6 +106,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver1 = pc.addTransceiver('audio');
// Create another transceiver that resends what
@ -117,6 +124,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.getStats()
.then(statsReport => {
validateStatsReport(statsReport);
@ -126,6 +134,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia('audio')
.then(([track, mediaStream]) => {
pc.addTrack(track, mediaStream);
@ -140,6 +149,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia('audio')
.then(([track, mediaStream]) => {
pc.addTrack(track);
@ -162,6 +172,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return getTrackFromUserMedia('audio')
.then(([track, mediaStream]) => {
pc.addTrack(track, mediaStream);
@ -185,6 +196,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
return pc.getStats(transceiver.receiver.track)

View file

@ -168,36 +168,6 @@ function generateAnswer(offer) {
.then(() => pc.createAnswer());
}
// Wait for peer connection to fire onsignalingstatechange
// event, compare and make sure the new state is the same
// as expected state. It accepts an RTCPeerConnection object
// and an array of expected state changes. The test passes
// if all expected state change events have been fired, and
// fail if the new state is different from the expected state.
//
// Note that the promise is never resolved if no change
// event is fired. To avoid confusion with the main test
// getting timed out, this is done in parallel as a separate
// test
function test_state_change_event(parentTest, pc, expectedStates) {
return async_test(t => {
pc.onsignalingstatechange = t.step_func(() => {
if(expectedStates.length === 0) {
return;
}
const newState = pc.signalingState;
const expectedState = expectedStates.shift();
assert_equals(newState, expectedState, 'New signaling state is different from expected.');
if(expectedStates.length === 0) {
t.done();
}
});
}, `Test onsignalingstatechange event for ${parentTest.name}`);
}
// Run a test function that return a promise that should
// never be resolved. For lack of better options,
// we wait for a time out and pass the test if the
@ -418,16 +388,19 @@ function getUserMediaTracksAndStreams(count, type = 'audio') {
});
}
// Creates an offer for the caller, set it as the caller's local description and
// then sets the callee's remote description to the offer. Returns the Promise
// of the setRemoteDescription call.
function performOffer(caller, callee) {
let sessionDescription;
return caller.createOffer()
.then(offer => {
sessionDescription = offer;
return caller.setLocalDescription(offer);
}).then(() => callee.setRemoteDescription(sessionDescription));
async function exchangeOffer(caller, callee) {
const offer = await caller.createOffer();
await caller.setLocalDescription(offer);
return callee.setRemoteDescription(offer);
}
async function exchangeAnswer(caller, callee) {
const answer = await callee.createAnswer();
await callee.setLocalDescription(answer);
return caller.setRemoteDescription(answer);
}
async function exchangeOfferAnswer(caller, callee) {
await exchangeOffer(caller, callee);
return exchangeAnswer(caller, callee);
}
@ -445,3 +418,13 @@ class Resolver {
this.reject = promiseReject;
}
}
function addEventListenerPromise(t, target, type, listener) {
return new Promise((resolve, reject) => {
target.addEventListener(type, t.step_func(e => {
if (listener != undefined)
e = listener(e);
resolve(e);
}));
});
}

View file

@ -104,8 +104,11 @@
*/
async_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
const onIceConnectionStateChange = t.step_func(() => {
const { iceConnectionState } = pc1;
@ -138,7 +141,6 @@
exchangeIceCandidates(pc1, pc2);
doSignalingHandshake(pc1, pc2);
}, 'connection with one data channel should eventually have connected connection state');
/*

View file

@ -57,6 +57,8 @@
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const onIceGatheringStateChange = t.step_func(() => {
const { iceGatheringState } = pc;
@ -74,7 +76,6 @@
.then(offer => pc.setLocalDescription(offer))
.then(err => t.step_func(err =>
assert_unreached(`Unhandled rejection ${err.name}: ${err.message}`)));
}, 'iceGatheringState should eventually become complete after setLocalDescription');
/*
@ -97,8 +98,11 @@
*/
async_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
const onIceGatheringStateChange = t.step_func(() => {
const { iceGatheringState } = pc2;
@ -131,7 +135,6 @@
exchangeIceCandidates(pc1, pc2);
doSignalingHandshake(pc1, pc2);
}, 'connection with one data channel should eventually have connected connection state');
/*

View file

@ -36,8 +36,11 @@
*/
async_test(t => {
const localPc = new RTCPeerConnection();
t.add_cleanup(() => localPc.close());
const remotePc = new RTCPeerConnection();
t.add_cleanup(() => remotePc.close());
let eventCount = 0;
const onDataChannel = t.step_func_done(event => {
@ -69,7 +72,6 @@
remotePc.addEventListener('datachannel', onDataChannel);
exchangeIceCandidates(localPc, remotePc);
doSignalingHandshake(localPc, remotePc);
}, 'datachannel event should fire when new data channel is announced to the remote peer');
/*
@ -98,8 +100,11 @@
*/
async_test(t => {
const localPc = new RTCPeerConnection();
t.add_cleanup(() => localPc.close());
const remotePc = new RTCPeerConnection();
t.add_cleanup(() => remotePc.close());
const onDataChannel = t.step_func_done(event => {
const remoteChannel = event.channel;
assert_true(remoteChannel instanceof RTCDataChannel,
@ -145,8 +150,11 @@
*/
async_test(t => {
const localPc = new RTCPeerConnection();
t.add_cleanup(() => localPc.close());
const remotePc = new RTCPeerConnection();
t.add_cleanup(() => remotePc.close());
const onDataChannel = t.unreached_func('datachannel event should not be fired');
localPc.createDataChannel('test', {
@ -158,7 +166,6 @@
doSignalingHandshake(localPc, remotePc);
t.step_timeout(t.step_func_done(), 200);
}, 'Data channel created with negotiated set to true should not fire datachannel event on remote peer');
/*

View file

@ -82,6 +82,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const negotiated = awaitNegotiation(pc);
pc.createDataChannel('test');
@ -114,6 +115,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const negotiated = awaitNegotiation(pc);
pc.addTransceiver('audio');
@ -184,6 +186,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return assert_first_promise_fulfill_after_second(
awaitNegotiation(pc),
pc.createOffer({ offerToReceiveAudio: true })

View file

@ -98,6 +98,8 @@
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
// Fail the test if the ontrack event handler is not implemented
assert_idl_attribute(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');
@ -151,6 +153,8 @@ a=ssrc:1001 cname:some
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_idl_attribute(pc, 'ontrack', 'Expect pc to have ontrack event handler attribute');
const sdp = `v=0
@ -182,13 +186,15 @@ a=ssrc:1001 cname:some
.then(t.step_func(() => {
t.step_timeout(t.step_func_done(), 100);
}));
}, 'setRemoteDescription() with m= line of recvonly direction should not trigger track event');
async_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
pc2.ontrack = t.step_func(trackEvent => {
const { track } = trackEvent;
@ -210,13 +216,15 @@ a=ssrc:1001 cname:some
.catch(t.step_func(err => {
assert_unreached('Error ' + err.name + ': ' + err.message);
}));
}, 'addTrack() should cause remote connection to fire ontrack when setRemoteDescription()');
async_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
pc2.ontrack = t.step_func(trackEvent => {
const { track } = trackEvent;
@ -235,13 +243,15 @@ a=ssrc:1001 cname:some
.catch(t.step_func(err => {
assert_unreached('Error ' + err.name + ': ' + err.message);
}));
}, `addTransceiver('video') should cause remote connection to fire ontrack when setRemoteDescription()`);
async_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
pc2.ontrack = t.step_func(trackEvent => {
const { track } = trackEvent;
@ -264,7 +274,6 @@ a=ssrc:1001 cname:some
.then(t.step_func(() => {
t.step_timeout(t.step_func_done(), 100);
}));
}, `addTransceiver() with inactive direction should not cause remote connection to fire ontrack when setRemoteDescription()`);
</script>

View file

@ -56,8 +56,11 @@
*/
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
const port = window.location.port;
const [idpDomain] = getIdpDomains();
const idpHost = hostString(idpDomain, port);
@ -92,10 +95,13 @@
const idpHost = hostString(idpDomain, port);
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection({
peerIdentity: `bob@${idpDomain}`
});
t.add_cleanup(() => pc2.close());
pc1.setIdentityProvider(idpHost, {
protocol: 'mock-idp.js',
usernameHint: `alice@${idpDomain}`
@ -131,10 +137,13 @@
const idpHost = hostString(idpDomain, port);
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection({
peerIdentity: `alice@${idpDomain}`
});
t.add_cleanup(() => pc2.close());
// Ask mockidp.js to return custom contents in validation result
pc1.setIdentityProvider(idpHost, {
protocol: 'mock-idp.js?validatorAction=return-custom-contents&contents=bogus',
@ -167,10 +176,13 @@
const idpHost1 = hostString(idpDomain1, port);
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection({
peerIdentity: `alice@${idpDomain2}`
});
t.add_cleanup(() => pc2.close());
// mock-idp.js will return assertion of domain2 identity
// with domain1 in the idp.domain field
pc1.setIdentityProvider(idpHost1, {
@ -220,10 +232,13 @@
const idpHost = hostString(idpDomain, port);
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection({
peerIdentity: `alice@${idpDomain}`
});
t.add_cleanup(() => pc2.close());
// Ask mock-idp.js to throw error during validation,
// i.e. during pc2.setRemoteDescription()
pc1.setIdentityProvider(idpHost, {
@ -263,8 +278,11 @@
*/
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
const port = window.location.port;
const [idpDomain] = getIdpDomains();
const idpHost = hostString(idpDomain, port);

View file

@ -49,6 +49,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
@ -78,6 +80,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
@ -111,6 +115,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
@ -149,6 +155,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return navigator.mediaDevices.getUserMedia({ audio: true })
.then(mediaStream => {
const tracks = mediaStream.getTracks();
@ -173,6 +181,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver(track);
const { sender } = transceiver;
@ -205,6 +214,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver(track, { direction: 'sendonly' });
const { sender } = transceiver;
@ -237,6 +247,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver(track, { direction: 'recvonly' });
const { sender } = transceiver;
@ -268,6 +279,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver(track, { direction: 'inactive' });
const { sender } = transceiver;

View file

@ -66,6 +66,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
assert_equals(transceiver.mid, null);
@ -99,8 +100,11 @@
*/
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
const transceiver1 = pc1.addTransceiver('audio');
assert_array_equals(pc1.getTransceivers(), [transceiver1]);
assert_array_equals(pc2.getTransceivers(), []);
@ -139,6 +143,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
assert_equals(transceiver.mid, null);
@ -159,6 +164,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver1 = pc.addTransceiver('audio');
assert_equals(transceiver1.mid, null);
@ -204,8 +210,11 @@
*/
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
pc1.addTransceiver('audio');
return pc1.createOffer()

View file

@ -14,7 +14,6 @@
// generateOffer
// generateAnswer
// assert_session_desc_equals
// test_state_change_event
/*
4.3.2. Interface Definition
@ -61,7 +60,10 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-remote-offer', 'stable']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
@ -79,6 +81,8 @@
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer', 'stable']);
})));
}, 'setLocalDescription() with valid answer should succeed');
@ -91,6 +95,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
pc.setRemoteDescription(offer)
@ -120,6 +126,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
pc.setRemoteDescription(offer)
@ -142,16 +150,19 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer =>
promise_rejects(t, 'InvalidStateError',
pc.setLocalDescription({ type: 'answer', sdp: offer.sdp })));
}, 'Calling setLocalDescription(answer) from stable state should reject with InvalidStateError');
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer =>
pc.setLocalDescription(offer)

View file

@ -14,7 +14,6 @@
// generateOffer
// assert_session_desc_not_equals
// assert_session_desc_equals
// test_state_change_event
/*
4.3.2. Interface Definition
@ -58,7 +57,10 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-local-offer']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer =>
@ -68,6 +70,8 @@
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer']);
}));
}, 'setLocalDescription with valid offer should succeed');
@ -79,6 +83,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer =>
pc.setLocalDescription({ type: 'offer' })
@ -99,8 +104,11 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
return generateOffer({ pc, data: true })
.then(offer =>
promise_rejects(t, 'InvalidModificationError',
@ -113,6 +121,7 @@
// last offer, setLocalDescription would reject when setting
// with the first offer
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer1 =>
pc.createOffer({ offerToReceiveVideo: true })
@ -125,9 +134,10 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
// Only one state change event should be fired
test_state_change_event(t, pc, ['have-local-offer']);
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer1 =>
@ -142,6 +152,8 @@
assert_session_desc_equals(pc.localDescription, offer2);
assert_session_desc_equals(pc.pendingLocalDescription, offer2);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer']);
}))));
}, 'Creating and setting offer multiple times should succeed');

View file

@ -14,7 +14,6 @@
// generateOffer
// generateAnswer
// assert_session_desc_equals
// test_state_change_event
/*
4.3.2. Interface Definition
@ -64,11 +63,12 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer =>
promise_rejects(t, 'InvalidStateError',
pc.setLocalDescription({ type: 'pranswer', sdp: offer.sdp })));
}, 'setLocalDescription(pranswer) from stable state should reject with InvalidStateError');
/*
@ -81,7 +81,10 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
@ -103,13 +106,18 @@
assert_equals(pc.currentLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer', 'have-local-pranswer']);
});
}));
}, 'setLocalDescription(pranswer) should succeed');
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
@ -119,13 +127,19 @@
const pranswer = { type: 'pranswer', sdp: answer.sdp };
return pc.setLocalDescription(pranswer)
.then(() => pc.setLocalDescription(pranswer));
.then(() => pc.setLocalDescription(pranswer))
.then(() => {
assert_array_equals(states, ['have-remote-offer', 'have-local-pranswer']);
});
}));
}, 'setLocalDescription(pranswer) can be applied multiple times while still in have-local-pranswer');
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-remote-offer', 'have-local-pranswer', 'stable']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
@ -146,6 +160,8 @@
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer', 'have-local-pranswer', 'stable']);
});
}));
}, 'setLocalDescription(answer) from have-local-pranswer state should succeed');

View file

@ -12,7 +12,6 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// assert_session_desc_equals
// test_state_change_event
/*
4.3.2. Interface Definition
@ -58,8 +57,10 @@
*/
promise_test(t=> {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
test_state_change_event(t, pc, ['have-local-offer', 'stable']);
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer()
.then(offer => pc.setLocalDescription(offer))
@ -76,6 +77,8 @@
assert_equals(pc.localDescription, null);
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.currentLocalDescription, null);
assert_array_equals(states, ['have-local-offer', 'stable']);
});
}, 'setLocalDescription(rollback) from have-local-offer state should reset back to stable state');
@ -94,12 +97,14 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return promise_rejects(t, 'InvalidStateError',
pc.setLocalDescription({ type: 'rollback' }));
}, `setLocalDescription(rollback) from stable state should reject with InvalidStateError`);
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer =>
pc.setRemoteDescription(offer)
@ -113,6 +118,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer => pc.setLocalDescription(offer))
.then(() => pc.setLocalDescription({

View file

@ -14,7 +14,6 @@
// generateOffer
// assert_session_desc_not_equals
// assert_session_desc_equals
// test_state_change_event
/*
4.3.2. Interface Definition
@ -46,7 +45,10 @@
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-local-offer', 'stable', 'have-local-offer']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer1 =>
@ -65,13 +67,17 @@
assert_session_desc_equals(pc.localDescription, offer2);
assert_session_desc_equals(pc.currentLocalDescription, offer1);
assert_session_desc_equals(pc.pendingLocalDescription, offer2);
assert_array_equals(states, ['have-local-offer', 'stable', 'have-local-offer']);
})));
}, 'Calling createOffer() and setLocalDescription() again after one round of local-offer/remote-answer should succeed');
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc,
['have-remote-offer', 'stable', 'have-local-offer']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return generateOffer({ pc, data: true })
.then(offer => pc.setRemoteDescription(offer))
@ -86,10 +92,26 @@
assert_session_desc_equals(pc.localDescription, offer);
assert_session_desc_equals(pc.currentLocalDescription, answer);
assert_session_desc_equals(pc.pendingLocalDescription, offer);
})));
assert_array_equals(states, ['have-remote-offer', 'stable', 'have-local-offer']);
})));
}, 'Switching role from answerer to offerer after going back to stable state should succeed');
promise_test(async t => {
const pc = new RTCPeerConnection();
const offer = await pc.createOffer();
let eventSequence = '';
const signalingstatechangeResolver = new Resolver();
pc.onsignalingstatechange = () => {
eventSequence += 'onsignalingstatechange;';
signalingstatechangeResolver.resolve();
};
await pc.setLocalDescription(offer);
eventSequence += 'setLocalDescription;';
await signalingstatechangeResolver.promise;
assert_equals(eventSequence, 'onsignalingstatechange;setLocalDescription;');
}, 'onsignalingstatechange fires before setLocalDescription resolves');
/*
TODO
4.3.2. setLocalDescription

View file

@ -14,7 +14,6 @@
// generateOffer()
// generateAnswer()
// assert_session_desc_equals()
// test_state_change_event()
/*
4.3.2. Interface Definition
@ -60,7 +59,10 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-local-offer', 'stable']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
@ -79,6 +81,8 @@
assert_equals(pc.pendingLocalDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
assert_array_equals(states, ['have-local-offer', 'stable']);
})));
}, 'setRemoteDescription() with valid state and answer should succeed');
@ -95,6 +99,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer =>
promise_rejects(t, 'InvalidStateError',
@ -104,6 +110,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer =>
pc.setRemoteDescription(offer)
@ -111,7 +119,6 @@
.then(answer =>
promise_rejects(t, 'InvalidStateError',
pc.setRemoteDescription(answer)));
}, 'Calling setRemoteDescription(answer) from have-remote-offer state should reject with InvalidStateError');
</script>

View file

@ -12,7 +12,6 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// assert_session_desc_equals()
// test_state_change_event()
/*
4.3.2. Interface Definition
@ -52,11 +51,14 @@
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
pc1.createDataChannel('datachannel');
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
test_state_change_event(t, pc2, ['have-remote-offer']);
const states = [];
pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState));
return pc1.createOffer()
.then(offer => {
@ -66,18 +68,22 @@
assert_session_desc_equals(pc2.remoteDescription, offer);
assert_session_desc_equals(pc2.pendingRemoteDescription, offer);
assert_equals(pc2.currentRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer']);
});
});
}, 'setRemoteDescription with valid offer should succeed');
}, 'setRemoteDescription with valid offer should succeed');
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
pc1.createDataChannel('datachannel');
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
// have-remote-offer event should only fire once
test_state_change_event(t, pc2, ['have-remote-offer']);
const states = [];
pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState));
return pc1.createOffer()
.then(offer => {
@ -88,18 +94,22 @@
assert_session_desc_equals(pc2.remoteDescription, offer);
assert_session_desc_equals(pc2.pendingRemoteDescription, offer);
assert_equals(pc2.currentRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer']);
});
});
}, 'setRemoteDescription multiple times should succeed');
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
pc1.createDataChannel('datachannel');
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
// have-remote-offer event should only fire once
test_state_change_event(t, pc2, ['have-remote-offer']);
const states = [];
pc2.addEventListener('signalingstatechange', () => states.push(pc2.signalingState));
return pc1.createOffer()
.then(offer1 => {
@ -116,6 +126,8 @@
assert_session_desc_equals(pc2.remoteDescription, offer2);
assert_session_desc_equals(pc2.pendingRemoteDescription, offer2);
assert_equals(pc2.currentRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer']);
});
});
});
@ -132,6 +144,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.setRemoteDescription({
type: 'offer',
sdp: 'Invalid SDP'
@ -159,6 +173,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer => {
return pc.setLocalDescription(offer)

View file

@ -14,7 +14,6 @@
// generateOffer
// generateAnswer
// assert_session_desc_equals
// test_state_change_event
/*
4.3.2. Interface Definition
@ -64,6 +63,8 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer()
.then(offer =>
promise_rejects(t, 'InvalidStateError',
@ -80,7 +81,10 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
@ -100,13 +104,18 @@
assert_session_desc_equals(pc.remoteDescription, pranswer);
assert_session_desc_equals(pc.pendingRemoteDescription, pranswer);
assert_equals(pc.currentRemoteDescription, null);
assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer']);
});
}));
}, 'setRemoteDescription(pranswer) from have-local-offer state should succeed');
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
@ -116,13 +125,19 @@
const pranswer = { type: 'pranswer', sdp: answer.sdp };
return pc.setRemoteDescription(pranswer)
.then(() => pc.setRemoteDescription(pranswer));
.then(() => pc.setRemoteDescription(pranswer))
.then(() => {
assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer']);
});
}));
}, 'setRemoteDescription(pranswer) multiple times should succeed');
promise_test(t => {
const pc = new RTCPeerConnection();
test_state_change_event(t, pc, ['have-local-offer', 'have-remote-pranswer', 'stable']);
t.add_cleanup(() => pc.close());
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return pc.createOffer({ offerToReceiveVideo: true })
.then(offer =>
@ -143,6 +158,8 @@
assert_session_desc_equals(pc.remoteDescription, answer);
assert_session_desc_equals(pc.currentRemoteDescription, answer);
assert_equals(pc.pendingRemoteDescription, null);
assert_array_equals(states, ['have-local-offer', 'have-remote-pranswer', 'stable']);
});
}));
}, 'setRemoteDescription(answer) from have-remote-pranswer state should succeed');

View file

@ -12,6 +12,7 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0], streams[0]);
@ -28,6 +29,7 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0], streams[0]);
@ -44,6 +46,7 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0], streams[0]);
@ -62,6 +65,7 @@
async_test(t => {
const expectedException = 'InvalidStateError';
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0], streams[0]);
@ -84,6 +88,7 @@
async_test(t => {
const expectedException = 'InvalidModificationError';
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0], streams[0]);
@ -108,6 +113,7 @@
async_test(t => {
const expectedException = 'InvalidModificationError';
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0], streams[0]);

View file

@ -13,7 +13,6 @@
// The following helper functions are called from RTCPeerConnection-helper.js:
// generateOffer
// assert_session_desc_equals
// test_state_change_event
/*
4.3.2. Interface Definition
@ -59,8 +58,10 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
test_state_change_event(t, pc, ['have-remote-offer', 'stable']);
const states = [];
pc.addEventListener('signalingstatechange', () => states.push(pc.signalingState));
return generateOffer({ data: true })
.then(offer => pc.setRemoteDescription(offer))
@ -77,6 +78,8 @@
assert_equals(pc.remoteDescription, null);
assert_equals(pc.pendingRemoteDescription, null);
assert_equals(pc.currentRemoteDescription, null);
assert_array_equals(states, ['have-remote-offer', 'stable']);
});
}, 'setRemoteDescription(rollback) in have-remote-offer state should revert to stable state');
@ -94,12 +97,14 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return promise_rejects(t, 'InvalidStateError',
pc.setRemoteDescription({ type: 'rollback' }));
}, `setRemoteDescription(rollback) from stable state should reject with InvalidStateError`);
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
return pc.createOffer({ offerToReceiveAudio: true })
.then(offer => pc.setRemoteDescription(offer))
.then(() => pc.setRemoteDescription({

View file

@ -7,420 +7,348 @@
<script>
'use strict';
// Test is based on the following editor draft:
// https://w3c.github.io/webrtc-pc/archives/20171002/webrtc.html
// The following helper functions are called from RTCPeerConnection-helper.js:
// getUserMediaTracksAndStreams
// performOffer
// addEventListenerPromise
// exchangeOffer
// exchangeOfferAnswer
// Resolver
// These tests are concerned with the observable consequences of processing
// the addition or removal of remote tracks, including events firing and the
// states of RTCPeerConnection, MediaStream and MediaStreamTrack.
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const localTrack = tracks[0];
caller.addTrack(localTrack);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
const remoteTrack = trackEvent.track;
assert_equals(remoteTrack.id, localTrack.id,
'Expected local and remote track IDs to match.');
assert_equals(trackEvent.streams.length, 0,
'Expected remote track not to belong to a stream.');
t.done();
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
caller.addTrack(localStream.getTracks()[0]);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
assert_equals(e.track.id, localStream.getTracks()[0].id,
'Local and remote track IDs match.');
assert_equals(e.streams.length, 0, 'No remote stream created.');
});
await exchangeOffer(caller, callee);
await ontrackPromise;
}, 'addTrack() with a track and no stream makes ontrack fire with a track and no stream.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const localTrack = tracks[0];
const localStream = streams[0];
caller.addTrack(localTrack, localStream);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
assert_equals(trackEvent.streams.length, 1,
'Expected track event to fire with a single stream.');
const remoteTrack = trackEvent.track;
const remoteStream = trackEvent.streams[0];
assert_equals(remoteTrack.id, localTrack.id,
'Expected local and remote track IDs to match.');
assert_equals(remoteStream.id, localStream.id,
'Expected local and remote stream IDs to match.');
assert_array_equals(remoteStream.getTracks(), [remoteTrack],
'Expected the remote stream\'s tracks to be the remote track.');
t.done();
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
assert_equals(e.track.id, localStream.getTracks()[0].id,
'Local and remote track IDs match.');
assert_equals(e.streams.length, 1, 'Created a single remote stream.');
assert_equals(e.streams[0].id, localStream.id,
'Local and remote stream IDs match.');
assert_array_equals(e.streams[0].getTracks(), [e.track],
'The remote stream contains the remote track.');
});
await exchangeOffer(caller, callee);
await ontrackPromise;
}, 'addTrack() with a track and a stream makes ontrack fire with a track and a stream.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let eventSequence = '';
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const ontrackResolver = new Resolver();
callee.ontrack = () => {
eventSequence += 'ontrack;';
ontrackResolver.resolve();
}
caller.addTrack(tracks[0]);
return Promise.all([
ontrackResolver.promise,
performOffer(caller, callee).then(() => {
eventSequence += 'setRemoteDescription;';
})
]);
}))
.then(t.step_func(() => {
assert_equals(eventSequence, 'ontrack;setRemoteDescription;');
t.done();
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
eventSequence += 'ontrack;';
});
await exchangeOffer(caller, callee);
eventSequence += 'setRemoteDescription;';
await ontrackPromise;
assert_equals(eventSequence, 'ontrack;setRemoteDescription;');
}, 'ontrack fires before setRemoteDescription resolves.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const localTrack1 = tracks[0];
const localTrack2 = tracks[1];
const localStream = streams[0];
caller.addTrack(localTrack1, localStream);
caller.addTrack(localTrack2, localStream);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
assert_equals(trackEvent.streams.length, 1,
'Expected track event to fire with a single stream.');
const remoteTrack1 = trackEvent.track;
const remoteStream = trackEvent.streams[0];
assert_equals(remoteTrack1.id, localTrack1.id,
'Expected first remote track ID to match first local track ID.');
assert_equals(remoteStream.getTracks().length, 2,
'Expected the remote stream to contain two tracks.');
callee.ontrack = t.step_func(trackEvent => {
assert_equals(trackEvent.streams.length, 1,
'Expected track event to fire with a single stream.');
const remoteTrack2 = trackEvent.track;
assert_equals(trackEvent.streams[0], remoteStream,
'Expected both track events to fire with the same remote stream.');
assert_equals(remoteTrack2.id, localTrack2.id,
'Expected second remote track ID to match second local track ID.');
assert_equals(remoteStream.getTracks().length, 2,
'Expected the remote stream to contain two tracks.');
assert_array_equals(remoteStream.getTracks(), [remoteTrack1, remoteTrack2],
'Expected the remote stream\'s tracks to be the [first, second] remote tracks.');
t.done();
});
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
const localStreams = await Promise.all([
navigator.mediaDevices.getUserMedia({audio: true}),
navigator.mediaDevices.getUserMedia({audio: true}),
]);
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
caller.addTrack(localStreams[1].getTracks()[0], localStreams[0]);
let ontrackEventsFired = 0;
const ontrackEventResolvers = [ new Resolver(), new Resolver() ];
callee.ontrack = t.step_func(e => {
ontrackEventResolvers[ontrackEventsFired++].resolve(e);
});
await exchangeOffer(caller, callee);
let firstTrackEvent = await ontrackEventResolvers[0].promise;
assert_equals(firstTrackEvent.track.id,
localStreams[0].getTracks()[0].id,
'First ontrack\'s track ID matches first local track.');
assert_equals(firstTrackEvent.streams.length, 1,
'First ontrack fires with a single stream.');
assert_equals(firstTrackEvent.streams[0].id,
localStreams[0].id,
'First ontrack\'s stream ID matches local stream.');
let secondTrackEvent = await ontrackEventResolvers[1].promise;
assert_equals(secondTrackEvent.track.id,
localStreams[1].getTracks()[0].id,
'Second ontrack\'s track ID matches second local track.');
assert_equals(secondTrackEvent.streams.length, 1,
'Second ontrack fires with a single stream.');
assert_equals(secondTrackEvent.streams[0].id,
localStreams[0].id,
'Second ontrack\'s stream ID matches local stream.');
assert_array_equals(firstTrackEvent.streams, secondTrackEvent.streams,
'ontrack was fired with the same streams both times.');
assert_array_equals(firstTrackEvent.streams[0].getTracks(),
[firstTrackEvent.track, secondTrackEvent.track],
'The remote stream == [first track, second track].');
assert_equals(ontrackEventsFired, 2, 'Unexpected number of track events.');
}, 'addTrack() with two tracks and one stream makes ontrack fire twice with the tracks and shared stream.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const localTracks = tracks;
const localStream = streams[0];
caller.addTrack(localTracks[0], localStream);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
assert_equals(trackEvent.streams.length, 1,
'Expected track event to fire with a single stream.');
const remoteTracks = [ trackEvent.track ];
const remoteStream = trackEvent.streams[0];
assert_equals(remoteTracks[0].id, localTracks[0].id, 'Remote track ID.');
assert_equals(remoteStream.id, localStream.id, 'Remote stream ID.');
assert_array_equals(remoteStream.getTracks(), remoteTracks,
'Expected the remote stream\'s tracks to be the remote track.');
caller.addTrack(localTracks[1], localStream);
performOffer(caller, callee);
remoteStream.onaddtrack = t.step_func(trackEvent => {
remoteTracks.push(trackEvent.track);
assert_equals(remoteTracks[1].id, localTracks[1].id, 'Remote track ID.');
assert_array_equals(remoteStream.getTracks(), remoteTracks,
'Expected the remote stream\'s tracks to be the remote tracks.');
t.done();
});
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
let eventSequence = '';
const localStreams = await Promise.all([
navigator.mediaDevices.getUserMedia({audio: true}),
navigator.mediaDevices.getUserMedia({audio: true}),
]);
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
const remoteStreams = [];
callee.ontrack = e => {
if (!remoteStreams.includes(e.streams[0]))
remoteStreams.push(e.streams[0]);
};
await exchangeOfferAnswer(caller, callee);
assert_equals(remoteStreams.length, 1, 'One remote stream created.');
assert_equals(remoteStreams[0].getTracks()[0].id,
localStreams[0].getTracks()[0].id,
'First local and remote tracks have the same ID.');
const onaddtrackPromise =
addEventListenerPromise(t, remoteStreams[0], 'addtrack', e => {
assert_equals(e.track.id, localStreams[1].getTracks()[0].id,
'Second local and remote tracks have the same ID.');
});
caller.addTrack(localStreams[1].getTracks()[0], localStreams[0]);
await exchangeOffer(caller, callee);
await onaddtrackPromise;
assert_equals(remoteStreams.length, 1, 'Still a single remote stream.');
}, 'addTrack() for an existing stream makes stream.onaddtrack fire.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let eventSequence = '';
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const localTracks = tracks;
const localStream = streams[0];
caller.addTrack(localTracks[0], localStream);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
callee.ontrack = null;
const remoteStream = trackEvent.streams[0];
const onaddtrackResolver = new Resolver();
remoteStream.onaddtrack = () => {
eventSequence += 'stream.onaddtrack;';
onaddtrackResolver.resolve();
}
caller.addTrack(localTracks[1], localStream);
Promise.all([
onaddtrackResolver.promise,
performOffer(caller, callee).then(() => {
eventSequence += 'setRemoteDescription;';
})
]).then(t.step_func(() => {
assert_equals(eventSequence, 'stream.onaddtrack;setRemoteDescription;');
t.done();
}));
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
const localStreams = await Promise.all([
navigator.mediaDevices.getUserMedia({audio: true}),
navigator.mediaDevices.getUserMedia({audio: true}),
]);
caller.addTrack(localStreams[0].getTracks()[0], localStreams[0]);
const remoteStreams = [];
callee.ontrack = e => {
if (!remoteStreams.includes(e.streams[0]))
remoteStreams.push(e.streams[0]);
};
await exchangeOfferAnswer(caller, callee);
assert_equals(remoteStreams.length, 1, 'One remote stream created.');
const onaddtrackPromise =
addEventListenerPromise(t, remoteStreams[0], 'addtrack', e => {
eventSequence += 'stream.onaddtrack;';
});
caller.addTrack(localStreams[1].getTracks()[0], localStreams[0]);
await exchangeOffer(caller, callee);
eventSequence += 'setRemoteDescription;';
await onaddtrackPromise;
assert_equals(remoteStreams.length, 1, 'Still a single remote stream.');
assert_equals(eventSequence, 'stream.onaddtrack;setRemoteDescription;');
}, 'stream.onaddtrack fires before setRemoteDescription resolves.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(2)
.then(t.step_func(([tracks, streams]) => {
const localTrack = tracks[0];
const localStreams = streams;
caller.addTrack(localTrack, localStreams[0], localStreams[1]);
const performOffer = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
assert_equals(trackEvent.streams.length, 2,
'Expected the track event to fire with two streams.');
const remoteTrack = trackEvent.track;
const remoteStreams = trackEvent.streams;
assert_equals(remoteTrack.id, localTrack.id,
'Expected local and remote track IDs to match.');
assert_equals(remoteStreams[0].id, localStreams[0].id,
'Expected the first remote stream ID to match the first local stream ID.');
assert_equals(remoteStreams[1].id, localStreams[1].id,
'Expected the second remote stream ID to match the second local stream ID.');
assert_array_equals(remoteStreams[0].getTracks(), [remoteTrack],
'Expected the remote stream\'s tracks to be the remote track.');
assert_array_equals(remoteStreams[1].getTracks(), [remoteTrack],
'Expected the remote stream\'s tracks to be the remote track.');
t.done();
});
return performOffer;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
const localStreams = await Promise.all([
navigator.mediaDevices.getUserMedia({audio: true}),
navigator.mediaDevices.getUserMedia({audio: true}),
]);
caller.addTrack(localStreams[0].getTracks()[0],
localStreams[0], localStreams[1]);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
assert_equals(e.track.id, localStreams[0].getTracks()[0].id,
'Local and remote track IDs match.');
assert_equals(e.streams.length, 2, 'Two remote stream created.');
assert_array_equals(e.streams[0].getTracks(), [e.track],
'First remote stream == [remote track].');
assert_array_equals(e.streams[1].getTracks(), [e.track],
'Second remote stream == [remote track].');
assert_equals(e.streams[0].id, localStreams[0].id,
'First local and remote stream IDs match.');
assert_equals(e.streams[1].id, localStreams[1].id,
'Second local and remote stream IDs match.');
});
await exchangeOffer(caller, callee);
await ontrackPromise;
}, 'addTrack() with a track and two streams makes ontrack fire with a track and two streams.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
caller.addTrack(tracks[0]);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
assert_array_equals(callee.getReceivers(), [trackEvent.receiver]);
t.done();
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
caller.addTrack(localStream.getTracks()[0]);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
assert_array_equals(callee.getReceivers(), [e.receiver],
'getReceivers() == [e.receiver].');
});
await exchangeOffer(caller, callee);
await ontrackPromise;
}, 'ontrack\'s receiver matches getReceivers().');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0]);
assert_not_equals(sender, null);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
const receivers = callee.getReceivers();
assert_equals(receivers.length, 1,
'Expected getReceivers() to be the track event\'s receiver.');
caller.removeTrack(sender);
performOffer(caller, callee)
.then(t.step_func(() => {
assert_array_equals(callee.getReceivers(), receivers,
'Expected the set of receivers to remain the same.');
t.done();
}));
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
const sender = caller.addTrack(localStream.getTracks()[0]);
const ontrackPromise = addEventListenerPromise(t, callee, 'track');
await exchangeOfferAnswer(caller, callee);
await ontrackPromise;
assert_equals(callee.getReceivers().length, 1, 'One receiver created.');
caller.removeTrack(sender);
await exchangeOffer(caller, callee);
assert_equals(callee.getReceivers().length, 1, 'Receiver not removed.');
}, 'removeTrack() does not remove the receiver.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0], streams[0]);
assert_not_equals(sender, null);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
assert_not_equals(trackEvent.track, null);
assert_equals(trackEvent.streams.length, 1);
assert_true(trackEvent.streams[0].getTracks().includes(trackEvent.track));
caller.removeTrack(sender);
performOffer(caller, callee);
trackEvent.streams[0].onremovetrack = t.step_func(removeEvent => {
assert_equals(removeEvent.track, trackEvent.track);
assert_false(trackEvent.streams[0].getTracks().includes(trackEvent.track));
t.done();
});
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
assert_equals(e.streams.length, 1);
return e.streams[0];
});
await exchangeOfferAnswer(caller, callee);
const remoteStream = await ontrackPromise;
const remoteTrack = remoteStream.getTracks()[0];
const onremovetrackPromise =
addEventListenerPromise(t, remoteStream, 'removetrack', e => {
assert_equals(e.track, remoteTrack);
assert_equals(remoteStream.getTracks().length, 0,
'Remote stream emptied of tracks.');
});
caller.removeTrack(sender);
await exchangeOffer(caller, callee);
await onremovetrackPromise;
}, 'removeTrack() makes stream.onremovetrack fire and the track to be removed from the stream.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let eventSequence = '';
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0], streams[0]);
assert_not_equals(sender, null);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
const remoteStream = trackEvent.streams[0];
const onremovetrackResolver = new Resolver();
remoteStream.onremovetrack = t.step_func(removeEvent => {
eventSequence += 'stream.onremovetrack;';
onremovetrackResolver.resolve();
});
caller.removeTrack(sender);
return Promise.all([
onremovetrackResolver.promise,
performOffer(caller, callee).then(() => {
eventSequence += 'setRemoteDescription;';
})
]).then(t.step_func(() => {
assert_equals(eventSequence, 'stream.onremovetrack;setRemoteDescription;');
t.done();
}));
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
assert_equals(e.streams.length, 1);
return e.streams[0];
});
await exchangeOfferAnswer(caller, callee);
const remoteStream = await ontrackPromise;
const remoteTrack = remoteStream.getTracks()[0];
const onremovetrackPromise =
addEventListenerPromise(t, remoteStream, 'removetrack', e => {
eventSequence += 'stream.onremovetrack;';
});
caller.removeTrack(sender);
await exchangeOffer(caller, callee);
eventSequence += 'setRemoteDescription;';
await onremovetrackPromise;
assert_equals(eventSequence, 'stream.onremovetrack;setRemoteDescription;');
}, 'stream.onremovetrack fires before setRemoteDescription resolves.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0]);
assert_not_equals(sender, null);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
const remoteTrack = trackEvent.track;
caller.removeTrack(sender);
performOffer(caller, callee);
remoteTrack.onmute = t.step_func(() => {
assert_true(trackEvent.track.muted);
t.done();
});
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => callee.close());
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
assert_equals(e.streams.length, 1);
return e.streams[0];
});
await exchangeOfferAnswer(caller, callee);
const remoteStream = await ontrackPromise;
const remoteTrack = remoteStream.getTracks()[0];
const onmutePromise =
addEventListenerPromise(t, remoteTrack, 'mute', () => {
assert_true(remoteTrack.muted);
});
caller.removeTrack(sender);
await exchangeOffer(caller, callee);
await onmutePromise;
}, 'removeTrack() makes track.onmute fire and the track to be muted.');
async_test(t => {
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let eventSequence = '';
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const sender = caller.addTrack(tracks[0]);
assert_not_equals(sender, null);
const offerPromise = performOffer(caller, callee);
callee.ontrack = t.step_func(trackEvent => {
const remoteTrack = trackEvent.track;
const onmuteResolver = new Resolver();
remoteTrack.onmute = t.step_func(() => {
eventSequence += 'track.onmute;';
onmuteResolver.resolve();
});
caller.removeTrack(sender);
return Promise.all([
onmuteResolver.promise,
performOffer(caller, callee).then(() => {
eventSequence += 'setRemoteDescription;';
})
]).then(t.step_func(() => {
assert_equals(eventSequence, 'track.onmute;setRemoteDescription;');
t.done();
}));
});
return offerPromise;
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
const localStream =
await navigator.mediaDevices.getUserMedia({audio: true});
const sender = caller.addTrack(localStream.getTracks()[0], localStream);
const ontrackPromise = addEventListenerPromise(t, callee, 'track', e => {
assert_equals(e.streams.length, 1);
return e.streams[0];
});
await exchangeOfferAnswer(caller, callee);
const remoteStream = await ontrackPromise;
const remoteTrack = remoteStream.getTracks()[0];
const onmutePromise =
addEventListenerPromise(t, remoteTrack, 'mute', () => {
eventSequence += 'track.onmute;';
});
caller.removeTrack(sender);
await exchangeOffer(caller, callee);
eventSequence += 'setRemoteDescription;';
await onmutePromise;
assert_equals(eventSequence, 'track.onmute;setRemoteDescription;');
}, 'track.onmute fires before setRemoteDescription resolves.');
async_test(t => {
promise_test(async t => {
const pc = new RTCPeerConnection();
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
const sender = pc.addTrack(tracks[0]);
assert_not_equals(sender, null);
pc.removeTrack(sender);
pc.removeTrack(sender);
t.done();
}))
.catch(t.step_func(reason => {
assert_unreached(reason);
}));
t.add_cleanup(() => pc.close());
const stream = await navigator.mediaDevices.getUserMedia({audio: true});
const sender = pc.addTrack(stream.getTracks()[0]);
pc.removeTrack(sender);
pc.removeTrack(sender);
}, 'removeTrack() twice is safe.');
</script>

View file

@ -19,6 +19,7 @@
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
let track;
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
@ -43,6 +44,7 @@
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
let stream;
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
@ -64,6 +66,7 @@
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
let track;
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
@ -90,6 +93,7 @@
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
let stream;
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
@ -117,6 +121,7 @@
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
let track;
let stream;
return getUserMediaTracksAndStreams(1)
@ -155,6 +160,7 @@
// https://github.com/w3c/webrtc-pc/issues/1125
async_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
let track;
let stream;
return getUserMediaTracksAndStreams(1)
@ -189,7 +195,9 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let sendingTrack;
return getUserMediaTracksAndStreams(1)
.then(t.step_func(([tracks, streams]) => {
@ -217,7 +225,9 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let receivingTrack;
callee.ontrack = trackEvent => {
assert_true(receivingTrack == undefined, 'ontrack has not fired before');
@ -249,7 +259,9 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let sendingTrack1;
let sendingTrack2;
let sender;
@ -276,7 +288,9 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let sendingTrack1;
let sendingTrack2;
let sender;
@ -285,7 +299,7 @@
sendingTrack1 = tracks[0];
sendingTrack2 = tracks[1];
sender = caller.addTrack(sendingTrack1);
return performOffer(caller, callee);
return exchangeOffer(caller, callee);
}))
.then(t.step_func(() => {
return sender.replaceTrack(sendingTrack2);
@ -311,7 +325,9 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let sendingTrack1;
let sendingTrack2;
let sender;
@ -345,7 +361,9 @@
async_test(t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let sendingTrack1;
let sendingTrack2;
let sender;
@ -380,7 +398,9 @@
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
let sender = caller.addTrack(tracks[0], streams[0]);
callee.addTrack(tracks[1], streams[1]);
@ -426,7 +446,9 @@
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
let sender = caller.addTrack(tracks[0], streams[0]);
callee.addTrack(tracks[1], streams[1]);
@ -472,7 +494,9 @@
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
let sender = caller.addTrack(tracks[0], streams[0]);
callee.addTrack(tracks[1], streams[1]);
@ -497,7 +521,9 @@
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
let sender = caller.addTrack(tracks[0], streams[0]);
callee.addTrack(tracks[1], streams[1]);
@ -523,6 +549,7 @@
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
let [tracks, streams] = await getUserMediaTracksAndStreams(1);
await promise_rejects(t, 'InvalidAccessError', pc.getStats(tracks[0]));
}, 'RTCPeerConnection.getStats(track) throws InvalidAccessError when there ' +
@ -530,6 +557,7 @@
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
let [tracks, streams] = await getUserMediaTracksAndStreams(2);
let sender1 = pc.addTrack(tracks[0]);
let sender2 = pc.addTrack(tracks[1]);

View file

@ -82,6 +82,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -96,11 +97,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, 'setParameters() with codec.payloadType modified 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);
@ -115,11 +116,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, 'setParameters() with codec.mimeType modified 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);
@ -134,11 +135,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, 'setParameters() with codec.clockRate modified 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);
@ -153,12 +154,12 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, 'setParameters() with codec.channels modified 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);
@ -173,12 +174,12 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, 'setParameters() with codec.sdpFmtpLine modified 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);
@ -194,11 +195,11 @@
return promise_rejects(t, 'InvalidModificationError',
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);
@ -213,11 +214,11 @@
}
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);
@ -227,7 +228,6 @@
param.codecs = codecs.slice(1);
return sender.setParameters(param);
}, 'setParameters with dropped codec should succeed');
</script>

View file

@ -42,6 +42,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
@ -63,6 +64,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();

View file

@ -192,6 +192,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -205,11 +206,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `sender.setParameters() with mismatch number of encodings 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);
@ -218,11 +219,11 @@
return promise_rejects(t, 'InvalidModificationError',
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();
@ -240,11 +241,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `setParameters() with modified encoding.ssrc 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();
@ -262,11 +263,11 @@
return promise_rejects(t, 'InvalidModificationError',
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();
@ -284,11 +285,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `setParameters() with modified encoding.fec field should reject with InvalidModificationError`);
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio', {
sendEncodings: [{ rid: 'foo' }],
});
@ -302,7 +303,6 @@
encoding.rid = 'bar';
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `setParameters() with modified encoding.rid field should reject with InvalidModificationError`);
/*
@ -313,6 +313,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
@ -322,11 +323,11 @@
encoding.scaleResolutionDownBy = 0.5;
return promise_rejects(t, 'RangeError',
sender.setParameters(param));
}, `setParameters() with encoding.scaleResolutionDownBy field set to less than 1.0 should reject with RangeError`);
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
@ -342,13 +343,13 @@
assert_approx_equals(encoding.scaleResolutionDownBy, 1.5, 0.01);
});
}, `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 => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio', {
sendEncodings: [{
[field]: value1

View file

@ -57,6 +57,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
validateSenderRtpParameters(param);
@ -69,7 +70,6 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `setParameters() with modified headerExtensions should reject with InvalidModificationError`);
</script>

View file

@ -56,6 +56,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
@ -75,11 +76,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `setParameters() with modified rtcp.cname 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();
@ -99,7 +100,6 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `setParameters() with modified rtcp.reducedSize should reject with InvalidModificationError`);
</script>

View file

@ -85,6 +85,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param = sender.getParameters();
@ -95,11 +96,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `sender.setParameters() with transaction ID different from last getParameters() 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();
@ -109,11 +110,11 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `sender.setParameters() with transaction ID 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();
@ -123,11 +124,11 @@
.then(() =>
promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param)));
}, `setParameters() twice with the same parameters should reject with InvalidModificationError`);
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
const param1 = sender.getParameters();
@ -140,7 +141,6 @@
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param1));
}, `setParameters() with parameters older than last getParameters() should reject with InvalidModificationError`);
</script>

View file

@ -40,8 +40,11 @@
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
const ontrackPromise = new Promise(resolve => {
pc2.addEventListener('track', trackEvent => {
const { receiver } = trackEvent;

View file

@ -46,7 +46,9 @@
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const { receiver } = caller.addTransceiver('audio');
await doSignalingHandshake(caller, callee);
@ -57,7 +59,9 @@
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 navigator.mediaDevices.getUserMedia({audio:true});
const [track] = stream.getTracks();
caller.addTrack(track, stream);

View file

@ -27,8 +27,11 @@
promise_test(t => {
const pc1 = new RTCPeerConnection();
t.add_cleanup(() => pc1.close());
const pc2 = new RTCPeerConnection();
t.add_cleanup(() => pc2.close());
const ontrackPromise = new Promise(resolve => {
pc2.addEventListener('track', trackEvent => {
const { receiver } = trackEvent;

View file

@ -41,7 +41,9 @@
promise_test(async t => {
const caller = new RTCPeerConnection();
t.add_cleanup(() => caller.close());
const callee = new RTCPeerConnection();
t.add_cleanup(() => callee.close());
const { sender } = caller.addTransceiver('audio');
await doSignalingHandshake(caller, callee);
@ -52,7 +54,9 @@
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 navigator.mediaDevices.getUserMedia({audio:true});
const [track] = stream.getTracks();
const sender = caller.addTrack(track, stream);

View file

@ -33,6 +33,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver('audio');
@ -41,7 +42,6 @@
return promise_rejects(t, 'InvalidStateError',
sender.replaceTrack(track));
}, 'Calling replaceTrack on closed connection should reject with InvalidStateError');
/*
@ -52,6 +52,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('video');
const transceiver = pc.addTransceiver('audio');
@ -59,7 +60,6 @@
return promise_rejects(t, new TypeError(),
sender.replaceTrack(track));
}, 'Calling replaceTrack with track of different kind should reject with TypeError');
/*
@ -69,6 +69,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver('audio');
@ -77,7 +78,6 @@
return promise_rejects(t, 'InvalidStateError',
sender.replaceTrack(track));
}, 'Calling replaceTrack on stopped sender should reject with InvalidStateError');
/*
@ -88,6 +88,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver('audio');
@ -102,6 +103,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track1 = generateMediaStreamTrack('audio');
const track2 = generateMediaStreamTrack('audio');
@ -118,6 +120,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver(track);
@ -144,6 +147,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track = generateMediaStreamTrack('audio');
const transceiver = pc.addTransceiver(track);
@ -173,6 +177,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track1 = generateMediaStreamTrack('audio');
const track2 = generateMediaStreamTrack('audio');
@ -204,6 +209,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const track1 = generateMediaStreamTrack('audio');
const track2 = generateMediaStreamTrack('audio');

View file

@ -16,6 +16,7 @@
*/
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio');
const { sender } = transceiver;
@ -24,7 +25,6 @@
return promise_rejects(t, 'InvalidStateError',
sender.setParameters(param));
}, `setParameters() when transceiver is stopped should reject with InvalidStateError`);
</script>

View file

@ -56,6 +56,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const transceiver = pc.addTransceiver('audio', { direction: 'recvonly' });
assert_equals(transceiver.direction, 'recvonly');
assert_equals(transceiver.currentDirection, null);

View file

@ -41,6 +41,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_equals(pc.sctp, null);
pc.createDataChannel('test');
@ -65,6 +66,7 @@
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_equals(pc.sctp, null);
return generateOffer({ pc, data: true })

View file

@ -45,6 +45,7 @@ const remoteValue2 = 2;
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_equals(pc.sctp, null);
let maxMessageSize;
@ -69,6 +70,7 @@ promise_test(t => {
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_equals(pc.sctp, null);
return generateOffer({ pc, data: true })
@ -97,6 +99,7 @@ promise_test(t => {
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_equals(pc.sctp, null);
return generateOffer({ pc, data: true })
@ -118,6 +121,7 @@ promise_test(t => {
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_equals(pc.sctp, null);
return generateOffer({ pc, data: true })
@ -152,6 +156,7 @@ promise_test(t => {
promise_test(t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
assert_equals(pc.sctp, null);
const largerThanCanSendSize = canSendSize + 1;