| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>RTCPeerConnection.createOffer</title> |
| <script src="../../resources/testharness.js"></script> |
| <script src="../../resources/testharnessreport.js"></script> |
| </head> |
| <body> |
| <script> |
| |
| sdes_constraint = {'mandatory': {'DtlsSrtpKeyAgreement': false}}; |
| |
| promise_test(async t => { |
| let pc1 = new RTCPeerConnection(); |
| let pc2 = new RTCPeerConnection(); |
| let stream = await navigator.mediaDevices.getUserMedia({audio: true}); |
| let track = stream.getAudioTracks()[0]; |
| pc1.addTrack(track); |
| let offer = await pc1.createOffer(); |
| assert_true(offer.sdp.match('\na=fingerprint') !== null); |
| assert_true(offer.sdp.match('\na=crypto') === null); |
| await pc1.setLocalDescription(offer); |
| await pc2.setRemoteDescription(offer); |
| let answer = await pc2.createAnswer(); |
| assert_true(answer.sdp.match('\na=fingerprint') !== null); |
| assert_true(answer.sdp.match('\na=crypto') === null); |
| await pc2.setLocalDescription(answer); |
| await pc1.setRemoteDescription(answer); |
| }, 'No constraints means DTLS-SRTP'); |
| |
| promise_test(async t => { |
| let pc1 = new RTCPeerConnection(null, sdes_constraint); |
| let pc2 = new RTCPeerConnection(null, sdes_constraint); |
| pc1.oncandidate = c => pc2.addCandidate(); |
| pc2.oncandidate = c => pc1.addCandidate(); |
| let stream = await navigator.mediaDevices.getUserMedia({audio: true}); |
| let track = stream.getAudioTracks()[0]; |
| pc1.addTrack(track); |
| let offer = await pc1.createOffer(); |
| // assert_regexp_match doesn't work |
| assert_true(offer.sdp.match('\na=fingerprint') === null); |
| assert_true(offer.sdp.match('\na=crypto') !== null); |
| await pc1.setLocalDescription(offer); |
| await pc2.setRemoteDescription(offer); |
| let answer = await pc2.createAnswer(); |
| assert_true(answer.sdp.match('\na=fingerprint') === null); |
| assert_true(answer.sdp.match('\na=crypto') !== null); |
| await pc2.setLocalDescription(answer); |
| await pc1.setRemoteDescription(answer); |
| }, 'DTLS constraint false means SDES'); |
| |
| promise_test(async t => { |
| let pc1 = new RTCPeerConnection(null, sdes_constraint); |
| let pc2 = new RTCPeerConnection(); |
| let stream = await navigator.mediaDevices.getUserMedia({audio: true}); |
| let track = stream.getAudioTracks()[0]; |
| pc1.addTrack(track); |
| let offer = await pc1.createOffer(); |
| await pc1.setLocalDescription(offer); |
| try { |
| await pc2.setRemoteDescription(offer); |
| assert_unreached('pc2.setRemote should have thrown'); |
| } catch(e) { |
| assert_equals(e.name, 'OperationError'); |
| } |
| |
| }, 'SDES can\'t connect to default configuration'); |
| |
| promise_test(async t => { |
| let pc1 = new RTCPeerConnection(); |
| let pc2 = new RTCPeerConnection(null, sdes_constraint); |
| let stream = await navigator.mediaDevices.getUserMedia({audio: true}); |
| let track = stream.getAudioTracks()[0]; |
| pc1.addTrack(track); |
| let offer = await pc1.createOffer(); |
| try { |
| await pc2.setRemoteDescription(offer); |
| assert_unreached('pc2.setRemote should have thrown'); |
| } catch(e) { |
| assert_equals(e.name, 'OperationError'); |
| } |
| }, 'Default configuration can\'t connect to SDES'); |
| |
| causes_sdes = async function(constraint) { |
| pc = new RTCPeerConnection(null, constraint); |
| let stream = await navigator.mediaDevices.getUserMedia({audio: true}); |
| let track = stream.getAudioTracks()[0]; |
| pc.addTrack(track); |
| let offer = await pc.createOffer(); |
| return offer.sdp.match('\na=crypto') !== null |
| } |
| |
| valid_constraint_for_pc = async function(constraint) { |
| console.log(JSON.stringify(constraint)); |
| try { |
| pc = new RTCPeerConnection(null, constraint); |
| return true; |
| } catch (e) { |
| assert_equals(e.name, 'OperationError'); |
| return false; |
| } |
| } |
| |
| promise_test(async t => { |
| assert_true(await causes_sdes(sdes_constraint)); |
| assert_false(await causes_sdes( |
| {'mandatory': {'DtlsSrtpKeyAgreement': true}})); |
| assert_true(await causes_sdes( |
| {'mandatory': {'DtlsSrtpKeyAgreement': 'false'}})); |
| assert_false(await causes_sdes( |
| {'optional': [{'DtlsSrtpKeyAgreement': true}]})); |
| assert_true(await causes_sdes( |
| {'optional': [{'DtlsSrtpKeyAgreement': false}]})); |
| }, 'SDES shows up when expected'); |
| |
| valid_for_pc = function(constraint) { |
| try { |
| pc = new RTCPeerConnection(null, constraint); |
| return true; |
| } catch (e) { |
| return false; |
| } |
| } |
| |
| test(t => { |
| assert_true(valid_for_pc(sdes_constraint)); |
| assert_true(valid_for_pc({'optional': [{'DtlsSrtpKeyAgreement': false}]})); |
| assert_true(valid_for_pc({'optional': [{'DtlsSrtpKeyAgreement': 'false'}]})); |
| assert_false(valid_for_pc({'DtlsSrtpKeyAgreement': false}), |
| 'Modern style constraint is not supported'); |
| }, 'Syntaxes valid for PC are as expected'); |
| |
| |
| </script> |
| </body> |
| </html> |
| |