diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 09:22:09 +0000 |
commit | 43a97878ce14b72f0981164f87f2e35e14151312 (patch) | |
tree | 620249daf56c0258faa40cbdcf9cfba06de2a846 /testing/web-platform/tests/webrtc/RTCConfiguration-iceTransportPolicy.html | |
parent | Initial commit. (diff) | |
download | firefox-upstream.tar.xz firefox-upstream.zip |
Adding upstream version 110.0.1.upstream/110.0.1upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webrtc/RTCConfiguration-iceTransportPolicy.html')
-rw-r--r-- | testing/web-platform/tests/webrtc/RTCConfiguration-iceTransportPolicy.html | 306 |
1 files changed, 306 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCConfiguration-iceTransportPolicy.html b/testing/web-platform/tests/webrtc/RTCConfiguration-iceTransportPolicy.html new file mode 100644 index 0000000000..ebc79048a3 --- /dev/null +++ b/testing/web-platform/tests/webrtc/RTCConfiguration-iceTransportPolicy.html @@ -0,0 +1,306 @@ +<!doctype html> +<meta name="timeout" content="long"> +<title>RTCConfiguration iceTransportPolicy</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="RTCConfiguration-helper.js"></script> +<script src="RTCPeerConnection-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 function is called from RTCConfiguration-helper.js: + // config_test + + /* + [Constructor(optional RTCConfiguration configuration)] + interface RTCPeerConnection : EventTarget { + RTCConfiguration getConfiguration(); + void setConfiguration(RTCConfiguration configuration); + ... + }; + + dictionary RTCConfiguration { + sequence<RTCIceServer> iceServers; + RTCIceTransportPolicy iceTransportPolicy = "all"; + }; + + enum RTCIceTransportPolicy { + "relay", + "all" + }; + */ + + test(() => { + const pc = new RTCPeerConnection(); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + }, `new RTCPeerConnection() should have default iceTransportPolicy all`); + + test(() => { + const pc = new RTCPeerConnection({ iceTransportPolicy: undefined }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + }, `new RTCPeerConnection({ iceTransportPolicy: undefined }) should have default iceTransportPolicy all`); + + test(() => { + const pc = new RTCPeerConnection({ iceTransportPolicy: 'all' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + }, `new RTCPeerConnection({ iceTransportPolicy: 'all' }) should succeed`); + + test(() => { + const pc = new RTCPeerConnection({ iceTransportPolicy: 'relay' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'relay'); + }, `new RTCPeerConnection({ iceTransportPolicy: 'relay' }) should succeed`); + + /* + 4.3.2. Set a configuration + 8. Set the ICE Agent's ICE transports setting to the value of + configuration.iceTransportPolicy. As defined in [JSEP] (section 4.1.16.), + if the new ICE transports setting changes the existing setting, no action + will be taken until the next gathering phase. If a script wants this to + happen immediately, it should do an ICE restart. + */ + test(() => { + const pc = new RTCPeerConnection({ iceTransportPolicy: 'all' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + + pc.setConfiguration({ iceTransportPolicy: 'relay' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'relay'); + }, `setConfiguration({ iceTransportPolicy: 'relay' }) with initial iceTransportPolicy all should succeed`); + + test(() => { + const pc = new RTCPeerConnection({ iceTransportPolicy: 'relay' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'relay'); + + pc.setConfiguration({ iceTransportPolicy: 'all' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + }, `setConfiguration({ iceTransportPolicy: 'all' }) with initial iceTransportPolicy relay should succeed`); + + test(() => { + const pc = new RTCPeerConnection({ iceTransportPolicy: 'relay' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'relay'); + + // default value for iceTransportPolicy is all + pc.setConfiguration({}); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + }, `setConfiguration({}) with initial iceTransportPolicy relay should set new value to all`); + + config_test(makePc => { + assert_throws_js(TypeError, () => + makePc({ iceTransportPolicy: 'invalid' })); + }, `with invalid iceTransportPolicy should throw TypeError`); + + // "none" is in Blink and Gecko's IDL, but not in the spec. + config_test(makePc => { + assert_throws_js(TypeError, () => + makePc({ iceTransportPolicy: 'none' })); + }, `with none iceTransportPolicy should throw TypeError`); + + config_test(makePc => { + assert_throws_js(TypeError, () => + makePc({ iceTransportPolicy: null })); + }, `with null iceTransportPolicy should throw TypeError`); + + // iceTransportPolicy is called iceTransports in Blink. + test(() => { + const pc = new RTCPeerConnection({ iceTransports: 'relay' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + }, `new RTCPeerConnection({ iceTransports: 'relay' }) should have no effect`); + + test(() => { + const pc = new RTCPeerConnection({ iceTransports: 'invalid' }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + }, `new RTCPeerConnection({ iceTransports: 'invalid' }) should have no effect`); + + test(() => { + const pc = new RTCPeerConnection({ iceTransports: null }); + assert_equals(pc.getConfiguration().iceTransportPolicy, 'all'); + }, `new RTCPeerConnection({ iceTransports: null }) should have no effect`); + + const getLines = (sdp, startsWith) => + sdp.split('\r\n').filter(l => l.startsWith(startsWith)); + + const getUfrags = ({sdp}) => getLines(sdp, 'a=ice-ufrag:'); + + promise_test(async t => { + const offerer = new RTCPeerConnection({iceTransportPolicy: 'relay'}); + t.add_cleanup(() => offerer.close()); + + offerer.addEventListener('icecandidate', + e => assert_equals(e.candidate, null, 'Should get no ICE candidates')); + + offerer.addTransceiver('audio'); + await offerer.setLocalDescription(); + + await waitForIceGatheringState(offerer, ['complete']); + }, `iceTransportPolicy "relay" on offerer should prevent candidate gathering`); + + promise_test(async t => { + const offerer = new RTCPeerConnection(); + const answerer = new RTCPeerConnection({iceTransportPolicy: 'relay'}); + t.add_cleanup(() => offerer.close()); + t.add_cleanup(() => answerer.close()); + + answerer.addEventListener('icecandidate', + e => assert_equals(e.candidate, null, 'Should get no ICE candidates')); + + offerer.addTransceiver('audio'); + const offer = await offerer.createOffer(); + await answerer.setRemoteDescription(offer); + await answerer.setLocalDescription(await answerer.createAnswer()); + await waitForIceGatheringState(answerer, ['complete']); + }, `iceTransportPolicy "relay" on answerer should prevent candidate gathering`); + + promise_test(async t => { + const offerer = new RTCPeerConnection(); + const answerer = new RTCPeerConnection(); + t.add_cleanup(() => offerer.close()); + t.add_cleanup(() => answerer.close()); + + offerer.addTransceiver('audio'); + + exchangeIceCandidates(offerer, answerer); + + await Promise.all([ + exchangeOfferAnswer(offerer, answerer), + listenToIceConnected(offerer), + listenToIceConnected(answerer), + waitForIceGatheringState(offerer, ['complete']), + waitForIceGatheringState(answerer, ['complete']) + ]); + + const [oldUfrag] = getUfrags(offerer.localDescription); + + offerer.setConfiguration({iceTransportPolicy: 'relay'}); + + offerer.addEventListener('icecandidate', + e => assert_equals(e.candidate, null, 'Should get no ICE candidates')); + + await Promise.all([ + exchangeOfferAnswer(offerer, answerer), + waitForIceStateChange(offerer, ['failed']), + waitForIceStateChange(answerer, ['failed']), + waitForIceGatheringState(offerer, ['complete']), + waitForIceGatheringState(answerer, ['complete']) + ]); + + const [newUfrag] = getUfrags(offerer.localDescription); + assert_not_equals(oldUfrag, newUfrag, + 'Changing iceTransportPolicy should prompt an ICE restart'); + }, `Changing iceTransportPolicy from "all" to "relay" causes an ICE restart which should fail, with no new candidates`); + + promise_test(async t => { + const offerer = new RTCPeerConnection({iceTransportPolicy: 'relay'}); + const answerer = new RTCPeerConnection(); + t.add_cleanup(() => offerer.close()); + t.add_cleanup(() => answerer.close()); + + offerer.addTransceiver('audio'); + + exchangeIceCandidates(offerer, answerer); + + const checkNoCandidate = + e => assert_equals(e.candidate, null, 'Should get no ICE candidates'); + + offerer.addEventListener('icecandidate', checkNoCandidate); + + await Promise.all([ + exchangeOfferAnswer(offerer, answerer), + waitForIceStateChange(offerer, ['failed']), + waitForIceStateChange(answerer, ['failed']), + waitForIceGatheringState(offerer, ['complete']), + waitForIceGatheringState(answerer, ['complete']) + ]); + + const [oldUfrag] = getUfrags(offerer.localDescription); + + offerer.setConfiguration({iceTransportPolicy: 'all'}); + + offerer.removeEventListener('icecandidate', checkNoCandidate); + + await Promise.all([ + exchangeOfferAnswer(offerer, answerer), + listenToIceConnected(offerer), + listenToIceConnected(answerer), + waitForIceGatheringState(offerer, ['complete']), + waitForIceGatheringState(answerer, ['complete']) + ]); + + const [newUfrag] = getUfrags(offerer.localDescription); + assert_not_equals(oldUfrag, newUfrag, + 'Changing iceTransportPolicy should prompt an ICE restart'); + }, `Changing iceTransportPolicy from "relay" to "all" causes an ICE restart which should succeed`); + + promise_test(async t => { + const offerer = new RTCPeerConnection(); + const answerer = new RTCPeerConnection(); + t.add_cleanup(() => offerer.close()); + t.add_cleanup(() => answerer.close()); + + offerer.addTransceiver('audio'); + + exchangeIceCandidates(offerer, answerer); + + await Promise.all([ + exchangeOfferAnswer(offerer, answerer), + listenToIceConnected(offerer), + listenToIceConnected(answerer), + waitForIceGatheringState(offerer, ['complete']), + waitForIceGatheringState(answerer, ['complete']) + ]); + + const [oldUfrag] = getUfrags(offerer.localDescription); + + offerer.setConfiguration({iceTransportPolicy: 'relay'}); + offerer.setConfiguration({iceTransportPolicy: 'all'}); + + await Promise.all([ + exchangeOfferAnswer(offerer, answerer), + listenToIceConnected(offerer), + listenToIceConnected(answerer), + waitForIceGatheringState(offerer, ['complete']), + waitForIceGatheringState(answerer, ['complete']) + ]); + + const [newUfrag] = getUfrags(offerer.localDescription); + assert_not_equals(oldUfrag, newUfrag, + 'Changing iceTransportPolicy should prompt an ICE restart'); + }, `Changing iceTransportPolicy from "all" to "relay", and back to "all" prompts an ICE restart`); + + promise_test(async t => { + const offerer = new RTCPeerConnection(); + const answerer = new RTCPeerConnection(); + t.add_cleanup(() => offerer.close()); + t.add_cleanup(() => answerer.close()); + + offerer.addTransceiver('audio'); + + exchangeIceCandidates(offerer, answerer); + + await Promise.all([ + exchangeOfferAnswer(offerer, answerer), + listenToIceConnected(offerer), + listenToIceConnected(answerer), + waitForIceGatheringState(offerer, ['complete']), + waitForIceGatheringState(answerer, ['complete']) + ]); + + const [oldUfrag] = getUfrags(answerer.localDescription); + + answerer.setConfiguration({iceTransportPolicy: 'relay'}); + + await Promise.all([ + exchangeOfferAnswer(offerer, answerer), + listenToIceConnected(offerer), + listenToIceConnected(answerer), + waitForIceGatheringState(offerer, ['complete']), + waitForIceGatheringState(answerer, ['complete']) + ]); + + const [newUfrag] = getUfrags(answerer.localDescription); + assert_equals(oldUfrag, newUfrag, + 'Changing iceTransportPolicy on answerer should not effect ufrag'); + }, `Changing iceTransportPolicy from "all" to "relay" on the answerer has no effect on a subsequent offer/answer`); + +</script> |