blob: c06dbda007b3f85e4fe6d50eaacf1a7f55a7b19a [file] [log] [blame]
<!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>