webrtc_m130/pc/rtcstats_integrationtest.cc
Max Morin 8ddc2e6258 Revert "Add hugeFramesSent GetStats metric"
This reverts commit f9f71b91ae073fdd2b89ff9df1204835aa3137eb.

Reason for revert: Looks like it's breaking WebRtcBrowserTest.RunsAudioVideoWebRTCCallInTwoTabsGetStatsPromise, see https://ci.chromium.org/buildbot/chromium.webrtc.fyi/Mac%20Tester/48322 (win and lin testers are also failing on the same test).

[ RUN      ] WebRtcBrowserTest.RunsAudioVideoWebRTCCallInTwoTabsGetStatsPromise
[12743:4099:0305/082149.300326:WARNING:notification_platform_bridge_mac.mm(510)] AlertNotificationService: XPC connection invalidated.
[12743:88323:0305/082150.773242:WARNING:embedded_test_server.cc(228)] Request not handled. Returning 404: /favicon.ico
[12743:775:0305/082150.774044:INFO:CONSOLE(13)] "Requesting doGetUserMedia: constraints: {"audio":true,"video":true}", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082150.969262:INFO:CONSOLE(13)] "Returning request-callback-granted to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082150.983959:INFO:CONSOLE(13)] "Returning ok-got-stream to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.741587:INFO:CONSOLE(13)] "Requesting doGetUserMedia: constraints: {"audio":true,"video":true}", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.749225:INFO:CONSOLE(13)] "Returning request-callback-granted to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.754982:INFO:CONSOLE(13)] "Returning ok-got-stream to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.761516:INFO:CONSOLE(13)] "Returning ok-peerconnection-created to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12752:775:0305/082151.762047:WARNING:RTCPeerConnection.cpp(1151)] mediaConstraints is not a supported argument to addStream.
[12752:775:0305/082151.762096:WARNING:RTCPeerConnection.cpp(1153)] mediaConstraints was
[12743:775:0305/082151.762953:INFO:CONSOLE(13)] "Added local stream.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.763010:INFO:CONSOLE(13)] "Returning ok-added to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.767078:INFO:CONSOLE(13)] "Returning ok-peerconnection-created to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12755:775:0305/082151.767614:WARNING:RTCPeerConnection.cpp(1151)] mediaConstraints is not a supported argument to addStream.
[12755:775:0305/082151.767660:WARNING:RTCPeerConnection.cpp(1153)] mediaConstraints was
[12743:775:0305/082151.768452:INFO:CONSOLE(13)] "Added local stream.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.768523:INFO:CONSOLE(13)] "Returning ok-added to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.776171:INFO:CONSOLE(13)] "Returning ok-created to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.777197:INFO:CONSOLE(13)] "Returning ok-created to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12752:42755:0305/082151.777736:WARNING:mediasession.cc(353)] Duplicate id found. Reassigning from 104 to 127
[12752:42755:0305/082151.777766:WARNING:mediasession.cc(353)] Duplicate id found. Reassigning from 106 to 125
[12752:42755:0305/082151.777829:WARNING:mediasession.cc(353)] Duplicate id found. Reassigning from 103 to 124
[12752:42755:0305/082151.777850:WARNING:mediasession.cc(353)] Duplicate id found. Reassigning from 105 to 123
[12743:775:0305/082151.778835:INFO:CONSOLE(13)] "createOffer(): success.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.779780:INFO:CONSOLE(13)] "Returning ok-{"type":"offer","sdp":"v=0\r\no=- 3491235150284933882 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video data\r\na=msid-semantic: WMS Nb7epCcAUJwMKKzTV36r1RGOlNSIxBooVpgU\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:ySYi\r\na=ice-pwd:5E4b4cjl+QFLqPoIgvleZ4m4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 94:ED:E9:BB:45:FF:BE:85:C2:98:E5:45:3A:AB:A9:4B:3B:F0:04:D7:B1:05:45:E9:6D:14:3C:FE:62:5C:23:03\r\na=setup:actpass\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3632917417 cname:J9N+OjIJeArKjXXh\r\na=ssrc:3632917417 msid:Nb7epCcAUJwMKKzTV36r1RGOlNSIxBooVpgU 6e608085-751b-4945-8982-6f4aedf7bef6\r\na=ssrc:3632917417 mslabel:Nb7epCcAUJwMKKzTV36r1RGOlNSIxBooVpgU\r\na=ssrc:3632917417 label:6e608085-751b-4945-8982-6f4aedf7bef6\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 124 127 123 125 107 108\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:ySYi\r\na=ice-pwd:5E4b4cjl+QFLqPoIgvleZ4m4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 94:ED:E9:BB:45:FF:BE:85:C2:98:E5:45:3A:AB:A9:4B:3B:F0:04:D7:B1:05:45:E9:6D:14:3C:FE:62:5C:23:03\r\na=setup:actpass\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=sendrecv\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=420032\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=127\r\na=rtpmap:125 red/90000\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 ulpfec/90000\r\na=ssrc-group:FID 1955312265 3021315394\r\na=ssrc:1955312265 cname:J9N+OjIJeArKjXXh\r\na=ssrc:1955312265 msid:Nb7epCcAUJwMKKzTV36r1RGOlNSIxBooVpgU 7cd84f82-8fa1-42ca-b0ac-326aa0925f05\r\na=ssrc:1955312265 mslabel:Nb7epCcAUJwMKKzTV36r1RGOlNSIxBooVpgU\r\na=ssrc:1955312265 label:7cd84f82-8fa1-42ca-b0ac-326aa0925f05\r\na=ssrc:3021315394 cname:J9N+OjIJeArKjXXh\r\na=ssrc:3021315394 msid:Nb7epCcAUJwMKKzTV36r1RGOlNSIxBooVpgU 7cd84f82-8fa1-42ca-b0ac-326aa0925f05\r\na=ssrc:3021315394 mslabel:Nb7epCcAUJwMKKzTV36r1RGOlNSIxBooVpgU\r\na=ssrc:3021315394 label:7cd84f82-8fa1-42ca-b0ac-326aa0925f05\r\nm=application 9 DTLS/SCTP 5000\r\nc=IN IP4 0.0.0.0\r\na=ice-ufrag:ySYi\r\na=ice-pwd:5E4b4cjl+QFLqPoIgvleZ4m4\r\na=ice-options:trickle\r\na=fingerprint:sha-256 94:ED:E9:BB:45:FF:BE:85:C2:98:E5:45:3A:AB:A9:4B:3B:F0:04:D7:B1:05:45:E9:6D:14:3C:FE:62:5C:23:03\r\na=setup:actpass\r\na=mid:data\r\na=sctpmap:5000 webrtc-datachannel 1024\r\n"} to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.781514:INFO:CONSOLE(13)] "setLocalDescription(): success.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12755:41731:0305/082151.782411:WARNING:channel.cc(1039)] Trying to cache the Absolute Send Time extension id but the SRTP is not active.
[12752:43011:0305/082151.884258:WARNING:p2ptransportchannel.cc(638)] Jingle:Port[0x7fab620da600:audio:1:0:local:Net[en0:192.168.195.x/24:Ethernet]]: SetOption(5, 0) failed: 0
[12752:43011:0305/082151.884438:WARNING:p2ptransportchannel.cc(638)] Jingle:Port[0x7fab620dd000:video:1:0:local:Net[en0:192.168.195.x/24:Ethernet]]: SetOption(1, 65536) failed: 0
[12752:43011:0305/082151.884481:WARNING:p2ptransportchannel.cc(638)] Jingle:Port[0x7fab620dd000:video:1:0:local:Net[en0:192.168.195.x/24:Ethernet]]: SetOption(2, 65536) failed: 0
[12752:43011:0305/082151.884513:WARNING:p2ptransportchannel.cc(638)] Jingle:Port[0x7fab620dd000:video:1:0:local:Net[en0:192.168.195.x/24:Ethernet]]: SetOption(5, 0) failed: 0
[12755:41731:0305/082151.922410:WARNING:channel.cc(1039)] Trying to cache the Absolute Send Time extension id but the SRTP is not active.
[12743:775:0305/082151.924626:INFO:CONSOLE(13)] "createAnswer(): success.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.925506:INFO:CONSOLE(13)] "Returning ok-{"type":"answer","sdp":"v=0\r\no=- 6096510228474213355 2 IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\na=group:BUNDLE audio video data\r\na=msid-semantic: WMS 7RUsJxsD5w2UmR1xiHiKSWHyYY8RVKSGT8hN\r\nm=audio 9 UDP/TLS/RTP/SAVPF 111 103 104 9 0 8 106 105 13 110 112 113 126\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:X54X\r\na=ice-pwd:VsLK5tJ8so82vOn1y+R72WBi\r\na=ice-options:trickle\r\na=fingerprint:sha-256 EC:A9:2D:A2:D9:44:F0:A4:EE:58:FC:32:DF:C4:8C:B0:FC:25:C3:08:BE:7E:D7:59:B8:A0:20:16:DA:5A:A5:7F\r\na=setup:active\r\na=mid:audio\r\na=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level\r\na=sendrecv\r\na=rtcp-mux\r\na=rtpmap:111 opus/48000/2\r\na=rtcp-fb:111 transport-cc\r\na=fmtp:111 minptime=10;useinbandfec=1\r\na=rtpmap:103 ISAC/16000\r\na=rtpmap:104 ISAC/32000\r\na=rtpmap:9 G722/8000\r\na=rtpmap:0 PCMU/8000\r\na=rtpmap:8 PCMA/8000\r\na=rtpmap:106 CN/32000\r\na=rtpmap:105 CN/16000\r\na=rtpmap:13 CN/8000\r\na=rtpmap:110 telephone-event/48000\r\na=rtpmap:112 telephone-event/32000\r\na=rtpmap:113 telephone-event/16000\r\na=rtpmap:126 telephone-event/8000\r\na=ssrc:3234277340 cname:PfS0qqt1exijuETX\r\na=ssrc:3234277340 msid:7RUsJxsD5w2UmR1xiHiKSWHyYY8RVKSGT8hN 9ddb9a77-20aa-42ba-8540-9e32f3dbb0af\r\na=ssrc:3234277340 mslabel:7RUsJxsD5w2UmR1xiHiKSWHyYY8RVKSGT8hN\r\na=ssrc:3234277340 label:9ddb9a77-20aa-42ba-8540-9e32f3dbb0af\r\nm=video 9 UDP/TLS/RTP/SAVPF 96 97 98 99 100 101 102 124 127 123 125 107 108\r\nc=IN IP4 0.0.0.0\r\na=rtcp:9 IN IP4 0.0.0.0\r\na=ice-ufrag:X54X\r\na=ice-pwd:VsLK5tJ8so82vOn1y+R72WBi\r\na=ice-options:trickle\r\na=fingerprint:sha-256 EC:A9:2D:A2:D9:44:F0:A4:EE:58:FC:32:DF:C4:8C:B0:FC:25:C3:08:BE:7E:D7:59:B8:A0:20:16:DA:5A:A5:7F\r\na=setup:active\r\na=mid:video\r\na=extmap:2 urn:ietf:params:rtp-hdrext:toffset\r\na=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\r\na=extmap:4 urn:3gpp:video-orientation\r\na=extmap:5 http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\r\na=extmap:6 http://www.webrtc.org/experiments/rtp-hdrext/playout-delay\r\na=extmap:7 http://www.webrtc.org/experiments/rtp-hdrext/video-content-type\r\na=extmap:8 http://www.webrtc.org/experiments/rtp-hdrext/video-timing\r\na=sendrecv\r\na=rtcp-mux\r\na=rtcp-rsize\r\na=rtpmap:96 VP8/90000\r\na=rtcp-fb:96 goog-remb\r\na=rtcp-fb:96 transport-cc\r\na=rtcp-fb:96 ccm fir\r\na=rtcp-fb:96 nack\r\na=rtcp-fb:96 nack pli\r\na=rtpmap:97 rtx/90000\r\na=fmtp:97 apt=96\r\na=rtpmap:98 VP9/90000\r\na=rtcp-fb:98 goog-remb\r\na=rtcp-fb:98 transport-cc\r\na=rtcp-fb:98 ccm fir\r\na=rtcp-fb:98 nack\r\na=rtcp-fb:98 nack pli\r\na=rtpmap:99 rtx/90000\r\na=fmtp:99 apt=98\r\na=rtpmap:100 H264/90000\r\na=rtcp-fb:100 goog-remb\r\na=rtcp-fb:100 transport-cc\r\na=rtcp-fb:100 ccm fir\r\na=rtcp-fb:100 nack\r\na=rtcp-fb:100 nack pli\r\na=fmtp:100 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=420032\r\na=rtpmap:101 rtx/90000\r\na=fmtp:101 apt=100\r\na=rtpmap:102 H264/90000\r\na=rtcp-fb:102 goog-remb\r\na=rtcp-fb:102 transport-cc\r\na=rtcp-fb:102 ccm fir\r\na=rtcp-fb:102 nack\r\na=rtcp-fb:102 nack pli\r\na=fmtp:102 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=4d0032\r\na=rtpmap:124 rtx/90000\r\na=fmtp:124 apt=102\r\na=rtpmap:127 H264/90000\r\na=rtcp-fb:127 goog-remb\r\na=rtcp-fb:127 transport-cc\r\na=rtcp-fb:127 ccm fir\r\na=rtcp-fb:127 nack\r\na=rtcp-fb:127 nack pli\r\na=fmtp:127 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=640032\r\na=rtpmap:123 rtx/90000\r\na=fmtp:123 apt=127\r\na=rtpmap:125 red/90000\r\na=rtpmap:107 rtx/90000\r\na=fmtp:107 apt=125\r\na=rtpmap:108 ulpfec/90000\r\na=ssrc-group:FID 3517790794 302440277\r\na=ssrc:3517790794 cname:PfS0qqt1exijuETX\r\na=ssrc:3517790794 msid:7RUsJxsD5w2UmR1xiHiKSWHyYY8RVKSGT8hN 2ffa90e8-b71e-463b-a105-d5a65e0ac205\r\na=ssrc:3517790794 mslabel:7RUsJxsD5w2UmR1xiHiKSWHyYY8RVKSGT8hN\r\na=ssrc:3517790794 label:2ffa90e8-b71e-463b-a105-d5a65e0ac205\r\na=ssrc:302440277 cname:PfS0qqt1exijuETX\r\na=ssrc:302440277 msid:7RUsJxsD5w2UmR1xiHiKSWHyYY8RVKSGT8hN 2ffa90e8-b71e-463b-a105-d5a65e0ac205\r\na=ssrc:302440277 mslabel:7RUsJxsD5w2UmR1xiHiKSWHyYY8RVKSGT8hN\r\na=ssrc:302440277 label:2ffa90e8-b71e-463b-a105-d5a65e0ac205\r\nm=application 9 DTLS/SCTP 5000\r\nc=IN IP4 0.0.0.0\r\nb=AS:30\r\na=ice-ufrag:X54X\r\na=ice-pwd:VsLK5tJ8so82vOn1y+R72WBi\r\na=ice-options:trickle\r\na=fingerprint:sha-256 EC:A9:2D:A2:D9:44:F0:A4:EE:58:FC:32:DF:C4:8C:B0:FC:25:C3:08:BE:7E:D7:59:B8:A0:20:16:DA:5A:A5:7F\r\na=setup:active\r\na=mid:data\r\na=sctpmap:5000 webrtc-datachannel 1024\r\n"} to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.925954:INFO:CONSOLE(13)] "Receiving remote stream...", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.926204:INFO:CONSOLE(13)] "setRemoteDescription(): success.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.939935:INFO:CONSOLE(13)] "Returning ok-verified to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.940232:INFO:CONSOLE(13)] "setLocalDescription(): success.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12752:43011:0305/082151.942049:WARNING:p2ptransportchannel.cc(1093)] SetOption(1, 65536) failed: 0
[12752:43011:0305/082151.942084:WARNING:p2ptransportchannel.cc(1093)] SetOption(2, 65536) failed: 0
[12743:775:0305/082151.946009:INFO:CONSOLE(13)] "Receiving remote stream...", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.946327:INFO:CONSOLE(13)] "setRemoteDescription(): success.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.946367:INFO:CONSOLE(13)] "Returning ok-accepted-answer to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082151.950048:INFO:CONSOLE(368)] "Still ICE gathering - waiting...", source: http://127.0.0.1:50666/webrtc/peerconnection.js (368)
[12755:41731:0305/082152.030690:WARNING:p2ptransportchannel.cc(638)] Jingle:Port[0x7f8a9c809a00:audio:1:0:local:Net[en0:192.168.195.x/24:Ethernet]]: SetOption(1, 65536) failed: 0
[12755:41731:0305/082152.030759:WARNING:p2ptransportchannel.cc(638)] Jingle:Port[0x7f8a9c809a00:audio:1:0:local:Net[en0:192.168.195.x/24:Ethernet]]: SetOption(2, 65536) failed: 0
[12755:41731:0305/082152.030785:WARNING:p2ptransportchannel.cc(638)] Jingle:Port[0x7f8a9c809a00:audio:1:0:local:Net[en0:192.168.195.x/24:Ethernet]]: SetOption(5, 0) failed: 0
[12743:775:0305/082152.048464:INFO:CONSOLE(13)] "Returning [{"candidate":"candidate:2504140996 1 udp 2122260223 192.168.195.156 65179 typ host generation 0 ufrag X54X network-id 1","sdpMid":"audio","sdpMLineIndex":0},{"candidate":"candidate:3686913076 1 tcp 1518280447 192.168.195.156 9 typ host tcptype active generation 0 ufrag X54X network-id 1","sdpMid":"audio","sdpMLineIndex":0}] to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082152.049868:INFO:CONSOLE(13)] "Returning ok-received-candidates to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082152.050468:INFO:CONSOLE(13)] "Returning [{"candidate":"candidate:2504140996 1 udp 2122260223 192.168.195.156 60484 typ host generation 0 ufrag ySYi network-id 1","sdpMid":"audio","sdpMLineIndex":0},{"candidate":"candidate:2504140996 1 udp 2122260223 192.168.195.156 62030 typ host generation 0 ufrag ySYi network-id 1","sdpMid":"video","sdpMLineIndex":1},{"candidate":"candidate:2504140996 1 udp 2122260223 192.168.195.156 50175 typ host generation 0 ufrag ySYi network-id 1","sdpMid":"data","sdpMLineIndex":2},{"candidate":"candidate:3686913076 1 tcp 1518280447 192.168.195.156 9 typ host tcptype active generation 0 ufrag ySYi network-id 1","sdpMid":"audio","sdpMLineIndex":0},{"candidate":"candidate:3686913076 1 tcp 1518280447 192.168.195.156 9 typ host tcptype active generation 0 ufrag ySYi network-id 1","sdpMid":"video","sdpMLineIndex":1},{"candidate":"candidate:3686913076 1 tcp 1518280447 192.168.195.156 9 typ host tcptype active generation 0 ufrag ySYi network-id 1","sdpMid":"data","sdpMLineIndex":2}] to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082152.052841:INFO:CONSOLE(13)] "Returning ok-received-candidates to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082152.053385:INFO:CONSOLE(13)] "Returning ["codec","inbound-rtp","outbound-rtp","peer-connection","stream","track","data-channel","transport","local-candidate","remote-candidate","candidate-pair","certificate"] to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
[12743:775:0305/082152.061797:INFO:CONSOLE(13)] "Returning Test failed: Error: stats.hugeFramesSent is not a whitelisted member: 0
    at failTest (http://127.0.0.1:50666/webrtc/test_functions.js:46:15)
    at verifyStatsIsWhitelisted_ (http://127.0.0.1:50666/webrtc/peerconnection_getstats.js:386:13)
    at http://127.0.0.1:50666/webrtc/peerconnection_getstats.js:273:9 to test.", source: http://127.0.0.1:50666/webrtc/test_functions.js (13)
../../chrome/browser/media/webrtc/webrtc_browsertest_base.cc:533: Failure
Value of: base::StartsWith(result, "ok-", base::CompareCase::SENSITIVE)
  Actual: false
Expected: true
../../chrome/browser/media/webrtc/webrtc_browsertest_base.cc:138: Failure
Value of: value
  Actual: false
Expected: true
BrowserTestBase received signal: Segmentation fault: 11. Backtrace:
0   browser_tests                       0x0000000105c700cc base::debug::StackTrace::StackTrace(unsigned long) + 28
1   browser_tests                       0x0000000106271902 content::(anonymous namespace)::DumpStackTraceSignalHandler(int) + 226
2   libsystem_platform.dylib            0x00007fffa63ccb3a _sigtramp + 26
3   ???                                 0x0000000000000000 0x0 + 0
4   browser_tests                       0x0000000102ee29e3 WebRtcTestBase::VerifyStatsGeneratedPromise(content::WebContents*) const + 467
5   browser_tests                       0x0000000102edb4d1 WebRtcBrowserTest_RunsAudioVideoWebRTCCallInTwoTabsGetStatsPromise_Test::RunTestOnMainThread() + 817
6   browser_tests                       0x000000010627162d content::BrowserTestBase::ProxyRunTestOnMainThreadLoop() + 557
7   browser_tests                       0x0000000105da0d23 ChromeBrowserMainParts::PreMainMessageLoopRunImpl() + 4227
8   browser_tests                       0x0000000105d9fb9e ChromeBrowserMainParts::PreMainMessageLoopRun() + 62
9   browser_tests                       0x0000000104a3a3d3 content::BrowserMainLoop::PreMainMessageLoopRun() + 67
10  browser_tests                       0x0000000104df0dc7 content::StartupTaskRunner::RunAllTasksNow() + 39
11  browser_tests                       0x0000000104a38d35 content::BrowserMainLoop::CreateStartupTasks() + 661
12  browser_tests                       0x0000000104a3c8f0 content::BrowserMainRunnerImpl::Initialize(content::MainFunctionParams const&) + 96
13  browser_tests                       0x0000000104a36c94 content::BrowserMain(content::MainFunctionParams const&) + 180
14  browser_tests                       0x0000000105c3ebb9 content::ContentMainRunnerImpl::Run() + 377
15  browser_tests                       0x000000010784a8f4 service_manager::Main(service_manager::MainParams const&) + 2324
16  browser_tests                       0x0000000105c3e094 content::ContentMain(content::ContentMainParams const&) + 68
17  browser_tests                       0x0000000106271216 content::BrowserTestBase::SetUp() + 2550
18  browser_tests                       0x0000000105d2993e InProcessBrowserTest::SetUp() + 398
19  browser_tests                       0x0000000104032b51 testing::Test::Run() + 97
20  browser_tests                       0x0000000104033770 testing::TestInfo::Run() + 288
21  browser_tests                       0x0000000104033cd7 testing::TestCase::Run() + 263
22  browser_tests                       0x000000010403b167 testing::internal::UnitTestImpl::RunAllTests() + 903
23  browser_tests                       0x000000010403adb3 testing::UnitTest::Run() + 163
24  browser_tests                       0x0000000105d41c67 base::TestSuite::Run() + 167
25  browser_tests                       0x0000000105c63755 ChromeTestSuiteRunner::RunTestSuite(int, char**) + 37
26  browser_tests                       0x00000001062b6597 content::LaunchTests(content::TestLauncherDelegate*, unsigned long, int, char**) + 391
27  browser_tests                       0x0000000105c63c3c LaunchChromeTests(unsigned long, content::TestLauncherDelegate*, int, char**) + 348
28  browser_tests                       0x0000000105c636ce main + 94
29  libdyld.dylib                       0x00007fffa61bd235 start + 1
30  ???                                 0x000000000000000a 0x0 + 10


Original change's description:
> Add hugeFramesSent GetStats metric
> 
> Bug: webrtc:8901
> Change-Id: I36021c1160c3426d3bfa0f37ff0adaa35710b93e
> Reviewed-on: https://webrtc-review.googlesource.com/54420
> Reviewed-by: Fredrik Solenberg <solenberg@webrtc.org>
> Reviewed-by: Harald Alvestrand <hta@webrtc.org>
> Reviewed-by: Henrik Boström <hbos@webrtc.org>
> Reviewed-by: Erik Språng <sprang@webrtc.org>
> Commit-Queue: Ilya Nikolaevskiy <ilnik@webrtc.org>
> Cr-Commit-Position: refs/heads/master@{#22290}

TBR=solenberg@webrtc.org,ilnik@webrtc.org,hbos@webrtc.org,sprang@webrtc.org,stefan@webrtc.org,hta@webrtc.org

Change-Id: I6a7501c46f928281d357da37f9232bb92c5a4f19
No-Presubmit: true
No-Tree-Checks: true
No-Try: true
Bug: webrtc:8901
Reviewed-on: https://webrtc-review.googlesource.com/60120
Reviewed-by: Max Morin <maxmorin@webrtc.org>
Commit-Queue: Max Morin <maxmorin@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#22303}
2018-03-06 08:28:52 +00:00

745 lines
31 KiB
C++

/*
* Copyright 2016 The WebRTC project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#include <set>
#include <vector>
#include "api/audio_codecs/builtin_audio_decoder_factory.h"
#include "api/audio_codecs/builtin_audio_encoder_factory.h"
#include "api/datachannelinterface.h"
#include "api/peerconnectioninterface.h"
#include "api/stats/rtcstats_objects.h"
#include "api/stats/rtcstatsreport.h"
#include "pc/test/peerconnectiontestwrapper.h"
#include "pc/test/rtcstatsobtainer.h"
#include "rtc_base/checks.h"
#include "rtc_base/event_tracer.h"
#include "rtc_base/gunit.h"
#include "rtc_base/refcountedobject.h"
#include "rtc_base/scoped_ref_ptr.h"
#include "rtc_base/trace_event.h"
#include "rtc_base/virtualsocketserver.h"
namespace webrtc {
namespace {
const int64_t kGetStatsTimeoutMs = 10000;
const unsigned char* GetCategoryEnabledHandler(const char* name) {
if (strcmp("webrtc_stats", name) != 0) {
return reinterpret_cast<const unsigned char*>("");
}
return reinterpret_cast<const unsigned char*>(name);
}
class RTCStatsReportTraceListener {
public:
static void SetUp() {
if (!traced_report_)
traced_report_ = new RTCStatsReportTraceListener();
traced_report_->last_trace_ = "";
SetupEventTracer(&GetCategoryEnabledHandler,
&RTCStatsReportTraceListener::AddTraceEventHandler);
}
static const std::string& last_trace() {
RTC_DCHECK(traced_report_);
return traced_report_->last_trace_;
}
private:
static void AddTraceEventHandler(
char phase,
const unsigned char* category_enabled,
const char* name,
unsigned long long id, // NOLINT(runtime/int)
int num_args,
const char** arg_names,
const unsigned char* arg_types,
const unsigned long long* arg_values, // NOLINT(runtime/int)
unsigned char flags) {
RTC_DCHECK(traced_report_);
EXPECT_STREQ("webrtc_stats",
reinterpret_cast<const char*>(category_enabled));
EXPECT_STREQ("webrtc_stats", name);
EXPECT_EQ(1, num_args);
EXPECT_STREQ("report", arg_names[0]);
EXPECT_EQ(TRACE_VALUE_TYPE_COPY_STRING, arg_types[0]);
traced_report_->last_trace_ = reinterpret_cast<const char*>(arg_values[0]);
}
static RTCStatsReportTraceListener* traced_report_;
std::string last_trace_;
};
RTCStatsReportTraceListener* RTCStatsReportTraceListener::traced_report_ =
nullptr;
class RTCStatsIntegrationTest : public testing::Test {
public:
RTCStatsIntegrationTest()
: network_thread_(new rtc::Thread(&virtual_socket_server_)),
worker_thread_(rtc::Thread::Create()) {
RTCStatsReportTraceListener::SetUp();
RTC_CHECK(network_thread_->Start());
RTC_CHECK(worker_thread_->Start());
caller_ = new rtc::RefCountedObject<PeerConnectionTestWrapper>(
"caller", network_thread_.get(), worker_thread_.get());
callee_ = new rtc::RefCountedObject<PeerConnectionTestWrapper>(
"callee", network_thread_.get(), worker_thread_.get());
}
void StartCall() {
// Create PeerConnections and "connect" sigslots
PeerConnectionInterface::RTCConfiguration config;
PeerConnectionInterface::IceServer ice_server;
ice_server.uri = "stun:1.1.1.1:3478";
config.servers.push_back(ice_server);
EXPECT_TRUE(caller_->CreatePc(nullptr, config,
CreateBuiltinAudioEncoderFactory(),
CreateBuiltinAudioDecoderFactory()));
EXPECT_TRUE(callee_->CreatePc(nullptr, config,
CreateBuiltinAudioEncoderFactory(),
CreateBuiltinAudioDecoderFactory()));
PeerConnectionTestWrapper::Connect(caller_.get(), callee_.get());
// Get user media for audio and video
caller_->GetAndAddUserMedia(true, FakeConstraints(),
true, FakeConstraints());
callee_->GetAndAddUserMedia(true, FakeConstraints(),
true, FakeConstraints());
// Create data channels
DataChannelInit init;
caller_->CreateDataChannel("data", init);
callee_->CreateDataChannel("data", init);
// Negotiate and wait for call to establish
caller_->CreateOffer(nullptr);
caller_->WaitForCallEstablished();
callee_->WaitForCallEstablished();
}
rtc::scoped_refptr<const RTCStatsReport> GetStatsFromCaller() {
return GetStats(caller_->pc());
}
rtc::scoped_refptr<const RTCStatsReport> GetStatsFromCallee() {
return GetStats(callee_->pc());
}
protected:
static rtc::scoped_refptr<const RTCStatsReport> GetStats(
PeerConnectionInterface* pc) {
rtc::scoped_refptr<RTCStatsObtainer> stats_obtainer =
RTCStatsObtainer::Create();
pc->GetStats(stats_obtainer);
EXPECT_TRUE_WAIT(stats_obtainer->report(), kGetStatsTimeoutMs);
return stats_obtainer->report();
}
// |network_thread_| uses |virtual_socket_server_| so they must be
// constructed/destructed in the correct order.
rtc::VirtualSocketServer virtual_socket_server_;
std::unique_ptr<rtc::Thread> network_thread_;
std::unique_ptr<rtc::Thread> worker_thread_;
rtc::scoped_refptr<PeerConnectionTestWrapper> caller_;
rtc::scoped_refptr<PeerConnectionTestWrapper> callee_;
};
class RTCStatsVerifier {
public:
RTCStatsVerifier(const RTCStatsReport* report, const RTCStats* stats)
: report_(report), stats_(stats), all_tests_successful_(true) {
RTC_CHECK(report_);
RTC_CHECK(stats_);
for (const RTCStatsMemberInterface* member : stats_->Members()) {
untested_members_.insert(member);
}
}
void MarkMemberTested(
const RTCStatsMemberInterface& member, bool test_successful) {
untested_members_.erase(&member);
all_tests_successful_ &= test_successful;
}
void TestMemberIsDefined(const RTCStatsMemberInterface& member) {
EXPECT_TRUE(member.is_defined()) <<
stats_->type() << "." << member.name() << "[" << stats_->id() <<
"] was undefined.";
MarkMemberTested(member, member.is_defined());
}
void TestMemberIsUndefined(const RTCStatsMemberInterface& member) {
EXPECT_FALSE(member.is_defined()) <<
stats_->type() << "." << member.name() << "[" << stats_->id() <<
"] was defined (" << member.ValueToString() << ").";
MarkMemberTested(member, !member.is_defined());
}
template<typename T>
void TestMemberIsPositive(const RTCStatsMemberInterface& member) {
EXPECT_TRUE(member.is_defined()) <<
stats_->type() << "." << member.name() << "[" << stats_->id() <<
"] was undefined.";
if (!member.is_defined()) {
MarkMemberTested(member, false);
return;
}
bool is_positive = *member.cast_to<RTCStatsMember<T>>() > T(0);
EXPECT_TRUE(is_positive) <<
stats_->type() << "." << member.name() << "[" << stats_->id() <<
"] was not positive (" << member.ValueToString() << ").";
MarkMemberTested(member, is_positive);
}
template<typename T>
void TestMemberIsNonNegative(const RTCStatsMemberInterface& member) {
EXPECT_TRUE(member.is_defined()) <<
stats_->type() << "." << member.name() << "[" << stats_->id() <<
"] was undefined.";
if (!member.is_defined()) {
MarkMemberTested(member, false);
return;
}
bool is_non_negative = *member.cast_to<RTCStatsMember<T>>() >= T(0);
EXPECT_TRUE(is_non_negative) <<
stats_->type() << "." << member.name() << "[" << stats_->id() <<
"] was not non-negative (" << member.ValueToString() << ").";
MarkMemberTested(member, is_non_negative);
}
void TestMemberIsIDReference(
const RTCStatsMemberInterface& member,
const char* expected_type) {
TestMemberIsIDReference(member, expected_type, false);
}
void TestMemberIsOptionalIDReference(
const RTCStatsMemberInterface& member,
const char* expected_type) {
TestMemberIsIDReference(member, expected_type, true);
}
bool ExpectAllMembersSuccessfullyTested() {
if (untested_members_.empty())
return all_tests_successful_;
for (const RTCStatsMemberInterface* member : untested_members_) {
EXPECT_TRUE(false) <<
stats_->type() << "." << member->name() << "[" << stats_->id() <<
"] was not tested.";
}
return false;
}
private:
void TestMemberIsIDReference(
const RTCStatsMemberInterface& member,
const char* expected_type,
bool optional) {
if (optional && !member.is_defined()) {
MarkMemberTested(member, true);
return;
}
bool valid_reference = false;
if (member.is_defined()) {
if (member.type() == RTCStatsMemberInterface::kString) {
// A single ID.
const RTCStatsMember<std::string>& id =
member.cast_to<RTCStatsMember<std::string>>();
const RTCStats* referenced_stats = report_->Get(*id);
valid_reference =
referenced_stats && referenced_stats->type() == expected_type;
} else if (member.type() == RTCStatsMemberInterface::kSequenceString) {
// A vector of IDs.
valid_reference = true;
const RTCStatsMember<std::vector<std::string>>& ids =
member.cast_to<RTCStatsMember<std::vector<std::string>>>();
for (const std::string& id : *ids) {
const RTCStats* referenced_stats = report_->Get(id);
if (!referenced_stats || referenced_stats->type() != expected_type) {
valid_reference = false;
break;
}
}
}
}
EXPECT_TRUE(valid_reference) <<
stats_->type() << "." << member.name() << " is not a reference to an " <<
"existing dictionary of type " << expected_type << " (" <<
member.ValueToString() << ").";
MarkMemberTested(member, valid_reference);
}
rtc::scoped_refptr<const RTCStatsReport> report_;
const RTCStats* stats_;
std::set<const RTCStatsMemberInterface*> untested_members_;
bool all_tests_successful_;
};
class RTCStatsReportVerifier {
public:
static std::set<const char*> StatsTypes() {
std::set<const char*> stats_types;
stats_types.insert(RTCCertificateStats::kType);
stats_types.insert(RTCCodecStats::kType);
stats_types.insert(RTCDataChannelStats::kType);
stats_types.insert(RTCIceCandidatePairStats::kType);
stats_types.insert(RTCLocalIceCandidateStats::kType);
stats_types.insert(RTCRemoteIceCandidateStats::kType);
stats_types.insert(RTCMediaStreamStats::kType);
stats_types.insert(RTCMediaStreamTrackStats::kType);
stats_types.insert(RTCPeerConnectionStats::kType);
stats_types.insert(RTCInboundRTPStreamStats::kType);
stats_types.insert(RTCOutboundRTPStreamStats::kType);
stats_types.insert(RTCTransportStats::kType);
return stats_types;
}
explicit RTCStatsReportVerifier(const RTCStatsReport* report)
: report_(report) {
}
void VerifyReport() {
std::set<const char*> missing_stats = StatsTypes();
bool verify_successful = true;
std::vector<const RTCTransportStats*> transport_stats =
report_->GetStatsOfType<RTCTransportStats>();
EXPECT_EQ(transport_stats.size(), 1);
std::string selected_candidate_pair_id =
*transport_stats[0]->selected_candidate_pair_id;
for (const RTCStats& stats : *report_) {
missing_stats.erase(stats.type());
if (stats.type() == RTCCertificateStats::kType) {
verify_successful &= VerifyRTCCertificateStats(
stats.cast_to<RTCCertificateStats>());
} else if (stats.type() == RTCCodecStats::kType) {
verify_successful &= VerifyRTCCodecStats(
stats.cast_to<RTCCodecStats>());
} else if (stats.type() == RTCDataChannelStats::kType) {
verify_successful &= VerifyRTCDataChannelStats(
stats.cast_to<RTCDataChannelStats>());
} else if (stats.type() == RTCIceCandidatePairStats::kType) {
verify_successful &= VerifyRTCIceCandidatePairStats(
stats.cast_to<RTCIceCandidatePairStats>(),
stats.id() == selected_candidate_pair_id);
} else if (stats.type() == RTCLocalIceCandidateStats::kType) {
verify_successful &= VerifyRTCLocalIceCandidateStats(
stats.cast_to<RTCLocalIceCandidateStats>());
} else if (stats.type() == RTCRemoteIceCandidateStats::kType) {
verify_successful &= VerifyRTCRemoteIceCandidateStats(
stats.cast_to<RTCRemoteIceCandidateStats>());
} else if (stats.type() == RTCMediaStreamStats::kType) {
verify_successful &= VerifyRTCMediaStreamStats(
stats.cast_to<RTCMediaStreamStats>());
} else if (stats.type() == RTCMediaStreamTrackStats::kType) {
verify_successful &= VerifyRTCMediaStreamTrackStats(
stats.cast_to<RTCMediaStreamTrackStats>());
} else if (stats.type() == RTCPeerConnectionStats::kType) {
verify_successful &= VerifyRTCPeerConnectionStats(
stats.cast_to<RTCPeerConnectionStats>());
} else if (stats.type() == RTCInboundRTPStreamStats::kType) {
verify_successful &= VerifyRTCInboundRTPStreamStats(
stats.cast_to<RTCInboundRTPStreamStats>());
} else if (stats.type() == RTCOutboundRTPStreamStats::kType) {
verify_successful &= VerifyRTCOutboundRTPStreamStats(
stats.cast_to<RTCOutboundRTPStreamStats>());
} else if (stats.type() == RTCTransportStats::kType) {
verify_successful &= VerifyRTCTransportStats(
stats.cast_to<RTCTransportStats>());
} else {
EXPECT_TRUE(false) << "Unrecognized stats type: " << stats.type();
verify_successful = false;
}
}
if (!missing_stats.empty()) {
verify_successful = false;
for (const char* missing : missing_stats) {
EXPECT_TRUE(false) << "Missing expected stats type: " << missing;
}
}
EXPECT_TRUE(verify_successful) <<
"One or more problems with the stats. This is the report:\n" <<
report_->ToJson();
}
bool VerifyRTCCertificateStats(
const RTCCertificateStats& certificate) {
RTCStatsVerifier verifier(report_, &certificate);
verifier.TestMemberIsDefined(certificate.fingerprint);
verifier.TestMemberIsDefined(certificate.fingerprint_algorithm);
verifier.TestMemberIsDefined(certificate.base64_certificate);
verifier.TestMemberIsOptionalIDReference(
certificate.issuer_certificate_id, RTCCertificateStats::kType);
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCCodecStats(
const RTCCodecStats& codec) {
RTCStatsVerifier verifier(report_, &codec);
verifier.TestMemberIsDefined(codec.payload_type);
verifier.TestMemberIsDefined(codec.mime_type);
verifier.TestMemberIsPositive<uint32_t>(codec.clock_rate);
verifier.TestMemberIsUndefined(codec.channels);
verifier.TestMemberIsUndefined(codec.sdp_fmtp_line);
verifier.TestMemberIsUndefined(codec.implementation);
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCDataChannelStats(
const RTCDataChannelStats& data_channel) {
RTCStatsVerifier verifier(report_, &data_channel);
verifier.TestMemberIsDefined(data_channel.label);
verifier.TestMemberIsDefined(data_channel.protocol);
verifier.TestMemberIsDefined(data_channel.datachannelid);
verifier.TestMemberIsDefined(data_channel.state);
verifier.TestMemberIsNonNegative<uint32_t>(data_channel.messages_sent);
verifier.TestMemberIsNonNegative<uint64_t>(data_channel.bytes_sent);
verifier.TestMemberIsNonNegative<uint32_t>(data_channel.messages_received);
verifier.TestMemberIsNonNegative<uint64_t>(data_channel.bytes_received);
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCIceCandidatePairStats(
const RTCIceCandidatePairStats& candidate_pair, bool is_selected_pair) {
RTCStatsVerifier verifier(report_, &candidate_pair);
verifier.TestMemberIsIDReference(
candidate_pair.transport_id, RTCTransportStats::kType);
verifier.TestMemberIsIDReference(
candidate_pair.local_candidate_id, RTCLocalIceCandidateStats::kType);
verifier.TestMemberIsIDReference(
candidate_pair.remote_candidate_id, RTCRemoteIceCandidateStats::kType);
verifier.TestMemberIsDefined(candidate_pair.state);
verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.priority);
verifier.TestMemberIsDefined(candidate_pair.nominated);
verifier.TestMemberIsDefined(candidate_pair.writable);
verifier.TestMemberIsUndefined(candidate_pair.readable);
verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.bytes_sent);
verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.bytes_received);
verifier.TestMemberIsNonNegative<double>(
candidate_pair.total_round_trip_time);
verifier.TestMemberIsNonNegative<double>(
candidate_pair.current_round_trip_time);
if (is_selected_pair) {
verifier.TestMemberIsNonNegative<double>(
candidate_pair.available_outgoing_bitrate);
// A pair should be nominated in order to be selected.
EXPECT_TRUE(*candidate_pair.nominated);
} else {
verifier.TestMemberIsUndefined(candidate_pair.available_outgoing_bitrate);
}
verifier.TestMemberIsUndefined(candidate_pair.available_incoming_bitrate);
verifier.TestMemberIsNonNegative<uint64_t>(
candidate_pair.requests_received);
verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.requests_sent);
verifier.TestMemberIsNonNegative<uint64_t>(
candidate_pair.responses_received);
verifier.TestMemberIsNonNegative<uint64_t>(candidate_pair.responses_sent);
verifier.TestMemberIsUndefined(candidate_pair.retransmissions_received);
verifier.TestMemberIsUndefined(candidate_pair.retransmissions_sent);
verifier.TestMemberIsUndefined(candidate_pair.consent_requests_received);
verifier.TestMemberIsNonNegative<uint64_t>(
candidate_pair.consent_requests_sent);
verifier.TestMemberIsUndefined(candidate_pair.consent_responses_received);
verifier.TestMemberIsUndefined(candidate_pair.consent_responses_sent);
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCIceCandidateStats(
const RTCIceCandidateStats& candidate) {
RTCStatsVerifier verifier(report_, &candidate);
verifier.TestMemberIsIDReference(
candidate.transport_id, RTCTransportStats::kType);
verifier.TestMemberIsDefined(candidate.is_remote);
if (*candidate.is_remote) {
verifier.TestMemberIsUndefined(candidate.network_type);
} else {
verifier.TestMemberIsDefined(candidate.network_type);
}
verifier.TestMemberIsDefined(candidate.ip);
verifier.TestMemberIsNonNegative<int32_t>(candidate.port);
verifier.TestMemberIsDefined(candidate.protocol);
verifier.TestMemberIsDefined(candidate.candidate_type);
verifier.TestMemberIsNonNegative<int32_t>(candidate.priority);
verifier.TestMemberIsUndefined(candidate.url);
verifier.TestMemberIsDefined(candidate.deleted);
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCLocalIceCandidateStats(
const RTCLocalIceCandidateStats& local_candidate) {
return VerifyRTCIceCandidateStats(local_candidate);
}
bool VerifyRTCRemoteIceCandidateStats(
const RTCRemoteIceCandidateStats& remote_candidate) {
return VerifyRTCIceCandidateStats(remote_candidate);
}
bool VerifyRTCMediaStreamStats(
const RTCMediaStreamStats& media_stream) {
RTCStatsVerifier verifier(report_, &media_stream);
verifier.TestMemberIsDefined(media_stream.stream_identifier);
verifier.TestMemberIsIDReference(
media_stream.track_ids, RTCMediaStreamTrackStats::kType);
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCMediaStreamTrackStats(
const RTCMediaStreamTrackStats& media_stream_track) {
RTCStatsVerifier verifier(report_, &media_stream_track);
verifier.TestMemberIsDefined(media_stream_track.track_identifier);
verifier.TestMemberIsDefined(media_stream_track.remote_source);
verifier.TestMemberIsDefined(media_stream_track.ended);
verifier.TestMemberIsDefined(media_stream_track.detached);
verifier.TestMemberIsDefined(media_stream_track.kind);
// Video or audio media stream track?
if (*media_stream_track.kind == RTCMediaStreamTrackKind::kVideo) {
// Video-only members
verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.frame_width);
verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.frame_height);
verifier.TestMemberIsUndefined(media_stream_track.frames_per_second);
if (*media_stream_track.remote_source) {
verifier.TestMemberIsUndefined(media_stream_track.frames_sent);
verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.frames_received);
verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.frames_decoded);
verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.frames_dropped);
} else {
verifier.TestMemberIsNonNegative<uint32_t>(
media_stream_track.frames_sent);
verifier.TestMemberIsUndefined(media_stream_track.frames_received);
verifier.TestMemberIsUndefined(media_stream_track.frames_decoded);
verifier.TestMemberIsUndefined(media_stream_track.frames_dropped);
}
verifier.TestMemberIsUndefined(media_stream_track.frames_corrupted);
verifier.TestMemberIsUndefined(media_stream_track.partial_frames_lost);
verifier.TestMemberIsUndefined(media_stream_track.full_frames_lost);
// Audio-only members should be undefined
verifier.TestMemberIsUndefined(media_stream_track.audio_level);
verifier.TestMemberIsUndefined(media_stream_track.echo_return_loss);
verifier.TestMemberIsUndefined(
media_stream_track.echo_return_loss_enhancement);
verifier.TestMemberIsUndefined(media_stream_track.total_audio_energy);
verifier.TestMemberIsUndefined(media_stream_track.total_samples_duration);
} else {
RTC_DCHECK_EQ(*media_stream_track.kind,
RTCMediaStreamTrackKind::kAudio);
// Video-only members should be undefined
verifier.TestMemberIsUndefined(media_stream_track.frame_width);
verifier.TestMemberIsUndefined(media_stream_track.frame_height);
verifier.TestMemberIsUndefined(media_stream_track.frames_per_second);
verifier.TestMemberIsUndefined(media_stream_track.frames_sent);
verifier.TestMemberIsUndefined(media_stream_track.frames_received);
verifier.TestMemberIsUndefined(media_stream_track.frames_decoded);
verifier.TestMemberIsUndefined(media_stream_track.frames_dropped);
verifier.TestMemberIsUndefined(media_stream_track.frames_corrupted);
verifier.TestMemberIsUndefined(media_stream_track.partial_frames_lost);
verifier.TestMemberIsUndefined(media_stream_track.full_frames_lost);
// Audio-only members
verifier.TestMemberIsNonNegative<double>(media_stream_track.audio_level);
verifier.TestMemberIsNonNegative<double>(
media_stream_track.total_audio_energy);
verifier.TestMemberIsNonNegative<double>(
media_stream_track.total_samples_duration);
// TODO(hbos): |echo_return_loss| and |echo_return_loss_enhancement| are
// flaky on msan bot (sometimes defined, sometimes undefined). Should the
// test run until available or is there a way to have it always be
// defined? crbug.com/627816
verifier.MarkMemberTested(media_stream_track.echo_return_loss, true);
verifier.MarkMemberTested(
media_stream_track.echo_return_loss_enhancement, true);
}
// totalSamplesReceived, concealedSamples and concealmentEvents are only
// present on inbound audio tracks.
// jitterBufferDelay is currently only implemented for audio.
if (*media_stream_track.kind == RTCMediaStreamTrackKind::kAudio &&
*media_stream_track.remote_source) {
verifier.TestMemberIsNonNegative<double>(
media_stream_track.jitter_buffer_delay);
verifier.TestMemberIsNonNegative<uint64_t>(
media_stream_track.total_samples_received);
verifier.TestMemberIsNonNegative<uint64_t>(
media_stream_track.concealed_samples);
verifier.TestMemberIsNonNegative<uint64_t>(
media_stream_track.concealment_events);
} else {
verifier.TestMemberIsUndefined(media_stream_track.jitter_buffer_delay);
verifier.TestMemberIsUndefined(media_stream_track.total_samples_received);
verifier.TestMemberIsUndefined(media_stream_track.concealed_samples);
verifier.TestMemberIsUndefined(media_stream_track.concealment_events);
}
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCPeerConnectionStats(
const RTCPeerConnectionStats& peer_connection) {
RTCStatsVerifier verifier(report_, &peer_connection);
verifier.TestMemberIsNonNegative<uint32_t>(
peer_connection.data_channels_opened);
verifier.TestMemberIsNonNegative<uint32_t>(
peer_connection.data_channels_closed);
return verifier.ExpectAllMembersSuccessfullyTested();
}
void VerifyRTCRTPStreamStats(
const RTCRTPStreamStats& stream, RTCStatsVerifier* verifier) {
verifier->TestMemberIsDefined(stream.ssrc);
verifier->TestMemberIsUndefined(stream.associate_stats_id);
verifier->TestMemberIsDefined(stream.is_remote);
verifier->TestMemberIsDefined(stream.media_type);
verifier->TestMemberIsIDReference(
stream.track_id, RTCMediaStreamTrackStats::kType);
verifier->TestMemberIsIDReference(
stream.transport_id, RTCTransportStats::kType);
verifier->TestMemberIsIDReference(stream.codec_id, RTCCodecStats::kType);
if (stream.media_type.is_defined() && *stream.media_type == "video") {
verifier->TestMemberIsNonNegative<uint32_t>(stream.fir_count);
verifier->TestMemberIsNonNegative<uint32_t>(stream.pli_count);
verifier->TestMemberIsNonNegative<uint32_t>(stream.nack_count);
} else {
verifier->TestMemberIsUndefined(stream.fir_count);
verifier->TestMemberIsUndefined(stream.pli_count);
verifier->TestMemberIsUndefined(stream.nack_count);
}
verifier->TestMemberIsUndefined(stream.sli_count);
}
bool VerifyRTCInboundRTPStreamStats(
const RTCInboundRTPStreamStats& inbound_stream) {
RTCStatsVerifier verifier(report_, &inbound_stream);
VerifyRTCRTPStreamStats(inbound_stream, &verifier);
if (inbound_stream.media_type.is_defined() &&
*inbound_stream.media_type == "video") {
verifier.TestMemberIsNonNegative<uint64_t>(inbound_stream.qp_sum);
} else {
verifier.TestMemberIsUndefined(inbound_stream.qp_sum);
}
verifier.TestMemberIsNonNegative<uint32_t>(inbound_stream.packets_received);
verifier.TestMemberIsNonNegative<uint64_t>(inbound_stream.bytes_received);
// packets_lost is defined as signed, but this should never happen in
// this test. See RFC 3550.
verifier.TestMemberIsNonNegative<int32_t>(inbound_stream.packets_lost);
if (inbound_stream.media_type.is_defined() &&
*inbound_stream.media_type == "video") {
verifier.TestMemberIsUndefined(inbound_stream.jitter);
} else {
verifier.TestMemberIsNonNegative<double>(inbound_stream.jitter);
}
verifier.TestMemberIsNonNegative<double>(inbound_stream.fraction_lost);
verifier.TestMemberIsUndefined(inbound_stream.round_trip_time);
verifier.TestMemberIsUndefined(inbound_stream.packets_discarded);
verifier.TestMemberIsUndefined(inbound_stream.packets_repaired);
verifier.TestMemberIsUndefined(inbound_stream.burst_packets_lost);
verifier.TestMemberIsUndefined(inbound_stream.burst_packets_discarded);
verifier.TestMemberIsUndefined(inbound_stream.burst_loss_count);
verifier.TestMemberIsUndefined(inbound_stream.burst_discard_count);
verifier.TestMemberIsUndefined(inbound_stream.burst_loss_rate);
verifier.TestMemberIsUndefined(inbound_stream.burst_discard_rate);
verifier.TestMemberIsUndefined(inbound_stream.gap_loss_rate);
verifier.TestMemberIsUndefined(inbound_stream.gap_discard_rate);
if (inbound_stream.media_type.is_defined() &&
*inbound_stream.media_type == "video") {
verifier.TestMemberIsDefined(inbound_stream.frames_decoded);
} else {
verifier.TestMemberIsUndefined(inbound_stream.frames_decoded);
}
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCOutboundRTPStreamStats(
const RTCOutboundRTPStreamStats& outbound_stream) {
RTCStatsVerifier verifier(report_, &outbound_stream);
VerifyRTCRTPStreamStats(outbound_stream, &verifier);
if (outbound_stream.media_type.is_defined() &&
*outbound_stream.media_type == "video") {
verifier.TestMemberIsNonNegative<uint64_t>(outbound_stream.qp_sum);
} else {
verifier.TestMemberIsUndefined(outbound_stream.qp_sum);
}
verifier.TestMemberIsNonNegative<uint32_t>(outbound_stream.packets_sent);
verifier.TestMemberIsNonNegative<uint64_t>(outbound_stream.bytes_sent);
verifier.TestMemberIsUndefined(outbound_stream.target_bitrate);
if (outbound_stream.media_type.is_defined() &&
*outbound_stream.media_type == "video") {
verifier.TestMemberIsDefined(outbound_stream.frames_encoded);
} else {
verifier.TestMemberIsUndefined(outbound_stream.frames_encoded);
}
return verifier.ExpectAllMembersSuccessfullyTested();
}
bool VerifyRTCTransportStats(
const RTCTransportStats& transport) {
RTCStatsVerifier verifier(report_, &transport);
verifier.TestMemberIsNonNegative<uint64_t>(transport.bytes_sent);
verifier.TestMemberIsNonNegative<uint64_t>(transport.bytes_received);
verifier.TestMemberIsOptionalIDReference(
transport.rtcp_transport_stats_id, RTCTransportStats::kType);
verifier.TestMemberIsDefined(transport.dtls_state);
verifier.TestMemberIsIDReference(
transport.selected_candidate_pair_id, RTCIceCandidatePairStats::kType);
verifier.TestMemberIsIDReference(
transport.local_certificate_id, RTCCertificateStats::kType);
verifier.TestMemberIsIDReference(
transport.remote_certificate_id, RTCCertificateStats::kType);
return verifier.ExpectAllMembersSuccessfullyTested();
}
private:
rtc::scoped_refptr<const RTCStatsReport> report_;
};
#ifdef HAVE_SCTP
TEST_F(RTCStatsIntegrationTest, GetStatsFromCaller) {
StartCall();
rtc::scoped_refptr<const RTCStatsReport> report = GetStatsFromCaller();
RTCStatsReportVerifier(report.get()).VerifyReport();
EXPECT_EQ(report->ToJson(), RTCStatsReportTraceListener::last_trace());
}
TEST_F(RTCStatsIntegrationTest, GetStatsFromCallee) {
StartCall();
rtc::scoped_refptr<const RTCStatsReport> report = GetStatsFromCallee();
RTCStatsReportVerifier(report.get()).VerifyReport();
EXPECT_EQ(report->ToJson(), RTCStatsReportTraceListener::last_trace());
}
TEST_F(RTCStatsIntegrationTest, GetsStatsWhileDestroyingPeerConnections) {
StartCall();
rtc::scoped_refptr<RTCStatsObtainer> stats_obtainer =
RTCStatsObtainer::Create();
caller_->pc()->GetStats(stats_obtainer);
// This will destroy the peer connection.
caller_ = nullptr;
// Any pending stats requests should have completed in the act of destroying
// the peer connection.
EXPECT_TRUE(stats_obtainer->report());
EXPECT_EQ(stats_obtainer->report()->ToJson(),
RTCStatsReportTraceListener::last_trace());
}
#endif // HAVE_SCTP
} // namespace
} // namespace webrtc