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 |