blob: 472b0439b5cc77d553b48000f6a7de3dda90b7d4 [file] [log] [blame]
<!doctype html>
<meta charset=utf-8>
<title>RTCRtpParameters transactionId</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="dictionary-helper.js"></script>
<script src="RTCRtpParameters-helper.js"></script>
<script>
'use strict';
// Test is based on the following editor draft:
// https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
// The following helper functions are called from RTCRtpParameters-helper.js:
// doOfferAnswerExchange
// validateSenderRtpParameters
/*
5.1. RTCPeerConnection Interface Extensions
partial interface RTCPeerConnection {
RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
optional RTCRtpTransceiverInit init);
...
};
dictionary RTCRtpTransceiverInit {
RTCRtpTransceiverDirection direction = "sendrecv";
sequence<MediaStream> streams;
sequence<RTCRtpEncodingParameters> sendEncodings;
};
addTransceiver
2. If the dictionary argument is present, and it has a sendEncodings member,
let sendEncodings be that list of RTCRtpEncodingParameters objects, or an
empty list otherwise.
7. Create an RTCRtpSender with track, streams and sendEncodings and let
sender be the result.
5.2. RTCRtpSender Interface
interface RTCRtpSender {
Promise<void> setParameters(optional RTCRtpParameters parameters);
RTCRtpParameters getParameters();
};
dictionary RTCRtpParameters {
DOMString transactionId;
sequence<RTCRtpEncodingParameters> encodings;
sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
RTCRtcpParameters rtcp;
sequence<RTCRtpCodecParameters> codecs;
RTCDegradationPreference degradationPreference;
};
getParameters
- transactionId is set to a new unique identifier, used to match this
getParameters call to a setParameters call that may occur later.
*/
/*
5.2. getParameters
- transactionId is set to a new unique identifier, used to match this
getParameters call to a setParameters call that may occur later.
*/
promise_test(async t => {
const pc = new RTCPeerConnection();
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param1 = sender.getParameters();
const param2 = sender.getParameters();
validateSenderRtpParameters(param1);
validateSenderRtpParameters(param2);
assert_not_equals(param1.transactionId, param2.transactionId);
}, `sender.getParameters() should return different transaction IDs for each call`);
/*
5.2. setParameters
7. If parameters.encodings.length is different from N, or if any parameter
in the parameters argument, marked as a Read-only parameter, has a value
that is different from the corresponding parameter value returned from
sender.getParameters(), abort these steps and return a promise rejected
with a newly created InvalidModificationError. Note that this also applies
to transactionId.
*/
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 { transactionId } = param;
param.transactionId = `${transactionId}-modified`;
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param));
}, `sender.setParameters() with transaction ID different from last getParameters() 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);
param.transactionId = undefined;
return promise_rejects(t, new TypeError(),
sender.setParameters(param));
}, `sender.setParameters() with transaction ID unset should reject with TypeError`);
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param = sender.getParameters();
validateSenderRtpParameters(param);
return sender.setParameters(param)
.then(() =>
promise_rejects(t, 'InvalidStateError',
sender.setParameters(param)));
}, `setParameters() twice with the same parameters should reject with InvalidStateError`);
promise_test(async t => {
const pc = new RTCPeerConnection();
t.add_cleanup(() => pc.close());
const { sender } = pc.addTransceiver('audio');
await doOfferAnswerExchange(t, pc);
const param1 = sender.getParameters();
const param2 = sender.getParameters();
validateSenderRtpParameters(param1);
validateSenderRtpParameters(param2);
assert_not_equals(param1.transactionId, param2.transactionId);
return promise_rejects(t, 'InvalidModificationError',
sender.setParameters(param1));
}, `setParameters() with parameters older than last getParameters() should reject with InvalidModificationError`);
</script>