| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/api/rtcstatscollector.h" | 11 #include "webrtc/api/rtcstatscollector.h" |
| 12 | 12 |
| 13 #include <memory> | 13 #include <memory> |
| 14 #include <ostream> | 14 #include <ostream> |
| 15 #include <string> | 15 #include <string> |
| 16 #include <vector> | 16 #include <vector> |
| 17 | 17 |
| 18 #include "webrtc/api/jsepsessiondescription.h" |
| 18 #include "webrtc/api/mediastream.h" | 19 #include "webrtc/api/mediastream.h" |
| 19 #include "webrtc/api/mediastreamtrack.h" | 20 #include "webrtc/api/mediastreamtrack.h" |
| 20 #include "webrtc/api/jsepsessiondescription.h" | 21 #include "webrtc/api/rtpparameters.h" |
| 21 #include "webrtc/api/stats/rtcstats_objects.h" | 22 #include "webrtc/api/stats/rtcstats_objects.h" |
| 22 #include "webrtc/api/stats/rtcstatsreport.h" | 23 #include "webrtc/api/stats/rtcstatsreport.h" |
| 23 #include "webrtc/api/test/mock_datachannel.h" | 24 #include "webrtc/api/test/mock_datachannel.h" |
| 24 #include "webrtc/api/test/mock_peerconnection.h" | 25 #include "webrtc/api/test/mock_peerconnection.h" |
| 25 #include "webrtc/api/test/mock_webrtcsession.h" | 26 #include "webrtc/api/test/mock_webrtcsession.h" |
| 26 #include "webrtc/base/checks.h" | 27 #include "webrtc/base/checks.h" |
| 27 #include "webrtc/base/fakeclock.h" | 28 #include "webrtc/base/fakeclock.h" |
| 28 #include "webrtc/base/fakesslidentity.h" | 29 #include "webrtc/base/fakesslidentity.h" |
| 29 #include "webrtc/base/gunit.h" | 30 #include "webrtc/base/gunit.h" |
| 30 #include "webrtc/base/logging.h" | 31 #include "webrtc/base/logging.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 45 using testing::ReturnRef; | 46 using testing::ReturnRef; |
| 46 using testing::SetArgPointee; | 47 using testing::SetArgPointee; |
| 47 | 48 |
| 48 namespace webrtc { | 49 namespace webrtc { |
| 49 | 50 |
| 50 // These are used by gtest code, such as if |EXPECT_EQ| fails. | 51 // These are used by gtest code, such as if |EXPECT_EQ| fails. |
| 51 void PrintTo(const RTCCertificateStats& stats, ::std::ostream* os) { | 52 void PrintTo(const RTCCertificateStats& stats, ::std::ostream* os) { |
| 52 *os << stats.ToString(); | 53 *os << stats.ToString(); |
| 53 } | 54 } |
| 54 | 55 |
| 56 void PrintTo(const RTCCodecStats& stats, ::std::ostream* os) { |
| 57 *os << stats.ToString(); |
| 58 } |
| 59 |
| 55 void PrintTo(const RTCDataChannelStats& stats, ::std::ostream* os) { | 60 void PrintTo(const RTCDataChannelStats& stats, ::std::ostream* os) { |
| 56 *os << stats.ToString(); | 61 *os << stats.ToString(); |
| 57 } | 62 } |
| 58 | 63 |
| 59 void PrintTo(const RTCIceCandidatePairStats& stats, ::std::ostream* os) { | 64 void PrintTo(const RTCIceCandidatePairStats& stats, ::std::ostream* os) { |
| 60 *os << stats.ToString(); | 65 *os << stats.ToString(); |
| 61 } | 66 } |
| 62 | 67 |
| 63 void PrintTo(const RTCLocalIceCandidateStats& stats, ::std::ostream* os) { | 68 void PrintTo(const RTCLocalIceCandidateStats& stats, ::std::ostream* os) { |
| 64 *os << stats.ToString(); | 69 *os << stats.ToString(); |
| (...skipping 734 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 if (transport_name == "transport") | 804 if (transport_name == "transport") |
| 800 return remote_certinfo->certificate->ssl_certificate().GetReference(); | 805 return remote_certinfo->certificate->ssl_certificate().GetReference(); |
| 801 return static_cast<rtc::SSLCertificate*>(nullptr); | 806 return static_cast<rtc::SSLCertificate*>(nullptr); |
| 802 })); | 807 })); |
| 803 | 808 |
| 804 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 809 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 805 ExpectReportContainsCertificateInfo(report, *local_certinfo.get()); | 810 ExpectReportContainsCertificateInfo(report, *local_certinfo.get()); |
| 806 ExpectReportContainsCertificateInfo(report, *remote_certinfo.get()); | 811 ExpectReportContainsCertificateInfo(report, *remote_certinfo.get()); |
| 807 } | 812 } |
| 808 | 813 |
| 814 TEST_F(RTCStatsCollectorTest, CollectRTCCodecStats) { |
| 815 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); |
| 816 cricket::VoiceChannel voice_channel( |
| 817 test_->worker_thread(), test_->network_thread(), test_->media_engine(), |
| 818 voice_media_channel, nullptr, "VoiceContentName", false); |
| 819 |
| 820 MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel(); |
| 821 cricket::VideoChannel video_channel( |
| 822 test_->worker_thread(), test_->network_thread(), video_media_channel, |
| 823 nullptr, "VideoContentName", false); |
| 824 |
| 825 // Audio |
| 826 cricket::VoiceMediaInfo voice_media_info; |
| 827 |
| 828 RtpCodecParameters inbound_audio_codec; |
| 829 inbound_audio_codec.payload_type = 1; |
| 830 inbound_audio_codec.mime_type = "opus"; |
| 831 inbound_audio_codec.clock_rate = 1337; |
| 832 voice_media_info.receive_codecs.insert( |
| 833 std::make_pair(inbound_audio_codec.payload_type, inbound_audio_codec)); |
| 834 |
| 835 RtpCodecParameters outbound_audio_codec; |
| 836 outbound_audio_codec.payload_type = 2; |
| 837 outbound_audio_codec.mime_type = "isac"; |
| 838 outbound_audio_codec.clock_rate = 1338; |
| 839 voice_media_info.send_codecs.insert( |
| 840 std::make_pair(outbound_audio_codec.payload_type, outbound_audio_codec)); |
| 841 |
| 842 EXPECT_CALL(*voice_media_channel, GetStats(_)) |
| 843 .WillOnce(DoAll(SetArgPointee<0>(voice_media_info), Return(true))); |
| 844 |
| 845 // Video |
| 846 cricket::VideoMediaInfo video_media_info; |
| 847 |
| 848 RtpCodecParameters inbound_video_codec; |
| 849 inbound_video_codec.payload_type = 3; |
| 850 inbound_video_codec.mime_type = "H264"; |
| 851 inbound_video_codec.clock_rate = 1339; |
| 852 video_media_info.receive_codecs.insert( |
| 853 std::make_pair(inbound_video_codec.payload_type, inbound_video_codec)); |
| 854 |
| 855 RtpCodecParameters outbound_video_codec; |
| 856 outbound_video_codec.payload_type = 4; |
| 857 outbound_video_codec.mime_type = "VP8"; |
| 858 outbound_video_codec.clock_rate = 1340; |
| 859 video_media_info.send_codecs.insert( |
| 860 std::make_pair(outbound_video_codec.payload_type, outbound_video_codec)); |
| 861 |
| 862 EXPECT_CALL(*video_media_channel, GetStats(_)) |
| 863 .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true))); |
| 864 |
| 865 SessionStats session_stats; |
| 866 session_stats.proxy_to_transport["VoiceContentName"] = "TransportName"; |
| 867 session_stats.proxy_to_transport["VideoContentName"] = "TransportName"; |
| 868 session_stats.transport_stats["TransportName"].transport_name = |
| 869 "TransportName"; |
| 870 |
| 871 EXPECT_CALL(test_->session(), GetTransportStats(_)) |
| 872 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); |
| 873 EXPECT_CALL(test_->session(), voice_channel()) |
| 874 .WillRepeatedly(Return(&voice_channel)); |
| 875 EXPECT_CALL(test_->session(), video_channel()) |
| 876 .WillRepeatedly(Return(&video_channel)); |
| 877 |
| 878 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 879 |
| 880 RTCCodecStats expected_inbound_audio_codec( |
| 881 "RTCCodec_InboundAudio_1", report->timestamp_us()); |
| 882 expected_inbound_audio_codec.payload_type = 1; |
| 883 expected_inbound_audio_codec.codec = "audio/opus"; |
| 884 expected_inbound_audio_codec.clock_rate = 1337; |
| 885 |
| 886 RTCCodecStats expected_outbound_audio_codec( |
| 887 "RTCCodec_OutboundAudio_2", report->timestamp_us()); |
| 888 expected_outbound_audio_codec.payload_type = 2; |
| 889 expected_outbound_audio_codec.codec = "audio/isac"; |
| 890 expected_outbound_audio_codec.clock_rate = 1338; |
| 891 |
| 892 RTCCodecStats expected_inbound_video_codec( |
| 893 "RTCCodec_InboundVideo_3", report->timestamp_us()); |
| 894 expected_inbound_video_codec.payload_type = 3; |
| 895 expected_inbound_video_codec.codec = "video/H264"; |
| 896 expected_inbound_video_codec.clock_rate = 1339; |
| 897 |
| 898 RTCCodecStats expected_outbound_video_codec( |
| 899 "RTCCodec_OutboundVideo_4", report->timestamp_us()); |
| 900 expected_outbound_video_codec.payload_type = 4; |
| 901 expected_outbound_video_codec.codec = "video/VP8"; |
| 902 expected_outbound_video_codec.clock_rate = 1340; |
| 903 |
| 904 ASSERT(report->Get(expected_inbound_audio_codec.id())); |
| 905 EXPECT_EQ(expected_inbound_audio_codec, |
| 906 report->Get(expected_inbound_audio_codec.id())->cast_to< |
| 907 RTCCodecStats>()); |
| 908 |
| 909 ASSERT(report->Get(expected_outbound_audio_codec.id())); |
| 910 EXPECT_EQ(expected_outbound_audio_codec, |
| 911 report->Get(expected_outbound_audio_codec.id())->cast_to< |
| 912 RTCCodecStats>()); |
| 913 |
| 914 ASSERT(report->Get(expected_inbound_video_codec.id())); |
| 915 EXPECT_EQ(expected_inbound_video_codec, |
| 916 report->Get(expected_inbound_video_codec.id())->cast_to< |
| 917 RTCCodecStats>()); |
| 918 |
| 919 ASSERT(report->Get(expected_outbound_video_codec.id())); |
| 920 EXPECT_EQ(expected_outbound_video_codec, |
| 921 report->Get(expected_outbound_video_codec.id())->cast_to< |
| 922 RTCCodecStats>()); |
| 923 } |
| 924 |
| 809 TEST_F(RTCStatsCollectorTest, CollectRTCCertificateStatsMultiple) { | 925 TEST_F(RTCStatsCollectorTest, CollectRTCCertificateStatsMultiple) { |
| 810 std::unique_ptr<CertificateInfo> audio_local_certinfo = | 926 std::unique_ptr<CertificateInfo> audio_local_certinfo = |
| 811 CreateFakeCertificateAndInfoFromDers( | 927 CreateFakeCertificateAndInfoFromDers( |
| 812 std::vector<std::string>({ "(local) audio" })); | 928 std::vector<std::string>({ "(local) audio" })); |
| 813 audio_local_certinfo = CreateFakeCertificateAndInfoFromDers( | 929 audio_local_certinfo = CreateFakeCertificateAndInfoFromDers( |
| 814 audio_local_certinfo->ders); | 930 audio_local_certinfo->ders); |
| 815 std::unique_ptr<CertificateInfo> audio_remote_certinfo = | 931 std::unique_ptr<CertificateInfo> audio_remote_certinfo = |
| 816 CreateFakeCertificateAndInfoFromDers( | 932 CreateFakeCertificateAndInfoFromDers( |
| 817 std::vector<std::string>({ "(remote) audio" })); | 933 std::vector<std::string>({ "(remote) audio" })); |
| 818 audio_remote_certinfo = CreateFakeCertificateAndInfoFromDers( | 934 audio_remote_certinfo = CreateFakeCertificateAndInfoFromDers( |
| (...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1313 RTCMediaStreamTrackStats>()); | 1429 RTCMediaStreamTrackStats>()); |
| 1314 } | 1430 } |
| 1315 | 1431 |
| 1316 TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Audio) { | 1432 TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Audio) { |
| 1317 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); | 1433 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); |
| 1318 cricket::VoiceChannel voice_channel( | 1434 cricket::VoiceChannel voice_channel( |
| 1319 test_->worker_thread(), test_->network_thread(), test_->media_engine(), | 1435 test_->worker_thread(), test_->network_thread(), test_->media_engine(), |
| 1320 voice_media_channel, nullptr, "VoiceContentName", false); | 1436 voice_media_channel, nullptr, "VoiceContentName", false); |
| 1321 | 1437 |
| 1322 cricket::VoiceMediaInfo voice_media_info; | 1438 cricket::VoiceMediaInfo voice_media_info; |
| 1439 |
| 1323 voice_media_info.receivers.push_back(cricket::VoiceReceiverInfo()); | 1440 voice_media_info.receivers.push_back(cricket::VoiceReceiverInfo()); |
| 1324 voice_media_info.receivers[0].local_stats.push_back( | 1441 voice_media_info.receivers[0].local_stats.push_back( |
| 1325 cricket::SsrcReceiverInfo()); | 1442 cricket::SsrcReceiverInfo()); |
| 1326 voice_media_info.receivers[0].local_stats[0].ssrc = 1; | 1443 voice_media_info.receivers[0].local_stats[0].ssrc = 1; |
| 1327 voice_media_info.receivers[0].packets_rcvd = 2; | 1444 voice_media_info.receivers[0].packets_rcvd = 2; |
| 1328 voice_media_info.receivers[0].bytes_rcvd = 3; | 1445 voice_media_info.receivers[0].bytes_rcvd = 3; |
| 1446 voice_media_info.receivers[0].codec_payload_type = rtc::Optional<int>(42); |
| 1329 voice_media_info.receivers[0].jitter_ms = 4500; | 1447 voice_media_info.receivers[0].jitter_ms = 4500; |
| 1330 voice_media_info.receivers[0].fraction_lost = 5.5f; | 1448 voice_media_info.receivers[0].fraction_lost = 5.5f; |
| 1449 |
| 1450 RtpCodecParameters codec_parameters; |
| 1451 codec_parameters.payload_type = 42; |
| 1452 codec_parameters.mime_type = "dummy"; |
| 1453 codec_parameters.clock_rate = 0; |
| 1454 voice_media_info.receive_codecs.insert( |
| 1455 std::make_pair(codec_parameters.payload_type, codec_parameters)); |
| 1456 |
| 1331 EXPECT_CALL(*voice_media_channel, GetStats(_)) | 1457 EXPECT_CALL(*voice_media_channel, GetStats(_)) |
| 1332 .WillOnce(DoAll(SetArgPointee<0>(voice_media_info), Return(true))); | 1458 .WillOnce(DoAll(SetArgPointee<0>(voice_media_info), Return(true))); |
| 1333 | 1459 |
| 1334 SessionStats session_stats; | 1460 SessionStats session_stats; |
| 1335 session_stats.proxy_to_transport["VoiceContentName"] = "TransportName"; | 1461 session_stats.proxy_to_transport["VoiceContentName"] = "TransportName"; |
| 1336 session_stats.transport_stats["TransportName"].transport_name = | 1462 session_stats.transport_stats["TransportName"].transport_name = |
| 1337 "TransportName"; | 1463 "TransportName"; |
| 1338 | 1464 |
| 1339 // Make sure the associated |RTCTransportStats| is created. | 1465 // Make sure the associated |RTCTransportStats| is created. |
| 1340 cricket::TransportChannelStats channel_stats; | 1466 cricket::TransportChannelStats channel_stats; |
| 1341 channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP; | 1467 channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP; |
| 1342 session_stats.transport_stats["TransportName"].channel_stats.push_back( | 1468 session_stats.transport_stats["TransportName"].channel_stats.push_back( |
| 1343 channel_stats); | 1469 channel_stats); |
| 1344 | 1470 |
| 1345 EXPECT_CALL(test_->session(), GetTransportStats(_)) | 1471 EXPECT_CALL(test_->session(), GetTransportStats(_)) |
| 1346 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); | 1472 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); |
| 1347 EXPECT_CALL(test_->session(), voice_channel()) | 1473 EXPECT_CALL(test_->session(), voice_channel()) |
| 1348 .WillRepeatedly(Return(&voice_channel)); | 1474 .WillRepeatedly(Return(&voice_channel)); |
| 1349 | 1475 |
| 1350 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1476 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 1351 | 1477 |
| 1352 RTCInboundRTPStreamStats expected_audio( | 1478 RTCInboundRTPStreamStats expected_audio( |
| 1353 "RTCInboundRTPAudioStream_1", report->timestamp_us()); | 1479 "RTCInboundRTPAudioStream_1", report->timestamp_us()); |
| 1354 expected_audio.ssrc = "1"; | 1480 expected_audio.ssrc = "1"; |
| 1355 expected_audio.is_remote = false; | 1481 expected_audio.is_remote = false; |
| 1356 expected_audio.media_type = "audio"; | 1482 expected_audio.media_type = "audio"; |
| 1357 expected_audio.transport_id = "RTCTransport_TransportName_" + | 1483 expected_audio.transport_id = "RTCTransport_TransportName_" + |
| 1358 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); | 1484 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 1485 expected_audio.codec_id = "RTCCodec_InboundAudio_42"; |
| 1359 expected_audio.packets_received = 2; | 1486 expected_audio.packets_received = 2; |
| 1360 expected_audio.bytes_received = 3; | 1487 expected_audio.bytes_received = 3; |
| 1361 expected_audio.jitter = 4.5; | 1488 expected_audio.jitter = 4.5; |
| 1362 expected_audio.fraction_lost = 5.5; | 1489 expected_audio.fraction_lost = 5.5; |
| 1363 | 1490 |
| 1364 ASSERT(report->Get(expected_audio.id())); | 1491 ASSERT(report->Get(expected_audio.id())); |
| 1365 const RTCInboundRTPStreamStats& audio = report->Get( | 1492 const RTCInboundRTPStreamStats& audio = report->Get( |
| 1366 expected_audio.id())->cast_to<RTCInboundRTPStreamStats>(); | 1493 expected_audio.id())->cast_to<RTCInboundRTPStreamStats>(); |
| 1367 EXPECT_EQ(audio, expected_audio); | 1494 EXPECT_EQ(audio, expected_audio); |
| 1368 | 1495 |
| 1369 EXPECT_TRUE(report->Get(*expected_audio.transport_id)); | 1496 EXPECT_TRUE(report->Get(*expected_audio.transport_id)); |
| 1497 EXPECT_TRUE(report->Get(*expected_audio.codec_id)); |
| 1370 } | 1498 } |
| 1371 | 1499 |
| 1372 TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Video) { | 1500 TEST_F(RTCStatsCollectorTest, CollectRTCInboundRTPStreamStats_Video) { |
| 1373 MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel(); | 1501 MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel(); |
| 1374 cricket::VideoChannel video_channel( | 1502 cricket::VideoChannel video_channel( |
| 1375 test_->worker_thread(), test_->network_thread(), video_media_channel, | 1503 test_->worker_thread(), test_->network_thread(), video_media_channel, |
| 1376 nullptr, "VideoContentName", false); | 1504 nullptr, "VideoContentName", false); |
| 1377 | 1505 |
| 1378 cricket::VideoMediaInfo video_media_info; | 1506 cricket::VideoMediaInfo video_media_info; |
| 1507 |
| 1379 video_media_info.receivers.push_back(cricket::VideoReceiverInfo()); | 1508 video_media_info.receivers.push_back(cricket::VideoReceiverInfo()); |
| 1380 video_media_info.receivers[0].local_stats.push_back( | 1509 video_media_info.receivers[0].local_stats.push_back( |
| 1381 cricket::SsrcReceiverInfo()); | 1510 cricket::SsrcReceiverInfo()); |
| 1382 video_media_info.receivers[0].local_stats[0].ssrc = 1; | 1511 video_media_info.receivers[0].local_stats[0].ssrc = 1; |
| 1383 video_media_info.receivers[0].packets_rcvd = 2; | 1512 video_media_info.receivers[0].packets_rcvd = 2; |
| 1384 video_media_info.receivers[0].bytes_rcvd = 3; | 1513 video_media_info.receivers[0].bytes_rcvd = 3; |
| 1385 video_media_info.receivers[0].fraction_lost = 4.5f; | 1514 video_media_info.receivers[0].fraction_lost = 4.5f; |
| 1515 video_media_info.receivers[0].codec_payload_type = rtc::Optional<int>(42); |
| 1386 video_media_info.receivers[0].firs_sent = 5; | 1516 video_media_info.receivers[0].firs_sent = 5; |
| 1387 video_media_info.receivers[0].plis_sent = 6; | 1517 video_media_info.receivers[0].plis_sent = 6; |
| 1388 video_media_info.receivers[0].nacks_sent = 7; | 1518 video_media_info.receivers[0].nacks_sent = 7; |
| 1519 |
| 1520 RtpCodecParameters codec_parameters; |
| 1521 codec_parameters.payload_type = 42; |
| 1522 codec_parameters.mime_type = "dummy"; |
| 1523 codec_parameters.clock_rate = 0; |
| 1524 video_media_info.receive_codecs.insert( |
| 1525 std::make_pair(codec_parameters.payload_type, codec_parameters)); |
| 1526 |
| 1389 EXPECT_CALL(*video_media_channel, GetStats(_)) | 1527 EXPECT_CALL(*video_media_channel, GetStats(_)) |
| 1390 .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true))); | 1528 .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true))); |
| 1391 | 1529 |
| 1392 SessionStats session_stats; | 1530 SessionStats session_stats; |
| 1393 session_stats.proxy_to_transport["VideoContentName"] = "TransportName"; | 1531 session_stats.proxy_to_transport["VideoContentName"] = "TransportName"; |
| 1394 session_stats.transport_stats["TransportName"].transport_name = | 1532 session_stats.transport_stats["TransportName"].transport_name = |
| 1395 "TransportName"; | 1533 "TransportName"; |
| 1396 | 1534 |
| 1397 // Make sure the associated |RTCTransportStats| is created. | 1535 // Make sure the associated |RTCTransportStats| is created. |
| 1398 cricket::TransportChannelStats channel_stats; | 1536 cricket::TransportChannelStats channel_stats; |
| 1399 channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP; | 1537 channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP; |
| 1400 session_stats.transport_stats["TransportName"].channel_stats.push_back( | 1538 session_stats.transport_stats["TransportName"].channel_stats.push_back( |
| 1401 channel_stats); | 1539 channel_stats); |
| 1402 | 1540 |
| 1403 EXPECT_CALL(test_->session(), GetTransportStats(_)) | 1541 EXPECT_CALL(test_->session(), GetTransportStats(_)) |
| 1404 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); | 1542 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); |
| 1405 EXPECT_CALL(test_->session(), video_channel()) | 1543 EXPECT_CALL(test_->session(), video_channel()) |
| 1406 .WillRepeatedly(Return(&video_channel)); | 1544 .WillRepeatedly(Return(&video_channel)); |
| 1407 | 1545 |
| 1408 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1546 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 1409 | 1547 |
| 1410 RTCInboundRTPStreamStats expected_video( | 1548 RTCInboundRTPStreamStats expected_video( |
| 1411 "RTCInboundRTPVideoStream_1", report->timestamp_us()); | 1549 "RTCInboundRTPVideoStream_1", report->timestamp_us()); |
| 1412 expected_video.ssrc = "1"; | 1550 expected_video.ssrc = "1"; |
| 1413 expected_video.is_remote = false; | 1551 expected_video.is_remote = false; |
| 1414 expected_video.media_type = "video"; | 1552 expected_video.media_type = "video"; |
| 1415 expected_video.transport_id = "RTCTransport_TransportName_" + | 1553 expected_video.transport_id = "RTCTransport_TransportName_" + |
| 1416 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); | 1554 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 1555 expected_video.codec_id = "RTCCodec_InboundVideo_42"; |
| 1417 expected_video.fir_count = 5; | 1556 expected_video.fir_count = 5; |
| 1418 expected_video.pli_count = 6; | 1557 expected_video.pli_count = 6; |
| 1419 expected_video.nack_count = 7; | 1558 expected_video.nack_count = 7; |
| 1420 expected_video.packets_received = 2; | 1559 expected_video.packets_received = 2; |
| 1421 expected_video.bytes_received = 3; | 1560 expected_video.bytes_received = 3; |
| 1422 expected_video.fraction_lost = 4.5; | 1561 expected_video.fraction_lost = 4.5; |
| 1423 | 1562 |
| 1424 ASSERT(report->Get(expected_video.id())); | 1563 ASSERT(report->Get(expected_video.id())); |
| 1425 const RTCInboundRTPStreamStats& video = report->Get( | 1564 const RTCInboundRTPStreamStats& video = report->Get( |
| 1426 expected_video.id())->cast_to<RTCInboundRTPStreamStats>(); | 1565 expected_video.id())->cast_to<RTCInboundRTPStreamStats>(); |
| 1427 EXPECT_EQ(video, expected_video); | 1566 EXPECT_EQ(video, expected_video); |
| 1428 | 1567 |
| 1429 EXPECT_TRUE(report->Get(*expected_video.transport_id)); | 1568 EXPECT_TRUE(report->Get(*expected_video.transport_id)); |
| 1569 EXPECT_TRUE(report->Get(*video.codec_id)); |
| 1430 } | 1570 } |
| 1431 | 1571 |
| 1432 TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Audio) { | 1572 TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Audio) { |
| 1433 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); | 1573 MockVoiceMediaChannel* voice_media_channel = new MockVoiceMediaChannel(); |
| 1434 cricket::VoiceChannel voice_channel( | 1574 cricket::VoiceChannel voice_channel( |
| 1435 test_->worker_thread(), test_->network_thread(), test_->media_engine(), | 1575 test_->worker_thread(), test_->network_thread(), test_->media_engine(), |
| 1436 voice_media_channel, nullptr, "VoiceContentName", false); | 1576 voice_media_channel, nullptr, "VoiceContentName", false); |
| 1437 | 1577 |
| 1438 cricket::VoiceMediaInfo voice_media_info; | 1578 cricket::VoiceMediaInfo voice_media_info; |
| 1579 |
| 1439 voice_media_info.senders.push_back(cricket::VoiceSenderInfo()); | 1580 voice_media_info.senders.push_back(cricket::VoiceSenderInfo()); |
| 1440 voice_media_info.senders[0].local_stats.push_back(cricket::SsrcSenderInfo()); | 1581 voice_media_info.senders[0].local_stats.push_back(cricket::SsrcSenderInfo()); |
| 1441 voice_media_info.senders[0].local_stats[0].ssrc = 1; | 1582 voice_media_info.senders[0].local_stats[0].ssrc = 1; |
| 1442 voice_media_info.senders[0].packets_sent = 2; | 1583 voice_media_info.senders[0].packets_sent = 2; |
| 1443 voice_media_info.senders[0].bytes_sent = 3; | 1584 voice_media_info.senders[0].bytes_sent = 3; |
| 1444 voice_media_info.senders[0].rtt_ms = 4500; | 1585 voice_media_info.senders[0].rtt_ms = 4500; |
| 1586 voice_media_info.senders[0].codec_payload_type = rtc::Optional<int>(42); |
| 1587 |
| 1588 RtpCodecParameters codec_parameters; |
| 1589 codec_parameters.payload_type = 42; |
| 1590 codec_parameters.mime_type = "dummy"; |
| 1591 codec_parameters.clock_rate = 0; |
| 1592 voice_media_info.send_codecs.insert( |
| 1593 std::make_pair(codec_parameters.payload_type, codec_parameters)); |
| 1594 |
| 1445 EXPECT_CALL(*voice_media_channel, GetStats(_)) | 1595 EXPECT_CALL(*voice_media_channel, GetStats(_)) |
| 1446 .WillOnce(DoAll(SetArgPointee<0>(voice_media_info), Return(true))); | 1596 .WillOnce(DoAll(SetArgPointee<0>(voice_media_info), Return(true))); |
| 1447 | 1597 |
| 1448 SessionStats session_stats; | 1598 SessionStats session_stats; |
| 1449 session_stats.proxy_to_transport["VoiceContentName"] = "TransportName"; | 1599 session_stats.proxy_to_transport["VoiceContentName"] = "TransportName"; |
| 1450 session_stats.transport_stats["TransportName"].transport_name = | 1600 session_stats.transport_stats["TransportName"].transport_name = |
| 1451 "TransportName"; | 1601 "TransportName"; |
| 1452 | 1602 |
| 1453 // Make sure the associated |RTCTransportStats| is created. | 1603 // Make sure the associated |RTCTransportStats| is created. |
| 1454 cricket::TransportChannelStats channel_stats; | 1604 cricket::TransportChannelStats channel_stats; |
| 1455 channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP; | 1605 channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP; |
| 1456 session_stats.transport_stats["TransportName"].channel_stats.push_back( | 1606 session_stats.transport_stats["TransportName"].channel_stats.push_back( |
| 1457 channel_stats); | 1607 channel_stats); |
| 1458 | 1608 |
| 1459 EXPECT_CALL(test_->session(), GetTransportStats(_)) | 1609 EXPECT_CALL(test_->session(), GetTransportStats(_)) |
| 1460 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); | 1610 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); |
| 1461 EXPECT_CALL(test_->session(), voice_channel()) | 1611 EXPECT_CALL(test_->session(), voice_channel()) |
| 1462 .WillRepeatedly(Return(&voice_channel)); | 1612 .WillRepeatedly(Return(&voice_channel)); |
| 1463 | 1613 |
| 1464 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1614 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 1465 | 1615 |
| 1466 RTCOutboundRTPStreamStats expected_audio( | 1616 RTCOutboundRTPStreamStats expected_audio( |
| 1467 "RTCOutboundRTPAudioStream_1", report->timestamp_us()); | 1617 "RTCOutboundRTPAudioStream_1", report->timestamp_us()); |
| 1468 expected_audio.ssrc = "1"; | 1618 expected_audio.ssrc = "1"; |
| 1469 expected_audio.is_remote = false; | 1619 expected_audio.is_remote = false; |
| 1470 expected_audio.media_type = "audio"; | 1620 expected_audio.media_type = "audio"; |
| 1471 expected_audio.transport_id = "RTCTransport_TransportName_" + | 1621 expected_audio.transport_id = "RTCTransport_TransportName_" + |
| 1472 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); | 1622 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 1623 expected_audio.codec_id = "RTCCodec_OutboundAudio_42"; |
| 1473 expected_audio.packets_sent = 2; | 1624 expected_audio.packets_sent = 2; |
| 1474 expected_audio.bytes_sent = 3; | 1625 expected_audio.bytes_sent = 3; |
| 1475 expected_audio.round_trip_time = 4.5; | 1626 expected_audio.round_trip_time = 4.5; |
| 1476 | 1627 |
| 1477 ASSERT(report->Get(expected_audio.id())); | 1628 ASSERT(report->Get(expected_audio.id())); |
| 1478 const RTCOutboundRTPStreamStats& audio = report->Get( | 1629 const RTCOutboundRTPStreamStats& audio = report->Get( |
| 1479 expected_audio.id())->cast_to<RTCOutboundRTPStreamStats>(); | 1630 expected_audio.id())->cast_to<RTCOutboundRTPStreamStats>(); |
| 1480 EXPECT_EQ(audio, expected_audio); | 1631 EXPECT_EQ(audio, expected_audio); |
| 1481 | 1632 |
| 1482 EXPECT_TRUE(report->Get(*expected_audio.transport_id)); | 1633 EXPECT_TRUE(report->Get(*expected_audio.transport_id)); |
| 1634 EXPECT_TRUE(report->Get(*expected_audio.codec_id)); |
| 1483 } | 1635 } |
| 1484 | 1636 |
| 1485 TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Video) { | 1637 TEST_F(RTCStatsCollectorTest, CollectRTCOutboundRTPStreamStats_Video) { |
| 1486 MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel(); | 1638 MockVideoMediaChannel* video_media_channel = new MockVideoMediaChannel(); |
| 1487 cricket::VideoChannel video_channel( | 1639 cricket::VideoChannel video_channel( |
| 1488 test_->worker_thread(), test_->network_thread(), video_media_channel, | 1640 test_->worker_thread(), test_->network_thread(), video_media_channel, |
| 1489 nullptr, "VideoContentName", false); | 1641 nullptr, "VideoContentName", false); |
| 1490 | 1642 |
| 1491 cricket::VideoMediaInfo video_media_info; | 1643 cricket::VideoMediaInfo video_media_info; |
| 1644 |
| 1492 video_media_info.senders.push_back(cricket::VideoSenderInfo()); | 1645 video_media_info.senders.push_back(cricket::VideoSenderInfo()); |
| 1493 video_media_info.senders[0].local_stats.push_back(cricket::SsrcSenderInfo()); | 1646 video_media_info.senders[0].local_stats.push_back(cricket::SsrcSenderInfo()); |
| 1494 video_media_info.senders[0].local_stats[0].ssrc = 1; | 1647 video_media_info.senders[0].local_stats[0].ssrc = 1; |
| 1495 video_media_info.senders[0].firs_rcvd = 2; | 1648 video_media_info.senders[0].firs_rcvd = 2; |
| 1496 video_media_info.senders[0].plis_rcvd = 3; | 1649 video_media_info.senders[0].plis_rcvd = 3; |
| 1497 video_media_info.senders[0].nacks_rcvd = 4; | 1650 video_media_info.senders[0].nacks_rcvd = 4; |
| 1498 video_media_info.senders[0].packets_sent = 5; | 1651 video_media_info.senders[0].packets_sent = 5; |
| 1499 video_media_info.senders[0].bytes_sent = 6; | 1652 video_media_info.senders[0].bytes_sent = 6; |
| 1500 video_media_info.senders[0].rtt_ms = 7500; | 1653 video_media_info.senders[0].rtt_ms = 7500; |
| 1654 video_media_info.senders[0].codec_payload_type = rtc::Optional<int>(42); |
| 1655 |
| 1656 RtpCodecParameters codec_parameters; |
| 1657 codec_parameters.payload_type = 42; |
| 1658 codec_parameters.mime_type = "dummy"; |
| 1659 codec_parameters.clock_rate = 0; |
| 1660 video_media_info.send_codecs.insert( |
| 1661 std::make_pair(codec_parameters.payload_type, codec_parameters)); |
| 1662 |
| 1501 EXPECT_CALL(*video_media_channel, GetStats(_)) | 1663 EXPECT_CALL(*video_media_channel, GetStats(_)) |
| 1502 .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true))); | 1664 .WillOnce(DoAll(SetArgPointee<0>(video_media_info), Return(true))); |
| 1503 | 1665 |
| 1504 SessionStats session_stats; | 1666 SessionStats session_stats; |
| 1505 session_stats.proxy_to_transport["VideoContentName"] = "TransportName"; | 1667 session_stats.proxy_to_transport["VideoContentName"] = "TransportName"; |
| 1506 session_stats.transport_stats["TransportName"].transport_name = | 1668 session_stats.transport_stats["TransportName"].transport_name = |
| 1507 "TransportName"; | 1669 "TransportName"; |
| 1508 | 1670 |
| 1509 // Make sure the associated |RTCTransportStats| is created. | 1671 // Make sure the associated |RTCTransportStats| is created. |
| 1510 cricket::TransportChannelStats channel_stats; | 1672 cricket::TransportChannelStats channel_stats; |
| 1511 channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP; | 1673 channel_stats.component = cricket::ICE_CANDIDATE_COMPONENT_RTP; |
| 1512 session_stats.transport_stats["TransportName"].channel_stats.push_back( | 1674 session_stats.transport_stats["TransportName"].channel_stats.push_back( |
| 1513 channel_stats); | 1675 channel_stats); |
| 1514 | 1676 |
| 1515 EXPECT_CALL(test_->session(), GetTransportStats(_)) | 1677 EXPECT_CALL(test_->session(), GetTransportStats(_)) |
| 1516 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); | 1678 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), Return(true))); |
| 1517 EXPECT_CALL(test_->session(), video_channel()) | 1679 EXPECT_CALL(test_->session(), video_channel()) |
| 1518 .WillRepeatedly(Return(&video_channel)); | 1680 .WillRepeatedly(Return(&video_channel)); |
| 1519 | 1681 |
| 1520 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); | 1682 rtc::scoped_refptr<const RTCStatsReport> report = GetStatsReport(); |
| 1521 | 1683 |
| 1522 RTCOutboundRTPStreamStats expected_video( | 1684 RTCOutboundRTPStreamStats expected_video( |
| 1523 "RTCOutboundRTPVideoStream_1", report->timestamp_us()); | 1685 "RTCOutboundRTPVideoStream_1", report->timestamp_us()); |
| 1524 expected_video.ssrc = "1"; | 1686 expected_video.ssrc = "1"; |
| 1525 expected_video.is_remote = false; | 1687 expected_video.is_remote = false; |
| 1526 expected_video.media_type = "video"; | 1688 expected_video.media_type = "video"; |
| 1527 expected_video.transport_id = "RTCTransport_TransportName_" + | 1689 expected_video.transport_id = "RTCTransport_TransportName_" + |
| 1528 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); | 1690 rtc::ToString<>(cricket::ICE_CANDIDATE_COMPONENT_RTP); |
| 1691 expected_video.codec_id = "RTCCodec_OutboundVideo_42"; |
| 1529 expected_video.fir_count = 2; | 1692 expected_video.fir_count = 2; |
| 1530 expected_video.pli_count = 3; | 1693 expected_video.pli_count = 3; |
| 1531 expected_video.nack_count = 4; | 1694 expected_video.nack_count = 4; |
| 1532 expected_video.packets_sent = 5; | 1695 expected_video.packets_sent = 5; |
| 1533 expected_video.bytes_sent = 6; | 1696 expected_video.bytes_sent = 6; |
| 1534 expected_video.round_trip_time = 7.5; | 1697 expected_video.round_trip_time = 7.5; |
| 1535 | 1698 |
| 1536 ASSERT(report->Get(expected_video.id())); | 1699 ASSERT(report->Get(expected_video.id())); |
| 1537 const RTCOutboundRTPStreamStats& video = report->Get( | 1700 const RTCOutboundRTPStreamStats& video = report->Get( |
| 1538 expected_video.id())->cast_to<RTCOutboundRTPStreamStats>(); | 1701 expected_video.id())->cast_to<RTCOutboundRTPStreamStats>(); |
| 1539 EXPECT_EQ(video, expected_video); | 1702 EXPECT_EQ(video, expected_video); |
| 1540 | 1703 |
| 1541 EXPECT_TRUE(report->Get(*expected_video.transport_id)); | 1704 EXPECT_TRUE(report->Get(*expected_video.transport_id)); |
| 1705 EXPECT_TRUE(report->Get(*expected_video.codec_id)); |
| 1542 } | 1706 } |
| 1543 | 1707 |
| 1544 TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) { | 1708 TEST_F(RTCStatsCollectorTest, CollectRTCTransportStats) { |
| 1545 std::unique_ptr<cricket::Candidate> rtp_local_candidate = CreateFakeCandidate( | 1709 std::unique_ptr<cricket::Candidate> rtp_local_candidate = CreateFakeCandidate( |
| 1546 "42.42.42.42", 42, "protocol", cricket::LOCAL_PORT_TYPE, 42); | 1710 "42.42.42.42", 42, "protocol", cricket::LOCAL_PORT_TYPE, 42); |
| 1547 std::unique_ptr<cricket::Candidate> rtp_remote_candidate = | 1711 std::unique_ptr<cricket::Candidate> rtp_remote_candidate = |
| 1548 CreateFakeCandidate("42.42.42.42", 42, "protocol", | 1712 CreateFakeCandidate("42.42.42.42", 42, "protocol", |
| 1549 cricket::LOCAL_PORT_TYPE, 42); | 1713 cricket::LOCAL_PORT_TYPE, 42); |
| 1550 std::unique_ptr<cricket::Candidate> rtcp_local_candidate = | 1714 std::unique_ptr<cricket::Candidate> rtcp_local_candidate = |
| 1551 CreateFakeCandidate("42.42.42.42", 42, "protocol", | 1715 CreateFakeCandidate("42.42.42.42", 42, "protocol", |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1653 rtc::scoped_refptr<FakeRTCStatsCollector> collector_; | 1817 rtc::scoped_refptr<FakeRTCStatsCollector> collector_; |
| 1654 }; | 1818 }; |
| 1655 | 1819 |
| 1656 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) { | 1820 TEST_F(RTCStatsCollectorTestWithFakeCollector, ThreadUsageAndResultsMerging) { |
| 1657 collector_->VerifyThreadUsageAndResultsMerging(); | 1821 collector_->VerifyThreadUsageAndResultsMerging(); |
| 1658 } | 1822 } |
| 1659 | 1823 |
| 1660 } // namespace | 1824 } // namespace |
| 1661 | 1825 |
| 1662 } // namespace webrtc | 1826 } // namespace webrtc |
| OLD | NEW |