mirror of
https://github.com/servo/servo.git
synced 2025-10-04 02:29:12 +01:00
Update web-platform-tests to revision e29e596073468910d8655a8ec23262f17543e147
This commit is contained in:
parent
e56db1f322
commit
5e2118728a
67 changed files with 1403 additions and 821 deletions
|
@ -15,12 +15,6 @@
|
|||
// makeIceTransport
|
||||
// makeGatherAndStartTwoIceTransports
|
||||
|
||||
function makeIceTransport(t) {
|
||||
const iceTransport = new RTCIceTransport();
|
||||
t.add_cleanup(() => iceTransport.stop());
|
||||
return iceTransport;
|
||||
}
|
||||
|
||||
test(() => {
|
||||
const iceTransport = new RTCIceTransport();
|
||||
}, 'RTCIceTransport constructor does not throw');
|
||||
|
@ -260,4 +254,49 @@ promise_test(async t => {
|
|||
]);
|
||||
}, 'Two RTCIceTransports connect to each other');
|
||||
|
||||
promise_test(async t => {
|
||||
async function waitForConnectedThenSelectedCandidatePairChange(t, transport,
|
||||
transportName) {
|
||||
const watcher = new EventWatcher(t, transport,
|
||||
[ 'statechange', 'selectedcandidatepairchange' ]);
|
||||
await watcher.wait_for('statechange');
|
||||
assert_equals(transport.state, 'connected',
|
||||
`${transportName} state should be 'connected'`);
|
||||
await watcher.wait_for('selectedcandidatepairchange');
|
||||
const selectedCandidatePair = transport.getSelectedCandidatePair();
|
||||
assert_not_equals(selectedCandidatePair, null,
|
||||
`${transportName} selected candidate pair should not be null once ` +
|
||||
'the selectedcandidatepairchange event fires');
|
||||
assert_true(
|
||||
transport.getLocalCandidates().some(
|
||||
({ candidate }) =>
|
||||
candidate === selectedCandidatePair.local.candidate),
|
||||
`${transportName} selected candidate pair local should be in the ` +
|
||||
'list of local candidates');
|
||||
assert_true(
|
||||
transport.getRemoteCandidates().some(
|
||||
({ candidate }) =>
|
||||
candidate === selectedCandidatePair.remote.candidate),
|
||||
`${transportName} selected candidate pair local should be in the ` +
|
||||
'list of remote candidates');
|
||||
}
|
||||
const [ localTransport, remoteTransport ] =
|
||||
makeGatherAndStartTwoIceTransports(t);
|
||||
await Promise.all([
|
||||
waitForConnectedThenSelectedCandidatePairChange(t, localTransport,
|
||||
'local transport'),
|
||||
waitForConnectedThenSelectedCandidatePairChange(t, remoteTransport,
|
||||
'remote transport'),
|
||||
]);
|
||||
}, 'Selected candidate pair changes once the RTCIceTransports connect.');
|
||||
|
||||
promise_test(async t => {
|
||||
const [ transport, ] = makeGatherAndStartTwoIceTransports(t);
|
||||
const watcher = new EventWatcher(t, transport, 'selectedcandidatepairchange');
|
||||
await watcher.wait_for('selectedcandidatepairchange');
|
||||
transport.stop();
|
||||
assert_equals(transport.getSelectedCandidatePair(), null);
|
||||
}, 'getSelectedCandidatePair() returns null once the RTCIceTransport is ' +
|
||||
'stopped.');
|
||||
|
||||
</script>
|
||||
|
|
|
@ -354,56 +354,6 @@
|
|||
});
|
||||
}, `addTransceiver() with valid rid value should succeed`);
|
||||
|
||||
/*
|
||||
5.1. addTransceiver
|
||||
7. If any RTCRtpEncodingParameters dictionary in sendEncodings contains a
|
||||
read-only parameter other than rid, throw an InvalidAccessError.
|
||||
|
||||
- The sendEncodings argument can be used to specify the number of offered
|
||||
simulcast encodings, and optionally their RIDs and encoding parameters.
|
||||
Aside from rid , all read-only parameters in the RTCRtpEncodingParameters
|
||||
dictionaries, such as ssrc, must be left unset, or an error will be thrown.
|
||||
*/
|
||||
test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
assert_throws('InvalidAccessError', () =>
|
||||
pc.addTransceiver('audio', {
|
||||
sendEncodings: [{
|
||||
ssrc: 2
|
||||
}]
|
||||
}));
|
||||
}, `addTransceiver() with readonly ssrc set should throw InvalidAccessError`);
|
||||
|
||||
test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
assert_throws('InvalidAccessError', () =>
|
||||
pc.addTransceiver('audio', {
|
||||
sendEncodings: [{
|
||||
rtx: {
|
||||
ssrc: 2
|
||||
}
|
||||
}]
|
||||
}));
|
||||
}, `addTransceiver() with readonly rtx set should throw InvalidAccessError`);
|
||||
|
||||
test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
||||
assert_throws('InvalidAccessError', () =>
|
||||
pc.addTransceiver('audio', {
|
||||
sendEncodings: [{
|
||||
fec: {
|
||||
ssrc: 2
|
||||
}
|
||||
}]
|
||||
}));
|
||||
}, `addTransceiver() with readonly fec set should throw InvalidAccessError`);
|
||||
|
||||
test(t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
|
|
|
@ -13,19 +13,25 @@
|
|||
|
||||
// The following helper functions are called from RTCQuicTransport-helper.js:
|
||||
// makeStandaloneQuicTransport
|
||||
// makeTwoConnectedQuicTransports
|
||||
|
||||
promise_test(async t => {
|
||||
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||
const [ quicTransport, ] = await makeTwoConnectedQuicTransports(t);
|
||||
const quicStream = quicTransport.createStream();
|
||||
assert_equals(quicStream.transport, quicTransport,
|
||||
'Expect transport to be set to the creating RTCQuicTransport.');
|
||||
assert_equals(quicStream.state, 'new', `Expect state to be 'new'.`);
|
||||
assert_equals(quicStream.state, 'open', `Expect state to be 'open'.`);
|
||||
assert_equals(quicStream.readBufferedAmount, 0,
|
||||
'Expect read buffered amount to be 0.');
|
||||
assert_equals(quicStream.writeBufferedAmount, 0,
|
||||
'Expect write buffered amount to be 0.');
|
||||
}, 'createStream() returns an RTCQuicStream with initial properties set.');
|
||||
|
||||
promise_test(async t => {
|
||||
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||
assert_throws('InvalidStateError', () => quicTransport.createStream());
|
||||
}, 'createStream() throws if the transport is not connected.');
|
||||
|
||||
promise_test(async t => {
|
||||
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||
quicTransport.stop();
|
||||
|
@ -33,12 +39,120 @@ promise_test(async t => {
|
|||
}, 'createStream() throws if the transport is closed.');
|
||||
|
||||
promise_test(async t => {
|
||||
const quicTransport = await makeStandaloneQuicTransport(t);
|
||||
const [ quicTransport, ] = await makeTwoConnectedQuicTransports(t);
|
||||
const firstQuicStream = quicTransport.createStream();
|
||||
const secondQuicStream = quicTransport.createStream();
|
||||
quicTransport.stop();
|
||||
assert_equals(firstQuicStream.state, 'closed');
|
||||
assert_equals(secondQuicStream.state, 'closed');
|
||||
}, 'RTCQuicTransport.stop() closes all streams.');
|
||||
}, 'RTCQuicTransport.stop() closes all local streams.');
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
const firstLocalStream = localQuicTransport.createStream();
|
||||
firstLocalStream.finish();
|
||||
const secondLocalStream = localQuicTransport.createStream();
|
||||
secondLocalStream.finish();
|
||||
const remoteWatcher =
|
||||
new EventWatcher(t, remoteQuicTransport, [ 'quicstream', 'statechange' ]);
|
||||
const { stream: firstRemoteStream } =
|
||||
await remoteWatcher.wait_for('quicstream');
|
||||
const { stream: secondRemoteStream } =
|
||||
await remoteWatcher.wait_for('quicstream');
|
||||
localQuicTransport.stop();
|
||||
await remoteWatcher.wait_for('statechange');
|
||||
assert_equals(firstRemoteStream.state, 'closed');
|
||||
assert_equals(secondRemoteStream.state, 'closed');
|
||||
}, 'RTCQuicTransport.stop() closes all remote streams.');
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
const localStream = localQuicTransport.createStream();
|
||||
localStream.finish();
|
||||
assert_equals(localStream.state, 'closing');
|
||||
}, `finish() changes state to 'closing'.`);
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
const localStream = localQuicTransport.createStream();
|
||||
localStream.finish();
|
||||
localStream.finish();
|
||||
assert_equals(localStream.state, 'closing');
|
||||
}, `finish() twice does not change state.`);
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
const localStream = localQuicTransport.createStream();
|
||||
localStream.reset();
|
||||
assert_equals(localStream.state, 'closed');
|
||||
}, `reset() changes state to 'closed'.`);
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
const localStream = localQuicTransport.createStream();
|
||||
localStream.finish();
|
||||
localStream.reset();
|
||||
assert_equals(localStream.state, 'closed');
|
||||
}, `reset() following finish() changes state to 'closed'.`);
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
const localStream = localQuicTransport.createStream();
|
||||
localStream.finish();
|
||||
const remoteWatcher = new EventWatcher(t, remoteQuicTransport, 'quicstream');
|
||||
const { stream: remoteStream } = await remoteWatcher.wait_for('quicstream');
|
||||
assert_equals(remoteStream.state, 'open');
|
||||
const remoteStreamWatcher = new EventWatcher(t, remoteStream, 'statechange');
|
||||
await remoteStreamWatcher.wait_for('statechange');
|
||||
assert_equals(remoteStream.state, 'closing');
|
||||
}, 'createStream() followed by finish() fires a quicstream event followed by ' +
|
||||
`a statechange event to 'closing' on the remote side.`);
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
const localStream = localQuicTransport.createStream();
|
||||
localStream.reset();
|
||||
const remoteWatcher = new EventWatcher(t, remoteQuicTransport, 'quicstream');
|
||||
const { stream: remoteStream } = await remoteWatcher.wait_for('quicstream');
|
||||
assert_equals(remoteStream.state, 'open');
|
||||
const remoteStreamWatcher = new EventWatcher(t, remoteStream, 'statechange');
|
||||
await remoteStreamWatcher.wait_for('statechange');
|
||||
assert_equals(remoteStream.state, 'closed');
|
||||
}, 'createStream() followed by reset() fires a quicstream event followed ' +
|
||||
`by a statechange event to 'closed' on the remote side.`);
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
remoteQuicTransport.onquicstream = ({ stream }) => stream.reset();
|
||||
const localStream = localQuicTransport.createStream();
|
||||
localStream.finish();
|
||||
const localWatcher = new EventWatcher(t, localStream, 'statechange');
|
||||
await localWatcher.wait_for('statechange');
|
||||
assert_equals(localStream.state, 'closed');
|
||||
}, 'finish() on a remote stream that has already finished fires a ' +
|
||||
`statechange event to 'closed' on the remote side.`);
|
||||
|
||||
promise_test(async t => {
|
||||
const [ localQuicTransport, remoteQuicTransport ] =
|
||||
await makeTwoConnectedQuicTransports(t);
|
||||
const localStream = localQuicTransport.createStream();
|
||||
localStream.finish();
|
||||
localStream.reset();
|
||||
const remoteWatcher = new EventWatcher(t, remoteQuicTransport, 'quicstream');
|
||||
const { stream: remoteStream } = await remoteWatcher.wait_for('quicstream');
|
||||
const remoteStreamWatcher = new EventWatcher(t, remoteStream, 'statechange');
|
||||
await remoteStreamWatcher.wait_for('statechange');
|
||||
assert_equals(remoteStream.state, 'closing');
|
||||
await remoteStreamWatcher.wait_for('statechange');
|
||||
assert_equals(remoteStream.state, 'closed');
|
||||
}, 'finish() then reset() fires two statechange events on the remote side.');
|
||||
|
||||
</script>
|
||||
|
|
|
@ -79,4 +79,3 @@ async function makeTwoConnectedQuicTransports(t) {
|
|||
]);
|
||||
return [ localQuicTransport, remoteQuicTransport ];
|
||||
}
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
// makeAndGatherTwoIceTransports
|
||||
|
||||
// The following helper functions are called from RTCQuicTransport-helper.js:
|
||||
// generateCertificate
|
||||
// makeQuicTransport
|
||||
// makeStandaloneQuicTransport
|
||||
// makeAndStartTwoQuicTransports
|
||||
|
|
|
@ -45,15 +45,6 @@
|
|||
};
|
||||
|
||||
dictionary RTCRtpEncodingParameters {
|
||||
[readonly]
|
||||
unsigned long ssrc;
|
||||
|
||||
[readonly]
|
||||
RTCRtpRtxParameters rtx;
|
||||
|
||||
[readonly]
|
||||
RTCRtpFecParameters fec;
|
||||
|
||||
RTCDtxStatus dtx;
|
||||
boolean active;
|
||||
RTCPriorityType priority;
|
||||
|
@ -67,16 +58,6 @@
|
|||
double scaleResolutionDownBy;
|
||||
};
|
||||
|
||||
dictionary RTCRtpRtxParameters {
|
||||
[readonly]
|
||||
unsigned long ssrc;
|
||||
};
|
||||
|
||||
dictionary RTCRtpFecParameters {
|
||||
[readonly]
|
||||
unsigned long ssrc;
|
||||
};
|
||||
|
||||
enum RTCDtxStatus {
|
||||
"disabled",
|
||||
"enabled"
|
||||
|
@ -229,32 +210,9 @@
|
|||
|
||||
param.encodings = undefined;
|
||||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
return promise_rejects(t, new TypeError(),
|
||||
sender.setParameters(param));
|
||||
}, `sender.setParameters() with encodings unset should reject with InvalidModificationError`);
|
||||
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
t.add_cleanup(() => pc.close());
|
||||
const { sender } = pc.addTransceiver('audio');
|
||||
await doOfferAnswerExchange(t, pc);
|
||||
|
||||
const param = sender.getParameters();
|
||||
validateSenderRtpParameters(param);
|
||||
const encoding = getFirstEncoding(param);
|
||||
const { rtx } = encoding;
|
||||
|
||||
if(rtx === undefined) {
|
||||
encoding.rtx = { ssrc: 2 };
|
||||
} else if(rtx.ssrc === undefined) {
|
||||
rtx.ssrc = 2;
|
||||
} else {
|
||||
rtx.ssrc += 1;
|
||||
}
|
||||
|
||||
return promise_rejects(t, 'InvalidModificationError',
|
||||
sender.setParameters(param));
|
||||
}, `setParameters() with modified encoding.rtx field should reject with InvalidModificationError`);
|
||||
}, `sender.setParameters() with encodings unset should reject with TypeError`);
|
||||
|
||||
promise_test(async t => {
|
||||
const pc = new RTCPeerConnection();
|
||||
|
|
|
@ -69,11 +69,6 @@ function validateSenderRtpParameters(param) {
|
|||
When getParameters is called, the RTCRtpParameters dictionary is constructed
|
||||
as follows:
|
||||
|
||||
- encodings is populated based on SSRCs and RIDs present in the current remote
|
||||
description, including SSRCs used for RTX and FEC, if signaled. Every member
|
||||
of the RTCRtpEncodingParameters dictionaries other than the SSRC and RID fields
|
||||
is left undefined.
|
||||
|
||||
- The headerExtensions sequence is populated based on the header extensions that
|
||||
the receiver is currently prepared to receive.
|
||||
|
||||
|
@ -144,15 +139,6 @@ function validateRtpParameters(param) {
|
|||
|
||||
/*
|
||||
dictionary RTCRtpEncodingParameters {
|
||||
[readonly]
|
||||
unsigned long ssrc;
|
||||
|
||||
[readonly]
|
||||
RTCRtpRtxParameters rtx;
|
||||
|
||||
[readonly]
|
||||
RTCRtpFecParameters fec;
|
||||
|
||||
RTCDtxStatus dtx;
|
||||
boolean active;
|
||||
RTCPriorityType priority;
|
||||
|
@ -166,16 +152,6 @@ function validateRtpParameters(param) {
|
|||
double scaleResolutionDownBy;
|
||||
};
|
||||
|
||||
dictionary RTCRtpRtxParameters {
|
||||
[readonly]
|
||||
unsigned long ssrc;
|
||||
};
|
||||
|
||||
dictionary RTCRtpFecParameters {
|
||||
[readonly]
|
||||
unsigned long ssrc;
|
||||
};
|
||||
|
||||
enum RTCDtxStatus {
|
||||
"disabled",
|
||||
"enabled"
|
||||
|
@ -189,18 +165,6 @@ function validateRtpParameters(param) {
|
|||
};
|
||||
*/
|
||||
function validateEncodingParameters(encoding) {
|
||||
assert_optional_unsigned_int_field(encoding, 'ssrc');
|
||||
|
||||
assert_optional_dict_field(encoding, 'rtx');
|
||||
if(encoding.rtx) {
|
||||
assert_unsigned_int_field(encoding.rtx, 'ssrc');
|
||||
}
|
||||
|
||||
assert_optional_dict_field(encoding, 'fec');
|
||||
if(encoding.fec) {
|
||||
assert_unsigned_int_field(encoding.fec, 'ssrc');
|
||||
}
|
||||
|
||||
assert_optional_enum_field(encoding, 'dtx',
|
||||
['disabled', 'enabled']);
|
||||
|
||||
|
|
|
@ -22,11 +22,6 @@
|
|||
When getParameters is called, the RTCRtpParameters dictionary is constructed
|
||||
as follows:
|
||||
|
||||
- encodings is populated based on SSRCs and RIDs present in the current remote
|
||||
description, including SSRCs used for RTX and FEC, if signaled. Every member
|
||||
of the RTCRtpEncodingParameters dictionaries other than the SSRC and RID fields
|
||||
is left undefined.
|
||||
|
||||
- The headerExtensions sequence is populated based on the header extensions that
|
||||
the receiver is currently prepared to receive.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue