Bug 784519 - Part 4: signalingState mochi tests r=jsmith

This commit is contained in:
Adam Roach [:abr] 2013-05-16 21:47:50 -05:00
parent bae13000e2
commit 4de6844e12
10 changed files with 475 additions and 14 deletions

View File

@ -35,6 +35,13 @@ MOCHITEST_FILES = \
test_peerConnection_offerRequiresReceiveVideo.html \
test_peerConnection_offerRequiresReceiveVideoAudio.html \
test_peerConnection_throwInCallbacks.html \
test_peerConnection_setLocalAnswerInStable.html \
test_peerConnection_setRemoteAnswerInStable.html \
test_peerConnection_setLocalAnswerInHaveLocalOffer.html \
test_peerConnection_setRemoteOfferInHaveLocalOffer.html \
test_peerConnection_setLocalOfferInHaveRemoteOffer.html \
test_peerConnection_setRemoteAnswerInHaveRemoteOffer.html \
test_peerConnection_addCandidateInHaveLocalOffer.html \
test_peerConnection_bug822674.html \
test_peerConnection_bug825703.html \
test_peerConnection_bug827843.html \

View File

@ -182,11 +182,23 @@ function unexpectedCallbackAndFinish(error) {
return function(aObj) {
var where = error.fileName + ":" + error.lineNumber;
if (aObj && aObj.name && aObj.message) {
ok(false, "Unexpected error callback from " + where + " with name = '" +
ok(false, "Unexpected callback/event from " + where + " with name = '" +
aObj.name + "', message = '" + aObj.message + "'");
} else {
ok(false, "Unexpected error callback from " + where + " with " + aObj);
ok(false, "Unexpected callback/event from " + where + " with " + aObj);
}
SimpleTest.finish();
}
}
/**
* Generates a callback function suitable for putting int a success
* callback in circumstances where success is unexpected. The callback,
* if activated, will kill off the test gracefully.
*/
function unexpectedSuccessCallbackAndFinish(error, reason) {
return function() {
unexpectedCallbackAndFinish(error)(message);
}
}

View File

@ -246,10 +246,19 @@ var commandsPeerConnection = [
});
}
],
[
'PC_CHECK_INITIAL_SIGNALINGSTATE',
function (test) {
is(test.pcLocal.signalingState,"stable", "Initial local signalingState is stable");
is(test.pcRemote.signalingState,"stable", "Initial remote signalingState is stable");
test.next();
}
],
[
'PC_LOCAL_CREATE_OFFER',
function (test) {
test.pcLocal.createOffer(function () {
is(test.pcLocal.signalingState, "stable", "Local create offer does not change signaling state");
test.next();
});
}
@ -257,23 +266,24 @@ var commandsPeerConnection = [
[
'PC_LOCAL_SET_LOCAL_DESCRIPTION',
function (test) {
test.pcLocal.setLocalDescription(test.pcLocal._last_offer, function () {
test.next();
});
test.expectStateChange(test.pcLocal, "have-local-offer", test);
test.pcLocal.setLocalDescription(test.pcLocal._last_offer,
test.checkStateInCallback(test.pcLocal, "have-local-offer", test));
}
],
[
'PC_REMOTE_SET_REMOTE_DESCRIPTION',
function (test) {
test.pcRemote.setRemoteDescription(test.pcLocal._last_offer, function () {
test.next();
});
test.expectStateChange(test.pcRemote, "have-remote-offer", test);
test.pcRemote.setRemoteDescription(test.pcLocal._last_offer,
test.checkStateInCallback(test.pcRemote, "have-remote-offer", test));
}
],
[
'PC_REMOTE_CREATE_ANSWER',
function (test) {
test.pcRemote.createAnswer(function () {
is(test.pcRemote.signalingState, "have-remote-offer", "Remote create offer does not change signaling state");
test.next();
});
}
@ -281,17 +291,17 @@ var commandsPeerConnection = [
[
'PC_LOCAL_SET_REMOTE_DESCRIPTION',
function (test) {
test.pcLocal.setRemoteDescription(test.pcRemote._last_answer, function () {
test.next();
});
test.expectStateChange(test.pcLocal, "stable", test);
test.pcLocal.setRemoteDescription(test.pcRemote._last_answer,
test.checkStateInCallback(test.pcLocal, "stable", test));
}
],
[
'PC_REMOTE_SET_LOCAL_DESCRIPTION',
function (test) {
test.pcRemote.setLocalDescription(test.pcRemote._last_answer, function () {
test.next();
});
test.expectStateChange(test.pcRemote, "stable", test);
test.pcRemote.setLocalDescription(test.pcRemote._last_answer,
test.checkStateInCallback(test.pcRemote, "stable", test));
}
],
[
@ -394,6 +404,64 @@ PeerConnectionTest.prototype.teardown = function PCT_teardown() {
SimpleTest.finish();
};
/**
* Sets up the "onsignalingstatechange" handler for the indicated peerconnection
* as a one-shot test. If the test.commandSuccess flag is set when the event
* happens, then the next test in the command chain is triggered. After
* running, this sets the event handler so that it will fail the test if
* it fires again before we expect it. This is intended to be used in
* conjunction with checkStateInCallback, below.
*
* @param {pcw} PeerConnectionWrapper
* The peer connection to expect a state change on
* @param {state} string
* The state that we expect to change to
* @param {test} PeerConnectionTest
* The test strucure currently in use.
*/
PeerConnectionTest.prototype.expectStateChange =
function PCT_expectStateChange(pcw, state, test) {
pcw.signalingChangeEvent = false;
pcw._pc.onsignalingstatechange = function() {
pcw._pc.onsignalingstatechange = unexpectedCallbackAndFinish(new Error);
is(pcw._pc.signalingState, state, pcw.label + ": State is " + state + " in onsignalingstatechange");
pcw.signalingChangeEvent = true;
if (pcw.commandSuccess) {
test.next();
} else {
info("Waiting for success callback...");
}
};
}
/**
* Returns a function, suitable for use as a success callback, that
* checks the signaling state of the PC; and, if the signalingstatechange
* event has already fired, moves on to the next test case. This is
* intended to be used in conjunction with expectStateChange, above.
*
* @param {pcw} PeerConnectionWrapper
* The peer connection to expect a state change on
* @param {state} string
* The state that we expect to change to
* @param {test} PeerConnectionTest
* The test strucure currently in use.
*/
PeerConnectionTest.prototype.checkStateInCallback =
function PCT_checkStateInCallback(pcw, state, test) {
pcw.commandSuccess = false;
return function() {
pcw.commandSuccess = true;
is(pcw.signalingState, state, pcw.label + ": State is " + state + " in success callback");
if (pcw.signalingChangeEvent) {
test.next();
} else {
info("Waiting for signalingstatechange event...");
}
};
}
/**
* This class handles acts as a wrapper around a PeerConnection instance.
@ -420,6 +488,9 @@ function PeerConnectionWrapper(label, configuration) {
// Bug 834835: Assume type is video until we get get{Audio,Video}Tracks.
self.attachMedia(event.stream, 'video', 'remote');
};
// Make sure no signaling state changes are fired until we expect them to
this._pc.onsignalingstatechange = unexpectedCallbackAndFinish(new Error);
}
PeerConnectionWrapper.prototype = {
@ -462,6 +533,15 @@ PeerConnectionWrapper.prototype = {
this._pc.remoteDescription = desc;
},
/**
* Returns the remote signaling state.
*
* @returns {object} The local description
*/
get signalingState() {
return this._pc.signalingState;
},
/**
* Callback when we get media from either side. Also an appropriate
* HTML media element will be created.
@ -571,6 +651,25 @@ PeerConnectionWrapper.prototype = {
}, unexpectedCallbackAndFinish(new Error));
},
/**
* Tries to set the local description and expect failure. Automatically
* causes the test case to fail if the call succeeds.
*
* @param {object} desc
* mozRTCSessionDescription for the local description request
* @param {function} onFailure
* Callback to execute if the call fails.
*/
setLocalDescriptionAndFail : function PCW_setLocalDescriptionAndFail(desc, onFailure) {
var self = this;
this._pc.setLocalDescription(desc,
unexpectedSuccessCallbackAndFinish(new Error, "setLocalDescription should have failed."),
function (err) {
info("As expected, failed to set the local description for " + self.label);
onFailure(err);
});
},
/**
* Sets the remote description and automatically handles the failure case.
*
@ -587,6 +686,62 @@ PeerConnectionWrapper.prototype = {
}, unexpectedCallbackAndFinish(new Error));
},
/**
* Tries to set the remote description and expect failure. Automatically
* causes the test case to fail if the call succeeds.
*
* @param {object} desc
* mozRTCSessionDescription for the remote description request
* @param {function} onFailure
* Callback to execute if the call fails.
*/
setRemoteDescriptionAndFail : function PCW_setRemoteDescriptionAndFail(desc, onFailure) {
var self = this;
this._pc.setRemoteDescription(desc,
unexpectedSuccessCallbackAndFinish(new Error, "setRemoteDescription should have failed."),
function (err) {
info("As expected, failed to set the remote description for " + self.label);
onFailure(err);
});
},
/**
* Adds an ICE candidate and automatically handles the failure case.
*
* @param {object} candidate
* SDP candidate
* @param {function} onSuccess
* Callback to execute if the local description was set successfully
*/
addIceCandidate : function PCW_addIceCandidate(candidate, onSuccess) {
var self = this;
this._pc.addIceCandidate(candidate, function () {
info("Successfully added an ICE candidate to " + self.label);
onSuccess();
}, unexpectedCallbackAndFinish(new Error));
},
/**
* Tries to add an ICE candidate and expects failure. Automatically
* causes the test case to fail if the call succeeds.
*
* @param {object} candidate
* SDP candidate
* @param {function} onFailure
* Callback to execute if the call fails.
*/
addIceCandidateAndFail : function PCW_addIceCandidateAndFail(candidate, onFailure) {
var self = this;
this._pc.addIceCandidate(candidate,
unexpectedSuccessCallbackAndFinish(new Error, "addIceCandidate should have failed."),
function (err) {
info("As expected, failed to add an ICE candidate to " + self.label);
onFailure(err);
}) ;
},
/**
* Checks that we are getting the media we expect.
*

View File

@ -0,0 +1,43 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="head.js"></script>
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
<script type="application/javascript" src="pc.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
createHTML({
bug: "784519",
title: "addCandidate (answer) in 'have-local-offer'"
});
var test;
runTest(function () {
test = new PeerConnectionTest();
test.setMediaConstraints([{audio: true}], [{audio: true}]);
test.chain.removeAfter("PC_LOCAL_SET_LOCAL_DESCRIPTION");
test.chain.append([[
"PC_LOCAL_ADD_CANDIDATE",
function (test) {
test.pcLocal.addIceCandidateAndFail(
mozRTCIceCandidate(
{candidate:"1 1 UDP 2130706431 192.168.2.1 50005 typ host",
sdpMLineIndex: 1}),
function(err) {
is(err.name, "INVALID_STATE", "Error is INVALID_STATE");
test.next();
} );
}
]]);
test.run();
});
</script>
</pre>
</body>
</html>

View File

@ -0,0 +1,41 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="head.js"></script>
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
<script type="application/javascript" src="pc.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
createHTML({
bug: "784519",
title: "setLocalDescription (answer) in 'have-local-offer'"
});
var test;
runTest(function () {
test = new PeerConnectionTest();
test.setMediaConstraints([{audio: true}], [{audio: true}]);
test.chain.removeAfter("PC_LOCAL_SET_LOCAL_DESCRIPTION");
test.chain.append([[
"PC_LOCAL_SET_LOCAL_ANSWER",
function (test) {
test.pcLocal._last_offer.type="answer";
test.pcLocal.setLocalDescriptionAndFail(test.pcLocal._last_offer,
function(err) {
is(err.name, "INVALID_STATE", "Error is INVALID_STATE");
test.next();
} );
}
]]);
test.run();
});
</script>
</pre>
</body>
</html>

View File

@ -0,0 +1,41 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="head.js"></script>
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
<script type="application/javascript" src="pc.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
createHTML({
bug: "784519",
title: "setLocalDescription (answer) in 'stable'"
});
var test;
runTest(function () {
test = new PeerConnectionTest();
test.setMediaConstraints([{audio: true}], [{audio: true}]);
test.chain.removeAfter("PC_LOCAL_CREATE_OFFER");
test.chain.append([[
"PC_LOCAL_SET_LOCAL_ANSWER",
function (test) {
test.pcLocal._last_offer.type="answer";
test.pcLocal.setLocalDescriptionAndFail(test.pcLocal._last_offer,
function(err) {
is(err.name, "INVALID_STATE", "Error is INVALID_STATE");
test.next();
} );
}
]]);
test.run();
});
</script>
</pre>
</body>
</html>

View File

@ -0,0 +1,40 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="head.js"></script>
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
<script type="application/javascript" src="pc.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
createHTML({
bug: "784519",
title: "setLocalDescription (offer) in 'have-remote-offer'"
});
var test;
runTest(function () {
test = new PeerConnectionTest();
test.setMediaConstraints([{audio: true}], [{audio: true}]);
test.chain.removeAfter("PC_REMOTE_SET_REMOTE_DESCRIPTION");
test.chain.append([[
"PC_REMOTE_SET_LOCAL_OFFER",
function (test) {
test.pcRemote.setLocalDescriptionAndFail(test.pcLocal._last_offer,
function(err) {
is(err.name, "INVALID_STATE", "Error is INVALID_STATE");
test.next();
} );
}
]]);
test.run();
});
</script>
</pre>
</body>
</html>

View File

@ -0,0 +1,41 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="head.js"></script>
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
<script type="application/javascript" src="pc.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
createHTML({
bug: "784519",
title: "setRemoteDescription (answer) in 'have-remote-offer'"
});
var test;
runTest(function () {
test = new PeerConnectionTest();
test.setMediaConstraints([{audio: true}], [{audio: true}]);
test.chain.removeAfter("PC_REMOTE_SET_REMOTE_DESCRIPTION");
test.chain.append([[
"PC_REMOTE_SET_REMOTE_ANSWER",
function (test) {
test.pcLocal._last_offer.type="answer";
test.pcRemote.setRemoteDescriptionAndFail(test.pcLocal._last_offer,
function(err) {
is(err.name, "INVALID_STATE", "Error is INVALID_STATE");
test.next();
} );
}
]]);
test.run();
});
</script>
</pre>
</body>
</html>

View File

@ -0,0 +1,41 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="head.js"></script>
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
<script type="application/javascript" src="pc.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
createHTML({
bug: "784519",
title: "setRemoteDescription (answer) in 'stable'"
});
var test;
runTest(function () {
test = new PeerConnectionTest();
test.setMediaConstraints([{audio: true}], [{audio: true}]);
test.chain.removeAfter("PC_LOCAL_CREATE_OFFER");
test.chain.append([[
"PC_LOCAL_SET_REMOTE_ANSWER",
function (test) {
test.pcLocal._last_offer.type="answer";
test.pcLocal.setRemoteDescriptionAndFail(test.pcLocal._last_offer,
function(err) {
is(err.name, "INVALID_STATE", "Error is INVALID_STATE");
test.next();
} );
}
]]);
test.run();
});
</script>
</pre>
</body>
</html>

View File

@ -0,0 +1,40 @@
<!DOCTYPE HTML>
<html>
<head>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="head.js"></script>
<script type="application/javascript" src="mediaStreamPlayback.js"></script>
<script type="application/javascript" src="pc.js"></script>
</head>
<body>
<pre id="test">
<script type="application/javascript">
createHTML({
bug: "784519",
title: "setRemoteDescription (offer) in 'have-local-offer'"
});
var test;
runTest(function () {
test = new PeerConnectionTest();
test.setMediaConstraints([{audio: true}], [{audio: true}]);
test.chain.removeAfter("PC_LOCAL_SET_LOCAL_DESCRIPTION");
test.chain.append([[
"PC_LOCAL_SET_REMOTE_OFFER",
function (test) {
test.pcLocal.setRemoteDescriptionAndFail(test.pcLocal._last_offer,
function(err) {
is(err.name, "INVALID_STATE", "Error is INVALID_STATE");
test.next();
} );
}
]]);
test.run();
});
</script>
</pre>
</body>
</html>