OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2014 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2014 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 |
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
158 } | 158 } |
159 rtc::scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor() | 159 rtc::scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor() |
160 override { | 160 override { |
161 return processor_; | 161 return processor_; |
162 } | 162 } |
163 | 163 |
164 private: | 164 private: |
165 rtc::scoped_refptr<FakeAudioProcessor> processor_; | 165 rtc::scoped_refptr<FakeAudioProcessor> processor_; |
166 }; | 166 }; |
167 | 167 |
| 168 // This fake audio processor is used to verify that the undesired initial values |
| 169 // (-1) will be filtered out. |
| 170 class FakeAudioProcessorWithInitValue : public webrtc::AudioProcessorInterface { |
| 171 public: |
| 172 FakeAudioProcessorWithInitValue() {} |
| 173 ~FakeAudioProcessorWithInitValue() {} |
| 174 |
| 175 private: |
| 176 void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override { |
| 177 stats->typing_noise_detected = false; |
| 178 stats->echo_return_loss = -100; |
| 179 stats->echo_return_loss_enhancement = -100; |
| 180 stats->echo_delay_median_ms = -1; |
| 181 stats->aec_quality_min = -1.0f; |
| 182 stats->echo_delay_std_ms = -1; |
| 183 } |
| 184 }; |
| 185 |
| 186 class FakeAudioTrackWithInitValue |
| 187 : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> { |
| 188 public: |
| 189 explicit FakeAudioTrackWithInitValue(const std::string& id) |
| 190 : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id), |
| 191 processor_( |
| 192 new rtc::RefCountedObject<FakeAudioProcessorWithInitValue>()) {} |
| 193 std::string kind() const override { return "audio"; } |
| 194 webrtc::AudioSourceInterface* GetSource() const override { return NULL; } |
| 195 void AddSink(webrtc::AudioTrackSinkInterface* sink) override {} |
| 196 void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {} |
| 197 bool GetSignalLevel(int* level) override { |
| 198 *level = 1; |
| 199 return true; |
| 200 } |
| 201 rtc::scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor() |
| 202 override { |
| 203 return processor_; |
| 204 } |
| 205 |
| 206 private: |
| 207 rtc::scoped_refptr<FakeAudioProcessorWithInitValue> processor_; |
| 208 }; |
| 209 |
168 bool GetValue(const StatsReport* report, | 210 bool GetValue(const StatsReport* report, |
169 StatsReport::StatsValueName name, | 211 StatsReport::StatsValueName name, |
170 std::string* value) { | 212 std::string* value) { |
171 const StatsReport::Value* v = report->FindValue(name); | 213 const StatsReport::Value* v = report->FindValue(name); |
172 if (!v) | 214 if (!v) |
173 return false; | 215 return false; |
174 *value = v->ToString(); | 216 *value = v->ToString(); |
175 return true; | 217 return true; |
176 } | 218 } |
177 | 219 |
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
437 voice_sender_info->audio_level = 107; | 479 voice_sender_info->audio_level = 107; |
438 voice_sender_info->echo_return_loss = 108; | 480 voice_sender_info->echo_return_loss = 108; |
439 voice_sender_info->echo_return_loss_enhancement = 109; | 481 voice_sender_info->echo_return_loss_enhancement = 109; |
440 voice_sender_info->echo_delay_median_ms = 110; | 482 voice_sender_info->echo_delay_median_ms = 110; |
441 voice_sender_info->echo_delay_std_ms = 111; | 483 voice_sender_info->echo_delay_std_ms = 111; |
442 voice_sender_info->aec_quality_min = 112.0f; | 484 voice_sender_info->aec_quality_min = 112.0f; |
443 voice_sender_info->typing_noise_detected = false; | 485 voice_sender_info->typing_noise_detected = false; |
444 } | 486 } |
445 | 487 |
446 void UpdateVoiceSenderInfoFromAudioTrack( | 488 void UpdateVoiceSenderInfoFromAudioTrack( |
447 FakeAudioTrack* audio_track, cricket::VoiceSenderInfo* voice_sender_info) { | 489 AudioTrackInterface* audio_track, |
| 490 cricket::VoiceSenderInfo* voice_sender_info) { |
448 audio_track->GetSignalLevel(&voice_sender_info->audio_level); | 491 audio_track->GetSignalLevel(&voice_sender_info->audio_level); |
449 webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; | 492 webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; |
450 audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); | 493 audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); |
451 voice_sender_info->typing_noise_detected = | 494 voice_sender_info->typing_noise_detected = |
452 audio_processor_stats.typing_noise_detected; | 495 audio_processor_stats.typing_noise_detected; |
453 voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; | 496 voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; |
454 voice_sender_info->echo_return_loss_enhancement = | 497 voice_sender_info->echo_return_loss_enhancement = |
455 audio_processor_stats.echo_return_loss_enhancement; | 498 audio_processor_stats.echo_return_loss_enhancement; |
456 voice_sender_info->echo_delay_median_ms = | 499 voice_sender_info->echo_delay_median_ms = |
457 audio_processor_stats.echo_delay_median_ms; | 500 audio_processor_stats.echo_delay_median_ms; |
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 MockWebRtcSession session_; | 814 MockWebRtcSession session_; |
772 MockPeerConnection pc_; | 815 MockPeerConnection pc_; |
773 FakeDataChannelProvider data_channel_provider_; | 816 FakeDataChannelProvider data_channel_provider_; |
774 SessionStats session_stats_; | 817 SessionStats session_stats_; |
775 rtc::scoped_refptr<webrtc::MediaStream> stream_; | 818 rtc::scoped_refptr<webrtc::MediaStream> stream_; |
776 rtc::scoped_refptr<webrtc::VideoTrack> track_; | 819 rtc::scoped_refptr<webrtc::VideoTrack> track_; |
777 rtc::scoped_refptr<FakeAudioTrack> audio_track_; | 820 rtc::scoped_refptr<FakeAudioTrack> audio_track_; |
778 std::vector<rtc::scoped_refptr<DataChannel>> data_channels_; | 821 std::vector<rtc::scoped_refptr<DataChannel>> data_channels_; |
779 }; | 822 }; |
780 | 823 |
| 824 TEST_F(StatsCollectorTest, FilterOutNegativeDataChannelId) { |
| 825 const std::string label = "hacks"; |
| 826 // The data channel id is from the Config which is -1 initially. |
| 827 const int id = -1; |
| 828 const std::string state = DataChannelInterface::DataStateString( |
| 829 DataChannelInterface::DataState::kConnecting); |
| 830 |
| 831 AddDataChannel(cricket::DCT_SCTP, label, id); |
| 832 StatsCollectorForTest stats(&pc_); |
| 833 |
| 834 stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); |
| 835 |
| 836 StatsReports reports; |
| 837 stats.GetStats(NULL, &reports); |
| 838 |
| 839 const StatsReport* report = |
| 840 FindNthReportByType(reports, StatsReport::kStatsReportTypeDataChannel, 1); |
| 841 |
| 842 std::string value_in_report; |
| 843 EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameDataChannelId, |
| 844 &value_in_report)); |
| 845 } |
| 846 |
781 // Verify that ExtractDataInfo populates reports. | 847 // Verify that ExtractDataInfo populates reports. |
782 TEST_F(StatsCollectorTest, ExtractDataInfo) { | 848 TEST_F(StatsCollectorTest, ExtractDataInfo) { |
783 const std::string label = "hacks"; | 849 const std::string label = "hacks"; |
784 const int id = 31337; | 850 const int id = 31337; |
785 const std::string state = DataChannelInterface::DataStateString( | 851 const std::string state = DataChannelInterface::DataStateString( |
786 DataChannelInterface::DataState::kConnecting); | 852 DataChannelInterface::DataState::kConnecting); |
787 | 853 |
788 AddDataChannel(cricket::DCT_SCTP, label, id); | 854 AddDataChannel(cricket::DCT_SCTP, label, id); |
789 StatsCollectorForTest stats(&pc_); | 855 StatsCollectorForTest stats(&pc_); |
790 | 856 |
(...skipping 702 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1493 // Build a remote certificate with an unsupported digest algorithm. | 1559 // Build a remote certificate with an unsupported digest algorithm. |
1494 std::string remote_der = "This is somebody else's der."; | 1560 std::string remote_der = "This is somebody else's der."; |
1495 std::unique_ptr<rtc::FakeSSLCertificate> remote_cert( | 1561 std::unique_ptr<rtc::FakeSSLCertificate> remote_cert( |
1496 new rtc::FakeSSLCertificate(DerToPem(remote_der))); | 1562 new rtc::FakeSSLCertificate(DerToPem(remote_der))); |
1497 remote_cert->set_digest_algorithm("foobar"); | 1563 remote_cert->set_digest_algorithm("foobar"); |
1498 | 1564 |
1499 TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), | 1565 TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), |
1500 std::move(remote_cert), std::vector<std::string>()); | 1566 std::move(remote_cert), std::vector<std::string>()); |
1501 } | 1567 } |
1502 | 1568 |
| 1569 // This test verifies that the audio/video related stats which are -1 initially |
| 1570 // will be filtered out. |
| 1571 TEST_F(StatsCollectorTest, FilterOutNegativeInitialValues) { |
| 1572 StatsCollectorForTest stats(&pc_); |
| 1573 |
| 1574 EXPECT_CALL(session_, GetLocalCertificate(_, _)) |
| 1575 .WillRepeatedly(Return(false)); |
| 1576 EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_)) |
| 1577 .WillRepeatedly(Return(nullptr)); |
| 1578 |
| 1579 MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); |
| 1580 // The transport_name known by the voice channel. |
| 1581 const std::string kVcName("vcname"); |
| 1582 cricket::VoiceChannel voice_channel(worker_thread_, network_thread_, |
| 1583 media_engine_, media_channel, nullptr, |
| 1584 kVcName, false); |
| 1585 |
| 1586 // Create a local stream with a local audio track and adds it to the stats. |
| 1587 if (stream_ == NULL) |
| 1588 stream_ = webrtc::MediaStream::Create("streamlabel"); |
| 1589 |
| 1590 rtc::scoped_refptr<FakeAudioTrackWithInitValue> local_track( |
| 1591 new rtc::RefCountedObject<FakeAudioTrackWithInitValue>(kLocalTrackId)); |
| 1592 stream_->AddTrack(local_track); |
| 1593 EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) |
| 1594 .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); |
| 1595 stats.AddStream(stream_); |
| 1596 stats.AddLocalAudioTrack(local_track.get(), kSsrcOfTrack); |
| 1597 |
| 1598 // Create a remote stream with a remote audio track and adds it to the stats. |
| 1599 rtc::scoped_refptr<webrtc::MediaStream> remote_stream( |
| 1600 webrtc::MediaStream::Create("remotestreamlabel")); |
| 1601 rtc::scoped_refptr<FakeAudioTrackWithInitValue> remote_track( |
| 1602 new rtc::RefCountedObject<FakeAudioTrackWithInitValue>(kRemoteTrackId)); |
| 1603 EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) |
| 1604 .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); |
| 1605 remote_stream->AddTrack(remote_track); |
| 1606 stats.AddStream(remote_stream); |
| 1607 |
| 1608 // Instruct the session to return stats containing the transport channel. |
| 1609 InitSessionStats(kVcName); |
| 1610 EXPECT_CALL(session_, GetTransportStats(_)) |
| 1611 .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), Return(true))); |
| 1612 |
| 1613 cricket::VoiceSenderInfo voice_sender_info; |
| 1614 voice_sender_info.add_ssrc(kSsrcOfTrack); |
| 1615 // These values are set to -1 initially in audio_send_stream. |
| 1616 // The voice_sender_info will read the values from audio_send_stream. |
| 1617 voice_sender_info.rtt_ms = -1; |
| 1618 voice_sender_info.packets_lost = -1; |
| 1619 voice_sender_info.jitter_ms = -1; |
| 1620 |
| 1621 // Some of the contents in |voice_sender_info| needs to be updated from the |
| 1622 // |audio_track_|. |
| 1623 UpdateVoiceSenderInfoFromAudioTrack(local_track.get(), &voice_sender_info); |
| 1624 |
| 1625 cricket::VoiceReceiverInfo voice_receiver_info; |
| 1626 voice_receiver_info.add_ssrc(kSsrcOfTrack); |
| 1627 voice_receiver_info.capture_start_ntp_time_ms = -1; |
| 1628 voice_receiver_info.audio_level = -1; |
| 1629 |
| 1630 // Constructs an ssrc stats update. |
| 1631 cricket::VoiceMediaInfo stats_read; |
| 1632 stats_read.senders.push_back(voice_sender_info); |
| 1633 stats_read.receivers.push_back(voice_receiver_info); |
| 1634 |
| 1635 EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); |
| 1636 EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); |
| 1637 EXPECT_CALL(*media_channel, GetStats(_)) |
| 1638 .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), Return(true))); |
| 1639 |
| 1640 StatsReports reports; |
| 1641 stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); |
| 1642 |
| 1643 // Get stats for the local track. |
| 1644 stats.GetStats(local_track.get(), &reports); |
| 1645 const StatsReport* report = |
| 1646 FindNthReportByType(reports, StatsReport::kStatsReportTypeSsrc, 1); |
| 1647 EXPECT_TRUE(report); |
| 1648 // The -1 will not be added to the stats report. |
| 1649 std::string value_in_report; |
| 1650 EXPECT_FALSE( |
| 1651 GetValue(report, StatsReport::kStatsValueNameRtt, &value_in_report)); |
| 1652 EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNamePacketsLost, |
| 1653 &value_in_report)); |
| 1654 EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameJitterReceived, |
| 1655 &value_in_report)); |
| 1656 EXPECT_FALSE(GetValue(report, |
| 1657 StatsReport::kStatsValueNameEchoCancellationQualityMin, |
| 1658 &value_in_report)); |
| 1659 EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameEchoDelayMedian, |
| 1660 &value_in_report)); |
| 1661 EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameEchoDelayStdDev, |
| 1662 &value_in_report)); |
| 1663 |
| 1664 // Get stats for the remote track. |
| 1665 reports.clear(); |
| 1666 stats.GetStats(remote_track.get(), &reports); |
| 1667 report = FindNthReportByType(reports, StatsReport::kStatsReportTypeSsrc, 1); |
| 1668 EXPECT_TRUE(report); |
| 1669 EXPECT_FALSE(GetValue(report, |
| 1670 StatsReport::kStatsValueNameCaptureStartNtpTimeMs, |
| 1671 &value_in_report)); |
| 1672 EXPECT_FALSE(GetValue(report, StatsReport::kStatsValueNameAudioInputLevel, |
| 1673 &value_in_report)); |
| 1674 } |
| 1675 |
1503 // This test verifies that a local stats object can get statistics via | 1676 // This test verifies that a local stats object can get statistics via |
1504 // AudioTrackInterface::GetStats() method. | 1677 // AudioTrackInterface::GetStats() method. |
1505 TEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { | 1678 TEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { |
1506 StatsCollectorForTest stats(&pc_); | 1679 StatsCollectorForTest stats(&pc_); |
1507 | 1680 |
1508 EXPECT_CALL(session_, GetLocalCertificate(_, _)) | 1681 EXPECT_CALL(session_, GetLocalCertificate(_, _)) |
1509 .WillRepeatedly(Return(false)); | 1682 .WillRepeatedly(Return(false)); |
1510 EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_)) | 1683 EXPECT_CALL(session_, GetRemoteSSLCertificate_ReturnsRawPointer(_)) |
1511 .WillRepeatedly(Return(nullptr)); | 1684 .WillRepeatedly(Return(nullptr)); |
1512 | 1685 |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1764 cricket::VoiceSenderInfo new_voice_sender_info; | 1937 cricket::VoiceSenderInfo new_voice_sender_info; |
1765 InitVoiceSenderInfo(&new_voice_sender_info); | 1938 InitVoiceSenderInfo(&new_voice_sender_info); |
1766 cricket::VoiceMediaInfo new_stats_read; | 1939 cricket::VoiceMediaInfo new_stats_read; |
1767 reports.clear(); | 1940 reports.clear(); |
1768 SetupAndVerifyAudioTrackStats( | 1941 SetupAndVerifyAudioTrackStats( |
1769 new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, | 1942 new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, |
1770 media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); | 1943 media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); |
1771 } | 1944 } |
1772 | 1945 |
1773 } // namespace webrtc | 1946 } // namespace webrtc |
OLD | NEW |