blob: 0661a69edbc6da0bcdc9a1976c26d7cf57862e09 [file] [log] [blame]
Soares Chen172fe9d2017-07-18 09:30:181<!doctype html>
2<meta charset=utf-8>
3<title>RTCRtpParameters transactionId</title>
4<script src="/resources/testharness.js"></script>
5<script src="/resources/testharnessreport.js"></script>
6<script src="dictionary-helper.js"></script>
7<script src="RTCRtpParameters-helper.js"></script>
8<script>
9 'use strict';
10
11 // Test is based on the following editor draft:
12 // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html
13
14 // The following helper functions are called from RTCRtpParameters-helper.js:
Henrik Boström36fb0332018-06-29 09:09:0415 // doOfferAnswerExchange
Soares Chen172fe9d2017-07-18 09:30:1816 // validateSenderRtpParameters
17
18 /*
19 5.1. RTCPeerConnection Interface Extensions
20 partial interface RTCPeerConnection {
21 RTCRtpTransceiver addTransceiver((MediaStreamTrack or DOMString) trackOrKind,
22 optional RTCRtpTransceiverInit init);
23 ...
24 };
25
26 dictionary RTCRtpTransceiverInit {
27 RTCRtpTransceiverDirection direction = "sendrecv";
28 sequence<MediaStream> streams;
29 sequence<RTCRtpEncodingParameters> sendEncodings;
30 };
31
32 addTransceiver
33 2. If the dictionary argument is present, and it has a sendEncodings member,
34 let sendEncodings be that list of RTCRtpEncodingParameters objects, or an
35 empty list otherwise.
36 7. Create an RTCRtpSender with track, streams and sendEncodings and let
37 sender be the result.
38
39 5.2. RTCRtpSender Interface
40 interface RTCRtpSender {
41 Promise<void> setParameters(optional RTCRtpParameters parameters);
42 RTCRtpParameters getParameters();
43 };
44
45 dictionary RTCRtpParameters {
46 DOMString transactionId;
47 sequence<RTCRtpEncodingParameters> encodings;
48 sequence<RTCRtpHeaderExtensionParameters> headerExtensions;
49 RTCRtcpParameters rtcp;
50 sequence<RTCRtpCodecParameters> codecs;
51 RTCDegradationPreference degradationPreference;
52 };
53
54 getParameters
55 - transactionId is set to a new unique identifier, used to match this
56 getParameters call to a setParameters call that may occur later.
57 */
58
59 /*
60 5.2. getParameters
61 - transactionId is set to a new unique identifier, used to match this
62 getParameters call to a setParameters call that may occur later.
63 */
Henrik Boström36fb0332018-06-29 09:09:0464 promise_test(async t => {
Soares Chen172fe9d2017-07-18 09:30:1865 const pc = new RTCPeerConnection();
Philipp Hanckefb60c652019-05-20 07:39:1866 t.add_cleanup(() => pc.close());
Soares Chen172fe9d2017-07-18 09:30:1867 const { sender } = pc.addTransceiver('audio');
Henrik Boström36fb0332018-06-29 09:09:0468 await doOfferAnswerExchange(t, pc);
Soares Chen172fe9d2017-07-18 09:30:1869
70 const param1 = sender.getParameters();
71 const param2 = sender.getParameters();
72
73 validateSenderRtpParameters(param1);
74 validateSenderRtpParameters(param2);
75
76 assert_not_equals(param1.transactionId, param2.transactionId);
Soares Chen172fe9d2017-07-18 09:30:1877 }, `sender.getParameters() should return different transaction IDs for each call`);
78
79 /*
80 5.2. setParameters
81 7. If parameters.encodings.length is different from N, or if any parameter
82 in the parameters argument, marked as a Read-only parameter, has a value
83 that is different from the corresponding parameter value returned from
84 sender.getParameters(), abort these steps and return a promise rejected
85 with a newly created InvalidModificationError. Note that this also applies
86 to transactionId.
87 */
Henrik Boström36fb0332018-06-29 09:09:0488 promise_test(async t => {
Soares Chen172fe9d2017-07-18 09:30:1889 const pc = new RTCPeerConnection();
Philipp Hancke1622a022018-06-11 10:00:5390 t.add_cleanup(() => pc.close());
Soares Chen172fe9d2017-07-18 09:30:1891 const { sender } = pc.addTransceiver('audio');
Henrik Boström36fb0332018-06-29 09:09:0492 await doOfferAnswerExchange(t, pc);
Soares Chen172fe9d2017-07-18 09:30:1893
94 const param = sender.getParameters();
95 validateSenderRtpParameters(param);
96
97 const { transactionId } = param;
98 param.transactionId = `${transactionId}-modified`;
99
100 return promise_rejects(t, 'InvalidModificationError',
101 sender.setParameters(param));
Soares Chen172fe9d2017-07-18 09:30:18102 }, `sender.setParameters() with transaction ID different from last getParameters() should reject with InvalidModificationError`);
103
Henrik Boström36fb0332018-06-29 09:09:04104 promise_test(async t => {
Soares Chen172fe9d2017-07-18 09:30:18105 const pc = new RTCPeerConnection();
Philipp Hancke1622a022018-06-11 10:00:53106 t.add_cleanup(() => pc.close());
Soares Chen172fe9d2017-07-18 09:30:18107 const { sender } = pc.addTransceiver('audio');
Henrik Boström36fb0332018-06-29 09:09:04108 await doOfferAnswerExchange(t, pc);
Soares Chen172fe9d2017-07-18 09:30:18109
110 const param = sender.getParameters();
111 validateSenderRtpParameters(param);
112
113 param.transactionId = undefined;
114
Boris Zbarskyab733fd2020-02-04 21:19:03115 return promise_rejects_js(t, TypeError,
Soares Chen172fe9d2017-07-18 09:30:18116 sender.setParameters(param));
Florent Castelli7efb0ab2018-08-06 16:11:39117 }, `sender.setParameters() with transaction ID unset should reject with TypeError`);
Soares Chen172fe9d2017-07-18 09:30:18118
Henrik Boström36fb0332018-06-29 09:09:04119 promise_test(async t => {
Soares Chen172fe9d2017-07-18 09:30:18120 const pc = new RTCPeerConnection();
Philipp Hancke1622a022018-06-11 10:00:53121 t.add_cleanup(() => pc.close());
Soares Chen172fe9d2017-07-18 09:30:18122 const { sender } = pc.addTransceiver('audio');
Henrik Boström36fb0332018-06-29 09:09:04123 await doOfferAnswerExchange(t, pc);
Soares Chen172fe9d2017-07-18 09:30:18124
125 const param = sender.getParameters();
126 validateSenderRtpParameters(param);
127
128 return sender.setParameters(param)
129 .then(() =>
Henrik Boström36fb0332018-06-29 09:09:04130 promise_rejects(t, 'InvalidStateError',
Soares Chen172fe9d2017-07-18 09:30:18131 sender.setParameters(param)));
Henrik Boström36fb0332018-06-29 09:09:04132 }, `setParameters() twice with the same parameters should reject with InvalidStateError`);
Soares Chen172fe9d2017-07-18 09:30:18133
Henrik Boström36fb0332018-06-29 09:09:04134 promise_test(async t => {
Soares Chen172fe9d2017-07-18 09:30:18135 const pc = new RTCPeerConnection();
Philipp Hancke1622a022018-06-11 10:00:53136 t.add_cleanup(() => pc.close());
Soares Chen172fe9d2017-07-18 09:30:18137 const { sender } = pc.addTransceiver('audio');
Henrik Boström36fb0332018-06-29 09:09:04138 await doOfferAnswerExchange(t, pc);
Soares Chen172fe9d2017-07-18 09:30:18139
140 const param1 = sender.getParameters();
141 const param2 = sender.getParameters();
142
143 validateSenderRtpParameters(param1);
144 validateSenderRtpParameters(param2);
145
146 assert_not_equals(param1.transactionId, param2.transactionId);
147
148 return promise_rejects(t, 'InvalidModificationError',
149 sender.setParameters(param1));
Soares Chen172fe9d2017-07-18 09:30:18150 }, `setParameters() with parameters older than last getParameters() should reject with InvalidModificationError`);
151
152</script>