statscollector_unittest.cc revision b90991dade9139e5c14c3b616a9eff07b9d6fdda
128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <stdio.h> 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/statscollector.h" 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastream.h" 3240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h" 3340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreamtrack.h" 3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org#include "talk/base/base64.h" 364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org#include "talk/base/fakesslidentity.h" 3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/gunit.h" 3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h" 3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/devices/fakedevicemanager.h" 4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/p2p/base/fakesession.h" 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/channelmanager.h" 4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "testing/base/public/gmock.h" 4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 44b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing cricket::StatsOptions; 4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_; 4628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll; 47b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing testing::Field; 4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return; 4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull; 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee; 51b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing webrtc::PeerConnectionInterface; 5240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReport; 5340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReports; 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager; 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeDeviceManager; 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace { 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND"; 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNoReports[] = "NO REPORTS"; 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Constant names for track identification. 6997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst char kTrackId[] = "somename"; 7040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst char kAudioTrackId[] = "audio_track_id"; 7197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst uint32 kSsrcOfTrack = 1234; 7297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession { 7428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org explicit MockWebRtcSession(cricket::ChannelManager* channel_manager) 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : WebRtcSession(channel_manager, talk_base::Thread::Current(), 774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::Thread::Current(), NULL, NULL) { 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD0(voice_channel, cricket::VoiceChannel*()); 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD0(video_channel, cricket::VideoChannel*()); 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD2(GetTrackIdBySsrc, bool(uint32, std::string*)); 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::SessionStats*)); 834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org MOCK_METHOD1(GetTransport, cricket::Transport*(const std::string&)); 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel { 8728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 8828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel() 8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : cricket::FakeVideoMediaChannel(NULL) { 9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // MOCK_METHOD0(transport_channel, cricket::TransportChannel*()); 92b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org MOCK_METHOD2(GetStats, bool(const StatsOptions&, cricket::VideoMediaInfo*)); 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass MockVoiceMediaChannel : public cricket::FakeVoiceMediaChannel { 9640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 9740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel() : cricket::FakeVoiceMediaChannel(NULL) { 9840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 9940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VoiceMediaInfo*)); 10040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 10140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 10240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeAudioProcessor : public webrtc::AudioProcessorInterface { 10340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 10440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org FakeAudioProcessor() {} 10540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ~FakeAudioProcessor() {} 10640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 10740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 10840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void GetStats( 10940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org AudioProcessorInterface::AudioProcessorStats* stats) OVERRIDE { 11040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->typing_noise_detected = true; 11140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss = 2; 11240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss_enhancement = 3; 11340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_median_ms = 4; 11440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->aec_quality_min = 5.1f; 11540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_std_ms = 6; 11640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 11740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 11840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 11940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeLocalAudioTrack 12040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> { 12140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 12240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org explicit FakeLocalAudioTrack(const std::string& id) 12340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id), 12440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org processor_(new talk_base::RefCountedObject<FakeAudioProcessor>()) {} 12540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string kind() const OVERRIDE { 12640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return "audio"; 12740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 12840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual webrtc::AudioSourceInterface* GetSource() const OVERRIDE { 12940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return NULL; 13040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 13140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void AddSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {} 13240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void RemoveSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {} 13340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual bool GetSignalLevel(int* level) OVERRIDE { 13440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org *level = 1; 13540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return true; 13640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 137b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org virtual talk_base::scoped_refptr<webrtc::AudioProcessorInterface> 138b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org GetAudioProcessor() OVERRIDE { 139b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org return processor_; 14040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 14140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 14340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org talk_base::scoped_refptr<FakeAudioProcessor> processor_; 14440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 14540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 1474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& name, 1484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::Values::const_iterator it = report->values.begin(); 1504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org for (; it != report->values.end(); ++it) { 1514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (it->name == name) { 1524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org *value = it->value; 1534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return true; 1544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return false; 1574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 15928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractStatsValue(const std::string& type, 16040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, 16128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string name) { 16228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports.empty()) { 16328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNoReports; 16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].type != type) 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org continue; 1684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (GetValue(&reports[i], name, &ret)) { 1704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 17940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType( 18040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, const std::string& type, int n) { 18128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 18228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].type == type) { 18328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 18428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 18528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return &reports[i]; 18628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 18728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 19028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports, 19240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string& id) { 19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].id == id) { 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return &reports[i]; 19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports, 20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& name) { 20328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 20440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, reports, name); 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports, 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& name) { 20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 21040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeBwe, reports, name); 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 2144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return talk_base::SSLIdentity::DerToPem( 2154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::kPemTypeCertificate, 2164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 2174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 2184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 2214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 2224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 2234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 2244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 2254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 22740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports, 2284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 2294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& start_id) { 2304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string certificate_id = start_id; 2314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 2324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 23340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindReportById(reports, certificate_id); 2344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 23519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 2374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 23840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameDer, &der_base64)); 2394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der = talk_base::Base64::Decode(der_base64, 2404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::Base64::DO_STRICT); 2414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 24219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 24319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 24419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 24519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 24640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprintAlgorithm, 24719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 24819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 24919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string sha_1_str = talk_base::DIGEST_SHA_1; 25019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 25119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 25219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string dummy_fingerprint; // Value is not checked. 25319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 25419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 25540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprint, 25619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &dummy_fingerprint)); 25719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 2594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (!GetValue( 26040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameIssuerId, &certificate_id)) 2614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 2624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 2644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 26640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report, 26740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const cricket::VoiceSenderInfo& sinfo) { 26840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string value_in_report; 26940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 27040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 27140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(sinfo.codec_name, value_in_report); 27240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 27340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameBytesSent, &value_in_report)); 27440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int64>(sinfo.bytes_sent), value_in_report); 27540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 27640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 27740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.packets_sent), value_in_report); 27840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 27940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 28040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.rtt_ms), value_in_report); 28140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 28240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 28340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.rtt_ms), value_in_report); 28440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 28540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 28640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.jitter_ms), value_in_report); 28740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 28840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoCancellationQualityMin, 28940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 29040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<float>(sinfo.aec_quality_min), value_in_report); 29140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 29240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 29340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.echo_delay_median_ms), 29440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 29540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 29640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report)); 29740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.echo_delay_std_ms), 29840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 29940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 30040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report)); 30140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.echo_return_loss), 30240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 30340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 30440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLossEnhancement, 30540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 30640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.echo_return_loss_enhancement), 30740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 30840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 30940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); 31040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.audio_level), value_in_report); 31140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 31240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); 31340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false"; 31440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(typing_detected, value_in_report); 31540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 31640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 31728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 31828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 31928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 32028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : media_engine_(new cricket::FakeMediaEngine), 32128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_manager_( 32228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::ChannelManager(media_engine_, 32328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::FakeDeviceManager(), 32428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::Thread::Current())), 32597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_(channel_manager_.get()), 32697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org track_id_(kTrackId) { 32728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 32828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false)); 32928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 33028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 33197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 33297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 33397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 33497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org void InitSessionStats(const std::string vc_name) { 33597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 33697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 33797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 33897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 33997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.content_name = kTransportName; 34097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 34197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 34297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 34397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 34497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 34597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 34697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Adds a track with a given SSRC into the stats. 34797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org void AddVideoTrackStats() { 34897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 34997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org track_= webrtc::VideoTrack::Create(kTrackId, NULL); 35097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 35197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) 35297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(track_id_), 35397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 35497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 35597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 35640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Adds a local audio track with a given SSRC into the stats. 35740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org void AddLocalAudioTrackStats() { 35840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 35940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 36040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 36140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org audio_track_ = 36240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org new talk_base::RefCountedObject<FakeLocalAudioTrack>(kAudioTrackId); 36340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 36440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) 36540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kAudioTrackId), 36640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 36740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 36840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 3694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org void TestCertificateReports(const talk_base::FakeSSLCertificate& local_cert, 3704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 3714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const talk_base::FakeSSLCertificate& remote_cert, 3724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 3734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 37440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 3754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 3764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 3784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 3794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 3804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 3824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 3834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 3844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 3864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 3874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 3884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 3904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLIdentity local_identity(local_cert); 3914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<talk_base::FakeSSLCertificate> remote_cert_copy( 3924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 3934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 3954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<cricket::FakeTransport> transport( 3964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 3974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 3984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 3994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 4004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 4014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 4024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 4034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 4044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 4054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 4064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 4074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 4084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 4094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(Return(transport.get())); 4104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 4114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 4124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 41340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 41440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 4154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 416b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 4174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 4184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 4194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 42040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 42140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 4224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 4234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 4244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 4254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 42640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 4274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 42840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 429b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 430b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 431b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org CheckCertChainReports(reports, local_ders, local_certificate_id); 432b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 433b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 434b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 4354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 4364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 4374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 43840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 4394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 44040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 441b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 442b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 443b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org CheckCertChainReports(reports, remote_ders, remote_certificate_id); 444b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 445b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 446b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 4474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 44897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 44928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 45028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_; 45128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 45297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SessionStats session_stats_; 45397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> stream_; 45497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org talk_base::scoped_refptr<webrtc::VideoTrack> track_; 45540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org talk_base::scoped_refptr<FakeLocalAudioTrack> audio_track_; 45697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org std::string track_id_; 45728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 45828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 45928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 46028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 46128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 46228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 46328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 46428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 46540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 46628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 46728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 46828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 46928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 47028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 47128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 47397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 47497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 47528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 4775bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 47828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 48140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 48240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 483b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 484b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 486b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 48728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); 48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 49528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 49628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 49728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 49840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 49928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 50028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 50128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 50228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 50797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 50897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 50928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 5115bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 51328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 51428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 51528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 51628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 51728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 52040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 52140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 522b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 523b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 52428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 52597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 526b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 52728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 52828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); 52928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 53028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org result = ExtractBweStatsValue(reports, "googTargetEncBitrate"); 53128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 53228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 53328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 53528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 53628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 53728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 53840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 53928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 54040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 54140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 542b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 54328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 54440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 54540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 54628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 54728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 54828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 54928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 55028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 55128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 55228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 55340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 55428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 55540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 55640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 557b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 558b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 55928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 56040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 56140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 56228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 56328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 56440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 56528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 56628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 56728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 56828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 56928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 57028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 57128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 57228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 57328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 57428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 57597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 57697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 57728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 57828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 57928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 58040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 58128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 58228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 58328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 58428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 58540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(std::string(StatsReport::kStatsReportTypeTrack), 58628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports[0].type); 58728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 58828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 58940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 59028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 59140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 59228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTrackId, trackValue); 59328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 59428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 59528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 59628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 59728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 59828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 59928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 60028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 60128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 60297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 60397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 60428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 60528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 60628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 60740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 60828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 60928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 61028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 61128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 61228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 61328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 61428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 6155bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 61628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 61728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 61828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 61940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 62040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 621b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 622b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 62328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 62428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 625b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 62628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 62797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 62897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 62997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 63040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 63140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 63228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(track_report == NULL); 63328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 63497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 63597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 63697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 63797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 63828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 63940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 64028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(track_report == NULL); 64128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 64228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 64340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 64428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 64528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 64628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 64740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 64828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTrackId, track_id); 64928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 65028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 65128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 65228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 65328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 65428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 65528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 65628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 65728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 65828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 65928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 66097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 66197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 66228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 66428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 66628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 66828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 66928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 67028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 67128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 67228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 6735bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 67428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 67528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 67628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 67740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 67840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 679b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 680b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 68128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 68228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 68397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 68428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 68540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 68640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 68728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 688b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 68928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 69028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 69140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 69228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 69340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 69428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 69540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* transport_report = FindReportById(reports, 69640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org transport_id); 69728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 69828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 69928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 70097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 70197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 70297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 70397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 70497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 70597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 70697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 70797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 70897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 70997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 71097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 71197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 71297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.set_session(&session_); 71397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 71440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 71540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 71697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 717b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 71840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 71997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 72040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 72140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 72297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 72397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 72497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 72597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 72697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 72797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 72897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 72997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 73097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 73197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 73297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 73397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 73497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 73597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 73697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 73797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.set_session(&session_); 73897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 73940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 74097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 74197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 74297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 74397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 74440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 74540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 74697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 74797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 74897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 74997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 75097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 75197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 75297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 75397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 7545bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 75597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 75697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 75797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 75840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 75940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 760b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 761b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 76297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 76397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 764b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 76597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 76640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 76740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 76897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 76997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_NE(0, remote_report->timestamp); 77097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 77197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 7724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 7734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 77419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 7754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 7764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 7774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 7784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 7794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 7804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 7814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 7824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate local_cert(DersToPems(local_ders)); 7834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 7854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 7864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 7874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 7884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 7894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 7904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 7914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 7934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 7944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 7964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 79719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 7984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 7994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 8004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate local_cert(DerToPem(local_der)); 8014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 8034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 8044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 8054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 8074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 8084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 8094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 8114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 81219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 8134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 81440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 8154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 8164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 8184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 8194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 8204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 8224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 8234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 8244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 8264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 8274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 8284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 8304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 8314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(ReturnNull()); 8324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 8334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 8344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 83597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 83640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 83740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 8384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 839b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 8404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 8414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 8434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 84440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 8454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 84640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 8474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 8484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 8504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 85140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 8524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 85340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 8544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 8554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 8564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 8584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 85919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 8604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 86140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 8624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 8634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 8654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 8664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 8674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 8694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 8704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 8714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 8734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 8744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 8754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 8774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<cricket::FakeTransport> transport( 8784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 8794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 8804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 8814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 8824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 8844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 8854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(Return(transport.get())); 8864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 8874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 8884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 88940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 89040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 8914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 892b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 8934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 8944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 8954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 8964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 89740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 8984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 89940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 9004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 9014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 9024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 9034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 90440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 9054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 90640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 9074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 9084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 9094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 910b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 911b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 912b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 913b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 914b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 915b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org talk_base::FakeSSLCertificate local_cert(DerToPem(local_der)); 916b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 917b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 918b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 919b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 920b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 921b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 922b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 923b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 924b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 925b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 926b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// Verifies the correct optons are passed to the VideoMediaChannel when using 927b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// verbose output level. 928b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, StatsOutputLevelVerbose) { 929b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 930b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 931b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 932b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 933b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.set_session(&session_); 934b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 93540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 936b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::VideoMediaInfo stats_read; 937b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::BandwidthEstimationInfo bwe; 938b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.total_received_propagation_delta_ms = 10; 939b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(100); 940b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(200); 941b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(1000); 942b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(2000); 943b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats_read.bw_estimations.push_back(bwe); 944b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 945b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(session_, video_channel()) 946b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(Return(&video_channel)); 94740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 948b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 949b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org StatsOptions options; 950b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org options.include_received_propagation_stats = true; 951b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats( 952b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Field(&StatsOptions::include_received_propagation_stats, true), 953b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org _)) 954b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 955b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Return(true))); 956b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 957b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelDebug); 958b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.GetStats(NULL, &reports); 959b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string result = ExtractBweStatsValue( 960b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org reports, "googReceivedPacketGroupPropagationDeltaSumDebug"); 961b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("10", result); 962b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 963b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org reports, "googReceivedPacketGroupPropagationDeltaDebug"); 964b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[100, 200]", result); 965b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 966b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org reports, "googReceivedPacketGroupArrivalTimeDebug"); 967b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[1000, 2000]", result); 968b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 969b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 97040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 97140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 97240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 97340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 97440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 97540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 97640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 97740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceChannel voice_channel(talk_base::Thread::Current(), 97840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 97940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org AddLocalAudioTrackStats(); 98040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 98140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 98240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 98340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.set_session(&session_); 98440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 98540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 98640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 98740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 98840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 98940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 99040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 99140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 99240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Contents won't be modified by the AudioTrackInterface::GetStats(). 99340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 99440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.codec_name = "fake_codec"; 99540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.bytes_sent = 100; 99640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.packets_sent = 101; 99740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.rtt_ms = 102; 99840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.fraction_lost = 103; 99940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.jitter_ms = 104; 100040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.packets_lost = 105; 100140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.ext_seqnum = 106; 100240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 100340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Contents will be modified by the AudioTrackInterface::GetStats(). 100440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.audio_level = 107; 100540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_return_loss = 108;; 100640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_return_loss_enhancement = 109; 100740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_delay_median_ms = 110; 100840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_delay_std_ms = 111; 100940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.aec_quality_min = 112.0f; 101040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.typing_noise_detected = false; 101140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 101240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 101340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 101440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 101540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 101640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 101740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 101840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 101940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 102040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 102140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 102240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 102340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 102440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 102540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 102640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verfy the existence of the track report. 102740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 102840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 102940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 103040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 103140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 103240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(kAudioTrackId, track_id); 103340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 103440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 103540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 103640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 103740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report. 103840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org audio_track_->GetSignalLevel(&voice_sender_info.audio_level); 103940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; 104040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org audio_track_->GetAudioProcessor()->GetStats(&audio_processor_stats); 104140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.typing_noise_detected = 104240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org audio_processor_stats.typing_noise_detected; 104340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_return_loss = audio_processor_stats.echo_return_loss; 104440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_return_loss_enhancement = 104540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org audio_processor_stats.echo_return_loss_enhancement; 104640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_delay_median_ms = 104740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org audio_processor_stats.echo_delay_median_ms; 104840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.aec_quality_min = audio_processor_stats.aec_quality_min; 104940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_delay_std_ms = audio_processor_stats.echo_delay_std_ms; 105040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 105140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 105240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verify we get the same result by passing a track to GetStats(). 105340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports track_reports; // returned values. 105440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(audio_track_.get(), &track_reports); 105540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 105640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 105740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(track_report == NULL); 105840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 105940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 106040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(kAudioTrackId, track_id); 106140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 106240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameSsrc); 106340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 106440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 106540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 106640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 106740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 106840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 106940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 107040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 107140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 107240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 107340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 107440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceChannel voice_channel(talk_base::Thread::Current(), 107540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 107640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org AddLocalAudioTrackStats(); 107740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 107840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 107940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 108040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.set_session(&session_); 108140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 108240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 108340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 108440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 108540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 108640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 108740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 108840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 108940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 109040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Contents won't be modified by the AudioTrackInterface::GetStats(). 109140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 109240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.codec_name = "fake_codec"; 109340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.bytes_sent = 100; 109440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.packets_sent = 101; 109540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.rtt_ms = 102; 109640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.fraction_lost = 103; 109740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.jitter_ms = 104; 109840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.packets_lost = 105; 109940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.ext_seqnum = 106; 110040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 110140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Contents will be modified by the AudioTrackInterface::GetStats(). 110240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.audio_level = 107; 110340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_return_loss = 108;; 110440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_return_loss_enhancement = 109; 110540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_delay_median_ms = 110; 110640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.echo_delay_std_ms = 111; 110740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.aec_quality_min = 112; 110840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org voice_sender_info.typing_noise_detected = false; 110940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 111040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 111140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 111240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 111340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 111440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 111540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 111640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 111740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 111840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 111940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 112040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 112140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 112240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 112340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 112440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 112540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 112640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 112740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 112840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 112940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 113040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(kAudioTrackId, track_id); 113140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 113240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 113340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 113440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 113540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 113640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 113740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 113840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 113940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 114040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 114128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace 1142