164 lines
6.3 KiB
HTML
164 lines
6.3 KiB
HTML
<!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>
|