Chromium Code Reviews| 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..25b42566f63fd9e961b5eb3717a102acf869b8d8 100644 |
| --- a/content/test/data/media/peerconnection-call.html |
| +++ b/content/test/data/media/peerconnection-call.html |
| @@ -8,15 +8,116 @@ |
| var gFirstConnection = null; |
| var gSecondConnection = null; |
| var gTestWithoutMsidAndBundle = false; |
| - |
| + |
| + // Number of test events to occur before the test pass. When the test pass, |
| + // the document title change to OK. |
| + var gNumberOfExpectedEvents = 0; |
| + |
| + // Number of events that currently have occured. |
| + var gNumberOfEvents = 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); |
| + } |
| + |
| + // This function is used for setting up a test that: |
|
phoglund_chromium
2013/01/09 16:36:45
Nit: Creates
perkj_chrome
2013/01/10 09:53:39
Done.
|
| + // 1. Create a data channel on |gFirstConnection| and sends data to |
| + // |gSecondConnection|. |
| + // 2. When data is received on |gSecondConnection| a message |
| + // is sent to |gFirstConnection|. |
| + // 3. When data is received on |gFirstConnection|, the data |
|
phoglund_chromium
2013/01/09 16:36:45
Nit: passes
perkj_chrome
2013/01/10 09:53:39
Done.
|
| + // channel is closed. The test pass when the state transition completes. |
| + function setupDataChannel() { |
| + var sendDataString = "send some text on a data channel." |
| + firstDataChannel = gFirstConnection.createDataChannel( |
| + "sendDataChannel", {reliable : false}); |
| + expectEquals('connecting', firstDataChannel.readyState); |
| + |
|
phoglund_chromium
2013/01/09 16:36:45
Nit: line length
|
| + // When |firstDataChannel| transition to open state, send a text string. |
| + firstDataChannel.onopen = function() { |
| + expectEquals('open', firstDataChannel.readyState); |
| + firstDataChannel.send(sendDataString); |
| + } |
| + |
| + // When |firstDataChannel| receive a message, close the channel and |
| + // initiate a new offer/answer exchange to complete the closure. |
| + firstDataChannel.onmessage = function(event) { |
| + expectEquals(event.data, sendDataString); |
| + firstDataChannel.close(); |
| + gFirstConnection.createOffer(onOfferCreated); |
| + } |
| + |
| + // When |firstDataChannel| transition to closed state, the test pass. |
| + addExitCondition(); |
| + firstDataChannel.onclose = function() { |
| + expectEquals('closed', firstDataChannel.readyState); |
| + exitConditionMet(); |
| + } |
| + |
|
phoglund_chromium
2013/01/09 16:36:45
Nit: line length
|
| + // Event handler for when |gSecondConnection| receive a new dataChannel. |
| + gSecondConnection.ondatachannel = function (event) { |
| + var secondDataChannel = event.channel; |
| + |
| + // When |secondDataChannel| receive a message, send a message back. |
| + secondDataChannel.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 |
| + if (secondDataChannel.readyState == "open") { |
| + secondDataChannel.send(sendDataString); |
| + } else { |
| + secondDataChannel.onopen = function(event) { |
| + expectEquals('open', secondDataChannel.readyState); |
| + secondDataChannel.send(sendDataString); |
| + } |
| + } |
| + } |
| + } |
| } |
| function failedCallback(error) { |
| @@ -30,31 +131,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 +196,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...'; |
| + addExitCondition(); |
| var canvas = $('canvas'); |
| setInterval(function() { |
| var context = canvas.getContext('2d'); |
| @@ -116,7 +217,7 @@ |
| var pixels = context.getImageData(0, 0, width, height).data; |
| if (isVideoPlaying(pixels, width, height)) |
| - testSuccessful(); |
| + exitConditionMet(); |
| }, 100); |
| } |
| @@ -133,9 +234,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; |
| + } |
| + } |
|
phoglund_chromium
2013/01/09 16:36:45
Nit: rename to eventOccurred or something more sui
perkj_chrome
2013/01/10 09:53:39
addExpectedEvent and eventOccured ?
|
| - function testSuccessful() { |
| - document.title = 'OK'; |
| + function addExitCondition() { |
| + ++gNumberOfExpectedEvents; |
| + } |
| + |
| + function exitConditionMet() { |
| + ++gNumberOfEvents; |
| + if (gNumberOfEvents == gNumberOfExpectedEvents) { |
| + document.title = 'OK'; |
| + } |
| } |
| </script> |
| </head> |