diff options
Diffstat (limited to 'testing/web-platform/tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html')
-rw-r--r-- | testing/web-platform/tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html | 219 |
1 files changed, 219 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html b/testing/web-platform/tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html new file mode 100644 index 0000000000..e823bd830c --- /dev/null +++ b/testing/web-platform/tests/webrtc-extensions/RTCRtpTransceiver-headerExtensionControl.html @@ -0,0 +1,219 @@ +<!doctype html> +<meta charset=utf-8> +<title>RTCRtpParameters encodings</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/webrtc/dictionary-helper.js"></script> +<script src="/webrtc/RTCRtpParameters-helper.js"></script> +<script> +'use strict'; + +async function negotiate(pc1, pc2) { + const offer = await pc1.createOffer(); + await pc1.setLocalDescription(offer); + await pc2.setRemoteDescription(offer); + const answer = await pc2.createAnswer(); + await pc2.setLocalDescription(answer); + await pc1.setRemoteDescription(answer); +} + +test(function(t) { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video'); + const capabilities = transceiver.headerExtensionsToOffer; + let capability = capabilities.find((capability) => { + return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid" && + capability.direction != "stopped"; + }); + assert_not_equals(capability, undefined); + capability = capabilities.find((capability) => { + return capability.uri == "urn:3gpp:video-orientation" && + capability.direction != "stopped"; + }); + assert_not_equals(capability, undefined); +}, `the video transceiver.headerExtensionsToOffer() includes mandatory extensions`); + +test(function(t) { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('audio'); + const capabilities = transceiver.headerExtensionsToOffer; + let capability = capabilities.find((capability) => { + return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid" && + capability.direction != "stopped"; + }); + assert_not_equals(capability, undefined); +}, `the audio transceiver.headerExtensionsToOffer() includes mandatory extensions`); + +test(function(t) { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('audio'); + const capabilities = transceiver.headerExtensionsToOffer; + capabilities[0].uri = ""; + assert_throws_js(TypeError, () => { + transceiver.setOfferedRtpHeaderExtensions(capabilities); + }, 'transceiver should throw TypeError when setting an empty URI'); +}, `setOfferedRtpHeaderExtensions throws TypeError on encountering missing URI`); + +test(function(t) { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('audio'); + const capabilities = transceiver.headerExtensionsToOffer; + capabilities[0].uri = "4711"; + assert_throws_dom("NotSupportedError", () => { + transceiver.setOfferedRtpHeaderExtensions(capabilities); + }, 'transceiver should throw NotSupported when setting an unknown URI'); +}, `setOfferedRtpHeaderExtensions throws NotSupported on encountering unknown URI`); + +test(function(t) { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('audio'); + const capabilities = transceiver.headerExtensionsToOffer; + let capability = capabilities.find((capability) => { + return capability.uri == "urn:ietf:params:rtp-hdrext:sdes:mid"; + }); + ["sendonly", "recvonly", "inactive", "stopped"].map(direction => { + capability.direction = direction; + assert_throws_dom("InvalidModificationError", () => { + transceiver.setOfferedRtpHeaderExtensions(capabilities); + }, `transceiver should throw InvalidModificationError when setting a mandatory header extension\'s direction to ${direction}`); + }); +}, `setOfferedRtpHeaderExtensions throws InvalidModificationError when setting a mandatory header extension\'s direction to something else than "sendrecv"`); + +test(function(t) { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('audio'); + let capabilities = transceiver.headerExtensionsToOffer; + let selected_capability = capabilities.find((capability) => { + return capability.direction == "sendrecv" && + capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid"; + }); + selected_capability.direction = "stopped"; + const offered_capabilities = transceiver.headerExtensionsToOffer; + let altered_capability = capabilities.find((capability) => { + return capability.uri == selected_capability.uri && + capability.direction == "stopped"; + }); + assert_not_equals(altered_capability, undefined); +}, `modified direction set by setOfferedRtpHeaderExtensions is visible in headerExtensionsOffered`); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video'); + const capabilities = transceiver.headerExtensionsToOffer; + const offer = await pc.createOffer(); + const extmaps = offer + .sdp + .split("\n") + .filter(line => { return line.includes("a=extmap"); }) + .join("\n"); + for (const capability of capabilities) { + if (capability.direction == "stopped") { + assert_false(extmaps.includes(capability.uri)); + } else { + assert_true(extmaps.includes(capability.uri)); + } + } +}, `unstopped extensions turn up in offer`); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + const transceiver = pc.addTransceiver('video'); + const capabilities = transceiver.headerExtensionsToOffer; + const selected_capability = capabilities.find((capability) => { + return capability.direction == "sendrecv" && + capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid" && + capability.uri != "urn:3gpp:video-orientation"; + }); + selected_capability.direction = "stopped"; + transceiver.setOfferedRtpHeaderExtensions(capabilities); + const offer = await pc.createOffer(); + const extmaps = offer + .sdp + .split("\n") + .filter(line => { return line.includes("a=extmap"); }) + .join("\n"); + for (const capability of capabilities) { + if (capability.direction == "stopped") { + assert_false(extmaps.includes(capability.uri)); + } else { + assert_true(extmaps.includes(capability.uri)); + } + } +}, `stopped extensions do not turn up in offers`); + +promise_test(async t => { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + + // Disable a non-mandatory extension before first negotiation. + const transceiver = pc1.addTransceiver('video'); + const capabilities = transceiver.headerExtensionsToOffer; + const selected_capability = capabilities.find((capability) => { + return capability.direction == "sendrecv" && + capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid" && + capability.uri != "urn:3gpp:video-orientation"; + }); + selected_capability.direction = "stopped"; + transceiver.setOfferedRtpHeaderExtensions(capabilities); + + await negotiate(pc1, pc2); + const negotiated_capabilites = transceiver.headerExtensionsNegotiated; + + // Attempt enabling the extension. + selected_capability.direction = "sendrecv"; + + // The enabled extension should not be part of the negotiated set. + transceiver.setOfferedRtpHeaderExtensions(capabilities); + await negotiate(pc1, pc2); + assert_not_equals( + transceiver.headerExtensionsNegotiated.find(capability => { + return capability.uri == selected_capability.uri && + capability.direction == "sendrecv"; + }), undefined); +}, `the set of negotiated extensions grows with subsequent offers`); + +promise_test(async t => { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + + // Disable a non-mandatory extension before first negotiation. + const transceiver = pc1.addTransceiver('video'); + const capabilities = transceiver.headerExtensionsToOffer; + const selected_capability = capabilities.find((capability) => { + return capability.direction == "sendrecv" && + capability.uri != "urn:ietf:params:rtp-hdrext:sdes:mid" && + capability.uri != "urn:3gpp:video-orientation"; + }); + selected_capability.direction = "stopped"; + transceiver.setOfferedRtpHeaderExtensions(capabilities); + + await negotiate(pc1, pc2); + const negotiated_capabilites = transceiver.headerExtensionsNegotiated; + + for (const capability of negotiated_capabilites) { + assert_not_equals(capabilities.find((cap) => { + return cap.uri == capability.uri && cap.direction != "stopped"; + }), undefined); + } + for (const capability of capabilities) { + if (capability.direction != "stopped") { + assert_not_equals(negotiated_capabilites.find((cap) => { + return cap.uri == capability.uri; + }), undefined); + } + } +}, `the set of negotiated extensions is the set of unstopped extensions`); + +</script> |