Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(22)

Unified Diff: content/test/data/media/peerconnection-call.html

Issue 11785041: Add content browser tests for PeerConnection DataChannels. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/test/data/media/peerconnection-call.html
diff --git a/content/test/data/media/peerconnection-call.html b/content/test/data/media/peerconnection-call.html
index be3387b2232971266c6c011dc9f660d1305c677a..60a4f3ea1a64fa2ef34d8ffb1d798e4de153e691 100644
--- a/content/test/data/media/peerconnection-call.html
+++ b/content/test/data/media/peerconnection-call.html
@@ -8,16 +8,112 @@
var gFirstConnection = null;
var gSecondConnection = null;
var gTestWithoutMsidAndBundle = false;
-
+
+ // Number of conditions to meet before the test pass. When the test pass, the
+ // document title change to OK.
phoglund_chromium 2013/01/09 12:40:36 I think a better name here is gNumberOfEvents and
perkj_chrome 2013/01/09 13:56:21 Done.
+ var gNumberOfExitConditions = 0;
+
+ // Number of conditions that currently have been met.
+ var gNumberOfExitConditionsMet = 0;
+
+ // Test that we can setup call with an audio and video track.
function call(constraints) {
+ createConnections(null);
navigator.webkitGetUserMedia(constraints, okCallback, failedCallback);
+ waitForVideo($('remote-view'), 320, 240);
}
+ // Test that we can setup call with an audio and video track and
+ // simulate that the remote peer don't support MSID.
function callWithoutMsidAndBundle() {
+ createConnections(null);
gTestWithoutMsidAndBundle = true;
navigator.webkitGetUserMedia({audio:true, video:true}, okCallback,
failedCallback);
+ waitForVideo($('remote-view'), 320, 240);
+ }
+
+ // Test only a data channel.
+ function callWithDataOnly() {
+ createConnections({optional:[{RtpDataChannels: true}]});
+ setupDataChannel();
+ gFirstConnection.createOffer(onOfferCreated);
+ }
+
+ // Test call with audio, video and a data channel.
+ function callWithDataAndMedia() {
+ createConnections({optional:[{RtpDataChannels: true}]});
+ setupDataChannel();
+ navigator.webkitGetUserMedia({audio:true, video:true}, okCallback,
+ failedCallback);
+ waitForVideo($('remote-view'), 320, 240);
}
+
+ // Test call with a data channel and later add audio and video.
+ function callWithDataAndLaterAddMedia() {
+ // TODO(perkj): This is needed for now until
+ // https://code.google.com/p/webrtc/issues/detail?id=1203 is fixed.
+ gTestWithoutMsidAndBundle = true;
+
+ createConnections({optional:[{RtpDataChannels: true}]});
+ setupDataChannel();
+ gFirstConnection.createOffer(onOfferCreated);
+
+ navigator.webkitGetUserMedia({audio:true, video:true}, okCallback,
+ failedCallback);
+ waitForVideo($('remote-view'), 320, 240);
+ }
+
phoglund_chromium 2013/01/09 12:40:36 Perhaps it would be nice to number the events, lik
perkj_chrome 2013/01/09 13:56:21 Done.
+ // Create a data channel on |gFirstConnection| and sends data to
phoglund_chromium 2013/01/09 12:40:36 Nit: line length
perkj_chrome 2013/01/09 13:56:21 Done.
+ // |gSecondConnection|. When data is received on |gSecondConnection| a message
+ // is sent to |gFirstConnection|.
+ // When data is received on |gFirstConnection|, the data
+ // channel is closed again. The test pass when |dataChannel.readyState| has
+ // transitioned to closed after an offer/answer exchange.
+ function setupDataChannel() {
+ var sendDataString = "send some text on a data channel."
+ dataChannel = gFirstConnection.createDataChannel(
+ "sendDataChannel", {reliable : false});
+ expectEquals('connecting', dataChannel.readyState);
+
+ dataChannel.onmessage = function(event) {
+ expectEquals(event.data, sendDataString);
+ dataChannel.close();
+ gFirstConnection.createOffer(onOfferCreated);
+ }
+
+ dataChannel.onopen = function() {
+ expectEquals('open', dataChannel.readyState);
+ dataChannel.send(sendDataString);
+ }
+
+ gSecondConnection.ondatachannel = function (event) {
phoglund_chromium 2013/01/09 12:40:36 This shadows a variable in the outer scope, which
perkj_chrome 2013/01/09 13:56:21 renamed. I would prefer to not break out anyting s
phoglund_chromium 2013/01/09 16:36:45 Ok, fair enough.
+ var dataChannel = event.channel;
+ var messageReceived = false;
+ dataChannel.onmessage = function(event) {
+ expectEquals(event.data, sendDataString);
+ // TODO(perkj): Currently we sometimes can't send a message here since
+ // the the |dataChannel.readyState| has not transitioned to open yet.
+ // http://code.google.com/p/webrtc/issues/detail?id=1262
+ messageReceived = true;
phoglund_chromium 2013/01/09 12:40:36 Hm. Ok, so this whole messageReceived thing is use
perkj_chrome 2013/01/09 13:56:21 Done.
+ if (dataChannel.readyState == "open") {
+ dataChannel.send(sendDataString);
+ }
+ }
+ dataChannel.onopen = function(event) {
+ expectEquals('open', dataChannel.readyState);
+ if (messageReceived) {
+ dataChannel.send(sendDataString);
+ }
+ }
+ }
+
+ addExitCondition();
+ dataChannel.onclose = function() {
+ expectEquals('closed', dataChannel.readyState);
+ testSuccessful();
+ }
+ }
function failedCallback(error) {
document.title = 'getUserMedia request failed with code ' + error.code;
@@ -30,31 +126,33 @@
callUsingStream(localStream);
}
- function callUsingStream(localStream) {
- gFirstConnection = new webkitRTCPeerConnection(null, null);
+ function createConnections(constraints) {
+ gFirstConnection = new webkitRTCPeerConnection(null, constraints);
gFirstConnection.onicecandidate = onIceCandidateToFirst;
+
+ gSecondConnection = new webkitRTCPeerConnection(null, constraints);
+ gSecondConnection.onicecandidate = onIceCandidateToSecond;
+ gSecondConnection.onaddstream = onRemoteStream;
+ }
+
+ function callUsingStream(localStream) {
gFirstConnection.addStream(localStream);
gFirstConnection.createOffer(onOfferCreated);
}
-
+
function onOfferCreated(offer) {
gFirstConnection.setLocalDescription(offer);
-
- receiveCall(offer.sdp);
+ receiveOffer(offer.sdp);
}
-
- function receiveCall(offerSdp) {
+
+ function receiveOffer(offerSdp) {
if (gTestWithoutMsidAndBundle) {
offerSdp = removeMsidAndBundle(offerSdp);
- }
- gSecondConnection = new webkitRTCPeerConnection(null, null);
- gSecondConnection.onicecandidate = onIceCandidateToSecond;
- gSecondConnection.onaddstream = onRemoteStream;
+ }
var parsedOffer = new RTCSessionDescription({ type: 'offer',
sdp: offerSdp });
gSecondConnection.setRemoteDescription(parsedOffer);
-
gSecondConnection.createAnswer(onAnswerCreated);
}
@@ -93,22 +191,20 @@
}
function onRemoteStream(e) {
- var remoteStreamUrl = webkitURL.createObjectURL(e.stream);
- var remoteVideo = $('remote-view');
- remoteVideo.src = remoteStreamUrl;
-
if (gTestWithoutMsidAndBundle && e.stream.label != "default") {
document.title = 'a default remote stream was expected but instead ' +
e.stream.label + ' was received.';
return;
}
-
- waitForVideo(remoteVideo, 320, 240);
+ var remoteStreamUrl = webkitURL.createObjectURL(e.stream);
+ var remoteVideo = $('remote-view');
+ remoteVideo.src = remoteStreamUrl;
}
// TODO(phoglund): perhaps use the video detector in chrome/test/data/webrtc/?
function waitForVideo(videoElement, width, height) {
document.title = 'Waiting for video...';
phoglund_chromium 2013/01/09 12:40:36 Use addExitConditions.
perkj_chrome 2013/01/09 13:56:21 Done.
+ ++gNumberOfExitConditions;
var canvas = $('canvas');
setInterval(function() {
var context = canvas.getContext('2d');
@@ -133,9 +229,27 @@
}
return false;
}
+
+
+ // This function matches |left| and |right| and throws an exception if the
+ // values don't match.
+ function expectEquals(left, right) {
+ if (left != right) {
+ var s = "expectEquals failed left: " + left + " right: " + right;
+ document.title = s;
+ throw s;
+ }
+ }
+ function addExitCondition() {
+ ++gNumberOfExitConditions;
+ }
+
function testSuccessful() {
phoglund_chromium 2013/01/09 12:40:36 Why is testSuccessful an exit condition?...
perkj_chrome 2013/01/09 13:56:21 Renamed to exitConditionMet. This is called when a
- document.title = 'OK';
+ ++gNumberOfExitConditionsMet;
+ if (gNumberOfExitConditionsMet == gNumberOfExitConditions) {
+ document.title = 'OK';
+ }
}
</script>
</head>

Powered by Google App Engine
This is Rietveld 408576698