summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/tests/mochitests/test_peerConnection_gatherWithSetConfiguration.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webrtc/tests/mochitests/test_peerConnection_gatherWithSetConfiguration.html')
-rw-r--r--dom/media/webrtc/tests/mochitests/test_peerConnection_gatherWithSetConfiguration.html450
1 files changed, 450 insertions, 0 deletions
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_gatherWithSetConfiguration.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_gatherWithSetConfiguration.html
new file mode 100644
index 0000000000..6710e628aa
--- /dev/null
+++ b/dom/media/webrtc/tests/mochitests/test_peerConnection_gatherWithSetConfiguration.html
@@ -0,0 +1,450 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="iceTestUtils.js"></script>
+ <script type="application/javascript" src="helpers_from_wpt/sdp.js"></script></head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1253706",
+ title: "Test ICE gathering when setConfiguration is used to change the ICE config"
+ });
+
+ const tests = [
+ async function baselineV4Cases() {
+ await checkSrflx([{urls:[`stun:${turnAddressV4}`]}]);
+ await checkRelayUdp([{urls:[`turn:${turnAddressV4}`], username, credential}]);
+ await checkRelayTcp([{urls:[`turn:${turnAddressV4}?transport=tcp`], username, credential}]);
+ await checkRelayUdpTcp([{urls:[`turn:${turnAddressV4}`, `turn:${turnAddressV4}?transport=tcp`], username, credential}]);
+ await checkNoSrflx();
+ await checkNoRelay();
+ },
+
+ async function addStunServerBeforeOffer() {
+ const pc = new RTCPeerConnection();
+ try {
+ pc.setConfiguration({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ const candidates = await gatherWithTimeout(pc, 32000, `just a stun server`);
+ ok(candidates.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(!candidates.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function addTurnServerBeforeOffer() {
+ const pc = new RTCPeerConnection();
+ try {
+ pc.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}`], username, credential}]});
+ const candidates = await gatherWithTimeout(pc, 32000, `a turn (udp) server`);
+ ok(candidates.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(candidates.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function addTurnTcpServerBeforeOffer() {
+ const pc = new RTCPeerConnection();
+ try {
+ pc.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}?transport=tcp`], username, credential}]});
+ const candidates = await gatherWithTimeout(pc, 32000, `a turn (tcp) server`);
+ ok(!candidates.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(candidates.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function addStunServerAfterOffer() {
+ const pc = new RTCPeerConnection();
+ try {
+ const candidates1 = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates1.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates1.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ await pc.setLocalDescription({type: "rollback"});
+
+ pc.setConfiguration({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ const candidates2 = await gatherWithTimeout(pc, 32000, `just a stun server`);
+ ok(candidates2.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(!candidates2.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function addTurnServerAfterOffer() {
+ const pc = new RTCPeerConnection();
+ try {
+ const candidates1 = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates1.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates1.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ await pc.setLocalDescription({type: "rollback"});
+
+ pc.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}`], username, credential}]});
+ const candidates2 = await gatherWithTimeout(pc, 32000, `a turn (udp) server`);
+ ok(candidates2.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(candidates2.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function addTurnTcpServerAfterOffer() {
+ const pc = new RTCPeerConnection();
+ try {
+ const candidates1 = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates1.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates1.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ await pc.setLocalDescription({type: "rollback"});
+
+ pc.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}?transport=tcp`], username, credential}]});
+ const candidates2 = await gatherWithTimeout(pc, 32000, `a turn (tcp) server`);
+ ok(!candidates2.some(c => c.candidate.includes("srflx")), "Should get no srflx candidates");
+ ok(candidates2.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function removeStunServerBeforeOffer() {
+ const pc = new RTCPeerConnection({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ try {
+ pc.setConfiguration({});
+ const candidates = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function removeTurnServerBeforeOffer() {
+ const pc = new RTCPeerConnection({iceServers: [{urls:[`turn:${turnAddressV4}`], username, credential}]});
+ try {
+ pc.setConfiguration({});
+ const candidates = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function removeTurnTcpServerBeforeOffer() {
+ const pc = new RTCPeerConnection({iceServers: [{urls:[`turn:${turnAddressV4}?transport=tcp`], username, credential}]});
+ try {
+ pc.setConfiguration({});
+ const candidates = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function removeStunServerAfterOffer() {
+ const pc = new RTCPeerConnection({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ try {
+ const candidates1 = await gatherWithTimeout(pc, 32000, `just a stun server`);
+ ok(candidates1.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(!candidates1.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ await pc.setLocalDescription({type: "rollback"});
+
+ pc.setConfiguration({});
+ const candidates2 = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates2.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates2.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function removeTurnServerAfterOffer() {
+ const pc = new RTCPeerConnection({iceServers: [{urls:[`turn:${turnAddressV4}`], username, credential}]});
+ try {
+ const candidates1 = await gatherWithTimeout(pc, 32000, `a turn (udp) server`);
+ ok(candidates1.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(candidates1.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ await pc.setLocalDescription({type: "rollback"});
+
+ pc.setConfiguration({});
+ const candidates2 = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates2.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates2.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function removeTurnTcpServerAfterOffer() {
+ const pc = new RTCPeerConnection({iceServers: [{urls:[`turn:${turnAddressV4}?transport=tcp`], username, credential}]});
+ try {
+ const candidates1 = await gatherWithTimeout(pc, 32000, `a turn (tcp) server`);
+ ok(!candidates1.some(c => c.candidate.includes("srflx")), "Should get no srflx candidates");
+ ok(candidates1.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ await pc.setLocalDescription({type: "rollback"});
+
+ pc.setConfiguration({});
+ const candidates2 = await gatherWithTimeout(pc, 32000, `no ICE servers`);
+ ok(!candidates2.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(!candidates2.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function addStunServerAfterNegotiation() {
+ const offerer = new RTCPeerConnection();
+ const answerer = new RTCPeerConnection({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ try {
+ const candidatePromise = trickleIce(offerer);
+ await connect(offerer, answerer, 32000, `no ICE servers`);
+ const candidates = await candidatePromise;
+ const ufrags = Array.from(new Set(candidates.map(c => c.usernameFragment)));
+ is(ufrags.length, 1, "Should have one ufrag in candidate set");
+
+ offerer.setConfiguration({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ const candidates2 = await gatherWithTimeout(offerer, 32000, `just a stun server`);
+ ok(candidates2.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(!candidates2.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ const ufrags2 = Array.from(new Set(candidates2.map(c => c.usernameFragment)));
+ is(ufrags2.length, 1, "Should have one ufrag in candidate set");
+ isnot(ufrags[0], ufrags2[0], "ufrag should change, because setConfiguration should have triggered an ICE restart");
+ } finally {
+ offerer.close();
+ answerer.close();
+ }
+ },
+
+ async function addTurnServerAfterNegotiation() {
+ const offerer = new RTCPeerConnection();
+ const answerer = new RTCPeerConnection({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ try {
+ const candidatePromise = trickleIce(offerer);
+ await connect(offerer, answerer, 32000, `no ICE servers`);
+ const candidates = await candidatePromise;
+ const ufrags = Array.from(new Set(candidates.map(c => c.usernameFragment)));
+ is(ufrags.length, 1, "Should have one ufrag in candidate set");
+
+ offerer.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}`], username, credential}]});
+ const candidates2 = await gatherWithTimeout(offerer, 32000, `a turn (udp) server`);
+ ok(candidates2.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(candidates2.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ const ufrags2 = Array.from(new Set(candidates2.map(c => c.usernameFragment)));
+ is(ufrags2.length, 1, "Should have one ufrag in candidate set");
+ isnot(ufrags[0], ufrags2[0], "ufrag should change, because setConfiguration should have triggered an ICE restart");
+ } finally {
+ offerer.close();
+ answerer.close();
+ }
+ },
+
+ async function addTurnTcpServerAfterNegotiation() {
+ const offerer = new RTCPeerConnection();
+ const answerer = new RTCPeerConnection({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ try {
+ const candidatePromise = trickleIce(offerer);
+ await connect(offerer, answerer, 32000, `no ICE servers`);
+ const candidates = await candidatePromise;
+ const ufrags = Array.from(new Set(candidates.map(c => c.usernameFragment)));
+ is(ufrags.length, 1, "Should have one ufrag in candidate set");
+
+ offerer.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}?transport=tcp`], username, credential}]});
+ const candidates2 = await gatherWithTimeout(offerer, 32000, `a turn (tcp) server`);
+ ok(!candidates2.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(candidates2.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ const ufrags2 = Array.from(new Set(candidates2.map(c => c.usernameFragment)));
+ is(ufrags2.length, 1, "Should have one ufrag in candidate set");
+ isnot(ufrags[0], ufrags2[0], "ufrag should change, because setConfiguration should have triggered an ICE restart");
+ } finally {
+ offerer.close();
+ answerer.close();
+ }
+ },
+
+ async function addStunServerBeforeCreateAnswer() {
+ const offerer = new RTCPeerConnection();
+ const answerer = new RTCPeerConnection();
+
+ try {
+ await answerer.setRemoteDescription(await offerer.createOffer({offerToReceiveAudio: true}));
+
+ answerer.setConfiguration({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ const candidates = await gatherWithTimeout(answerer, 32000, `just a stun server`);
+ ok(candidates.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(!candidates.some(c => c.candidate.includes("relay")), "Should not get any relay candidates");
+ } finally {
+ offerer.close();
+ answerer.close();
+ }
+ },
+
+ async function addTurnServerBeforeCreateAnswer() {
+ const offerer = new RTCPeerConnection();
+ const answerer = new RTCPeerConnection();
+
+ try {
+ await answerer.setRemoteDescription(await offerer.createOffer({offerToReceiveAudio: true}));
+
+ answerer.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}`], username, credential}]});
+ const candidates = await gatherWithTimeout(answerer, 32000, `a turn (udp) server`);
+ ok(candidates.some(c => c.candidate.includes("srflx")), "Should get at least one srflx candidate");
+ ok(candidates.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ } finally {
+ offerer.close();
+ answerer.close();
+ }
+ },
+
+ async function addTurnTcpServerBeforeCreateAnswer() {
+ const offerer = new RTCPeerConnection();
+ const answerer = new RTCPeerConnection();
+
+ try {
+ await answerer.setRemoteDescription(await offerer.createOffer({offerToReceiveAudio: true}));
+
+ answerer.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}?transport=tcp`], username, credential}]});
+ const candidates = await gatherWithTimeout(answerer, 32000, `a turn (tcp) server`);
+ ok(!candidates.some(c => c.candidate.includes("srflx")), "Should not get any srflx candidates");
+ ok(candidates.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ } finally {
+ offerer.close();
+ answerer.close();
+ }
+ },
+
+ async function relayPolicyPreventsSrflx() {
+ const pc = new RTCPeerConnection();
+ try {
+ pc.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}`], username, credential}], iceTransportPolicy: "relay"});
+ const candidates = await gatherWithTimeout(pc, 32000, `a turn (udp) server`);
+ ok(!candidates.some(c => c.candidate.includes("srflx")), "Should not get a srflx candidate");
+ ok(candidates.some(c => c.candidate.includes("relay")), "Should get at least one relay candidate");
+ } finally {
+ pc.close();
+ }
+ },
+
+ async function addOffererStunServerAllowsIceToConnect() {
+ const offerer = new RTCPeerConnection();
+ const answerer = new RTCPeerConnection();
+
+ try {
+ try {
+ // Both ends are behind a simulated endpoint-independent NAT, which
+ // requires at least one side to have a srflx candidate to work.
+ await connect(offerer, answerer, 2000, `no ICE servers`);
+ ok(false, "ICE should either have failed, or timed out!");
+ } catch (e) {
+ if (!(e instanceof Error)) throw e;
+ ok(true, "ICE should either have failed, or timed out!");
+ }
+
+ offerer.setConfiguration({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ await connect(offerer, answerer, 32000, `just a STUN server`);
+ } finally {
+ offerer.close();
+ answerer.close();
+ }
+ },
+
+ async function addAnswererStunServerDoesNotAllowIceToConnect() {
+ const offerer = new RTCPeerConnection();
+ const answerer = new RTCPeerConnection();
+
+ try {
+ try {
+ // Both ends are behind a simulated endpoint-independent NAT, which
+ // requires at least one side to have a srflx candidate to work.
+ await connect(offerer, answerer, 2000, `no ICE servers`);
+ ok(false, "ICE should either have failed, or timed out!");
+ } catch (e) {
+ if (!(e instanceof Error)) throw e;
+ ok(true, "ICE should either have failed, or timed out!");
+ }
+
+ // This _won't_ help, because the answerer does not get to decide to
+ // trigger an ICE restart.
+ answerer.setConfiguration({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ try {
+ await connectNoTrickleWait(offerer, answerer, 2000, `no ICE servers`);
+ ok(false, "ICE should either have failed, or timed out!");
+ } catch (e) {
+ if (!(e instanceof Error)) throw e;
+ ok(true, "ICE should either have failed, or timed out!");
+ }
+ } finally {
+ offerer.close();
+ answerer.close();
+ }
+ },
+
+ async function addOffererTurnServerAllowsIceToConnect() {
+ await pushPrefs(
+ ['media.peerconnection.nat_simulator.filtering_type', 'PORT_DEPENDENT'],
+ ['media.peerconnection.nat_simulator.mapping_type', 'PORT_DEPENDENT']);
+
+ const offerer = new RTCPeerConnection({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+ const answerer = new RTCPeerConnection({iceServers: [{urls:[`stun:${turnAddressV4}`]}]});
+
+ try {
+ try {
+ // Both ends are behind a simulated port-dependent NAT, which
+ // requires at least one side to have a relay candidate to work.
+ await connect(offerer, answerer, 2000, `just a STUN server`);
+ ok(false, "ICE should either have failed, or timed out!");
+ } catch (e) {
+ if (!(e instanceof Error)) throw e;
+ ok(true, "ICE should either have failed, or timed out!");
+ }
+
+ offerer.setConfiguration({iceServers: [{urls:[`turn:${turnAddressV4}`], username, credential}]});
+ await connect(offerer, answerer, 32000, `a TURN (udp) server`);
+ } finally {
+ offerer.close();
+ answerer.close();
+ await SpecialPowers.popPrefEnv();
+ }
+ },
+
+ ];
+
+ runNetworkTest(async () => {
+ const turnServer = iceServersArray.find(server => "username" in server);
+ username = turnServer.username;
+ credential = turnServer.credential;
+ // Just use the first url. It might make sense to look for TURNS first,
+ // since that will always use a hostname, but on CI we don't have TURNS
+ // support anyway (see bug 1323439).
+ const turnHostname = getTurnHostname(turnServer.urls[0]);
+ turnAddressV4 = await dnsLookupV4(turnHostname);
+
+ await pushPrefs(
+ ['media.peerconnection.ice.obfuscate_host_addresses', false],
+ ['media.peerconnection.nat_simulator.filtering_type', 'ENDPOINT_INDEPENDENT'],
+ ['media.peerconnection.nat_simulator.mapping_type', 'ENDPOINT_INDEPENDENT'],
+ ['media.peerconnection.ice.loopback', true],
+ ['media.getusermedia.insecure.enabled', true]);
+
+ for (const test of tests) {
+ info(`Running test: ${test.name}`);
+ try {
+ await test();
+ } catch (e) {
+ ok(false, `Caught ${e.name}: ${e.message} ${e.stack}`);
+ }
+ info(`Done running test: ${test.name}`);
+ // Make sure we don't build up a pile of GC work, and also get PCImpl to
+ // print their timecards.
+ await new Promise(r => SpecialPowers.exactGC(r));
+ }
+
+ await SpecialPowers.popPrefEnv();
+ }, { useIceServer: true });
+</script>
+</pre>
+</body>
+</html>