statscollector_unittest.cc revision 7bea1ffe772e837d96f8faa5c9dd06e531b95379
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; 514fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgusing rtc::scoped_ptr; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_; 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll; 54b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing testing::Field; 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull; 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee; 58b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing webrtc::PeerConnectionInterface; 5940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReport; 6040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReports; 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager; 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeDeviceManager; 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 69950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgnamespace webrtc { 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND"; 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 1554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// TODO(tommi): Use FindValue(). 15640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 157242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name, 1584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 1598e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto& v : report->values()) { 1608e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org if (v->name == name) { 1618e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org *value = v->value; 1624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return true; 1634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return false; 1664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1684fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgstd::string ExtractStatsValue(const StatsReport::StatsType& type, 16940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, 170242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 1714fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org for (const auto* r : reports) { 1724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1734fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (r->type() == type && GetValue(r, name, &ret)) 1744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 17928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1804fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgscoped_ptr<StatsReport::Id> TypedIdFromIdString(StatsReport::StatsType type, 1814fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const std::string& value) { 1824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(value.empty()); 1834fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> id; 1844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (value.empty()) 1854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return id.Pass(); 1864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 1874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 1884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 1894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 1904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = value.find('_'); 1914fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_NE(index, std::string::npos); 1924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (index == std::string::npos || index == (value.length() - 1)) 1934fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return id.Pass(); 1944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 1954fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org id = StatsReport::NewTypedId(type, value.substr(index + 1)); 1964fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(id->ToString(), value); 1974fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return id.Pass(); 1984fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 1994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 2004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgscoped_ptr<StatsReport::Id> IdFromCertIdString(const std::string& cert_id) { 2014fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return TypedIdFromIdString(StatsReport::kStatsReportTypeCertificate, cert_id) 2024fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org .Pass(); 2034fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 2044fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 20740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType( 2084fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReports& reports, const StatsReport::StatsType& type, int n) { 20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 2104fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (reports[i]->type() == type) { 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 2135b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org return reports[i]; 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2164fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return nullptr; 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 21828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports, 2204fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& id) { 2218e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto* r : reports) { 2224fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (r->id().Equals(id)) 2238e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return r; 22428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2258e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return nullptr; 22628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 22728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports, 229242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 2304fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return ExtractStatsValue(StatsReport::kStatsReportTypeSsrc, reports, name); 23128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 23228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 23340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports, 234242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 23528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 23640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeBwe, reports, name); 23728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 23828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 240d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return rtc::SSLIdentity::DerToPem( 241d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::kPemTypeCertificate, 2424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 2434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 2444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 2474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 2484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 2494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 2504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 2514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 25340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports, 2544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 2554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& start_id) { 2564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> cert_id; 2574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id* certificate_id = &start_id; 2584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 2594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 2604fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport* report = FindReportById(reports, *certificate_id); 2614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 26219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 2644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 26540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameDer, &der_base64)); 2664fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string der = rtc::Base64::Decode(der_base64, rtc::Base64::DO_STRICT); 2674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 26819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 26919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 27019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 27119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 27240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprintAlgorithm, 27319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 27419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 275d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string sha_1_str = rtc::DIGEST_SHA_1; 27619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 27719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2784fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string fingerprint; 2794fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameFingerprint, 2804fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &fingerprint)); 2814fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(fingerprint.empty()); 28219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 2844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string issuer_id; 2854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (!GetValue(report, StatsReport::kStatsValueNameIssuerId, 2864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &issuer_id)) { 2874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 2884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org } 2894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 2904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org cert_id = IdFromCertIdString(issuer_id).Pass(); 2914fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org certificate_id = cert_id.get(); 2924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 2934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 2944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid VerifyVoiceReceiverInfoReport( 2974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* report, 2984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const cricket::VoiceReceiverInfo& info) { 2993e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org std::string value_in_report; 3003e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3013e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report)); 302d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.audio_level), value_in_report); 3033e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3043e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameBytesReceived, &value_in_report)); 305d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(info.bytes_rcvd), value_in_report); 3063e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3073e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 308d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_ms), value_in_report); 3093e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3103e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report)); 311d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_ms), value_in_report); 3123e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3133e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePreferredJitterBufferMs, 3143e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org &value_in_report)); 315d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_preferred_ms), 3163e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3173e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report)); 319d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.delay_estimate_ms), value_in_report); 3203e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3213e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameExpandRate, &value_in_report)); 322d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.expand_rate), value_in_report); 3233e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 324652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org report, StatsReport::kStatsValueNameSpeechExpandRate, &value_in_report)); 325652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.speech_expand_rate), value_in_report); 326652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate, 327652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org &value_in_report)); 328652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.secondary_decoded_rate), value_in_report); 329652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue( 3303e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); 331d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report); 3323e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3333e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report)); 334d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_silence_generator), 3353e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3363e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3373e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report)); 338d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_neteq), 3393e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3403e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3413e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report)); 342d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_normal), value_in_report); 3433e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3443e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report)); 345d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc), value_in_report); 3463e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3473e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report)); 348d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_cng), value_in_report); 3493e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3503e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report)); 351d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc_cng), value_in_report); 3527e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org EXPECT_TRUE(GetValue( 3537e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 3543e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 3553e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 3563e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 35740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report, 35840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const cricket::VoiceSenderInfo& sinfo) { 35940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string value_in_report; 36040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 36240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(sinfo.codec_name, value_in_report); 36340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameBytesSent, &value_in_report)); 365d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(sinfo.bytes_sent), value_in_report); 36640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 368d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_sent), value_in_report); 36940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 370ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org report, StatsReport::kStatsValueNamePacketsLost, &value_in_report)); 371d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_lost), value_in_report); 372ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_TRUE(GetValue( 37340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 374d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 37540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 377d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 37840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 380d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.jitter_ms), value_in_report); 38140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoCancellationQualityMin, 38340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 384d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(sinfo.aec_quality_min), value_in_report); 38540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 387d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_median_ms), 38840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 38940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report)); 391d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_std_ms), 39240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 39340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report)); 395d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss), 39640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 39740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLossEnhancement, 39940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 400d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss_enhancement), 40140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 40240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); 404d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report); 40540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); 40740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false"; 40840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(typing_detected, value_in_report); 40940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 41040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 4114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// Helper methods to avoid duplication of code. 4124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceSenderInfo(cricket::VoiceSenderInfo* voice_sender_info) { 4134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->add_ssrc(kSsrcOfTrack); 4144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->codec_name = "fake_codec"; 4154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->bytes_sent = 100; 4164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_sent = 101; 4174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->rtt_ms = 102; 4184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->fraction_lost = 103; 4194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->jitter_ms = 104; 4204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_lost = 105; 4214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->ext_seqnum = 106; 4224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->audio_level = 107; 4234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = 108; 4244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 109; 4254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 110; 4264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 111; 4274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = 112.0f; 4284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = false; 4294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid UpdateVoiceSenderInfoFromAudioTrack( 4324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org FakeAudioTrack* audio_track, cricket::VoiceSenderInfo* voice_sender_info) { 4334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetSignalLevel(&voice_sender_info->audio_level); 4344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; 4354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); 4364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = 4374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.typing_noise_detected; 4384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; 4394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 4404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_return_loss_enhancement; 4414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 4424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_median_ms; 4434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = audio_processor_stats.aec_quality_min; 4444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 4454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_std_ms; 4464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { 4494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->add_ssrc(kSsrcOfTrack); 4504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->bytes_rcvd = 110; 4514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_rcvd = 111; 4524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 112; 4534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->fraction_lost = 113; 4544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 114; 4554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->ext_seqnum = 115; 4564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_ms = 116; 4574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_ms = 117; 4584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_preferred_ms = 118; 4594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->delay_estimate_ms = 119; 4604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->audio_level = 120; 4614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->expand_rate = 121; 462652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->speech_expand_rate = 122; 463652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->secondary_decoded_rate = 123; 4644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 466322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.orgclass StatsCollectorForTest : public webrtc::StatsCollector { 467322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org public: 468322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org explicit StatsCollectorForTest(WebRtcSession* session) : 469322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollector(session), time_now_(19477) { 470322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org } 471322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 472322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double GetTimeNow() override { 473322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org return time_now_; 474322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org } 475322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 476322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org private: 477322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double time_now_; 478322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org}; 479322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 48128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 48228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 4835b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org : media_engine_(new cricket::FakeMediaEngine()), 48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_manager_( 48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::ChannelManager(media_engine_, 48628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::FakeDeviceManager(), 487d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current())), 488487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org signaling_(channel_manager_.get()), 4894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org session_(channel_manager_.get()) { 49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false)); 492487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, mediastream_signaling()).WillRepeatedly( 493487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org Return(&signaling_)); 49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 49528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4965b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org ~StatsCollectorTest() {} 4975b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org 49897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 49997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 50097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 501242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org void InitSessionStats(const std::string& vc_name) { 50297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 50397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 50497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 50597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 50697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.content_name = kTransportName; 50797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 50897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 50997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 51097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 51197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 51297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing video track with a given SSRC into the stats. 5144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingVideoTrackStats() { 51597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kLocalTrackId, NULL); 51797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 5184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 5194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 52097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 52197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming video track with a given SSRC into the stats. 5234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingVideoTrackStats() { 5244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kRemoteTrackId, NULL); 5264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(track_); 5274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 52801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 5294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing audio track with a given SSRC into the stats. 5324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingAudioTrackStats() { 53340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 53440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 53540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 536d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kLocalTrackId); 53840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 5394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 54001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 5414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming audio track with a given SSRC into the stats. 5444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingAudioTrackStats() { 5454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org if (stream_ == NULL) 5464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 548d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kRemoteTrackId); 5504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(audio_track_); 5514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 55201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 55301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 55401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 555950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org std::string AddCandidateReport(StatsCollector* collector, 556950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const cricket::Candidate& candidate, 5574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org bool local) { 5584fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return collector->AddCandidateReport(candidate, local); 559950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org } 560950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 56101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org void SetupAndVerifyAudioTrackStats( 56201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org FakeAudioTrack* audio_track, 56301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::MediaStream* stream, 56401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::StatsCollector* stats, 56501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceChannel* voice_channel, 56601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string& vc_name, 56701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel, 56801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo* voice_sender_info, 56901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceReceiverInfo* voice_receiver_info, 57001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo* stats_read, 57101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports* reports) { 57201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // A track can't have both sender report and recv report at the same time 57301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // for now, this might change in the future though. 57401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ASSERT((voice_sender_info == NULL) ^ (voice_receiver_info == NULL)); 57501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 57601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Instruct the session to return stats containing the transport channel. 57701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitSessionStats(vc_name); 57801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 57901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 58001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(true))); 58101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 58201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Constructs an ssrc stats update. 58301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 58401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->senders.push_back(*voice_sender_info); 58501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 58601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->receivers.push_back(*voice_receiver_info); 58701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 58801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly( 58901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(voice_channel)); 59001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 59101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 59201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(*stats_read), Return(true))); 59301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 59401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 59569bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats->ClearUpdateStatsCacheForTest(); 59601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(NULL, reports); 59701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 59801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify the existence of the track report. 59901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* report = FindNthReportByType( 60001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsReportTypeSsrc, 1); 60101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_FALSE(report == NULL); 60201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 60301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameTrackId); 60401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 60501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 60601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameSsrc); 607d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 60801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 60901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verifies the values in the track report. 61001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) { 61101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track, voice_sender_info); 61201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(report, *voice_sender_info); 61301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 61401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) { 61501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(report, *voice_receiver_info); 61601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 61701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 61801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify we get the same result by passing a track to GetStats(). 61901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports track_reports; // returned values. 62001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(audio_track, &track_reports); 62101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* track_report = FindNthReportByType( 62201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 62301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_TRUE(track_report); 62401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 62501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameTrackId); 62601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 62701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 62801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameSsrc); 629d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 63001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 63101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(track_report, *voice_sender_info); 63201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 63301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, *voice_receiver_info); 63440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 63540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 636d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org void TestCertificateReports(const rtc::FakeSSLCertificate& local_cert, 6374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 638d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::FakeSSLCertificate& remote_cert, 6394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 640322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 641487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 64240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 6434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 6477bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org channel_stats.srtp_cipher = "the-srtp-cipher"; 6487bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org channel_stats.ssl_cipher = "the-ssl-cipher"; 6494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 6514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 6524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 6554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 6564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 659d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLIdentity local_identity(local_cert); 660d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<rtc::FakeSSLCertificate> remote_cert_copy( 6614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 6624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 664d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 6654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 6664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 6674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 6684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 6694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 6704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 6714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 6724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 6734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 6744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 6754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 6774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 67806b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 6794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 6804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 6814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 68240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 68340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 6844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 685b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 6864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 6884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 68940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 69040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 6914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 6924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 6944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 69540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 6964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 69740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 698b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 699b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 7004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> id(IdFromCertIdString(local_certificate_id)); 7014fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org CheckCertChainReports(reports, local_ders, *id.get()); 702b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 703b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 704b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 7074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 70840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 7094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 71040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 711b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 712b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 7134fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> id(IdFromCertIdString(remote_certificate_id)); 7144fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org CheckCertChainReports(reports, remote_ders, *id.get()); 715b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 716b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 717b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7187bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 7197bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check negotiated ciphers. 7207bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string dtls_cipher = ExtractStatsValue( 7217bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 7227bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 7237bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameDtlsCipher); 7247bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org EXPECT_EQ("the-ssl-cipher", dtls_cipher); 7257bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string srtp_cipher = ExtractStatsValue( 7267bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 7277bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 7287bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameSrtpCipher); 7297bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org EXPECT_EQ("the-srtp-cipher", srtp_cipher); 7304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 73197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 73228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 733d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 73428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 735487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeMediaStreamSignaling signaling_; 736487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeDataChannelProvider data_channel_provider_; 73797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SessionStats session_stats_; 738d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> stream_; 739d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrack> track_; 740d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> audio_track_; 74128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 74228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 743487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org// Verify that ExtractDataInfo populates reports. 744487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.orgTEST_F(StatsCollectorTest, ExtractDataInfo) { 745487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string label = "hacks"; 746487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const int id = 31337; 747487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string state = DataChannelInterface::DataStateString( 748487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org DataChannelInterface::DataState::kConnecting); 749487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 750487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 751487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 752487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 753487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org InternalDataChannelInit config; 754487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org config.id = id; 755487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org signaling_.AddDataChannel(DataChannel::Create( 756487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org &data_channel_provider_, cricket::DCT_SCTP, label, config)); 757322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 758487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 759487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 760487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 761487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReports reports; 762487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.GetStats(NULL, &reports); 763322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 764322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org const StatsReport* report = 765322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org FindNthReportByType(reports, StatsReport::kStatsReportTypeDataChannel, 1); 766322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 767322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org scoped_ptr<StatsReport::Id> reportId = StatsReport::NewTypedIntId( 768322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsReport::kStatsReportTypeDataChannel, id); 769322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 770322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_TRUE(reportId->Equals(report->id())); 771322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 772322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(stats.GetTimeNow(), report->timestamp()); 773487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(label, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 774487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 775487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameLabel)); 776487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(rtc::ToString<int64>(id), 777487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 778487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 779487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameDataChannelId)); 780487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(state, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 781487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 782487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameState)); 783487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ("", ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 784487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 785487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameProtocol)); 786487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org} 787487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 78828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 78928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 790322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 791487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 7924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 793d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 79428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 79540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 79628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 79728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 79828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 79928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 80028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 80128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 80397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 80428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8065bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 80728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 80828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 80928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 81140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 812b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 813242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 814242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org Return(true))); 815b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 81628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 817242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 818242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 81928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 82028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 82128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 82328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 824322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 825487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 8264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 827d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 82828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 82940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 83028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 83128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 83228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 83328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 83428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 83528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 83628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 83897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 83928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8415bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 84228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 84328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 84428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 84528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 84628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 84728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 84828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 84928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 85140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 852b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 853b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 85428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 85597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 856b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 858242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 859242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 86028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 861242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org result = ExtractBweStatsValue(reports, 862242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameTargetEncBitrate); 86328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 86428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 86528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 86628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 86728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 86828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 869322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 870487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 87140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 87240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 87340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 874b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 87528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 87640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 87740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 87828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 87928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 88028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 88128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 88228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 88328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 884322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 885487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 88640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 88740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 88840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 889b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 890b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 89128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 89240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 89340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 89428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 89528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 89640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 89728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 89828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 89928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 90028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 90128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 90228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 903322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 904487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 9054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 906d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 90728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 9084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 90997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 91028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 91203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 91328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 91428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 9154fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(StatsReport::kStatsReportTypeTrack, reports[0]->type()); 91628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 91840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 91928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 92040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 9214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, trackValue); 92228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 92328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 92428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 92528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 92628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 927322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 928487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 9294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 930d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 93128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 9324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 93397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 93428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 93528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 93628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 93728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 93828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 93928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 9415bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 94228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 94328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 94428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 94640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 947b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 948b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 94928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 95028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 951b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 95203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 95328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 95497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 95597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 95697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 95740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 95840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 9594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 96028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get report for the specific |track|. 9625b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 96397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 96497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 96597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 96697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 96728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 96840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 9694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 97028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 97128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 97240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 973d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 97428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 97528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 97640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 9774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 97828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 97928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 98028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 98128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 98228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 983322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 984487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 985242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 986242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 98706b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 9884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 98928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 99028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 991d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 99228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 9934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 99497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 99528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 99728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 99828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 99928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 100028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 100128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 10025bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 100328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 100428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 100528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 100640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 100740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1008b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 1009b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 101028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 101128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 101297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 101328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 101440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 101540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 101628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1017b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 101803505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 101928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 102028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 102140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 102228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 102340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 102428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 10254fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // Transport id component ID will always be 1. 10264fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 10274fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 10284fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 10294fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = transport_id.find('-'); 10304fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10314fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string content = transport_id.substr(index + 1); 10324fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org index = content.rfind('-'); 10334fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10344fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org content = content.substr(0, index); 10354fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> id(StatsReport::NewComponentId(content, 1)); 10364fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_EQ(transport_id, id->ToString()); 10374fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport* transport_report = FindReportById(reports, *id.get()); 103828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 103928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 104028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 104197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 104297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 104397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 1044322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1045487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 10464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 104797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 104897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1049d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 105097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 10514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 105297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 105397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 105440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 105540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 105697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1057b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 105840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 105997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 106040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 106140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 106297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 106397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 106497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 106597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 106697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 106797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 1068322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1069487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1070242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1071242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 107206b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 10734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 107497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 107597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1076d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 107797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 10784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 107997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 108097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 108197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 108297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 108397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 108440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 108540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 108697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 108797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 108897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 108997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 109097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 109197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 109297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 109397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 10945bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 109597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 109697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 109797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 109840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 109940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1100b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 1101b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 110297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 110397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1104b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 110503505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 110697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 11074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 110840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 110940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 111097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 1111322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(12345.678, remote_report->timestamp()); 111297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 111397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 11144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that the empty track report exists in the returned stats 11154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 11164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, ReportsFromRemoteTrack) { 1117322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1118487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 11194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1120d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 11214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 11224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingVideoTrackStats(); 11234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 11244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 11264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoReceiverInfo video_receiver_info; 11274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoMediaInfo stats_read; 11281ed6224eafc7816f25d1906e4d709afdf2ad8f0fpbos@webrtc.org const int64 kNumOfPacketsConcealed = 54321; 11294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Construct a stats value to read. 11314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.add_ssrc(1234); 11321ed6224eafc7816f25d1906e4d709afdf2ad8f0fpbos@webrtc.org video_receiver_info.packets_concealed = kNumOfPacketsConcealed; 11334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(video_receiver_info); 11344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 11364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 11374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 11384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 11394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 11404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 114203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 11434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(NULL, &reports); 11444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |reports| should contain at least one session report, one track report, 11454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // and one ssrc report. 11464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_LE(static_cast<size_t>(3), reports.size()); 11474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 11484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 11494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 11504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 11524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1153d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 11544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 11564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 11574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 11584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 11594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 1160950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// This test verifies the Ice Candidate report should contain the correct 1161950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// information from local/remote candidates. 1162950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgTEST_F(StatsCollectorTest, IceCandidateReport) { 1163322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1164487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1165950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReports reports; // returned values. 1166950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1167950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int local_port = 2000; 1168950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char local_ip[] = "192.168.0.1"; 1169950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int remote_port = 2001; 1170950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char remote_ip[] = "192.168.0.2"; 1171950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1172950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress local_address(local_ip, local_port); 1173950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress remote_address(remote_ip, remote_port); 1174950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::AdapterType network_type = rtc::ADAPTER_TYPE_ETHERNET; 1175950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org uint32 priority = 1000; 1176950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1177950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::Candidate c; 117861c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1179950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::LOCAL_PORT_TYPE); 1180950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1181950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(local_address); 1182950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_priority(priority); 1183950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_network_type(network_type); 11844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string report_id = AddCandidateReport(&stats, c, true); 118561c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1186950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 118761c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c = cricket::Candidate(); 118861c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1189950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::PRFLX_PORT_TYPE); 119061c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1191950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(remote_address); 119261c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_priority(priority); 119361c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_network_type(network_type); 11944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org report_id = AddCandidateReport(&stats, c, false); 119561c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1196950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1197950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org stats.GetStats(NULL, &reports); 1198950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1199950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the local candidate report is populated correctly. 1200950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1201950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org local_ip, 1202950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1203950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1204950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1205950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(local_port), 1206950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1207950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1208950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1209950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::UDP_PROTOCOL_NAME, 1210950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1211950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1212950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1213950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(priority), 1214950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1215950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1216950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1217950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::LOCAL_PORT_TYPE), 1218950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1219950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateType)); 1220950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1221950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org AdapterTypeToStatsType(network_type), 1222950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1223950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1224950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1225950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the remote candidate report is populated correctly. 1226950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(remote_ip, 1227950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1228950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1229950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1230950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(remote_port), 1231950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1232950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1233950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1234950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, 1235950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1236950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1237950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1238950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(priority), 1239950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1240950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1241950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1242950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1243950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::PRFLX_PORT_TYPE), 1244950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1245950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, StatsReport::kStatsValueNameCandidateType)); 1246950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(kNotFound, 1247950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1248950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1249950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1250950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} 1251950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 12524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 12534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 125419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 12554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 12564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 12574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 12584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 12594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 12604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 12614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 1262d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DersToPems(local_ders)); 12634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 12654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 12664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 12674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 12684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 12694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 1270d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 12714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 12734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 12744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 12764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 127719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 12784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 12794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 1280d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 12814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 12834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 1284d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 12854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 12874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 12884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 12894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 12914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 129219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 1293322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1294487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 129540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 12964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 12984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 12994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 13004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 13024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 13034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 13044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 13064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 13074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 13084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 13104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 131106b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(ReturnNull()); 13124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 13134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 13144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 131597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 131640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 131740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 13184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1319b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 13214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 13234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 132440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 132640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 13274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 13284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 13304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 133140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 133340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 13344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 13357bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 13367bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check that the negotiated ciphers are absent. 13377bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string dtls_cipher = ExtractStatsValue( 13387bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 13397bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 13407bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameDtlsCipher); 13417bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org ASSERT_EQ(kNotFound, dtls_cipher); 13427bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string srtp_cipher = ExtractStatsValue( 13437bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 13447bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 13457bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameSrtpCipher); 13467bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org ASSERT_EQ(kNotFound, srtp_cipher); 13474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 13504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 135119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 1352322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1353487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 135440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 13554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 13574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 13584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 13594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 13614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 13624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 13634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 13654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 13664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 13674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 1369d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 13704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 13714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 13724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 13734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 13744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 13764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 137706b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 13784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 13794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 13804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 138140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 138240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 13834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1384b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 13864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 13884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 138940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 139140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 13924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 13934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 13954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 139640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 139840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 13994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 14004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 14014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1402b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 1403b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 1404b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 1405b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 1406b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 1407d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 1408b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1409b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 1410b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 1411d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 1412b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 1413b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1414b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 1415b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 1416b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1417b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1418b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// Verifies the correct optons are passed to the VideoMediaChannel when using 1419b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// verbose output level. 1420b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, StatsOutputLevelVerbose) { 1421322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1422487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 14234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1424d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 1425b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 1426b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1427b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::VideoMediaInfo stats_read; 1428b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::BandwidthEstimationInfo bwe; 1429b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.total_received_propagation_delta_ms = 10; 1430b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(100); 1431b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(200); 1432b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(1000); 1433b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(2000); 1434b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats_read.bw_estimations.push_back(bwe); 1435b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1436b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(session_, video_channel()) 1437b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(Return(&video_channel)); 143840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1439b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1440b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org StatsOptions options; 1441b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org options.include_received_propagation_stats = true; 1442b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats( 1443b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Field(&StatsOptions::include_received_propagation_stats, true), 1444b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org _)) 1445b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 1446b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Return(true))); 1447b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1448b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelDebug); 144903505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; // returned values. 1450b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.GetStats(NULL, &reports); 1451b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string result = ExtractBweStatsValue( 1452242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, 1453242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameRecvPacketGroupPropagationDeltaSumDebug); 1454b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("10", result); 1455b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 1456242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, 1457242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameRecvPacketGroupPropagationDeltaDebug); 1458b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[100, 200]", result); 1459b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 1460242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, StatsReport::kStatsValueNameRecvPacketGroupArrivalTimeDebug); 1461b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[1000, 2000]", result); 1462b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1463b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 146440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 146540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 146640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 1467322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1468487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1469242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1470242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 147106b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 1472242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org 147340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 147440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 147540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1476d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 147740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 14784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 147940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 148001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 148140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 148240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 14834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 148440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 148540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 148640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 148701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 148801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 148901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 149040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify that there is no remote report for the local audio track because 14924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // we did not set it up. 14934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 14944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 14954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(remote_report == NULL); 14964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 14973e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 14983e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// This test verifies that audio receive streams populate stats reports 14993e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// correctly. 15003e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromRemoteStream) { 1501322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1502487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1503242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1504242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 150506b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 15063e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 15073e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org // The content_name known by the voice channel. 15083e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const std::string kVcName("vcname"); 1509d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 15103e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 15114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingAudioTrackStats(); 15123e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.AddStream(stream_); 15133e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15143e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 15154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 15167e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org voice_receiver_info.codec_name = "fake_codec"; 15173e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceMediaInfo stats_read; 15193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org StatsReports reports; // returned values. 152001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 152101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 152201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, NULL, &voice_receiver_info, &stats_read, &reports); 15233e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 15243e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 152540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 152640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 152740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 1528322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1529487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1530242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1531242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 153206b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 153340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 153440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 153540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1536d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 153740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 15384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 153940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 154040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 154140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 154240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 154340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 154440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 154540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 154640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 154740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 154840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 154940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 155140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 155240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 155340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 155440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 155540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 155640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 155740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 155840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 155940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 156040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 156140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 156240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 156340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 156440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 156540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 156640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 156740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 156840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 156940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 157040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 157140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 15724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 157340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 157440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1575d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 157640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 157740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 157840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 157940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 158040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 158140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 158240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that when ongoing and incoming audio tracks are using 15844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// the same ssrc, they populate stats reports correctly. 15854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) { 1586322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1587487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1588242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1589242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 159006b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 15914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 15924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // The content_name known by the voice channel. 15934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string kVcName("vcname"); 1594d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 15954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 15964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 15984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 15994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 16004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 16014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a remote stream with a remote audio track and adds it to the stats. 1603d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> remote_stream( 16044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::MediaStream::Create("remotestreamlabel")); 1605d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> remote_track( 1606d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId)); 16074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 160801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 16094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org remote_stream->AddTrack(remote_track); 16104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(remote_stream); 16114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Instruct the session to return stats containing the transport channel. 16134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitSessionStats(kVcName); 16144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 16154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 16164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 16174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 16194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 16204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Some of the contents in |voice_sender_info| needs to be updated from the 16224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |audio_track_|. 16234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 16244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 16264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 16274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 16294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceMediaInfo stats_read; 16304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.senders.push_back(voice_sender_info); 16314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 16324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 16344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 16354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 16364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 16374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 16384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; // returned values. 16404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 16414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the local track. 16434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(audio_track_.get(), &reports); 16444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 16454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 16464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 16474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 16484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 16494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 16504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 16514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the remote track. 16535b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 16544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(remote_track.get(), &reports); 16554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_report = FindNthReportByType(reports, 16564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeSsrc, 1); 16574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 16584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_id = ExtractSsrcStatsValue(reports, 16594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsValueNameTrackId); 16604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 16614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info); 16624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 16634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 166401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// This test verifies that when two outgoing audio tracks are using the same 166501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// ssrc at different times, they populate stats reports correctly. 166601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// TODO(xians): Figure out if it is possible to encapsulate the setup and 166701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// avoid duplication of code in test cases. 166801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.orgTEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) { 1669322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1670487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1671242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1672242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 1673242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 167401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 167501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // The content_name known by the voice channel. 167601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string kVcName("vcname"); 1677d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 167801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 167901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 168001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 168101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org AddOutgoingAudioTrackStats(); 168201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddStream(stream_); 168301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 168401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 168501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 168601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 168701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 168801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo stats_read; 168901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports reports; // returned values. 169001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 169101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 169201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 169301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 169401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Remove the previous audio track from the stream. 169501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->RemoveTrack(audio_track_.get()); 169601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 169701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 169801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a new audio track and adds it to the stream and stats. 169901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org static const std::string kNewTrackId = "new_track_id"; 1700d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> new_audio_track( 1701d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kNewTrackId)); 170201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 170301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNewTrackId), Return(true))); 170401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->AddTrack(new_audio_track); 170501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 170601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(new_audio_track, kSsrcOfTrack); 170769bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats.ClearUpdateStatsCacheForTest(); 170801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo new_voice_sender_info; 170901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitVoiceSenderInfo(&new_voice_sender_info); 171001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo new_stats_read; 17115b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 171201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 171301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, 171401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); 171501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org} 171601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 1717950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} // namespace webrtc 1718