blob: cac37f078a704f8450e0f6b021046b5a53386eaa [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<script src="../../resources/js-test-pre.js"></script>
<script src="resources/promise-utils.js"></script>
</head>
<body>
<script>
if (window.internals)
internals.useMockRTCPeerConnectionFactory("");
var stream;
var remotePcAudioTrack;
var remotePcVideoTrack;
var remotePcAudioTransceiver;
var remotePcVideoTransceiver;
var remoteOffer1;
var remoteOffer2;
var trackEvent;
var mediaTypes = ["Audio", "Video"];
description("Test RTCPeerConnection.setRemoteDescription called with an RTCSessionDescription of type 'offer'");
if (window.testRunner)
testRunner.setUserMediaPermission(true);
else {
debug("This test can not be run without the testRunner");
finishJSTest();
}
var pc = new RTCPeerConnection({iceServers:[{urls:'stun:foo.com'}]});
var remotePc = new RTCPeerConnection({iceServers:[{urls:'stun:foo.com'}]});
function testRemoteTrack(evt, mediaType) {
trackEvent = evt;
var remotePcTrackName = `remotePc${mediaType}Track`;
debug("*** 'track' event must fire before setRemoteDescription promise is fulfilled");
debug("*** Check track event properties");
shouldBeTrue("pc.getReceivers().includes(trackEvent.receiver)");
shouldBeTrue("pc.getTransceivers().includes(trackEvent.transceiver)");
debug("*** Remote track should be muted initially");
shouldBeTrue("trackEvent.track.muted");
debug("*** Remote track properties should match track added at remote side (remotePc)");
shouldBe("trackEvent.track.kind", `${remotePcTrackName}.kind`);
shouldBe("trackEvent.track.id", `${remotePcTrackName}.id`);
shouldBe("trackEvent.track.label", `'remote ${mediaType.toLocaleLowerCase()}'`);
debug("*** Check local and remote transceivers");
shouldBe("trackEvent.transceiver.mid", `remotePc${mediaType}Transceiver.mid`);
debug("");
}
pc.ontrack = function (evt) {
testRemoteTrack(evt, mediaTypes.shift());
};
navigator.mediaDevices.getUserMedia({ "audio": true, "video": true })
.then(function (s) {
stream = s;
remotePcAudioTrack = stream.getAudioTracks()[0];
remotePcVideoTrack = stream.getVideoTracks()[0];
debug("*** Create (remote) offer with audio (remoteOffer1)");
remotePc.addTrack(remotePcAudioTrack, stream);
remotePcAudioTransceiver = remotePc.getTransceivers()[0];
return remotePc.createOffer();
})
.then(function (remoteOfferArg) {
remoteOffer1 = remoteOfferArg;
return remotePc.setLocalDescription(remoteOffer1);
})
.then(function () {
debug("*** Done, start testing with remoteOffer1");
shouldBe("pc.signalingState", "'stable'");
shouldBeNull("pc.remoteDescription");
shouldBeNull("pc.pendingRemoteDescription");
shouldBeNull("pc.currentRemoteDescription");
debug("");
return pc.setRemoteDescription(remoteOffer1);
})
.then(function () {
testPassed("remoteOffer1 set as remote description");
shouldBe("pc.signalingState", "'have-remote-offer'");
shouldBe("pc.remoteDescription", "remoteOffer1");
shouldBe("pc.pendingRemoteDescription", "remoteOffer1");
shouldBeNull("pc.currentRemoteDescription");
debug("");
return pc.setRemoteDescription(remoteOffer1);
})
.then(function () {
testPassed("remoteOffer1 set as remote description (again)");
shouldBe("pc.signalingState", "'have-remote-offer'");
debug("");
debug("*** Try setting local descriptions with bad types for the current state");
return promiseShouldReject("pc.setRemoteDescription({type:'answer', sdp:remoteOffer1.sdp});");
})
.then(function () {
return promiseShouldReject("pc.setRemoteDescription({type:'pranswer', sdp:remoteOffer1.sdp});");
})
.then(function () {
debug("");
debug("*** Create (remote) offer with video (remoteOffer2)");
var sender = remotePc.addTrack(remotePcVideoTrack, stream);
// Order of transceivers is undefined so we need to match it with the sender.
var transceivers = remotePc.getTransceivers();
remotePcVideoTransceiver = transceivers[1].sender == sender ? transceivers[1] : transceivers[0];
return remotePc.createOffer();
})
.then(function (remoteOfferArg) {
remoteOffer2 = remoteOfferArg;
return remotePc.setLocalDescription(remoteOffer2);
})
.then(function () {
debug("*** Done, start testing with remoteOffer2");
shouldBe("pc.signalingState", "'have-remote-offer'");
debug("");
return pc.setRemoteDescription(remoteOffer2);
})
.then(function () {
testPassed("remoteOffer2 set as remote description");
shouldBe("pc.signalingState", "'have-remote-offer'");
shouldBe("pc.remoteDescription", "remoteOffer2");
shouldBe("pc.pendingRemoteDescription", "remoteOffer2");
shouldBeNull("pc.currentRemoteDescription");
debug("");
finishJSTest();
})
.catch(function (error) {
testFailed("Error in promise chain: " + error);
finishJSTest();
});
window.jsTestIsAsync = true;
window.successfullyParsed = true;
</script>
<script src="../../resources/js-test-post.js"></script>
</body>
</html>