diff options
Diffstat (limited to 'testing/web-platform/tests/webrtc/getstats.html')
-rw-r--r-- | testing/web-platform/tests/webrtc/getstats.html | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/getstats.html b/testing/web-platform/tests/webrtc/getstats.html new file mode 100644 index 0000000000..d6a692bb78 --- /dev/null +++ b/testing/web-platform/tests/webrtc/getstats.html @@ -0,0 +1,130 @@ +<!doctype html> +<!-- +This test uses data only, and thus does not require fake media devices. +--> + +<html> +<head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + <title>RTCPeerConnection GetStats</title> +</head> +<body> + <div id="log"></div> + <h2>Retrieved stats info</h2> + <pre> + <input type="button" onclick="showStats()" value="Show stats"></input> + <div id="stats"> + </div> + </pre> + + <!-- These files are in place when executing on W3C. --> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script type="text/javascript"> + var test = async_test('Can get stats from a basic WebRTC call.'); + var statsToShow; + var gFirstConnection = null; + var gSecondConnection = null; + + var onIceCandidateToFirst = test.step_func(function(event) { + gSecondConnection.addIceCandidate(event.candidate); + }); + + var onIceCandidateToSecond = test.step_func(function(event) { + gFirstConnection.addIceCandidate(event.candidate); + }); + + var getStatsRecordByType = function(stats, type) { + for (let stat of stats.values()) { + if (stat.type == type) { + return stat; + } + } + return null; + } + + var onIceConnectionStateChange = test.step_func(function(event) { + // Wait until connection is established. + // Note - not all browsers reach 'completed' state, so we're + // checking for 'connected' state instead. + if (gFirstConnection.iceConnectionState != 'connected') { + return; + } + gFirstConnection.getStats() + .then(function(report) { + let reportDictionary = {}; + for (let stats of report.values()) { + reportDictionary[stats.id] = stats; + } + statsToShow = JSON.stringify(reportDictionary, null, 2); + // Check the stats properties. + assert_not_equals(report, null, 'No report'); + let sessionStat = getStatsRecordByType(report, 'peer-connection'); + assert_not_equals(sessionStat, null, 'Did not find peer-connection stats'); + assert_own_property(sessionStat, 'dataChannelsOpened', 'no dataChannelsOpened stat'); + // Once every 4000 or so tests, the datachannel won't be opened when the getStats + // function is done, so allow both 0 and 1 datachannels. + assert_true(sessionStat.dataChannelsOpened == 1 || sessionStat.dataChannelsOpened == 0, + 'dataChannelsOpened count wrong'); + test.done(); + }) + .catch(test.step_func(function(e) { + assert_unreached(e.name + ': ' + e.message + ': '); + })); + }); + + // This function starts the test. + test.step(function() { + gFirstConnection = new RTCPeerConnection(null); + test.add_cleanup(() => gFirstConnection.close()); + gFirstConnection.onicecandidate = onIceCandidateToFirst; + gFirstConnection.oniceconnectionstatechange = onIceConnectionStateChange; + + gSecondConnection = new RTCPeerConnection(null); + test.add_cleanup(() => gSecondConnection.close()); + gSecondConnection.onicecandidate = onIceCandidateToSecond; + + // The createDataChannel is necessary and sufficient to make + // sure the ICE connection be attempted. + gFirstConnection.createDataChannel('channel'); + var atStep = 'Create offer'; + + gFirstConnection.createOffer() + .then(function(offer) { + atStep = 'Set local description at first'; + return gFirstConnection.setLocalDescription(offer); + }) + .then(function() { + atStep = 'Set remote description at second'; + return gSecondConnection.setRemoteDescription( + gFirstConnection.localDescription); + }) + .then(function() { + atStep = 'Create answer'; + return gSecondConnection.createAnswer(); + }) + .then(function(answer) { + atStep = 'Set local description at second'; + return gSecondConnection.setLocalDescription(answer); + }) + .then(function() { + atStep = 'Set remote description at first'; + return gFirstConnection.setRemoteDescription( + gSecondConnection.localDescription); + }) + .catch(test.step_func(function(e) { + assert_unreached('Error ' + e.name + ': ' + e.message + + ' happened at step ' + atStep); + })); + }); + + function showStats() { + // Show the retrieved stats info + var showStats = document.getElementById('stats'); + showStats.innerHTML = statsToShow; + } + +</script> + +</body> +</html> |