From a142f6a21fbcab4a7c68c57dc80c8dacd8852219 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Tue, 6 Feb 2018 18:23:19 +0800 Subject: [PATCH 01/20] Decouple dependencies for RTCIceTransport tests --- webrtc/RTCIceTransport-helper.js | 96 +++++++++++++++++++ webrtc/RTCIceTransport.html | 157 ++++++++++++++----------------- 2 files changed, 168 insertions(+), 85 deletions(-) create mode 100644 webrtc/RTCIceTransport-helper.js diff --git a/webrtc/RTCIceTransport-helper.js b/webrtc/RTCIceTransport-helper.js new file mode 100644 index 00000000000000..9fa169ec209901 --- /dev/null +++ b/webrtc/RTCIceTransport-helper.js @@ -0,0 +1,96 @@ +'use strict' + +function getIceTransportFromDtls(dtlsTransport) { + assert_true(dtlsTransport instanceof RTCDtlsTransport, + 'Expect sctp.transport to be an RTCDtlsTransport'); + + const iceTransport = dtlsTransport.transport; + assert_true(iceTransport instanceof RTCIceTransport, + 'Expect dtlsTransport.transport to be an RTCIceTransport'); + + return iceTransport; +} + +function getIceTransportFromSctp(pc) { + const sctpTransport = pc.sctp; + assert_true(sctpTransport instanceof RTCSctpTransport, + 'Expect pc.sctp to be instantiated from RTCSctpTransport'); + + return getIceTransportFromDtls(sctpTransport.transport) +} + +function getIceTransportsFromSenderReceiver(pc) { + const senders = pc.getSenders() + const receivers = pc.getReceivers() + + assert_greater_than(senders.length, 0, + 'Expect pc to have at least one sender') + + assert_greater_than(receivers.length, 0, + 'Expect pc to have at least one receiver') + + const [sender] = senders; + const [receiver] = receivers; + + const iceTransports = new Set(); + + iceTransports.add(getIceTransportFromDtls(sender.transport)); + iceTransports.add(getIceTransportFromDtls(sender.rtcpTransport)); + iceTransports.add(getIceTransportFromDtls(receiver.transport)); + iceTransports.add(getIceTransportFromDtls(receiver.rtcpTransport)); + + return [...iceTransports]; +} + +function validateCandidates(candidates) { + assert_greater_than(candidates.length, 0, + 'Expect at least one ICE candidate returned from get*Candidates()'); + + for(const candidate of candidates) { + assert_true(candidate instanceof RTCIceCandidate, + 'Expect candidate elements to be instance of RTCIceCandidate'); + } +} + +function validateCandidateParameter(param) { + assert_not_equals(param, null, + 'Expect candidate parameter to be non-null after data channels are connected'); + + assert_equals(typeof param.usernameFragment, 'string', + 'Expect param.usernameFragment to be set with string value'); + + assert_equals(typeof param.password, 'string', + 'Expect param.password to be set with string value'); +} + +function validateConnectedIceTransport(iceTransport) { + const { state, gatheringState, role, component } = iceTransport; + + assert_true(role === 'controlling' || role === 'controlled', + 'Expect RTCIceRole to be either controlling or controlled'); + + assert_true(component === 'rtp' || component === 'rtcp', + 'Expect RTCIceComponent to be either rtp or rtcp'); + + assert_true(state === 'connected' || state === 'completed', + 'Expect ICE transport to be in connected or completed state after data channels are connected'); + + assert_true(gatheringState === 'gathering' || gatheringState === 'completed', + 'Expect ICE transport to be in gathering or completed gatheringState after data channels are connected'); + + validateCandidates(iceTransport.getLocalCandidates()); + validateCandidates(iceTransport.getRemoteCandidates()); + + const candidatePair = iceTransport.getSelectedCandidatePair(); + assert_not_equals(candidatePair, null, + 'Expect selected candidate pair to be non-null after ICE transport is connected'); + + assert_true(candidatePair.local instanceof RTCIceCandidate, + 'Expect candidatePair.local to be instance of RTCIceCandidate'); + + assert_true(candidatePair.remote instanceof RTCIceCandidate, + 'Expect candidatePair.remote to be instance of RTCIceCandidate'); + + validateCandidateParameter(iceTransport.getLocalParameters()); + validateCandidateParameter(iceTransport.getRemoteParameters()); +} diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 6a00e1c59e7183..48913989c5ca8f 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -4,6 +4,7 @@ + From 30f9931bf1bf55f5fad95fdffdb67e8608a58efe Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Wed, 7 Feb 2018 16:20:49 +0800 Subject: [PATCH 02/20] Rewrite ICE and DTLS transport tests with alternative dependencies --- ...TCDtlsTransport-getRemoteCertificates.html | 125 ++++-------- webrtc/RTCIceTransport-helper.js | 96 --------- webrtc/RTCIceTransport.html | 192 ++++++++---------- webrtc/RTCPeerConnection-helper.js | 24 +++ webrtc/RTCTransport-helper.js | 145 +++++++++++++ webrtc/tools/.eslintrc.js | 14 +- 6 files changed, 313 insertions(+), 283 deletions(-) delete mode 100644 webrtc/RTCIceTransport-helper.js create mode 100644 webrtc/RTCTransport-helper.js diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index 0614364e9756ec..62bda1e10066f7 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -4,6 +4,7 @@ + diff --git a/webrtc/RTCIceTransport-helper.js b/webrtc/RTCIceTransport-helper.js deleted file mode 100644 index 9fa169ec209901..00000000000000 --- a/webrtc/RTCIceTransport-helper.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict' - -function getIceTransportFromDtls(dtlsTransport) { - assert_true(dtlsTransport instanceof RTCDtlsTransport, - 'Expect sctp.transport to be an RTCDtlsTransport'); - - const iceTransport = dtlsTransport.transport; - assert_true(iceTransport instanceof RTCIceTransport, - 'Expect dtlsTransport.transport to be an RTCIceTransport'); - - return iceTransport; -} - -function getIceTransportFromSctp(pc) { - const sctpTransport = pc.sctp; - assert_true(sctpTransport instanceof RTCSctpTransport, - 'Expect pc.sctp to be instantiated from RTCSctpTransport'); - - return getIceTransportFromDtls(sctpTransport.transport) -} - -function getIceTransportsFromSenderReceiver(pc) { - const senders = pc.getSenders() - const receivers = pc.getReceivers() - - assert_greater_than(senders.length, 0, - 'Expect pc to have at least one sender') - - assert_greater_than(receivers.length, 0, - 'Expect pc to have at least one receiver') - - const [sender] = senders; - const [receiver] = receivers; - - const iceTransports = new Set(); - - iceTransports.add(getIceTransportFromDtls(sender.transport)); - iceTransports.add(getIceTransportFromDtls(sender.rtcpTransport)); - iceTransports.add(getIceTransportFromDtls(receiver.transport)); - iceTransports.add(getIceTransportFromDtls(receiver.rtcpTransport)); - - return [...iceTransports]; -} - -function validateCandidates(candidates) { - assert_greater_than(candidates.length, 0, - 'Expect at least one ICE candidate returned from get*Candidates()'); - - for(const candidate of candidates) { - assert_true(candidate instanceof RTCIceCandidate, - 'Expect candidate elements to be instance of RTCIceCandidate'); - } -} - -function validateCandidateParameter(param) { - assert_not_equals(param, null, - 'Expect candidate parameter to be non-null after data channels are connected'); - - assert_equals(typeof param.usernameFragment, 'string', - 'Expect param.usernameFragment to be set with string value'); - - assert_equals(typeof param.password, 'string', - 'Expect param.password to be set with string value'); -} - -function validateConnectedIceTransport(iceTransport) { - const { state, gatheringState, role, component } = iceTransport; - - assert_true(role === 'controlling' || role === 'controlled', - 'Expect RTCIceRole to be either controlling or controlled'); - - assert_true(component === 'rtp' || component === 'rtcp', - 'Expect RTCIceComponent to be either rtp or rtcp'); - - assert_true(state === 'connected' || state === 'completed', - 'Expect ICE transport to be in connected or completed state after data channels are connected'); - - assert_true(gatheringState === 'gathering' || gatheringState === 'completed', - 'Expect ICE transport to be in gathering or completed gatheringState after data channels are connected'); - - validateCandidates(iceTransport.getLocalCandidates()); - validateCandidates(iceTransport.getRemoteCandidates()); - - const candidatePair = iceTransport.getSelectedCandidatePair(); - assert_not_equals(candidatePair, null, - 'Expect selected candidate pair to be non-null after ICE transport is connected'); - - assert_true(candidatePair.local instanceof RTCIceCandidate, - 'Expect candidatePair.local to be instance of RTCIceCandidate'); - - assert_true(candidatePair.remote instanceof RTCIceCandidate, - 'Expect candidatePair.remote to be instance of RTCIceCandidate'); - - validateCandidateParameter(iceTransport.getLocalParameters()); - validateCandidateParameter(iceTransport.getRemoteParameters()); -} diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 48913989c5ca8f..c1504d55452bb7 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -4,84 +4,72 @@ - + diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index a5631f886b9a17..9b43b1a285e61e 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -81,85 +81,79 @@ 'Expect selectedCandidatePair to be null'); } - promise_test(t => { + promise_test(async t => { const pc1 = new RTCPeerConnection(); t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - return createIceTransportsFromSctp(pc1, pc2) - .then(([iceTransport1, iceTransport2]) => { - return Promise.all([ - waitConnectingPc(pc1), - waitConnectingPc(pc2) - ]) - .then(() => { - validateConnectedIceTransport(iceTransport1); - validateConnectedIceTransport(iceTransport2); - }); - }); + const [iceTransport1, iceTransport2] = await createIceTransportsFromSctp(pc1, pc2); + + await waitConnectingPc(pc1); + await waitConnectingPc(pc2); + + validateConnectedIceTransport(iceTransport1); + validateConnectedIceTransport(iceTransport2); }, 'SCTP - Connected ICE transports should have relevants attributes set'); - promise_test(t => { + promise_test(async t => { const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + + const [iceTransports1, iceTransports2] = await createIceTransportsFromSenderReceiver(pc1, pc2) + const iceTransports = [...iceTransports1, ...iceTransports2]; - return createIceTransportsFromSenderReceiver(pc1, pc2) - .then(([iceTransports1, iceTransports2]) => { - const iceTransports = [...iceTransports1, ...iceTransports2]; - return Promise.all([ - waitConnectingPc(pc1), - waitConnectingPc(pc2) - ]) - .then(() => { - for (const iceTransport of iceTransports) { - validateConnectedIceTransport(iceTransport); - } - }); - }); + await waitConnectingPc(pc1); + await waitConnectingPc(pc2); + + for (const iceTransport of iceTransports) { + validateConnectedIceTransport(iceTransport); + } }, 'RTP - Connected ICE transports should have relevants attributes set'); - promise_test(t => { + promise_test(async t => { const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); - return getTrackFromUserMedia('audio') - .then(([track, mediaStream]) => { - addTrackOrTransceiver(pc, track, mediaStream); - - // setLocalDescription should initialize sender/receiver.transport - return pc.createOffer() - .then(offer => pc.setLocalDescription(offer)) - .then(() => { - const iceTransports = getIceTransportsFromSenderReceiver(pc); - - for (const iceTransport of iceTransports) { - validateUnconnectedIceTransport(iceTransport); - } - }); - }); + const [track, mediaStream] = await getTrackFromUserMedia('audio') + addTrackOrTransceiver(pc, track, mediaStream); + + // setLocalDescription should initialize sender/receiver.transport + const offer = await pc.createOffer() + await pc.setLocalDescription(offer) + + const iceTransports = getIceTransportsFromSenderReceiver(pc); + + for (const iceTransport of iceTransports) { + validateUnconnectedIceTransport(iceTransport); + } }, 'RTP - Unconnected iceTransport should have empty remote candidates and selected pair'); - promise_test(t => { + promise_test(async t => { const pc1 = new RTCPeerConnection(); t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); + pc1.createDataChannel(''); // pc1.setRemoteDescription(answer) without pc2 setting answer to it's // localDescription. This is because pc1.sctp is only set after setting // answer description. - return pc1.createOffer() - .then(offer => - pc1.setLocalDescription(offer) - .then(() => pc2.setRemoteDescription(offer)) - .then(() => pc2.createAnswer())) - .then(answer => pc1.setRemoteDescription(answer)) - .then(() => { - const iceTransport = getIceTransportFromSctpTransport(pc1.sctp); + const offer = await pc1.createOffer() - validateUnconnectedIceTransport(iceTransport); - }); + await pc1.setLocalDescription(offer) + await pc2.setRemoteDescription(offer) + const answer = await pc2.createAnswer() + await pc1.setRemoteDescription(answer) + + const iceTransport = getIceTransportFromSctpTransport(pc1.sctp); + validateUnconnectedIceTransport(iceTransport); }, 'SCTP - Unconnected iceTransport should have empty remote candidates and selected pair'); diff --git a/webrtc/RTCPeerConnection-helper.js b/webrtc/RTCPeerConnection-helper.js index 302bbafbad7ccc..e28c009c1e4713 100644 --- a/webrtc/RTCPeerConnection-helper.js +++ b/webrtc/RTCPeerConnection-helper.js @@ -476,6 +476,21 @@ async function exchangeOfferAndListenToOntrack(t, caller, callee) { const ontrackPromise = addEventListenerPromise(t, callee, 'track'); await exchangeOffer(caller, callee); return ontrackPromise; +} + +// Feature detect whether we can call add transceiver on the target browser. +// We cannot simply test if the addTransceiver method exist, as Chrome +// for example would have it implemented but only usable in unified plan, +// which means it would fail the tests when using default peer connection config +function canAddTransceiver() { + const pc = new RTCPeerConnection(); + try { + pc.addTransceiver('audio'); + return true; + } catch (err) { + return false; + } +} // A dependency agnostic way of adding track depending // on the supported method on a browser. Uses addTransceiver(track) @@ -483,7 +498,7 @@ async function exchangeOfferAndListenToOntrack(t, caller, callee) { // or falls back to the legacy addStream method (which has been removed // from the spec). function addTrackOrTransceiver(pc, track, mediaStream) { - if (typeof pc.addTransceiver === 'function') { + if (canAddTransceiver()) { return pc.addTransceiver(track); } else if (typeof pc.addTrack === 'function') { // Note: The mediaStream argument is optional in the spec, but we require @@ -542,8 +557,9 @@ async function createTrackAndStreamWithCleanup(t, kind = 'audio') { function findTransceiverForSender(pc, sender) { const transceivers = pc.getTransceivers(); for (let i = 0; i < transceivers.length; ++i) { - if (transceivers[i].sender == sender) + if (transceivers[i].sender == sender) { return transceivers[i]; + } } return null; } diff --git a/webrtc/RTCTransport-helper.js b/webrtc/RTCTransport-helper.js index a230e25e86f9a1..0f64291a65067c 100644 --- a/webrtc/RTCTransport-helper.js +++ b/webrtc/RTCTransport-helper.js @@ -65,7 +65,7 @@ function getDtlsTransportsFromSenderReceiver(pc) { const dtlsTransportsSet = new Set(); - function adddDtlsTransport(transport) { + function addDtlsTransport(transport) { // Add a dtls transport to the result set, if it is // not null/undefined. Although the spec mandates both // transport and rtcpTransport fields must be set together, @@ -79,13 +79,13 @@ function getDtlsTransportsFromSenderReceiver(pc) { } for (const sender of senders) { - adddDtlsTransport(sender.transport); - adddDtlsTransport(sender.rtcpTransport); + addDtlsTransport(sender.transport); + addDtlsTransport(sender.rtcpTransport); } for (const receiver of receivers) { - adddDtlsTransport(receiver.transport); - adddDtlsTransport(receiver.rtcpTransport); + addDtlsTransport(receiver.transport); + addDtlsTransport(receiver.rtcpTransport); } const dtlsTransports = [...dtlsTransportsSet]; @@ -129,17 +129,16 @@ function getIceTransportsFromSenderReceiver(pc) { // and connecting two peer connections. Returns an // array of two RTCDtlsTransports, which obtained // from RTCSctpTransport in pc.sctp. -function createDtlsTransportsFromSctp(pc1, pc2) { +async function createDtlsTransportsFromSctp(pc1, pc2) { pc1.createDataChannel(''); exchangeIceCandidates(pc1, pc2); - return doSignalingHandshake(pc1, pc2) - .then(() => { - const dtlsTransport1 = getDtlsTransportFromSctpTransport(pc1.sctp); - const dtlsTransport2 = getDtlsTransportFromSctpTransport(pc2.sctp); + await doSignalingHandshake(pc1, pc2); - return [dtlsTransport1, dtlsTransport2]; - }); + const dtlsTransport1 = getDtlsTransportFromSctpTransport(pc1.sctp); + const dtlsTransport2 = getDtlsTransportFromSctpTransport(pc2.sctp); + + return [dtlsTransport1, dtlsTransport2]; } // Create DTLS transports by adding tracks and connecting @@ -147,38 +146,33 @@ function createDtlsTransportsFromSctp(pc1, pc2) { // RTCDtlsTransports. This is because each peer connection // may have multiple underlying DTLS transports for each // RTP/RTCP sender/receivers. -function createDtlsTransportsFromSenderReceiver(pc1, pc2) { - return getTrackFromUserMedia('audio') - .then(([track, mediaStream]) => { - addTrackOrTransceiver(pc1, track, mediaStream); - exchangeIceCandidates(pc1, pc2); - - return doSignalingHandshake(pc1, pc2) - .then(() => { - const dtlsTransports1 = getDtlsTransportsFromSenderReceiver(pc1); - const dtlsTransports2 = getDtlsTransportsFromSenderReceiver(pc2); - - return [dtlsTransports1, dtlsTransports2]; - }); - }); +async function createDtlsTransportsFromSenderReceiver(pc1, pc2) { + const [track, mediaStream] = await getTrackFromUserMedia('audio') + addTrackOrTransceiver(pc1, track, mediaStream); + exchangeIceCandidates(pc1, pc2); + + await doSignalingHandshake(pc1, pc2); + + const dtlsTransports1 = getDtlsTransportsFromSenderReceiver(pc1); + const dtlsTransports2 = getDtlsTransportsFromSenderReceiver(pc2); + + return [dtlsTransports1, dtlsTransports2]; } -function createIceTransportsFromSctp(pc1, pc2) { - return createDtlsTransportsFromSctp(pc1, pc2) - .then(([dtlsTransport1, dtlsTransport2]) => { - const iceTransport1 = getIceTransportFromDtlsTransport(dtlsTransport1); - const iceTransport2 = getIceTransportFromDtlsTransport(dtlsTransport2); +async function createIceTransportsFromSctp(pc1, pc2) { + const [dtlsTransport1, dtlsTransport2] = await createDtlsTransportsFromSctp(pc1, pc2) - return [iceTransport1, iceTransport2]; - }); + const iceTransport1 = getIceTransportFromDtlsTransport(dtlsTransport1); + const iceTransport2 = getIceTransportFromDtlsTransport(dtlsTransport2); + + return [iceTransport1, iceTransport2]; } -function createIceTransportsFromSenderReceiver(pc1, pc2) { - return createDtlsTransportsFromSenderReceiver(pc1, pc2) - .then(([dtlsTransports1, dtlsTransports2]) => { - const iceTransports1 = getIceTransportsFromDtlsTransports(dtlsTransports1); - const iceTransports2 = getIceTransportsFromDtlsTransports(dtlsTransports2); +async function createIceTransportsFromSenderReceiver(pc1, pc2) { + const [dtlsTransports1, dtlsTransports2] = await createDtlsTransportsFromSenderReceiver(pc1, pc2) - return [iceTransports1, iceTransports2]; - }); + const iceTransports1 = getIceTransportsFromDtlsTransports(dtlsTransports1); + const iceTransports2 = getIceTransportsFromDtlsTransports(dtlsTransports2); + + return [iceTransports1, iceTransports2]; } From ce08934f61f1d220b386355c56c1d66a49468381 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sat, 3 Nov 2018 14:57:59 +0800 Subject: [PATCH 08/20] Fix review feedback --- ...TCDtlsTransport-getRemoteCertificates.html | 55 ++++++++++------ webrtc/RTCIceTransport.html | 46 ++++++++++---- webrtc/RTCPeerConnection-helper.js | 13 ++-- webrtc/RTCTransport-helper.js | 62 ++----------------- webrtc/tools/.eslintrc.js | 14 +++-- webrtc/tools/.gitignore | 1 + 6 files changed, 90 insertions(+), 101 deletions(-) create mode 100644 webrtc/tools/.gitignore diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index 62b9b10f0cf5c0..ab717027c5ad83 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -13,9 +13,9 @@ // doSignalingHandshake // The following helper functions are called from RTCTransport-helper.js: - // waitConnectingPc - // createDtlsTransportsFromSctp - // createDtlsTransportsFromSenderReceiver + // waitForConnectedState + // getDtlsTransportFromSctpTransport + // getDtlsTransportsFromSenderReceiver function validateConnectedDtlsTransport(dtlsTransport) { const certs = dtlsTransport.getRemoteCertificates(); @@ -43,17 +43,31 @@ const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - const [dtlsTransports1, dtlsTransports2] = await createDtlsTransportsFromSenderReceiver(pc1, pc2) - const dtlsTransports = [...dtlsTransports1, ... dtlsTransports2]; + const [track, mediaStream] = await getTrackFromUserMedia('audio') + addTrackOrTransceiver(pc1, track, mediaStream); + exchangeIceCandidates(pc1, pc2); - for (const dtlsTransport of dtlsTransports) { + await doSignalingHandshake(pc1, pc2); + + const dtlsTransports1 = getDtlsTransportsFromSenderReceiver(pc1); + const dtlsTransports2 = getDtlsTransportsFromSenderReceiver(pc2); + + for (const dtlsTransport of dtlsTransports1) { + validateConnectingDtlsTransport(dtlsTransport); + } + + for (const dtlsTransport of dtlsTransports2) { validateConnectingDtlsTransport(dtlsTransport); } - await waitConnectingPc(pc1); - await waitConnectingPc(pc2); + await waitForConnectedState(pc1); + await waitForConnectedState(pc2); + + for (const dtlsTransport of dtlsTransports1) { + validateConnectedDtlsTransport(dtlsTransport); + } - for (const dtlsTransport of dtlsTransports) { + for (const dtlsTransport of dtlsTransports2) { validateConnectedDtlsTransport(dtlsTransport); } }, 'RTP - connected DTLS transports should have valid remote certificates'); @@ -65,17 +79,22 @@ const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - const dtlsTransports = await createDtlsTransportsFromSctp(pc1, pc2) - for (const dtlsTransport of dtlsTransports) { - validateConnectingDtlsTransport(dtlsTransport); - } + pc1.createDataChannel(''); + exchangeIceCandidates(pc1, pc2); - await waitConnectingPc(pc1); - await waitConnectingPc(pc2); + await doSignalingHandshake(pc1, pc2); - for (const dtlsTransport of dtlsTransports) { - validateConnectedDtlsTransport(dtlsTransport); - } + const dtlsTransport1 = getDtlsTransportFromSctpTransport(pc1.sctp); + const dtlsTransport2 = getDtlsTransportFromSctpTransport(pc2.sctp); + + validateConnectingDtlsTransport(dtlsTransport1); + validateConnectingDtlsTransport(dtlsTransport2); + + await waitForConnectedState(pc1); + await waitForConnectedState(pc2); + + validateConnectedDtlsTransport(dtlsTransport1); + validateConnectedDtlsTransport(dtlsTransport2); }, 'SCTP - connected DTLS transports should have valid remote certificates'); diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 9b43b1a285e61e..0d51b8fa741616 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -15,10 +15,12 @@ // addTrackOrTransceiver // The following helper functions are called from RTCTransport-helper.js: - // waitConnectingPc + // waitForConnectedState + // getDtlsTransportFromSctpTransport + // getDtlsTransportsFromSenderReceiver // getIceTransportFromSctpTransport - // getIceTransportsFromSenderReceiver - // createIceTransportsFromSenderReceiver + // getIceTransportFromDtlsTransport + // getIceTransportsFromDtlsTransports function validateIceCandidates(candidates) { assert_greater_than(candidates.length, 0, @@ -88,10 +90,19 @@ const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - const [iceTransport1, iceTransport2] = await createIceTransportsFromSctp(pc1, pc2); + pc1.createDataChannel(''); + exchangeIceCandidates(pc1, pc2); + + await doSignalingHandshake(pc1, pc2); + + const dtlsTransport1 = getDtlsTransportFromSctpTransport(pc1.sctp); + const dtlsTransport2 = getDtlsTransportFromSctpTransport(pc2.sctp); - await waitConnectingPc(pc1); - await waitConnectingPc(pc2); + const iceTransport1 = getIceTransportFromDtlsTransport(dtlsTransport1); + const iceTransport2 = getIceTransportFromDtlsTransport(dtlsTransport2); + + await waitForConnectedState(pc1); + await waitForConnectedState(pc2); validateConnectedIceTransport(iceTransport1); validateConnectedIceTransport(iceTransport2); @@ -104,13 +115,26 @@ const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - const [iceTransports1, iceTransports2] = await createIceTransportsFromSenderReceiver(pc1, pc2) - const iceTransports = [...iceTransports1, ...iceTransports2]; + const [track, mediaStream] = await getTrackFromUserMedia('audio') + addTrackOrTransceiver(pc1, track, mediaStream); + exchangeIceCandidates(pc1, pc2); - await waitConnectingPc(pc1); - await waitConnectingPc(pc2); + await doSignalingHandshake(pc1, pc2); - for (const iceTransport of iceTransports) { + const dtlsTransports1 = getDtlsTransportsFromSenderReceiver(pc1); + const dtlsTransports2 = getDtlsTransportsFromSenderReceiver(pc2); + + const iceTransports1 = getIceTransportsFromDtlsTransports(dtlsTransports1); + const iceTransports2 = getIceTransportsFromDtlsTransports(dtlsTransports2); + + await waitForConnectedState(pc1); + await waitForConnectedState(pc2); + + for (const iceTransport of iceTransports1) { + validateConnectedIceTransport(iceTransport); + } + + for (const iceTransport of iceTransports2) { validateConnectedIceTransport(iceTransport); } }, 'RTP - Connected ICE transports should have relevants attributes set'); diff --git a/webrtc/RTCPeerConnection-helper.js b/webrtc/RTCPeerConnection-helper.js index e28c009c1e4713..721cb9005909ab 100644 --- a/webrtc/RTCPeerConnection-helper.js +++ b/webrtc/RTCPeerConnection-helper.js @@ -492,11 +492,10 @@ function canAddTransceiver() { } } -// A dependency agnostic way of adding track depending -// on the supported method on a browser. Uses addTransceiver(track) -// first if available, otherwise use addTrack(track, mediaStream) -// or falls back to the legacy addStream method (which has been removed -// from the spec). +// A dependency agnostic way to add a track track depending +// on the supported method on a browser. +// - If addTransceiver(track) is usable, use that. +// - If addTrack(track, mediastream) is available, use that. function addTrackOrTransceiver(pc, track, mediaStream) { if (canAddTransceiver()) { return pc.addTransceiver(track); @@ -505,10 +504,6 @@ function addTrackOrTransceiver(pc, track, mediaStream) { // it for now so that we can test older versions of Firefox that only // implements addTrack with compulsory mediaStream argument. return pc.addTrack(track, mediaStream); - } else if (typeof pc.addStream === 'function') { - // FIXME: Remove this case of using addStream once most major browsers - // support addTrack or addTransceiver. - return pc.addStream(mediaStream) } else { throw new Error('This test requires either addTrack or addTransceiver implemented'); } diff --git a/webrtc/RTCTransport-helper.js b/webrtc/RTCTransport-helper.js index 0f64291a65067c..42d11fb487a8a7 100644 --- a/webrtc/RTCTransport-helper.js +++ b/webrtc/RTCTransport-helper.js @@ -16,7 +16,7 @@ // is "connected", all RTCIceTransports and RTCDtlsTransports are in the // "connected", "completed" or "closed" state and at least one of them is in the // "connected" or "completed" state. -function waitConnectingPc(pc) { +function waitForConnectedState(pc) { return new Promise((resolve, reject) => { if (pc.connectionState === 'connected') { resolve(); @@ -56,9 +56,9 @@ function getIceTransportFromSctpTransport(sctpTransport) { } // Get one or more RTCDtlsTransports from RTCRtpSender/Receiver -// in pc. There may be more than one e.g. there are more than one -// senders/receivers or when there are different underlying -// transports for RTP and RTCP. +// in pc.There may be more than one DTLSTransport if there are +// multiple underlying transports, such as when not using max-bundle, +// or when not using RTCP multiplexing. function getDtlsTransportsFromSenderReceiver(pc) { const senders = pc.getSenders(); const receivers = pc.getReceivers(); @@ -91,7 +91,7 @@ function getDtlsTransportsFromSenderReceiver(pc) { const dtlsTransports = [...dtlsTransportsSet]; if (dtlsTransports.length === 0) { - assert_unreached('Expect to get at least one unique RTCDtlsTransport from sender receivers'); + assert_unreached('Expect to get at least one unique RTCDtlsTransport from senders and receivers'); } return dtlsTransports; @@ -124,55 +124,3 @@ function getIceTransportsFromSenderReceiver(pc) { return [...iceTransports]; } - -// Create DTLS transports by creating data channels -// and connecting two peer connections. Returns an -// array of two RTCDtlsTransports, which obtained -// from RTCSctpTransport in pc.sctp. -async function createDtlsTransportsFromSctp(pc1, pc2) { - pc1.createDataChannel(''); - exchangeIceCandidates(pc1, pc2); - - await doSignalingHandshake(pc1, pc2); - - const dtlsTransport1 = getDtlsTransportFromSctpTransport(pc1.sctp); - const dtlsTransport2 = getDtlsTransportFromSctpTransport(pc2.sctp); - - return [dtlsTransport1, dtlsTransport2]; -} - -// Create DTLS transports by adding tracks and connecting -// two peer connections. Returns an array of two array of -// RTCDtlsTransports. This is because each peer connection -// may have multiple underlying DTLS transports for each -// RTP/RTCP sender/receivers. -async function createDtlsTransportsFromSenderReceiver(pc1, pc2) { - const [track, mediaStream] = await getTrackFromUserMedia('audio') - addTrackOrTransceiver(pc1, track, mediaStream); - exchangeIceCandidates(pc1, pc2); - - await doSignalingHandshake(pc1, pc2); - - const dtlsTransports1 = getDtlsTransportsFromSenderReceiver(pc1); - const dtlsTransports2 = getDtlsTransportsFromSenderReceiver(pc2); - - return [dtlsTransports1, dtlsTransports2]; -} - -async function createIceTransportsFromSctp(pc1, pc2) { - const [dtlsTransport1, dtlsTransport2] = await createDtlsTransportsFromSctp(pc1, pc2) - - const iceTransport1 = getIceTransportFromDtlsTransport(dtlsTransport1); - const iceTransport2 = getIceTransportFromDtlsTransport(dtlsTransport2); - - return [iceTransport1, iceTransport2]; -} - -async function createIceTransportsFromSenderReceiver(pc1, pc2) { - const [dtlsTransports1, dtlsTransports2] = await createDtlsTransportsFromSenderReceiver(pc1, pc2) - - const iceTransports1 = getIceTransportsFromDtlsTransports(dtlsTransports1); - const iceTransports2 = getIceTransportsFromDtlsTransports(dtlsTransports2); - - return [iceTransports1, iceTransports2]; -} diff --git a/webrtc/tools/.eslintrc.js b/webrtc/tools/.eslintrc.js index 26c4fd3520c0ee..087c05a116200f 100644 --- a/webrtc/tools/.eslintrc.js +++ b/webrtc/tools/.eslintrc.js @@ -1,7 +1,7 @@ module.exports = { rules: { 'no-undef': 1, - 'no-unused-vars': 0, + 'no-unused-vars': 0 }, plugins: [ 'html' @@ -10,6 +10,9 @@ module.exports = { browser: true, es6: true }, + parserOptions: { + ecmaVersion: 2017 + }, globals: { // testharness globals test: true, @@ -155,15 +158,14 @@ module.exports = { validateCertificateStats: true, // RTCTransport-helper.js - waitConnectingPc: true, + waitForConnectedState: true, getDtlsTransportFromSctpTransport: true, getIceTransportFromSctpTransport: true, getDtlsTransportsFromSenderReceiver: true, getIceTransportFromDtlsTransport: true, getIceTransportsFromSenderReceiver: true, - createDtlsTransportsFromSctp: true, - createDtlsTransportsFromSenderReceiver: true, - createIceTransportsFromSctp: true, - createIceTransportsFromSenderReceiver: true, + getIceTransportFromDtlsTransport: true, + getIceTransportsFromDtlsTransports: true, + getIceTransportsFromSenderReceiver: true } } diff --git a/webrtc/tools/.gitignore b/webrtc/tools/.gitignore new file mode 100644 index 00000000000000..d8b83df9cdb661 --- /dev/null +++ b/webrtc/tools/.gitignore @@ -0,0 +1 @@ +package-lock.json From 7691a9fd97c2812c9210effb1db97464f384619f Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sat, 3 Nov 2018 15:53:35 +0800 Subject: [PATCH 09/20] Fix grammar --- webrtc/RTCDtlsTransport-getRemoteCertificates.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index ab717027c5ad83..45a07613437918 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -25,14 +25,14 @@ for(const cert of certs) { assert_true(cert instanceof ArrayBuffer, - 'Expect certificate elements be instance of ArrayBuffer'); + 'Certificates should be represented as ArrayBuffers'); } } function validateConnectingDtlsTransport(dtlsTransport) { if (dtlsTransport.state !== 'connected') { assert_array_equals(dtlsTransport.getCertificates(), [], - 'Expect DTLS certificates be initially empty until become connected'); + 'The DTLS certificate list should be empty before the transport is connected'); } } From bb08190b4bb43b1953e0a2208e5c6a27045ef3b1 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Sun, 4 Nov 2018 15:48:45 +0700 Subject: [PATCH 10/20] Fix minor semantics in waitForConnectedState --- webrtc/RTCTransport-helper.js | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/webrtc/RTCTransport-helper.js b/webrtc/RTCTransport-helper.js index 42d11fb487a8a7..9cac6c34f244e7 100644 --- a/webrtc/RTCTransport-helper.js +++ b/webrtc/RTCTransport-helper.js @@ -16,12 +16,10 @@ // is "connected", all RTCIceTransports and RTCDtlsTransports are in the // "connected", "completed" or "closed" state and at least one of them is in the // "connected" or "completed" state. -function waitForConnectedState(pc) { - return new Promise((resolve, reject) => { - if (pc.connectionState === 'connected') { - resolve(); - } +async function waitForConnectedState(pc) { + if (pc.connectionState === 'connected') return; + return new Promise((resolve, reject) => { pc.addEventListener('connectionstatechange', () => { const { connectionState } = pc; From d851654bcd0a3b53041b004049d141737ce6a0eb Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Mon, 5 Nov 2018 14:53:10 +0700 Subject: [PATCH 11/20] Fix nit --- webrtc/RTCDtlsTransport-getRemoteCertificates.html | 2 +- webrtc/RTCTransport-helper.js | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index 45a07613437918..b829889d09fb72 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -43,7 +43,7 @@ const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - const [track, mediaStream] = await getTrackFromUserMedia('audio') + const [track, mediaStream] = await getTrackFromUserMedia('audio'); addTrackOrTransceiver(pc1, track, mediaStream); exchangeIceCandidates(pc1, pc2); diff --git a/webrtc/RTCTransport-helper.js b/webrtc/RTCTransport-helper.js index 9cac6c34f244e7..d3e17bf18583e4 100644 --- a/webrtc/RTCTransport-helper.js +++ b/webrtc/RTCTransport-helper.js @@ -17,7 +17,9 @@ // "connected", "completed" or "closed" state and at least one of them is in the // "connected" or "completed" state. async function waitForConnectedState(pc) { - if (pc.connectionState === 'connected') return; + if (pc.connectionState === 'connected') { + return; + } return new Promise((resolve, reject) => { pc.addEventListener('connectionstatechange', () => { From 9f516dd6a32d4830c9ee050b55bfbfd78fa24ce3 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Thu, 15 Nov 2018 12:31:46 +0800 Subject: [PATCH 12/20] Fix more nit --- webrtc/RTCIceTransport.html | 16 ++++++++-------- webrtc/RTCPeerConnection-helper.js | 2 ++ 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 0d51b8fa741616..60dd13acbf0970 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -27,20 +27,20 @@ 'Expect at least one ICE candidate returned from get*Candidates()'); for(const candidate of candidates) { - assert_true(candidate instanceof RTCIceCandidate, - 'Expect candidate elements to be instance of RTCIceCandidate'); + assert_true(candidate instanceof RTCIceCandidate, + 'Expect candidate elements to be instance of RTCIceCandidate'); } } function validateIceParameter(param) { - assert_not_equals(param, null, - 'Expect candidate parameter to be non-null after peer connections are connected'); + assert_not_equals(param, null, + 'Expect candidate parameter to be non-null after peer connections are connected'); - assert_equals(typeof param.usernameFragment, 'string', - 'Expect param.usernameFragment to be set with string value'); + assert_equals(typeof param.usernameFragment, 'string', + 'Expect param.usernameFragment to be set with string value'); - assert_equals(typeof param.password, 'string', - 'Expect param.password to be set with string value'); + assert_equals(typeof param.password, 'string', + 'Expect param.password to be set with string value'); } function validateConnectedIceTransport(iceTransport) { diff --git a/webrtc/RTCPeerConnection-helper.js b/webrtc/RTCPeerConnection-helper.js index 721cb9005909ab..7e468c94312a77 100644 --- a/webrtc/RTCPeerConnection-helper.js +++ b/webrtc/RTCPeerConnection-helper.js @@ -489,6 +489,8 @@ function canAddTransceiver() { return true; } catch (err) { return false; + } finally { + pc.close() } } From f34413b98653150e39a90733f3adcfbbf93d0ef9 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Thu, 15 Nov 2018 12:45:31 +0800 Subject: [PATCH 13/20] Rename dtlsTransport.transport to .iceTransport --- webrtc/RTCTransport-helper.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/webrtc/RTCTransport-helper.js b/webrtc/RTCTransport-helper.js index d3e17bf18583e4..3cdfb35cab2f17 100644 --- a/webrtc/RTCTransport-helper.js +++ b/webrtc/RTCTransport-helper.js @@ -48,9 +48,9 @@ function getDtlsTransportFromSctpTransport(sctpTransport) { function getIceTransportFromSctpTransport(sctpTransport) { const dtlsTransport = getDtlsTransportFromSctpTransport(sctpTransport); - const iceTransport = dtlsTransport.transport; + const { iceTransport } = dtlsTransport; assert_true(iceTransport instanceof RTCIceTransport, - 'Expect dtlsTransport.transport to be an RTCIceTransport'); + 'Expect dtlsTransport.iceTransport to be an RTCIceTransport'); return iceTransport; } @@ -98,10 +98,10 @@ function getDtlsTransportsFromSenderReceiver(pc) { } function getIceTransportFromDtlsTransport(dtlsTransport) { - const iceTransport = dtlsTransport.transport; + const { iceTransport } = dtlsTransport; assert_true(iceTransport instanceof RTCIceTransport, - 'Expect dtlsTransport.transport to be an RTCIceTransport'); + 'Expect dtlsTransport.iceTransport to be an RTCIceTransport'); return iceTransport; } From 75f280b9cce9381cc52d470c15a7691ded633aa8 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Tue, 20 Nov 2018 11:46:05 +0800 Subject: [PATCH 14/20] Remove addTrackOrTransceiver and use addTransceiver directly --- ...TCDtlsTransport-getRemoteCertificates.html | 4 +-- webrtc/RTCIceTransport.html | 13 ++++---- webrtc/RTCPeerConnection-helper.js | 33 ------------------- webrtc/RTCTransport-helper.js | 1 - webrtc/tools/.eslintrc.js | 1 - 5 files changed, 8 insertions(+), 44 deletions(-) diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index b829889d09fb72..bf3bb40fa9e42c 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -43,8 +43,8 @@ const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - const [track, mediaStream] = await getTrackFromUserMedia('audio'); - addTrackOrTransceiver(pc1, track, mediaStream); + const [track] = await getTrackFromUserMedia('audio'); + pc1.addTransceiver(track); exchangeIceCandidates(pc1, pc2); await doSignalingHandshake(pc1, pc2); diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 60dd13acbf0970..d012e6b596e786 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -12,7 +12,6 @@ // createDataChannelPair // awaitMessage // getTrackFromUserMedia - // addTrackOrTransceiver // The following helper functions are called from RTCTransport-helper.js: // waitForConnectedState @@ -115,8 +114,8 @@ const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - const [track, mediaStream] = await getTrackFromUserMedia('audio') - addTrackOrTransceiver(pc1, track, mediaStream); + const [track] = await getTrackFromUserMedia('audio'); + pc1.addTransceiver(track); exchangeIceCandidates(pc1, pc2); await doSignalingHandshake(pc1, pc2); @@ -143,12 +142,12 @@ const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); - const [track, mediaStream] = await getTrackFromUserMedia('audio') - addTrackOrTransceiver(pc, track, mediaStream); + const [track] = await getTrackFromUserMedia('audio'); + pc.addTransceiver(track); // setLocalDescription should initialize sender/receiver.transport - const offer = await pc.createOffer() - await pc.setLocalDescription(offer) + const offer = await pc.createOffer(); + await pc.setLocalDescription(offer); const iceTransports = getIceTransportsFromSenderReceiver(pc); diff --git a/webrtc/RTCPeerConnection-helper.js b/webrtc/RTCPeerConnection-helper.js index 7e468c94312a77..fac2981c855b34 100644 --- a/webrtc/RTCPeerConnection-helper.js +++ b/webrtc/RTCPeerConnection-helper.js @@ -478,39 +478,6 @@ async function exchangeOfferAndListenToOntrack(t, caller, callee) { return ontrackPromise; } -// Feature detect whether we can call add transceiver on the target browser. -// We cannot simply test if the addTransceiver method exist, as Chrome -// for example would have it implemented but only usable in unified plan, -// which means it would fail the tests when using default peer connection config -function canAddTransceiver() { - const pc = new RTCPeerConnection(); - try { - pc.addTransceiver('audio'); - return true; - } catch (err) { - return false; - } finally { - pc.close() - } -} - -// A dependency agnostic way to add a track track depending -// on the supported method on a browser. -// - If addTransceiver(track) is usable, use that. -// - If addTrack(track, mediastream) is available, use that. -function addTrackOrTransceiver(pc, track, mediaStream) { - if (canAddTransceiver()) { - return pc.addTransceiver(track); - } else if (typeof pc.addTrack === 'function') { - // Note: The mediaStream argument is optional in the spec, but we require - // it for now so that we can test older versions of Firefox that only - // implements addTrack with compulsory mediaStream argument. - return pc.addTrack(track, mediaStream); - } else { - throw new Error('This test requires either addTrack or addTransceiver implemented'); - } -} - // The resolver has a |promise| that can be resolved or rejected using |resolve| // or |reject|. class Resolver { diff --git a/webrtc/RTCTransport-helper.js b/webrtc/RTCTransport-helper.js index 3cdfb35cab2f17..6d01c8eb09f6ab 100644 --- a/webrtc/RTCTransport-helper.js +++ b/webrtc/RTCTransport-helper.js @@ -6,7 +6,6 @@ The following helper functions are called from RTCPeerConnection-helper.js: getTrackFromUserMedia - addTrackOrTransceiver exchangeIceCandidates doSignalingHandshake */ diff --git a/webrtc/tools/.eslintrc.js b/webrtc/tools/.eslintrc.js index 087c05a116200f..3faba005572a9c 100644 --- a/webrtc/tools/.eslintrc.js +++ b/webrtc/tools/.eslintrc.js @@ -114,7 +114,6 @@ module.exports = { getUserMediaTracksAndStreams: true, performOffer: true, Resolver: true, - addTrackOrTransceiver: true, // RTCRtpCapabilities-helper.js validateRtpCapabilities: true, From 3478f68226851485e32a5a683be7113546ae74d8 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Tue, 20 Nov 2018 12:20:37 +0800 Subject: [PATCH 15/20] Remove getDtls/IceTransports helpers --- ...TCDtlsTransport-getRemoteCertificates.html | 52 ++++++----- webrtc/RTCIceTransport.html | 63 ++++++++----- webrtc/RTCTransport-helper.js | 91 ------------------- webrtc/tools/.eslintrc.js | 10 +- 4 files changed, 71 insertions(+), 145 deletions(-) diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index bf3bb40fa9e42c..570e6c9bee5366 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -14,8 +14,6 @@ // The following helper functions are called from RTCTransport-helper.js: // waitForConnectedState - // getDtlsTransportFromSctpTransport - // getDtlsTransportsFromSenderReceiver function validateConnectedDtlsTransport(dtlsTransport) { const certs = dtlsTransport.getRemoteCertificates(); @@ -23,7 +21,7 @@ assert_greater_than(certs.length, 0, 'Expect DTLS transport to have at least one remote certificate when connected'); - for(const cert of certs) { + for (const cert of certs) { assert_true(cert instanceof ArrayBuffer, 'Certificates should be represented as ArrayBuffers'); } @@ -49,25 +47,28 @@ await doSignalingHandshake(pc1, pc2); - const dtlsTransports1 = getDtlsTransportsFromSenderReceiver(pc1); - const dtlsTransports2 = getDtlsTransportsFromSenderReceiver(pc2); - - for (const dtlsTransport of dtlsTransports1) { - validateConnectingDtlsTransport(dtlsTransport); - } - - for (const dtlsTransport of dtlsTransports2) { + const dtlsTransports = [ + pc1.getSenders().transport, + pc1.getReceivers().transport, + pc1.getSenders().rtcpTransport, + pc1.getReceivers().rtcpTransport, + pc2.getSenders().transport, + pc2.getReceivers().transport, + pc2.getSenders().rtcpTransport, + pc2.getReceivers().rtcpTransport, + ] + .filter(dtlsTransport => dtlsTransport); // filter null/undefined + + assert_greater_than(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); + + for (const dtlsTransport of dtlsTransports) { validateConnectingDtlsTransport(dtlsTransport); } await waitForConnectedState(pc1); await waitForConnectedState(pc2); - for (const dtlsTransport of dtlsTransports1) { - validateConnectedDtlsTransport(dtlsTransport); - } - - for (const dtlsTransport of dtlsTransports2) { + for (const dtlsTransport of dtlsTransports) { validateConnectedDtlsTransport(dtlsTransport); } }, 'RTP - connected DTLS transports should have valid remote certificates'); @@ -84,17 +85,24 @@ await doSignalingHandshake(pc1, pc2); - const dtlsTransport1 = getDtlsTransportFromSctpTransport(pc1.sctp); - const dtlsTransport2 = getDtlsTransportFromSctpTransport(pc2.sctp); + const dtlsTransports = [ + pc1.sctp.transport, + pc2.sctp.transport + ] + .filter(dtlsTransport => dtlsTransport); // filter null/undefined + + assert_greater_than(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); - validateConnectingDtlsTransport(dtlsTransport1); - validateConnectingDtlsTransport(dtlsTransport2); + for (const dtlsTransport of dtlsTransports) { + validateConnectingDtlsTransport(dtlsTransport); + } await waitForConnectedState(pc1); await waitForConnectedState(pc2); - validateConnectedDtlsTransport(dtlsTransport1); - validateConnectedDtlsTransport(dtlsTransport2); + for (const dtlsTransport of dtlsTransports) { + validateConnectedDtlsTransport(dtlsTransport); + } }, 'SCTP - connected DTLS transports should have valid remote certificates'); diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index d012e6b596e786..fd99e303cd6b21 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -15,11 +15,6 @@ // The following helper functions are called from RTCTransport-helper.js: // waitForConnectedState - // getDtlsTransportFromSctpTransport - // getDtlsTransportsFromSenderReceiver - // getIceTransportFromSctpTransport - // getIceTransportFromDtlsTransport - // getIceTransportsFromDtlsTransports function validateIceCandidates(candidates) { assert_greater_than(candidates.length, 0, @@ -94,17 +89,22 @@ await doSignalingHandshake(pc1, pc2); - const dtlsTransport1 = getDtlsTransportFromSctpTransport(pc1.sctp); - const dtlsTransport2 = getDtlsTransportFromSctpTransport(pc2.sctp); + const iceTransports = [ + pc1.sctp.transport, + pc2.sctp.transport + ] + .filter(dtlsTransport => dtlsTransport) // filter null/undefined + .map(dtlsTransport => dtlsTransport.iceTransport) + .filter(iceTransport => iceTransport); // filter null/undefined - const iceTransport1 = getIceTransportFromDtlsTransport(dtlsTransport1); - const iceTransport2 = getIceTransportFromDtlsTransport(dtlsTransport2); + assert_greater_than(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); await waitForConnectedState(pc1); await waitForConnectedState(pc2); - validateConnectedIceTransport(iceTransport1); - validateConnectedIceTransport(iceTransport2); + for (const iceTransport of iceTransports) { + validateConnectedIceTransport(iceTransport); + } }, 'SCTP - Connected ICE transports should have relevants attributes set'); promise_test(async t => { @@ -120,20 +120,26 @@ await doSignalingHandshake(pc1, pc2); - const dtlsTransports1 = getDtlsTransportsFromSenderReceiver(pc1); - const dtlsTransports2 = getDtlsTransportsFromSenderReceiver(pc2); - - const iceTransports1 = getIceTransportsFromDtlsTransports(dtlsTransports1); - const iceTransports2 = getIceTransportsFromDtlsTransports(dtlsTransports2); + const iceTransports = [ + pc1.getSenders().transport, + pc1.getReceivers().transport, + pc1.getSenders().rtcpTransport, + pc1.getReceivers().rtcpTransport, + pc2.getSenders().transport, + pc2.getReceivers().transport, + pc2.getSenders().rtcpTransport, + pc2.getReceivers().rtcpTransport, + ] + .filter(dtlsTransport => dtlsTransport) // filter null/undefined + .map(dtlsTransport => dtlsTransport.iceTransport) + .filter(iceTransport => iceTransport); // filter null/undefined + + assert_greater_than(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); await waitForConnectedState(pc1); await waitForConnectedState(pc2); - for (const iceTransport of iceTransports1) { - validateConnectedIceTransport(iceTransport); - } - - for (const iceTransport of iceTransports2) { + for (const iceTransport of iceTransports) { validateConnectedIceTransport(iceTransport); } }, 'RTP - Connected ICE transports should have relevants attributes set'); @@ -149,7 +155,17 @@ const offer = await pc.createOffer(); await pc.setLocalDescription(offer); - const iceTransports = getIceTransportsFromSenderReceiver(pc); + const iceTransports = [ + pc.getSenders().transport, + pc.getReceivers().transport, + pc.getSenders().rtcpTransport, + pc.getReceivers().rtcpTransport + ] + .filter(dtlsTransport => dtlsTransport) // filter null/undefined + .map(dtlsTransport => dtlsTransport.iceTransport) + .filter(iceTransport => iceTransport); // filter null/undefined + + assert_greater_than(iceTransports.length, 1, 'expect to find at least 1 RTCIceTransports'); for (const iceTransport of iceTransports) { validateUnconnectedIceTransport(iceTransport); @@ -175,7 +191,8 @@ const answer = await pc2.createAnswer() await pc1.setRemoteDescription(answer) - const iceTransport = getIceTransportFromSctpTransport(pc1.sctp); + const iceTransport = pc1.sctp.transport.iceTransport; + validateUnconnectedIceTransport(iceTransport); }, 'SCTP - Unconnected iceTransport should have empty remote candidates and selected pair'); diff --git a/webrtc/RTCTransport-helper.js b/webrtc/RTCTransport-helper.js index 6d01c8eb09f6ab..6296984e90d335 100644 --- a/webrtc/RTCTransport-helper.js +++ b/webrtc/RTCTransport-helper.js @@ -32,94 +32,3 @@ async function waitForConnectedState(pc) { }); }); } - -function getDtlsTransportFromSctpTransport(sctpTransport) { - assert_true(sctpTransport instanceof RTCSctpTransport, - 'Expect pc.sctp to be instantiated from RTCSctpTransport'); - - const dtlsTransport = sctpTransport.transport; - assert_true(dtlsTransport instanceof RTCDtlsTransport, - 'Expect sctp.transport to be an RTCDtlsTransport'); - - return dtlsTransport; -} - -function getIceTransportFromSctpTransport(sctpTransport) { - const dtlsTransport = getDtlsTransportFromSctpTransport(sctpTransport); - - const { iceTransport } = dtlsTransport; - assert_true(iceTransport instanceof RTCIceTransport, - 'Expect dtlsTransport.iceTransport to be an RTCIceTransport'); - - return iceTransport; -} - -// Get one or more RTCDtlsTransports from RTCRtpSender/Receiver -// in pc.There may be more than one DTLSTransport if there are -// multiple underlying transports, such as when not using max-bundle, -// or when not using RTCP multiplexing. -function getDtlsTransportsFromSenderReceiver(pc) { - const senders = pc.getSenders(); - const receivers = pc.getReceivers(); - - const dtlsTransportsSet = new Set(); - - function addDtlsTransport(transport) { - // Add a dtls transport to the result set, if it is - // not null/undefined. Although the spec mandates both - // transport and rtcpTransport fields must be set together, - // we validate that requirement in separate test cases. - if (transport) { - assert_true(transport instanceof RTCDtlsTransport, - 'Expect transport to be an RTCDtlsTransport'); - - dtlsTransportsSet.add(transport); - } - } - - for (const sender of senders) { - addDtlsTransport(sender.transport); - addDtlsTransport(sender.rtcpTransport); - } - - for (const receiver of receivers) { - addDtlsTransport(receiver.transport); - addDtlsTransport(receiver.rtcpTransport); - } - - const dtlsTransports = [...dtlsTransportsSet]; - - if (dtlsTransports.length === 0) { - assert_unreached('Expect to get at least one unique RTCDtlsTransport from senders and receivers'); - } - - return dtlsTransports; -} - -function getIceTransportFromDtlsTransport(dtlsTransport) { - const { iceTransport } = dtlsTransport; - - assert_true(iceTransport instanceof RTCIceTransport, - 'Expect dtlsTransport.iceTransport to be an RTCIceTransport'); - - return iceTransport; -} - -function getIceTransportsFromDtlsTransports(dtlsTransports) { - const iceTransports = new Set(); - - for (const dtlsTransport of dtlsTransports) { - iceTransports.add(getIceTransportFromDtlsTransport(dtlsTransport)); - } - - return [...iceTransports]; -} - -function getIceTransportsFromSenderReceiver(pc) { - const dtlsTransports = getDtlsTransportsFromSenderReceiver(pc); - - const iceTransports = new Set( - dtlsTransports.map(getIceTransportFromDtlsTransport)); - - return [...iceTransports]; -} diff --git a/webrtc/tools/.eslintrc.js b/webrtc/tools/.eslintrc.js index 3faba005572a9c..ae3fbd85fb5bf2 100644 --- a/webrtc/tools/.eslintrc.js +++ b/webrtc/tools/.eslintrc.js @@ -157,14 +157,6 @@ module.exports = { validateCertificateStats: true, // RTCTransport-helper.js - waitForConnectedState: true, - getDtlsTransportFromSctpTransport: true, - getIceTransportFromSctpTransport: true, - getDtlsTransportsFromSenderReceiver: true, - getIceTransportFromDtlsTransport: true, - getIceTransportsFromSenderReceiver: true, - getIceTransportFromDtlsTransport: true, - getIceTransportsFromDtlsTransports: true, - getIceTransportsFromSenderReceiver: true + waitForConnectedState: true } } From 5fbc84de521cd6ba996093c00bed5969bb2d38b9 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Tue, 20 Nov 2018 12:58:32 +0800 Subject: [PATCH 16/20] Fix senderReceiver array usage --- ...TCDtlsTransport-getRemoteCertificates.html | 13 +++++------ webrtc/RTCIceTransport.html | 22 ++++++++----------- 2 files changed, 14 insertions(+), 21 deletions(-) diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index 570e6c9bee5366..e7b9e46ab6e938 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -48,15 +48,12 @@ await doSignalingHandshake(pc1, pc2); const dtlsTransports = [ - pc1.getSenders().transport, - pc1.getReceivers().transport, - pc1.getSenders().rtcpTransport, - pc1.getReceivers().rtcpTransport, - pc2.getSenders().transport, - pc2.getReceivers().transport, - pc2.getSenders().rtcpTransport, - pc2.getReceivers().rtcpTransport, + ...pc1.getSenders(), + ...pc1.getReceivers(), + ...pc2.getSenders(), + ...pc2.getReceivers() ] + .map(senderReceiver => senderReceiver.transport) .filter(dtlsTransport => dtlsTransport); // filter null/undefined assert_greater_than(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index fd99e303cd6b21..2dcb14a092fdd2 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -121,15 +121,12 @@ await doSignalingHandshake(pc1, pc2); const iceTransports = [ - pc1.getSenders().transport, - pc1.getReceivers().transport, - pc1.getSenders().rtcpTransport, - pc1.getReceivers().rtcpTransport, - pc2.getSenders().transport, - pc2.getReceivers().transport, - pc2.getSenders().rtcpTransport, - pc2.getReceivers().rtcpTransport, + ...pc1.getSenders(), + ...pc1.getReceivers(), + ...pc2.getSenders(), + ...pc2.getReceivers() ] + .map(senderReceiver => senderReceiver.transport) .filter(dtlsTransport => dtlsTransport) // filter null/undefined .map(dtlsTransport => dtlsTransport.iceTransport) .filter(iceTransport => iceTransport); // filter null/undefined @@ -155,12 +152,11 @@ const offer = await pc.createOffer(); await pc.setLocalDescription(offer); - const iceTransports = [ - pc.getSenders().transport, - pc.getReceivers().transport, - pc.getSenders().rtcpTransport, - pc.getReceivers().rtcpTransport + const iceTransports =[ + ...pc.getSenders(), + ...pc.getReceivers() ] + .map(senderReceiver => senderReceiver.transport) .filter(dtlsTransport => dtlsTransport) // filter null/undefined .map(dtlsTransport => dtlsTransport.iceTransport) .filter(iceTransport => iceTransport); // filter null/undefined From 10055fe862827044eb07bc3a2ce96703cc267495 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Tue, 20 Nov 2018 13:32:09 +0800 Subject: [PATCH 17/20] Don't need to filter null dtlsTransport.iceTransport --- webrtc/RTCIceTransport.html | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 2dcb14a092fdd2..1a2f8f76959167 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -94,8 +94,7 @@ pc2.sctp.transport ] .filter(dtlsTransport => dtlsTransport) // filter null/undefined - .map(dtlsTransport => dtlsTransport.iceTransport) - .filter(iceTransport => iceTransport); // filter null/undefined + .map(dtlsTransport => dtlsTransport.iceTransport); assert_greater_than(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); @@ -128,8 +127,7 @@ ] .map(senderReceiver => senderReceiver.transport) .filter(dtlsTransport => dtlsTransport) // filter null/undefined - .map(dtlsTransport => dtlsTransport.iceTransport) - .filter(iceTransport => iceTransport); // filter null/undefined + .map(dtlsTransport => dtlsTransport.iceTransport); assert_greater_than(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); @@ -158,8 +156,7 @@ ] .map(senderReceiver => senderReceiver.transport) .filter(dtlsTransport => dtlsTransport) // filter null/undefined - .map(dtlsTransport => dtlsTransport.iceTransport) - .filter(iceTransport => iceTransport); // filter null/undefined + .map(dtlsTransport => dtlsTransport.iceTransport); assert_greater_than(iceTransports.length, 1, 'expect to find at least 1 RTCIceTransports'); From 85497d7fd12ba876d37bc516f7cbe9c663d98b52 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Tue, 20 Nov 2018 13:36:37 +0800 Subject: [PATCH 18/20] assert_greater_than_equal --- webrtc/RTCDtlsTransport-getRemoteCertificates.html | 4 ++-- webrtc/RTCIceTransport.html | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index e7b9e46ab6e938..d1163b2a634fe1 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -56,7 +56,7 @@ .map(senderReceiver => senderReceiver.transport) .filter(dtlsTransport => dtlsTransport); // filter null/undefined - assert_greater_than(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); + assert_greater_than_equal(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); for (const dtlsTransport of dtlsTransports) { validateConnectingDtlsTransport(dtlsTransport); @@ -88,7 +88,7 @@ ] .filter(dtlsTransport => dtlsTransport); // filter null/undefined - assert_greater_than(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); + assert_greater_than_equal(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); for (const dtlsTransport of dtlsTransports) { validateConnectingDtlsTransport(dtlsTransport); diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 1a2f8f76959167..06fe0468a71ccb 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -96,7 +96,7 @@ .filter(dtlsTransport => dtlsTransport) // filter null/undefined .map(dtlsTransport => dtlsTransport.iceTransport); - assert_greater_than(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); + assert_greater_than_equal(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); await waitForConnectedState(pc1); await waitForConnectedState(pc2); @@ -129,7 +129,7 @@ .filter(dtlsTransport => dtlsTransport) // filter null/undefined .map(dtlsTransport => dtlsTransport.iceTransport); - assert_greater_than(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); + assert_greater_than_equal(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); await waitForConnectedState(pc1); await waitForConnectedState(pc2); @@ -158,7 +158,7 @@ .filter(dtlsTransport => dtlsTransport) // filter null/undefined .map(dtlsTransport => dtlsTransport.iceTransport); - assert_greater_than(iceTransports.length, 1, 'expect to find at least 1 RTCIceTransports'); + assert_greater_than_equal(iceTransports.length, 1, 'expect to find at least 1 RTCIceTransports'); for (const iceTransport of iceTransports) { validateUnconnectedIceTransport(iceTransport); From d6d0c2e8361d11ad405b174a3d6dfdaac6139115 Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Mon, 10 Dec 2018 17:30:02 +0800 Subject: [PATCH 19/20] Simplify code based on review feedback --- ...TCDtlsTransport-getRemoteCertificates.html | 43 +++++++------- webrtc/RTCIceTransport.html | 59 ++++++++++--------- 2 files changed, 50 insertions(+), 52 deletions(-) diff --git a/webrtc/RTCDtlsTransport-getRemoteCertificates.html b/webrtc/RTCDtlsTransport-getRemoteCertificates.html index d1163b2a634fe1..a64a4e1a933cf3 100644 --- a/webrtc/RTCDtlsTransport-getRemoteCertificates.html +++ b/webrtc/RTCDtlsTransport-getRemoteCertificates.html @@ -47,23 +47,28 @@ await doSignalingHandshake(pc1, pc2); - const dtlsTransports = [ + const dtlsTransports1 = new Set([ ...pc1.getSenders(), - ...pc1.getReceivers(), + ...pc1.getReceivers() + ] + .map(senderReceiver => senderReceiver.transport)); + + const dtlsTransports2 = new Set([ ...pc2.getSenders(), ...pc2.getReceivers() ] - .map(senderReceiver => senderReceiver.transport) - .filter(dtlsTransport => dtlsTransport); // filter null/undefined + .map(senderReceiver => senderReceiver.transport)); - assert_greater_than_equal(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); + const dtlsTransports = [...dtlsTransports1, ...dtlsTransports2]; for (const dtlsTransport of dtlsTransports) { validateConnectingDtlsTransport(dtlsTransport); } - await waitForConnectedState(pc1); - await waitForConnectedState(pc2); + await Promise.all([ + waitForConnectedState(pc1), + waitForConnectedState(pc2) + ]); for (const dtlsTransport of dtlsTransports) { validateConnectedDtlsTransport(dtlsTransport); @@ -82,24 +87,16 @@ await doSignalingHandshake(pc1, pc2); - const dtlsTransports = [ - pc1.sctp.transport, - pc2.sctp.transport - ] - .filter(dtlsTransport => dtlsTransport); // filter null/undefined + validateConnectingDtlsTransport(pc1.sctp.transport); + validateConnectingDtlsTransport(pc2.sctp.transport); - assert_greater_than_equal(dtlsTransports.length, 2, 'expect to find at least 2 RTCDtlsTransports'); + await Promise.all([ + waitForConnectedState(pc1), + waitForConnectedState(pc2) + ]); - for (const dtlsTransport of dtlsTransports) { - validateConnectingDtlsTransport(dtlsTransport); - } - - await waitForConnectedState(pc1); - await waitForConnectedState(pc2); - - for (const dtlsTransport of dtlsTransports) { - validateConnectedDtlsTransport(dtlsTransport); - } + validateConnectedDtlsTransport(pc1.sctp.transport); + validateConnectedDtlsTransport(pc2.sctp.transport); }, 'SCTP - connected DTLS transports should have valid remote certificates'); diff --git a/webrtc/RTCIceTransport.html b/webrtc/RTCIceTransport.html index 06fe0468a71ccb..1f3b74bf3df4dc 100644 --- a/webrtc/RTCIceTransport.html +++ b/webrtc/RTCIceTransport.html @@ -89,17 +89,22 @@ await doSignalingHandshake(pc1, pc2); + assert_true(pc1.sctp.transport instanceof RTCDtlsTransport, + 'Expect pc1.sctp.transport to be defined'); + + assert_true(pc2.sctp.transport instanceof RTCDtlsTransport, + 'Expect pc2.sctp.transport to be defined'); + const iceTransports = [ pc1.sctp.transport, pc2.sctp.transport ] - .filter(dtlsTransport => dtlsTransport) // filter null/undefined .map(dtlsTransport => dtlsTransport.iceTransport); - assert_greater_than_equal(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); - - await waitForConnectedState(pc1); - await waitForConnectedState(pc2); + await Promise.all([ + waitForConnectedState(pc1), + waitForConnectedState(pc2) + ]); for (const iceTransport of iceTransports) { validateConnectedIceTransport(iceTransport); @@ -113,28 +118,30 @@ const pc2 = new RTCPeerConnection(); t.add_cleanup(() => pc2.close()); - const [track] = await getTrackFromUserMedia('audio'); + const [ track ] = await getTrackFromUserMedia('audio'); pc1.addTransceiver(track); exchangeIceCandidates(pc1, pc2); await doSignalingHandshake(pc1, pc2); - const iceTransports = [ + const iceTransports1 = new Set([ ...pc1.getSenders(), ...pc1.getReceivers(), + ] + .map(senderReceiver => senderReceiver.transport.iceTransport)); + + const iceTransports2 = new Set([ ...pc2.getSenders(), ...pc2.getReceivers() ] - .map(senderReceiver => senderReceiver.transport) - .filter(dtlsTransport => dtlsTransport) // filter null/undefined - .map(dtlsTransport => dtlsTransport.iceTransport); - - assert_greater_than_equal(iceTransports.length, 2, 'expect to find at least 2 RTCIceTransports'); + .map(senderReceiver => senderReceiver.transport.iceTransport)); - await waitForConnectedState(pc1); - await waitForConnectedState(pc2); + await Promise.all([ + waitForConnectedState(pc1), + waitForConnectedState(pc2) + ]); - for (const iceTransport of iceTransports) { + for (const iceTransport of [...iceTransports1, ...iceTransports2]) { validateConnectedIceTransport(iceTransport); } }, 'RTP - Connected ICE transports should have relevants attributes set'); @@ -143,22 +150,17 @@ const pc = new RTCPeerConnection(); t.add_cleanup(() => pc.close()); - const [track] = await getTrackFromUserMedia('audio'); + const [ track ] = await getTrackFromUserMedia('audio'); pc.addTransceiver(track); // setLocalDescription should initialize sender/receiver.transport - const offer = await pc.createOffer(); - await pc.setLocalDescription(offer); + await pc.setLocalDescription(await pc.createOffer()); - const iceTransports =[ + const iceTransports = new Set([ ...pc.getSenders(), ...pc.getReceivers() ] - .map(senderReceiver => senderReceiver.transport) - .filter(dtlsTransport => dtlsTransport) // filter null/undefined - .map(dtlsTransport => dtlsTransport.iceTransport); - - assert_greater_than_equal(iceTransports.length, 1, 'expect to find at least 1 RTCIceTransports'); + .map(senderReceiver => senderReceiver.transport.iceTransport)); for (const iceTransport of iceTransports) { validateUnconnectedIceTransport(iceTransport); @@ -177,12 +179,11 @@ // pc1.setRemoteDescription(answer) without pc2 setting answer to it's // localDescription. This is because pc1.sctp is only set after setting // answer description. - const offer = await pc1.createOffer() + const offer = await pc1.createOffer(); - await pc1.setLocalDescription(offer) - await pc2.setRemoteDescription(offer) - const answer = await pc2.createAnswer() - await pc1.setRemoteDescription(answer) + await pc1.setLocalDescription(offer); + await pc2.setRemoteDescription(offer); + await pc1.setRemoteDescription(await pc2.createAnswer()); const iceTransport = pc1.sctp.transport.iceTransport; From 7a49b2721ce5aebc6397ec8cb11d8e061b78928c Mon Sep 17 00:00:00 2001 From: Soares Chen Date: Mon, 10 Dec 2018 17:40:22 +0800 Subject: [PATCH 20/20] Ensure waitForConnectedState always either resolve regardless of error --- webrtc/RTCTransport-helper.js | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/webrtc/RTCTransport-helper.js b/webrtc/RTCTransport-helper.js index 6296984e90d335..06472faa3d42ae 100644 --- a/webrtc/RTCTransport-helper.js +++ b/webrtc/RTCTransport-helper.js @@ -22,12 +22,16 @@ async function waitForConnectedState(pc) { return new Promise((resolve, reject) => { pc.addEventListener('connectionstatechange', () => { - const { connectionState } = pc; + try { + const { connectionState } = pc; - if (connectionState === 'connected') { - resolve(); - } else if (['closed', 'failed'].includes(connectionState)) { - reject(new Error(`one of DTLS/ICE transports transition to unexpected state ${connectionState}`)); + if (connectionState === 'connected') { + resolve(); + } else if (['closed', 'failed'].includes(connectionState)) { + reject(new Error(`one of DTLS/ICE transports transition to unexpected state ${connectionState}`)); + } + } catch (err) { + reject(err); } }); });