statscollector_unittest.cc revision 5f93d0a140515e3b8cdd1b9a4c6f5871144e5dee
128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 35f93d0a140515e3b8cdd1b9a4c6f5871144e5deejlmiller@webrtc.org * Copyright 2014 Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <stdio.h> 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/statscollector.h" 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastream.h" 3340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h" 34487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org#include "talk/app/webrtc/mediastreamsignaling.h" 3540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreamtrack.h" 36487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org#include "talk/app/webrtc/test/fakedatachannelprovider.h" 37487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org#include "talk/app/webrtc/test/fakemediastreamsignaling.h" 3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h" 4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/devices/fakedevicemanager.h" 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/channelmanager.h" 424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 44a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/base64.h" 45a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/fakesslidentity.h" 46a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h" 47950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org#include "webrtc/base/network.h" 48487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org#include "webrtc/p2p/base/fakesession.h" 4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing cricket::StatsOptions; 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll; 53b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing testing::Field; 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return; 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee; 57b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing webrtc::PeerConnectionInterface; 5840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReport; 5940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReports; 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager; 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeDeviceManager; 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 68950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgnamespace webrtc { 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND"; 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNoReports[] = "NO REPORTS"; 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Constant names for track identification. 754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kLocalTrackId[] = "local_track_id"; 764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kRemoteTrackId[] = "remote_track_id"; 7797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst uint32 kSsrcOfTrack = 1234; 7897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession { 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org explicit MockWebRtcSession(cricket::ChannelManager* channel_manager) 82d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org : WebRtcSession(channel_manager, rtc::Thread::Current(), 83d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current(), NULL, NULL) { 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 8540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD0(voice_channel, cricket::VoiceChannel*()); 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD0(video_channel, cricket::VideoChannel*()); 87487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org MOCK_CONST_METHOD0(mediastream_signaling, const MediaStreamSignaling*()); 884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Libjingle uses "local" for a outgoing track, and "remote" for a incoming 894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // track. 904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MOCK_METHOD2(GetLocalTrackIdBySsrc, bool(uint32, std::string*)); 914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MOCK_METHOD2(GetRemoteTrackIdBySsrc, bool(uint32, std::string*)); 9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::SessionStats*)); 934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org MOCK_METHOD1(GetTransport, cricket::Transport*(const std::string&)); 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel { 9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 981ecbe45c7e4c9142896cb2810d699558518f4f28buildbot@webrtc.org MockVideoMediaChannel() : cricket::FakeVideoMediaChannel(NULL) {} 991ecbe45c7e4c9142896cb2810d699558518f4f28buildbot@webrtc.org 10028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // MOCK_METHOD0(transport_channel, cricket::TransportChannel*()); 101b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org MOCK_METHOD2(GetStats, bool(const StatsOptions&, cricket::VideoMediaInfo*)); 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass MockVoiceMediaChannel : public cricket::FakeVoiceMediaChannel { 10540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 10640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel() : cricket::FakeVoiceMediaChannel(NULL) { 10740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 10840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VoiceMediaInfo*)); 10940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 11040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 11140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeAudioProcessor : public webrtc::AudioProcessorInterface { 11240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 11340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org FakeAudioProcessor() {} 11440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ~FakeAudioProcessor() {} 11540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 11640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 11740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void GetStats( 11840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org AudioProcessorInterface::AudioProcessorStats* stats) OVERRIDE { 11940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->typing_noise_detected = true; 12040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss = 2; 12140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss_enhancement = 3; 12240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_median_ms = 4; 12340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->aec_quality_min = 5.1f; 12440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_std_ms = 6; 12540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 12640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 12740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 1284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgclass FakeAudioTrack 12940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> { 13040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 1314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org explicit FakeAudioTrack(const std::string& id) 13240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id), 133d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org processor_(new rtc::RefCountedObject<FakeAudioProcessor>()) {} 13440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string kind() const OVERRIDE { 13540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return "audio"; 13640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 13740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual webrtc::AudioSourceInterface* GetSource() const OVERRIDE { 13840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return NULL; 13940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 14040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void AddSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {} 14140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void RemoveSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {} 14240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual bool GetSignalLevel(int* level) OVERRIDE { 14340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org *level = 1; 14440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return true; 14540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 146d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org virtual rtc::scoped_refptr<webrtc::AudioProcessorInterface> 147b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org GetAudioProcessor() OVERRIDE { 148b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org return processor_; 14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 15040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 152d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioProcessor> processor_; 15340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 15440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 156242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name, 1574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 1588e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto& v : report->values()) { 1598e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org if (v->name == name) { 1608e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org *value = v->value; 1614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return true; 1624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return false; 1654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractStatsValue(const std::string& type, 16840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, 169242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports.empty()) { 17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNoReports; 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 1745b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org if (reports[i]->type != type) 17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org continue; 1764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1775b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org if (GetValue(reports[i], name, &ret)) { 1784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 17928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 18028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 18128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 18228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 18328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 18428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 18528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 18628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 18740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType( 18840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, const std::string& type, int n) { 18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 1905b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org if (reports[i]->type == type) { 19128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 1935b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org return reports[i]; 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 19728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports, 20040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string& id) { 2018e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto* r : reports) { 2028e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org if (r->id().ToString() == id) { 2038e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return r; 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2068e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return nullptr; 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports, 210242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 21240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, reports, name); 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports, 216242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 21840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeBwe, reports, name); 21928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 22028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 222d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return rtc::SSLIdentity::DerToPem( 223d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::kPemTypeCertificate, 2244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 2254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 2264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 2294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 2304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 2314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 2324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 2334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 23540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports, 2364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 2374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& start_id) { 2384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string certificate_id = start_id; 2394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 2404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 24140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindReportById(reports, certificate_id); 2424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 24319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 2454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 24640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameDer, &der_base64)); 247d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string der = rtc::Base64::Decode(der_base64, 248d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Base64::DO_STRICT); 2494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 25019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 25119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 25219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 25319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 25440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprintAlgorithm, 25519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 25619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 257d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string sha_1_str = rtc::DIGEST_SHA_1; 25819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 25919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 26019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string dummy_fingerprint; // Value is not checked. 26119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 26219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 26340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprint, 26419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &dummy_fingerprint)); 26519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 2674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (!GetValue( 26840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameIssuerId, &certificate_id)) 2694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 2704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 2714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 2724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid VerifyVoiceReceiverInfoReport( 2754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* report, 2764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const cricket::VoiceReceiverInfo& info) { 2773e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org std::string value_in_report; 2783e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2793e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report)); 280d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.audio_level), value_in_report); 2813e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2823e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameBytesReceived, &value_in_report)); 283d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(info.bytes_rcvd), value_in_report); 2843e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2853e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 286d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_ms), value_in_report); 2873e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2883e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report)); 289d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_ms), value_in_report); 2903e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2913e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePreferredJitterBufferMs, 2923e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org &value_in_report)); 293d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_preferred_ms), 2943e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 2953e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2963e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report)); 297d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.delay_estimate_ms), value_in_report); 2983e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2993e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameExpandRate, &value_in_report)); 300d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.expand_rate), value_in_report); 3013e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3023e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); 303d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report); 3043e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3053e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report)); 306d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_silence_generator), 3073e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3083e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3093e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report)); 310d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_neteq), 3113e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3123e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3133e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report)); 314d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_normal), value_in_report); 3153e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3163e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report)); 317d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc), value_in_report); 3183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report)); 320d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_cng), value_in_report); 3213e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3223e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report)); 323d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc_cng), value_in_report); 3247e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org EXPECT_TRUE(GetValue( 3257e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 3263e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 3273e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 3283e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 32940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report, 33040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const cricket::VoiceSenderInfo& sinfo) { 33140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string value_in_report; 33240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 33340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 33440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(sinfo.codec_name, value_in_report); 33540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 33640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameBytesSent, &value_in_report)); 337d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(sinfo.bytes_sent), value_in_report); 33840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 33940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 340d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_sent), value_in_report); 34140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 342ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org report, StatsReport::kStatsValueNamePacketsLost, &value_in_report)); 343d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_lost), value_in_report); 344ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_TRUE(GetValue( 34540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 346d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 34740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 34840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 349d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 35040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 35140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 352d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.jitter_ms), value_in_report); 35340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 35440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoCancellationQualityMin, 35540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 356d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(sinfo.aec_quality_min), value_in_report); 35740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 35840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 359d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_median_ms), 36040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 36140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report)); 363d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_std_ms), 36440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 36540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report)); 367d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss), 36840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 36940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLossEnhancement, 37140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 372d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss_enhancement), 37340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 37440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); 376d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report); 37740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); 37940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false"; 38040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(typing_detected, value_in_report); 38140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 38240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 3834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// Helper methods to avoid duplication of code. 3844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceSenderInfo(cricket::VoiceSenderInfo* voice_sender_info) { 3854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->add_ssrc(kSsrcOfTrack); 3864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->codec_name = "fake_codec"; 3874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->bytes_sent = 100; 3884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_sent = 101; 3894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->rtt_ms = 102; 3904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->fraction_lost = 103; 3914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->jitter_ms = 104; 3924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_lost = 105; 3934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->ext_seqnum = 106; 3944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->audio_level = 107; 3954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = 108; 3964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 109; 3974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 110; 3984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 111; 3994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = 112.0f; 4004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = false; 4014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid UpdateVoiceSenderInfoFromAudioTrack( 4044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org FakeAudioTrack* audio_track, cricket::VoiceSenderInfo* voice_sender_info) { 4054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetSignalLevel(&voice_sender_info->audio_level); 4064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; 4074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); 4084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = 4094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.typing_noise_detected; 4104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; 4114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 4124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_return_loss_enhancement; 4134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 4144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_median_ms; 4154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = audio_processor_stats.aec_quality_min; 4164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 4174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_std_ms; 4184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { 4214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->add_ssrc(kSsrcOfTrack); 4224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->bytes_rcvd = 110; 4234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_rcvd = 111; 4244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 112; 4254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->fraction_lost = 113; 4264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 114; 4274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->ext_seqnum = 115; 4284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_ms = 116; 4294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_ms = 117; 4304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_preferred_ms = 118; 4314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->delay_estimate_ms = 119; 4324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->audio_level = 120; 4334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->expand_rate = 121; 4344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 43628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 43728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 43828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 4395b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org : media_engine_(new cricket::FakeMediaEngine()), 44028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_manager_( 44128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::ChannelManager(media_engine_, 44228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::FakeDeviceManager(), 443d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current())), 444487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org signaling_(channel_manager_.get()), 4454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org session_(channel_manager_.get()) { 44628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 44728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false)); 448487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, mediastream_signaling()).WillRepeatedly( 449487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org Return(&signaling_)); 45028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 45128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4525b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org ~StatsCollectorTest() {} 4535b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org 45497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 45597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 45697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 457242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org void InitSessionStats(const std::string& vc_name) { 45897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 45997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 46097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 46197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 46297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.content_name = kTransportName; 46397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 46497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 46597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 46697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 46797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 46897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 4694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing video track with a given SSRC into the stats. 4704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingVideoTrackStats() { 47197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 4724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kLocalTrackId, NULL); 47397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 4744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 4754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 47697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 47797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 4784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming video track with a given SSRC into the stats. 4794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingVideoTrackStats() { 4804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 4814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kRemoteTrackId, NULL); 4824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(track_); 4834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 48401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 4854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 4864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing audio track with a given SSRC into the stats. 4884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingAudioTrackStats() { 48940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 49040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 49140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 492d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 4934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kLocalTrackId); 49440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 4954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 49601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 4974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 4984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming audio track with a given SSRC into the stats. 5004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingAudioTrackStats() { 5014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org if (stream_ == NULL) 5024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 504d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kRemoteTrackId); 5064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(audio_track_); 5074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 50801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 50901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 51001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 511950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org std::string AddCandidateReport(StatsCollector* collector, 512950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const cricket::Candidate& candidate, 513950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const std::string& report_type) { 514950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org return collector->AddCandidateReport(candidate, report_type); 515950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org } 516950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 51701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org void SetupAndVerifyAudioTrackStats( 51801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org FakeAudioTrack* audio_track, 51901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::MediaStream* stream, 52001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::StatsCollector* stats, 52101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceChannel* voice_channel, 52201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string& vc_name, 52301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel, 52401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo* voice_sender_info, 52501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceReceiverInfo* voice_receiver_info, 52601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo* stats_read, 52701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports* reports) { 52801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // A track can't have both sender report and recv report at the same time 52901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // for now, this might change in the future though. 53001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ASSERT((voice_sender_info == NULL) ^ (voice_receiver_info == NULL)); 53101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 53201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Instruct the session to return stats containing the transport channel. 53301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitSessionStats(vc_name); 53401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 53501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 53601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(true))); 53701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 53801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Constructs an ssrc stats update. 53901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 54001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->senders.push_back(*voice_sender_info); 54101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 54201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->receivers.push_back(*voice_receiver_info); 54301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 54401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly( 54501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(voice_channel)); 54601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 54701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 54801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(*stats_read), Return(true))); 54901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 55001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 55169bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats->ClearUpdateStatsCacheForTest(); 55201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(NULL, reports); 55301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 55401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify the existence of the track report. 55501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* report = FindNthReportByType( 55601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsReportTypeSsrc, 1); 55701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_FALSE(report == NULL); 55801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 55901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameTrackId); 56001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 56101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 56201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameSsrc); 563d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 56401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 56501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verifies the values in the track report. 56601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) { 56701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track, voice_sender_info); 56801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(report, *voice_sender_info); 56901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 57001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) { 57101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(report, *voice_receiver_info); 57201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 57301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 57401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify we get the same result by passing a track to GetStats(). 57501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports track_reports; // returned values. 57601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(audio_track, &track_reports); 57701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* track_report = FindNthReportByType( 57801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 57901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_TRUE(track_report); 58001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 58101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameTrackId); 58201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 58301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 58401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameSsrc); 585d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 58601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 58701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(track_report, *voice_sender_info); 58801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 58901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, *voice_receiver_info); 59040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 59140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 592d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org void TestCertificateReports(const rtc::FakeSSLCertificate& local_cert, 5934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 594d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::FakeSSLCertificate& remote_cert, 5954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 596487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 597487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 59840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 5994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 6034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 6054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 6064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 6094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 6104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 613d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLIdentity local_identity(local_cert); 614d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<rtc::FakeSSLCertificate> remote_cert_copy( 6154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 6164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 618d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 6194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 6204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 6214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 6224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 6234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 6244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 6254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 6264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 6274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 6284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 6294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 6314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 63206b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 6334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 6344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 6354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 63640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 63740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 6384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 639b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 6404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 6424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 64340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 64440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 6454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 6464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 6484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 64940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 6504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 65140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 652b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 653b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 654b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org CheckCertChainReports(reports, local_ders, local_certificate_id); 655b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 656b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 657b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 6584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 6604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 66140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 6624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 66340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 664b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 665b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 666b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org CheckCertChainReports(reports, remote_ders, remote_certificate_id); 667b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 668b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 669b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 6704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 67197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 67228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 673d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 67428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 675487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeMediaStreamSignaling signaling_; 676487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeDataChannelProvider data_channel_provider_; 67797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SessionStats session_stats_; 678d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> stream_; 679d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrack> track_; 680d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> audio_track_; 68128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 68228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 683487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org// Verify that ExtractDataInfo populates reports. 684487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.orgTEST_F(StatsCollectorTest, ExtractDataInfo) { 685487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string label = "hacks"; 686487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const int id = 31337; 687487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string state = DataChannelInterface::DataStateString( 688487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org DataChannelInterface::DataState::kConnecting); 689487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 690487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 691487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 692487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 693487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org InternalDataChannelInit config; 694487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org config.id = id; 695487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org signaling_.AddDataChannel(DataChannel::Create( 696487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org &data_channel_provider_, cricket::DCT_SCTP, label, config)); 697487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 698487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 699487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 700487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 701487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReports reports; 702487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.GetStats(NULL, &reports); 703487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(label, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 704487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 705487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameLabel)); 706487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(rtc::ToString<int64>(id), 707487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 708487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 709487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameDataChannelId)); 710487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(state, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 711487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 712487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameState)); 713487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ("", ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 714487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 715487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameProtocol)); 716487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org} 717487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 71828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 71928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 720487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 721487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 7224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 723d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 72428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 72540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 72628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 72728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 72828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 72928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 73028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 73128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 73397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 73428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 73528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 7365bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 73728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 73828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 73928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 74040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 74140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 742b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 743242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 744242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org Return(true))); 745b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 74628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 747242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 748242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 74928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 75028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 75128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 75228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 75328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 754487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 755487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 7564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 757d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 75828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 75940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 76028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 76128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 76228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 76328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 76428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 76528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 76628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 76897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 76928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 77028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 7715bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 77228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 77328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 77428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 77528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 77628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 77728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 77828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 77928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 78040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 78140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 782b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 783b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 78428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 78597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 786b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 78728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 788242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 789242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 79028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 791242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org result = ExtractBweStatsValue(reports, 792242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameTargetEncBitrate); 79328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 79428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 79528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 79628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 79728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 79828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 799487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 800487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 80140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 80240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 80340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 804b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 80528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 80640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 80740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 80828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 80928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 81028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 81328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 814487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 815487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 81640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 81740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 81840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 819b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 820b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 82128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 82240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 82340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 82428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 82528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 82640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 82728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 82828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 82928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 83028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 83128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 83228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 833487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 834487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 8354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 836d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 83728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 8384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 83997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 84028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 84203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 84328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 84428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 84540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(std::string(StatsReport::kStatsReportTypeTrack), 8465b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports[0]->type); 84728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 84940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 85028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 85140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 8524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, trackValue); 85328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 85428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 85628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 858487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 859487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 8604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 861d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 86228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 8634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 86497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 86528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 86628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 86728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 86828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 86928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 87028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8725bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 87328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 87428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 87528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 87740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 878b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 879b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 88028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 88128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 882b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 88303505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 88428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 88597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 88697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 88797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 88840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 88940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 8904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 89128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get report for the specific |track|. 8935b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 89497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 89597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 89697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 89797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 89828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 89940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 9004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 90128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 90228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 90340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 904d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 90528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 90628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 90740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 9084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 90928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 91028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 91228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 91328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 914487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 915487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 916242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 917242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 91806b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 9194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 92028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 92128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 922d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 92328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 9244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 92597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 92628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 92728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 92828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 92928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 93028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 93128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 93228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 9335bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 93428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 93528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 93628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 93740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 93840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 939b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 940b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 94128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 94228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 94428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 94540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 94640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 94728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 948b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 94903505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 95028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 95128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 95240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 95328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 95440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 95528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 95640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* transport_report = FindReportById(reports, 95740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org transport_id); 95828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 95928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 96028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 96297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 96397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 964487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 965487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 9664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 96797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 96897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 969d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 97097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 9714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 97297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 97397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 97440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 97540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 97697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 977b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 97840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 97997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 98040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 98140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 98297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 98397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 98497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 98597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 98697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 98797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 988487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 989487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 990242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 991242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 99206b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 9934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 99497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 99597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 996d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 99797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 9984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 99997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 100097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 100197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 100297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 100397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 100440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 100540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 100697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 100797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 100897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 100997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 101097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 101197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 101297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 101397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 10145bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 101597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 101697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 101797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 101840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 101940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1020b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 1021b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 102297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 102397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1024b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 102503505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 102697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 10274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 102840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 102940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 103097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 10318e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org EXPECT_NE(0, remote_report->timestamp()); 103297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 103397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 10344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that the empty track report exists in the returned stats 10354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 10364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, ReportsFromRemoteTrack) { 1037487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1038487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 10394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1040d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 10414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 10424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingVideoTrackStats(); 10434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 10444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 10464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoReceiverInfo video_receiver_info; 10474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoMediaInfo stats_read; 10484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const int64 kNumOfPacketsConcealed = 54321; 10494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Construct a stats value to read. 10514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.add_ssrc(1234); 10524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.packets_concealed = kNumOfPacketsConcealed; 10534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(video_receiver_info); 10544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 10564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 10574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 10584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 10594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 10604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 106203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 10634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(NULL, &reports); 10644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |reports| should contain at least one session report, one track report, 10654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // and one ssrc report. 10664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_LE(static_cast<size_t>(3), reports.size()); 10674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 10684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 10694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 10704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 10724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1073d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 10744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 10764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 10774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 10784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 10794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 1080950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// This test verifies the Ice Candidate report should contain the correct 1081950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// information from local/remote candidates. 1082950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgTEST_F(StatsCollectorTest, IceCandidateReport) { 1083487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1084487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1085950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReports reports; // returned values. 1086950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1087950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int local_port = 2000; 1088950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char local_ip[] = "192.168.0.1"; 1089950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int remote_port = 2001; 1090950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char remote_ip[] = "192.168.0.2"; 1091950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1092950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress local_address(local_ip, local_port); 1093950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress remote_address(remote_ip, remote_port); 1094950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::AdapterType network_type = rtc::ADAPTER_TYPE_ETHERNET; 1095950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org uint32 priority = 1000; 1096950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1097950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::Candidate c; 109861c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1099950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::LOCAL_PORT_TYPE); 1100950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1101950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(local_address); 1102950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_priority(priority); 1103950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_network_type(network_type); 1104950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org std::string report_id = AddCandidateReport( 1105950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org &stats, c, StatsReport::kStatsReportTypeIceLocalCandidate); 110661c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1107950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 110861c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c = cricket::Candidate(); 110961c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1110950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::PRFLX_PORT_TYPE); 111161c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1112950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(remote_address); 111361c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_priority(priority); 111461c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_network_type(network_type); 1115950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org report_id = AddCandidateReport( 1116950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org &stats, c, StatsReport::kStatsReportTypeIceRemoteCandidate); 111761c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1118950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1119950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org stats.GetStats(NULL, &reports); 1120950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1121950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the local candidate report is populated correctly. 1122950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1123950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org local_ip, 1124950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1125950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1126950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1127950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(local_port), 1128950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1129950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1130950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1131950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::UDP_PROTOCOL_NAME, 1132950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1133950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1134950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1135950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(priority), 1136950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1137950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1138950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1139950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::LOCAL_PORT_TYPE), 1140950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1141950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateType)); 1142950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1143950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org AdapterTypeToStatsType(network_type), 1144950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1145950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1146950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1147950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the remote candidate report is populated correctly. 1148950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(remote_ip, 1149950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1150950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1151950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1152950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(remote_port), 1153950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1154950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1155950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1156950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, 1157950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1158950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1159950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1160950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(priority), 1161950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1162950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1163950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1164950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1165950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::PRFLX_PORT_TYPE), 1166950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1167950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, StatsReport::kStatsValueNameCandidateType)); 1168950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(kNotFound, 1169950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1170950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1171950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1172950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} 1173950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 11744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 11754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 117619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 11774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 11784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 11794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 11804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 11814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 11824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 11834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 1184d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DersToPems(local_ders)); 11854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 11874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 11884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 11894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 11904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 11914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 1192d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 11934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 11954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 11964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 11984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 119919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 12004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 12014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 1202d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 12034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 12054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 1206d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 12074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 12094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 12104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 12114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 12134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 121419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 1215487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1216487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 121740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 12184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 12204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 12214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 12224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 12244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 12254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 12264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 12284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 12294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 12304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 12324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 123306b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(ReturnNull()); 12344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 12354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 12364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 123797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 123840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 123940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 12404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1241b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 12424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 12434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 12454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 124640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 12474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 124840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 12494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 12504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 12524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 125340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 12544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 125540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 12564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 12574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 12584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 12604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 126119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 1262487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1263487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 126440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 12654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 12674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 12684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 12694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 12714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 12724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 12734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 12754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 12764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 12774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 1279d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 12804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 12814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 12824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 12834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 12844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 12864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 128706b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 12884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 12894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 12904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 129140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 129240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 12934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1294b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 12954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 12964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 12984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 129940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 130140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 13024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 13034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 13054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 130640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 130840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 13094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 13104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1312b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 1313b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 1314b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 1315b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 1316b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 1317d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 1318b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1319b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 1320b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 1321d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 1322b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 1323b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1324b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 1325b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 1326b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1327b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1328b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// Verifies the correct optons are passed to the VideoMediaChannel when using 1329b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// verbose output level. 1330b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, StatsOutputLevelVerbose) { 1331487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1332487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 13334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1334d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 1335b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 1336b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1337b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::VideoMediaInfo stats_read; 1338b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::BandwidthEstimationInfo bwe; 1339b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.total_received_propagation_delta_ms = 10; 1340b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(100); 1341b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(200); 1342b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(1000); 1343b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(2000); 1344b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats_read.bw_estimations.push_back(bwe); 1345b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1346b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(session_, video_channel()) 1347b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(Return(&video_channel)); 134840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1349b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1350b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org StatsOptions options; 1351b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org options.include_received_propagation_stats = true; 1352b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats( 1353b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Field(&StatsOptions::include_received_propagation_stats, true), 1354b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org _)) 1355b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 1356b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Return(true))); 1357b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1358b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelDebug); 135903505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; // returned values. 1360b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.GetStats(NULL, &reports); 1361b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string result = ExtractBweStatsValue( 1362242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, 1363242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameRecvPacketGroupPropagationDeltaSumDebug); 1364b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("10", result); 1365b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 1366242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, 1367242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameRecvPacketGroupPropagationDeltaDebug); 1368b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[100, 200]", result); 1369b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 1370242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, StatsReport::kStatsValueNameRecvPacketGroupArrivalTimeDebug); 1371b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[1000, 2000]", result); 1372b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1373b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 137440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 137540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 137640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 1377487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1378487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1379242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1380242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 138106b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 1382242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org 138340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 138440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 138540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1386d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 138740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 13884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 138940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 139001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 139140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 139240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 13934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 139440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 139540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 139640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 139701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 139801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 139901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 140040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify that there is no remote report for the local audio track because 14024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // we did not set it up. 14034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 14044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 14054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(remote_report == NULL); 14064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 14073e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 14083e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// This test verifies that audio receive streams populate stats reports 14093e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// correctly. 14103e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromRemoteStream) { 1411487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1412487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1413242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1414242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 141506b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 14163e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 14173e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org // The content_name known by the voice channel. 14183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const std::string kVcName("vcname"); 1419d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 14203e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 14214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingAudioTrackStats(); 14223e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.AddStream(stream_); 14233e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 14243e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 14254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 14267e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org voice_receiver_info.codec_name = "fake_codec"; 14273e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 14283e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceMediaInfo stats_read; 14293e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org StatsReports reports; // returned values. 143001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 143101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 143201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, NULL, &voice_receiver_info, &stats_read, &reports); 14333e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 14343e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 143540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 143640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 143740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 1438487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1439487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1440242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1441242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 144206b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 144340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 144440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 144540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1446d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 144740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 14484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 144940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 145040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 145140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 145240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 145340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 145440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 145540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 145640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 145740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 145840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 145940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 14604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 146140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 146240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 146340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 146440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 146540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 146640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 146740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 146840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 146940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 147040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 147140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 147240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 147340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 147440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 147540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 147640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 147740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 147840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 147940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 148040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 148140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 14824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 148340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 148440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1485d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 148640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 148740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 148840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 148940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 149040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 149140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 149240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that when ongoing and incoming audio tracks are using 14944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// the same ssrc, they populate stats reports correctly. 14954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) { 1496487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1497487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1498242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1499242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 150006b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 15014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 15024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // The content_name known by the voice channel. 15034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string kVcName("vcname"); 1504d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 15054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 15064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 15084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 15094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 15104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 15114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a remote stream with a remote audio track and adds it to the stats. 1513d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> remote_stream( 15144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::MediaStream::Create("remotestreamlabel")); 1515d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> remote_track( 1516d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId)); 15174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 151801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 15194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org remote_stream->AddTrack(remote_track); 15204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(remote_stream); 15214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Instruct the session to return stats containing the transport channel. 15234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitSessionStats(kVcName); 15244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 15254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 15264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 15274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 15304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Some of the contents in |voice_sender_info| needs to be updated from the 15324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |audio_track_|. 15334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 15344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 15364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 15374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 15394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceMediaInfo stats_read; 15404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.senders.push_back(voice_sender_info); 15414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 15424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 15444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 15454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 15464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 15474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 15484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; // returned values. 15504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 15514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the local track. 15534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(audio_track_.get(), &reports); 15544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 15554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 15564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 15574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 15584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 15594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 15604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 15614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the remote track. 15635b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 15644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(remote_track.get(), &reports); 15654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_report = FindNthReportByType(reports, 15664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeSsrc, 1); 15674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 15684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_id = ExtractSsrcStatsValue(reports, 15694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsValueNameTrackId); 15704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 15714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info); 15724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 15734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 157401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// This test verifies that when two outgoing audio tracks are using the same 157501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// ssrc at different times, they populate stats reports correctly. 157601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// TODO(xians): Figure out if it is possible to encapsulate the setup and 157701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// avoid duplication of code in test cases. 157801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.orgTEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) { 1579487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org webrtc::StatsCollector stats(&session_); 1580487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1581242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1582242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 1583242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 158401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 158501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // The content_name known by the voice channel. 158601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string kVcName("vcname"); 1587d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 158801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 158901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 159001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 159101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org AddOutgoingAudioTrackStats(); 159201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddStream(stream_); 159301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 159401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 159501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 159601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 159701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 159801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo stats_read; 159901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports reports; // returned values. 160001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 160101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 160201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 160301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 160401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Remove the previous audio track from the stream. 160501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->RemoveTrack(audio_track_.get()); 160601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 160701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 160801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a new audio track and adds it to the stream and stats. 160901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org static const std::string kNewTrackId = "new_track_id"; 1610d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> new_audio_track( 1611d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kNewTrackId)); 161201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 161301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNewTrackId), Return(true))); 161401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->AddTrack(new_audio_track); 161501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 161601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(new_audio_track, kSsrcOfTrack); 161769bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats.ClearUpdateStatsCacheForTest(); 161801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo new_voice_sender_info; 161901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitVoiceSenderInfo(&new_voice_sender_info); 162001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo new_stats_read; 16215b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 162201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 162301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, 162401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); 162501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org} 162601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 1627950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} // namespace webrtc 1628