summaryrefslogtreecommitdiffstats
path: root/dom/media/webrtc/tests/mochitests/test_peerConnection_sender_and_receiver_stats.html
diff options
context:
space:
mode:
Diffstat (limited to 'dom/media/webrtc/tests/mochitests/test_peerConnection_sender_and_receiver_stats.html')
-rw-r--r--dom/media/webrtc/tests/mochitests/test_peerConnection_sender_and_receiver_stats.html73
1 files changed, 73 insertions, 0 deletions
diff --git a/dom/media/webrtc/tests/mochitests/test_peerConnection_sender_and_receiver_stats.html b/dom/media/webrtc/tests/mochitests/test_peerConnection_sender_and_receiver_stats.html
new file mode 100644
index 0000000000..72749e8c50
--- /dev/null
+++ b/dom/media/webrtc/tests/mochitests/test_peerConnection_sender_and_receiver_stats.html
@@ -0,0 +1,73 @@
+<!DOCTYPE HTML>
+<html>
+<head>
+ <script type="application/javascript" src="pc.js"></script>
+ <script type="application/javascript" src="stats.js"></script>
+</head>
+<body>
+<pre id="test">
+<script type="application/javascript">
+ createHTML({
+ bug: "1355220",
+ title: "RTCRtpSender.getStats() and RTCRtpReceiver.getStats()",
+ visible: true
+ });
+
+ const checkStats = (sndReport, rcvReport, kind) => {
+ ok(sndReport instanceof window.RTCStatsReport, "sender stats are a RTCStatsReport");
+ ok(rcvReport instanceof window.RTCStatsReport, "receiver stats are a RTCStatsReport");
+ // Returns SSRCs and performs some checks
+ let getSsrcs = (report, kind) => {
+ return [...report.values()]
+ .filter(stat => stat.type.endsWith("bound-rtp")).map(stat =>{
+ isnot(parseInt(stat.id, 16), NaN,
+ `id ${stat.id} is an opaque (hex) number`);
+ is(stat.kind, kind, "kind of " + stat.id
+ + " is expected type " + kind);
+ return stat.ssrc;
+ }).sort().join("|");
+ };
+ let sndSsrcs = getSsrcs(sndReport, kind);
+ let rcvSsrcs = getSsrcs(rcvReport, kind);
+ ok(sndSsrcs, "sender SSRCs is not empty");
+ ok(rcvSsrcs, "receiver SSRCs is not empty");
+ is(sndSsrcs, rcvSsrcs, "sender SSRCs match receiver SSRCs");
+ };
+
+ // This MUST be run after PC_*_WAIT_FOR_MEDIA_FLOW to ensure that we have RTP
+ // before checking for RTCP.
+ // It will throw UnsyncedRtcpError if it times out waiting for sync.
+
+ runNetworkTest(function (options) {
+ test = new PeerConnectionTest(options);
+ test.chain.insertAfter("PC_REMOTE_WAIT_FOR_MEDIA_FLOW",
+ async function PC_LOCAL_AND_REMOTE_CHECK_SENDER_RECEIVER_STATS(test) {
+ await Promise.all([
+ waitForSyncedRtcp(test.pcLocal._pc),
+ waitForSyncedRtcp(test.pcRemote._pc),
+ ]);
+ let senders = test.pcLocal.getSenders();
+ let receivers = test.pcRemote.getReceivers();
+ is(senders.length, 2, "Have exactly two senders.");
+ is(receivers.length, 2, "Have exactly two receivers.");
+ for(let kind of ["audio", "video"]) {
+ let senderStats =
+ await senders.find(s => s.track.kind == kind).getStats();
+ is(senders.filter(s => s.track.kind == kind).length, 1,
+ "Exactly 1 sender of kind " + kind);
+ let receiverStats =
+ await receivers.find(r => r.track.kind == kind).getStats();
+ is(receivers.filter(r => r.track.kind == kind).length, 1,
+ "Exactly 1 receiver of kind " + kind);
+
+ checkStats(senderStats, receiverStats, kind);
+ }
+ }
+ );
+ test.setMediaConstraints([{audio: true}, {video: true}], []);
+ return test.run();
+ });
+</script>
+</pre>
+</body>
+</html>