From: chen Date: Wed, 15 May 2024 04:23:56 +0000 (+0800) Subject: [common][webrtc]fix TNINE3691 RTCRtpParameters encodings fails X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7abba2f6612eab1d311941c223b7e67bde1c2e90;p=test%2Ftct%2Fweb%2Fapi.git [common][webrtc]fix TNINE3691 RTCRtpParameters encodings fails Change-Id: I6fe7f6d8695fb6d669a7c3ca7e207eee77d71f0a Signed-off-by: chen --- diff --git a/common/tct-webrtc-w3c-tests/tests.xml b/common/tct-webrtc-w3c-tests/tests.xml index cd251e371..21cc23baa 100755 --- a/common/tct-webrtc-w3c-tests/tests.xml +++ b/common/tct-webrtc-w3c-tests/tests.xml @@ -3674,72 +3674,212 @@ - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=1 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=1 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=2 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=2 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=3 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=3 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=4 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=4 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=5 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=5 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=6 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=6 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=7 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=7 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=8 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=8 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=9 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=9 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=10 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=10 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=11 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=11 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=12 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=12 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=13 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=13 - + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=18 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=19 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=20 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=21 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=22 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=23 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=24 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=25 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=26 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=27 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=28 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=29 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=30 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=31 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=32 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=33 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=34 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=35 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=36 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=37 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=38 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=39 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=40 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=41 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=42 @@ -8573,75 +8713,215 @@ /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-codecs.html?total_num=6&locator_key=id&value=6 - + --> - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=1 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=1 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=2 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=2 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=3 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=3 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=4 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=4 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=5 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=5 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=6 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=6 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=7 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=7 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=8 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=8 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=9 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=9 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=10 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=10 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=11 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=11 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=12 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=12 - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=13 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=13 + + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=18 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=19 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=20 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=21 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=22 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=23 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=24 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=25 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=26 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=27 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=28 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=29 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=30 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=31 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=32 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=33 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=34 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=35 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=36 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=37 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=38 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=39 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=40 + + + + + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=41 - + - /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=14&locator_key=id&value=14 + /opt/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html?total_num=42&locator_key=id&value=42 diff --git a/common/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html b/common/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html index 956defd1e..fe38af873 100755 --- a/common/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html +++ b/common/tct-webrtc-w3c-tests/webrtc/RTCRtpParameters-encodings.html @@ -12,7 +12,6 @@ // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html // The following helper functions are called from RTCRtpParameters-helper.js: - // doOfferAnswerExchange // validateSenderRtpParameters /* @@ -57,6 +56,19 @@ - encodings is set to the value of the [[send encodings]] internal slot. */ + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video'); + + const param = transceiver.sender.getParameters(); + assert_equals(param.encodings.length, 1); + // Do not call this in every test; it does not make sense to disable all of + // the tests below for an implementation that is missing support for + // fields that are not related to the test. + validateSenderRtpParameters(param); + }, `getParameters should return RTCRtpEncodingParameters with all required fields`); + /* 5.1. addTransceiver 7. Create an RTCRtpSender with track, streams and sendEncodings and let sender @@ -75,29 +87,229 @@ const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); const transceiver = pc.addTransceiver('audio'); - await doOfferAnswerExchange(t, pc); const param = transceiver.sender.getParameters(); - validateSenderRtpParameters(param); const { encodings } = param; - const encoding = getFirstEncoding(param); + assert_equals(encodings.length, 1); + const encoding = param.encodings[0]; + + assert_equals(encoding.active, true); + assert_not_own_property(encoding, "maxBitrate"); + assert_not_own_property(encoding, "rid"); + assert_not_own_property(encoding, "scaleResolutionDownBy"); + // We do not check props from extension specifications here; those checks + // need to go in a test-case for that extension specification. + }, 'addTransceiver(audio) with undefined sendEncodings should have default encoding parameter with active set to true'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video'); + + const param = transceiver.sender.getParameters(); + const { encodings } = param; + assert_equals(encodings.length, 1); + const encoding = param.encodings[0]; assert_equals(encoding.active, true); - }, 'addTransceiver() with undefined sendEncodings should have default encoding parameter with active set to true'); + // spec says to return an encoding without a scaleResolutionDownBy value + // when addTransceiver does not pass any encodings, however spec also says + // to throw if setParameters is missing a scaleResolutionDownBy. One of + // these two requirements needs to be removed, but it is unclear right now + // which will be removed. For now, allow scaleResolutionDownBy, but don't + // require it. + // https://github.com/w3c/webrtc-pc/issues/2730 + assert_not_own_property(encoding, "maxBitrate"); + assert_not_own_property(encoding, "rid"); + assert_equals(encoding.scaleResolutionDownBy, undefined); + // We do not check props from extension specifications here; those checks + // need to go in a test-case for that extension specification. + }, 'addTransceiver(video) with undefined sendEncodings should have default encoding parameter with active set to true and scaleResolutionDownBy set to 1'); promise_test(async t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); const transceiver = pc.addTransceiver('audio', { sendEncodings: [] }); - await doOfferAnswerExchange(t, pc); const param = transceiver.sender.getParameters(); - validateSenderRtpParameters(param); const { encodings } = param; - const encoding = getFirstEncoding(param); + assert_equals(encodings.length, 1); + const encoding = param.encodings[0]; assert_equals(encoding.active, true); - }, 'addTransceiver() with empty list sendEncodings should have default encoding parameter with active set to true'); + assert_not_own_property(encoding, "maxBitrate"); + assert_not_own_property(encoding, "rid"); + assert_not_own_property(encoding, "scaleResolutionDownBy"); + // We do not check props from extension specifications here; those checks + // need to go in a test-case for that extension specification. + }, 'addTransceiver(audio) with empty list sendEncodings should have default encoding parameter with active set to true'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video', { sendEncodings: [] }); + + const param = transceiver.sender.getParameters(); + const { encodings } = param; + assert_equals(encodings.length, 1); + const encoding = param.encodings[0]; + + assert_equals(encoding.active, true); + assert_not_own_property(encoding, "maxBitrate"); + assert_not_own_property(encoding, "rid"); + assert_equals(encoding.scaleResolutionDownBy, undefined); + // We do not check props from extension specifications here; those checks + // need to go in a test-case for that extension specification. + }, 'addTransceiver(video) with empty list sendEncodings should have default encoding parameter with active set to true and scaleResolutionDownBy set to 1'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video', {sendEncodings: [{rid: "foo"}, {rid: "bar", scaleResolutionDownBy: 3.0}]}); + + const param = transceiver.sender.getParameters(); + const { encodings } = param; + assert_equals(encodings.length, 2); + assert_equals(encodings[0].scaleResolutionDownBy, undefined); + assert_equals(encodings[1].scaleResolutionDownBy, 3.0); + }, `addTransceiver(video) should auto-set scaleResolutionDownBy to 1 when some encodings have it, but not all`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video', {sendEncodings: [{rid: "foo"}, {rid: "bar"}]}); + + const param = transceiver.sender.getParameters(); + const { encodings } = param; + assert_equals(encodings.length, 2); + assert_equals(encodings[0].scaleResolutionDownBy, undefined); + assert_equals(encodings[1].scaleResolutionDownBy, undefined); + }, `addTransceiver should auto-set scaleResolutionDownBy to powers of 2 (descending) when absent`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const sendEncodings = []; + for (let i = 0; i < 1000; i++) { + sendEncodings.push({rid: i}); + } + const transceiver = pc.addTransceiver('video', {sendEncodings}); + + const param = transceiver.sender.getParameters(); + const { encodings } = param; + assert_less_than(encodings.length, 1000, `1000 encodings is clearly too many`); + }, `addTransceiver with a ridiculous number of encodings should truncate the list`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('audio', {sendEncodings: [{rid: "foo"}, {rid: "bar"}]}); + + const param = transceiver.sender.getParameters(); + const { encodings } = param; + assert_equals(encodings.length, 1); + assert_not_own_property(encodings[0], "maxBitrate"); + assert_not_own_property(encodings[0], "rid"); + assert_not_own_property(encodings[0], "scaleResolutionDownBy"); + // We do not check props from extension specifications here; those checks + // need to go in a test-case for that extension specification. + }, `addTransceiver(audio) with multiple encodings should result in one encoding with no properties other than active`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const {sender} = pc.addTransceiver('audio', {sendEncodings: [{rid: "foo", scaleResolutionDownBy: 2.0}]}); + const {encodings} = sender.getParameters(); + assert_equals(encodings.length, 1); + assert_not_own_property(encodings[0], "scaleResolutionDownBy"); + }, `addTransceiver(audio) should remove valid scaleResolutionDownBy`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const {sender} = pc.addTransceiver('audio', {sendEncodings: [{rid: "foo", scaleResolutionDownBy: -1.0}]}); + const {encodings} = sender.getParameters(); + assert_equals(encodings.length, 1); + assert_not_own_property(encodings[0], "scaleResolutionDownBy"); + }, `addTransceiver(audio) should remove invalid scaleResolutionDownBy`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const {sender} = pc.addTransceiver('audio'); + let params = sender.getParameters(); + assert_equals(params.encodings.length, 1); + params.encodings[0].scaleResolutionDownBy = 2; + await sender.setParameters(params); + const {encodings} = sender.getParameters(); + assert_equals(encodings.length, 1); + assert_not_own_property(encodings[0], "scaleResolutionDownBy"); + }, `setParameters with scaleResolutionDownBy on an audio sender should succeed, but remove the scaleResolutionDownBy`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const {sender} = pc.addTransceiver('audio'); + let params = sender.getParameters(); + assert_equals(params.encodings.length, 1); + params.encodings[0].scaleResolutionDownBy = -1; + await sender.setParameters(params); + const {encodings} = sender.getParameters(); + assert_equals(encodings.length, 1); + assert_not_own_property(encodings[0], "scaleResolutionDownBy"); + }, `setParameters with an invalid scaleResolutionDownBy on an audio sender should succeed, but remove the scaleResolutionDownBy`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + assert_throws_js(TypeError, () => pc.addTransceiver('video', { sendEncodings: [{rid: "foo"}, {rid: "foo"}] })); + }, 'addTransceiver with duplicate rid and multiple encodings throws TypeError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + assert_throws_js(TypeError, () => pc.addTransceiver('video', { sendEncodings: [{rid: "foo"}, {}] })); + }, 'addTransceiver with missing rid and multiple encodings throws TypeError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + assert_throws_js(TypeError, () => pc.addTransceiver('video', { sendEncodings: [{rid: ""}] })); + }, 'addTransceiver with empty rid throws TypeError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + assert_throws_js(TypeError, () => pc.addTransceiver('video', { sendEncodings: [{rid: "!?"}] })); + assert_throws_js(TypeError, () => pc.addTransceiver('video', { sendEncodings: [{rid: "(╯°□°)╯︵ ┻━┻"}] })); + // RFC 8851 says '-' and '_' are allowed, but RFC 8852 says they are not. + // RFC 8852 needs to be adhered to, otherwise we can't put the rid in RTP + // https://github.com/w3c/webrtc-pc/issues/2732 + // https://www.rfc-editor.org/errata/eid7132 + assert_throws_js(TypeError, () => pc.addTransceiver('video', { sendEncodings: [{rid: "foo-bar"}] })); + assert_throws_js(TypeError, () => pc.addTransceiver('video', { sendEncodings: [{rid: "foo_bar"}] })); + }, 'addTransceiver with invalid rid characters throws TypeError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + // https://github.com/w3c/webrtc-pc/issues/2732 + assert_throws_js(TypeError, () => pc.addTransceiver('video', { sendEncodings: [{rid: 'a'.repeat(256)}] })); + }, 'addTransceiver with rid longer than 255 characters throws TypeError'); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + + assert_throws_js(RangeError, () => pc.addTransceiver('video', { sendEncodings: [{scaleResolutionDownBy: -1}] })); + assert_throws_js(RangeError, () => pc.addTransceiver('video', { sendEncodings: [{scaleResolutionDownBy: 0}] })); + assert_throws_js(RangeError, () => pc.addTransceiver('video', { sendEncodings: [{scaleResolutionDownBy: 0.5}] })); + }, `addTransceiver with scaleResolutionDownBy < 1 throws RangeError`); /* 5.2. create an RTCRtpSender @@ -123,11 +335,9 @@ rid: 'foo' }] }); - await doOfferAnswerExchange(t, pc); const param = sender.getParameters(); - validateSenderRtpParameters(param); - const encoding = getFirstEncoding(param); + const encoding = param.encodings[0]; assert_equals(encoding.active, false); assert_equals(encoding.maxBitrate, 8); @@ -149,33 +359,64 @@ promise_test(async t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); - const { sender } = pc.addTransceiver('audio'); - await doOfferAnswerExchange(t, pc); + const { sender } = pc.addTransceiver('video'); const param = sender.getParameters(); - validateSenderRtpParameters(param); const { encodings } = param; assert_equals(encodings.length, 1); - // {} is valid RTCRtpEncodingParameters because all fields are optional - encodings.push({}); + // While {} is valid RTCRtpEncodingParameters because all fields are + // optional, it is still invalid to be missing a rid when there are multiple + // encodings. Only trigger one kind of error here. + encodings.push({ rid: "foo" }); assert_equals(param.encodings.length, 2); return promise_rejects_dom(t, 'InvalidModificationError', sender.setParameters(param)); - }, `sender.setParameters() with mismatch number of encodings should reject with InvalidModificationError`); + }, `sender.setParameters() with added encodings 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 { sender } = pc.addTransceiver('video', {sendEncodings: [{rid: "foo"}, {rid: "bar"}]}); const param = sender.getParameters(); - validateSenderRtpParameters(param); - param.encodings = undefined; + const { encodings } = param; + assert_equals(encodings.length, 2); + + encodings.pop(); + assert_equals(param.encodings.length, 1); + + return promise_rejects_dom(t, 'InvalidModificationError', + sender.setParameters(param)); + }, `sender.setParameters() with removed encodings should reject with InvalidModificationError`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('video', {sendEncodings: [{rid: "foo"}, {rid: "bar"}]}); + + const param = sender.getParameters(); + + const { encodings } = param; + assert_equals(encodings.length, 2); + encodings.push(encodings.shift()); + assert_equals(param.encodings.length, 2); + + return promise_rejects_dom(t, 'InvalidModificationError', + sender.setParameters(param)); + }, `sender.setParameters() with reordered encodings should reject with InvalidModificationError`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('video'); + + const param = sender.getParameters(); + + delete param.encodings; return promise_rejects_js(t, TypeError, sender.setParameters(param)); @@ -187,11 +428,9 @@ const { sender } = pc.addTransceiver('video', { sendEncodings: [{ rid: 'foo' }, { rid: 'baz' }], }); - await doOfferAnswerExchange(t, pc); const param = sender.getParameters(); - validateSenderRtpParameters(param); - const encoding = getFirstEncoding(param); + const encoding = param.encodings[0]; assert_equals(encoding.rid, 'foo'); @@ -209,46 +448,70 @@ promise_test(async t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); - const { sender } = pc.addTransceiver('audio'); - await doOfferAnswerExchange(t, pc); + const { sender } = pc.addTransceiver('video'); const param = sender.getParameters(); - validateSenderRtpParameters(param); - const encoding = getFirstEncoding(param); + const encoding = param.encodings[0]; encoding.scaleResolutionDownBy = 0.5; - return promise_rejects_js(t, RangeError, - sender.setParameters(param)); + return promise_rejects_js(t, RangeError, sender.setParameters(param)); + encoding.scaleResolutionDownBy = 0; + return promise_rejects_js(t, RangeError, sender.setParameters(param)); + encoding.scaleResolutionDownBy = -1; + return promise_rejects_js(t, RangeError, sender.setParameters(param)); }, `setParameters() with encoding.scaleResolutionDownBy field set to less than 1.0 should reject with RangeError`); promise_test(async t => { const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); const { sender } = pc.addTransceiver('video'); - await doOfferAnswerExchange(t, pc); + + let param = sender.getParameters(); + const encoding = param.encodings[0]; + + delete encoding.scaleResolutionDownBy; + await sender.setParameters(param); + param = sender.getParameters(); + assert_equals(param.encodings[0].scaleResolutionDownBy, undefined); + }, `setParameters() with missing encoding.scaleResolutionDownBy field should succeed, and set the value back to 1`); + + promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const { sender } = pc.addTransceiver('video'); const param = sender.getParameters(); - validateSenderRtpParameters(param); - const encoding = getFirstEncoding(param); + const encoding = param.encodings[0]; encoding.scaleResolutionDownBy = 1.5; return sender.setParameters(param) .then(() => { const param = sender.getParameters(); - validateSenderRtpParameters(param); - const encoding = getFirstEncoding(param); + const encoding = param.encodings[0]; assert_approx_equals(encoding.scaleResolutionDownBy, 1.5, 0.01); }); }, `setParameters() with encoding.scaleResolutionDownBy field set to greater than 1.0 should succeed`); + test_modified_encoding('video', 'active', false, true, + 'setParameters() with encoding.active false->true should succeed (video)'); + + test_modified_encoding('video', 'active', true, false, + 'setParameters() with encoding.active true->false should succeed (video)'); + + test_modified_encoding('video', 'maxBitrate', 10000, 20000, + 'setParameters() with modified encoding.maxBitrate should succeed (video)'); + test_modified_encoding('audio', 'active', false, true, - 'setParameters() with modified encoding.active should succeed'); + 'setParameters() with encoding.active false->true should succeed (audio)'); + + test_modified_encoding('audio', 'active', true, false, + 'setParameters() with encoding.active true->false should succeed (audio)'); test_modified_encoding('audio', 'maxBitrate', 10000, 20000, - 'setParameters() with modified encoding.maxBitrate should succeed'); + 'setParameters() with modified encoding.maxBitrate should succeed (audio)'); test_modified_encoding('video', 'scaleResolutionDownBy', 2, 4, 'setParameters() with modified encoding.scaleResolutionDownBy should succeed'); - + \ No newline at end of file