statscollector_unittest.cc revision 058b1f17ac43b1fe69a8c18aaa7999ba88733dfd
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 504fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgusing rtc::scoped_ptr; 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll; 53b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing testing::Field; 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return; 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee; 57b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing webrtc::PeerConnectionInterface; 5840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReport; 5940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReports; 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager; 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeDeviceManager; 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 68950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgnamespace webrtc { 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND"; 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Constant names for track identification. 744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kLocalTrackId[] = "local_track_id"; 754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kRemoteTrackId[] = "remote_track_id"; 7697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst uint32 kSsrcOfTrack = 1234; 7797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession { 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org explicit MockWebRtcSession(cricket::ChannelManager* channel_manager) 81d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org : WebRtcSession(channel_manager, rtc::Thread::Current(), 82d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current(), NULL, NULL) { 8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 8440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD0(voice_channel, cricket::VoiceChannel*()); 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD0(video_channel, cricket::VideoChannel*()); 86487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org MOCK_CONST_METHOD0(mediastream_signaling, const MediaStreamSignaling*()); 874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Libjingle uses "local" for a outgoing track, and "remote" for a incoming 884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // track. 894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MOCK_METHOD2(GetLocalTrackIdBySsrc, bool(uint32, std::string*)); 904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MOCK_METHOD2(GetRemoteTrackIdBySsrc, bool(uint32, std::string*)); 9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::SessionStats*)); 924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org MOCK_METHOD1(GetTransport, cricket::Transport*(const std::string&)); 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel { 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 971ecbe45c7e4c9142896cb2810d699558518f4f28buildbot@webrtc.org MockVideoMediaChannel() : cricket::FakeVideoMediaChannel(NULL) {} 981ecbe45c7e4c9142896cb2810d699558518f4f28buildbot@webrtc.org 9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // MOCK_METHOD0(transport_channel, cricket::TransportChannel*()); 100058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VideoMediaInfo*)); 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass MockVoiceMediaChannel : public cricket::FakeVoiceMediaChannel { 10440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 10540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel() : cricket::FakeVoiceMediaChannel(NULL) { 10640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 10740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VoiceMediaInfo*)); 10840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 10940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 11040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeAudioProcessor : public webrtc::AudioProcessorInterface { 11140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 11240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org FakeAudioProcessor() {} 11340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ~FakeAudioProcessor() {} 11440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 11540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 11640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void GetStats( 11740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org AudioProcessorInterface::AudioProcessorStats* stats) OVERRIDE { 11840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->typing_noise_detected = true; 11940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss = 2; 12040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss_enhancement = 3; 12140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_median_ms = 4; 12240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->aec_quality_min = 5.1f; 12340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_std_ms = 6; 12440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 12540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 12640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 1274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgclass FakeAudioTrack 12840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> { 12940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 1304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org explicit FakeAudioTrack(const std::string& id) 13140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id), 132d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org processor_(new rtc::RefCountedObject<FakeAudioProcessor>()) {} 13340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string kind() const OVERRIDE { 13440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return "audio"; 13540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 13640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual webrtc::AudioSourceInterface* GetSource() const OVERRIDE { 13740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return NULL; 13840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 13940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void AddSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {} 14040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void RemoveSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {} 14140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual bool GetSignalLevel(int* level) OVERRIDE { 14240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org *level = 1; 14340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return true; 14440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 145d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org virtual rtc::scoped_refptr<webrtc::AudioProcessorInterface> 146b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org GetAudioProcessor() OVERRIDE { 147b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org return processor_; 14840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 151d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioProcessor> processor_; 15240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 15340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 1544fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org// TODO(tommi): Use FindValue(). 15540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 156242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name, 1574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 1588e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto& v : report->values()) { 1598e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org if (v->name == name) { 1608e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org *value = v->value; 1614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return true; 1624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return false; 1654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1674fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgstd::string ExtractStatsValue(const StatsReport::StatsType& type, 16840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, 169242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 1704fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org for (const auto* r : reports) { 1714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1724fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (r->type() == type && GetValue(r, name, &ret)) 1734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 17428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1794fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgscoped_ptr<StatsReport::Id> TypedIdFromIdString(StatsReport::StatsType type, 1804fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const std::string& value) { 1814fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(value.empty()); 1824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> id; 1834fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (value.empty()) 1844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return id.Pass(); 1854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 1864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 1874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 1884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 1894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = value.find('_'); 1904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_NE(index, std::string::npos); 1914fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (index == std::string::npos || index == (value.length() - 1)) 1924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return id.Pass(); 1934fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 1944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org id = StatsReport::NewTypedId(type, value.substr(index + 1)); 1954fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(id->ToString(), value); 1964fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return id.Pass(); 1974fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 1984fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 1994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgscoped_ptr<StatsReport::Id> IdFromCertIdString(const std::string& cert_id) { 2004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return TypedIdFromIdString(StatsReport::kStatsReportTypeCertificate, cert_id) 2014fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org .Pass(); 2024fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 2034fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 20640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType( 2074fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReports& reports, const StatsReport::StatsType& type, int n) { 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 2094fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (reports[i]->type() == type) { 21028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 2125b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org return reports[i]; 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2154fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return nullptr; 21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports, 2194fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& id) { 2208e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto* r : reports) { 2214fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (r->id().Equals(id)) 2228e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return r; 22328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2248e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return nullptr; 22528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 22628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports, 228242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 2294fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return ExtractStatsValue(StatsReport::kStatsReportTypeSsrc, reports, name); 23028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 23128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 23240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports, 233242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 23428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 23540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeBwe, reports, name); 23628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 23728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 239d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return rtc::SSLIdentity::DerToPem( 240d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::kPemTypeCertificate, 2414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 2424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 2434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 2464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 2474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 2484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 2494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 2504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 25240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports, 2534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 2544fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& start_id) { 2554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> cert_id; 2564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id* certificate_id = &start_id; 2574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 2584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 2594fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport* report = FindReportById(reports, *certificate_id); 2604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 26119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 26440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameDer, &der_base64)); 2654fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string der = rtc::Base64::Decode(der_base64, rtc::Base64::DO_STRICT); 2664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 26719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 26819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 26919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 27019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 27140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprintAlgorithm, 27219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 27319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 274d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string sha_1_str = rtc::DIGEST_SHA_1; 27519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 27619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2774fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string fingerprint; 2784fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameFingerprint, 2794fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &fingerprint)); 2804fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(fingerprint.empty()); 28119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 2834fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string issuer_id; 2844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (!GetValue(report, StatsReport::kStatsValueNameIssuerId, 2854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &issuer_id)) { 2864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 2874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org } 2884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 2894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org cert_id = IdFromCertIdString(issuer_id).Pass(); 2904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org certificate_id = cert_id.get(); 2914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 2924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 2934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid VerifyVoiceReceiverInfoReport( 2964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* report, 2974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const cricket::VoiceReceiverInfo& info) { 2983e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org std::string value_in_report; 2993e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3003e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report)); 301d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.audio_level), value_in_report); 3023e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3033e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameBytesReceived, &value_in_report)); 304d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(info.bytes_rcvd), value_in_report); 3053e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3063e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 307d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_ms), value_in_report); 3083e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3093e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report)); 310d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_ms), value_in_report); 3113e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3123e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePreferredJitterBufferMs, 3133e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org &value_in_report)); 314d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_preferred_ms), 3153e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3163e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3173e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report)); 318d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.delay_estimate_ms), value_in_report); 3193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3203e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameExpandRate, &value_in_report)); 321d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.expand_rate), value_in_report); 3223e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 323652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org report, StatsReport::kStatsValueNameSpeechExpandRate, &value_in_report)); 324652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.speech_expand_rate), value_in_report); 325652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate, 326652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org &value_in_report)); 327652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.secondary_decoded_rate), value_in_report); 328652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue( 3293e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); 330d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report); 3313e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3323e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report)); 333d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_silence_generator), 3343e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3353e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3363e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report)); 337d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_neteq), 3383e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3393e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3403e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report)); 341d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_normal), value_in_report); 3423e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3433e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report)); 344d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc), value_in_report); 3453e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3463e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report)); 347d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_cng), value_in_report); 3483e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3493e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report)); 350d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc_cng), value_in_report); 3517e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org EXPECT_TRUE(GetValue( 3527e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 3533e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 3543e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 3553e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 35640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report, 35740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const cricket::VoiceSenderInfo& sinfo) { 35840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string value_in_report; 35940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 36140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(sinfo.codec_name, value_in_report); 36240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameBytesSent, &value_in_report)); 364d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(sinfo.bytes_sent), value_in_report); 36540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 367d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_sent), value_in_report); 36840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 369ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org report, StatsReport::kStatsValueNamePacketsLost, &value_in_report)); 370d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_lost), value_in_report); 371ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_TRUE(GetValue( 37240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 373d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 37440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 376d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 37740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 379d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.jitter_ms), value_in_report); 38040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoCancellationQualityMin, 38240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 383d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(sinfo.aec_quality_min), value_in_report); 38440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 386d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_median_ms), 38740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 38840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report)); 390d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_std_ms), 39140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 39240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report)); 394d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss), 39540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 39640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLossEnhancement, 39840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 399d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss_enhancement), 40040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 40140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); 403d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report); 40440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); 40640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false"; 40740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(typing_detected, value_in_report); 40840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 40940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 4104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// Helper methods to avoid duplication of code. 4114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceSenderInfo(cricket::VoiceSenderInfo* voice_sender_info) { 4124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->add_ssrc(kSsrcOfTrack); 4134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->codec_name = "fake_codec"; 4144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->bytes_sent = 100; 4154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_sent = 101; 4164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->rtt_ms = 102; 4174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->fraction_lost = 103; 4184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->jitter_ms = 104; 4194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_lost = 105; 4204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->ext_seqnum = 106; 4214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->audio_level = 107; 4224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = 108; 4234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 109; 4244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 110; 4254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 111; 4264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = 112.0f; 4274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = false; 4284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid UpdateVoiceSenderInfoFromAudioTrack( 4314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org FakeAudioTrack* audio_track, cricket::VoiceSenderInfo* voice_sender_info) { 4324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetSignalLevel(&voice_sender_info->audio_level); 4334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; 4344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); 4354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = 4364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.typing_noise_detected; 4374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; 4384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 4394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_return_loss_enhancement; 4404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 4414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_median_ms; 4424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = audio_processor_stats.aec_quality_min; 4434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 4444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_std_ms; 4454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { 4484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->add_ssrc(kSsrcOfTrack); 4494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->bytes_rcvd = 110; 4504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_rcvd = 111; 4514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 112; 4524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->fraction_lost = 113; 4534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 114; 4544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->ext_seqnum = 115; 4554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_ms = 116; 4564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_ms = 117; 4574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_preferred_ms = 118; 4584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->delay_estimate_ms = 119; 4594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->audio_level = 120; 4604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->expand_rate = 121; 461652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->speech_expand_rate = 122; 462652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->secondary_decoded_rate = 123; 4634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 465322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.orgclass StatsCollectorForTest : public webrtc::StatsCollector { 466322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org public: 467322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org explicit StatsCollectorForTest(WebRtcSession* session) : 468322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollector(session), time_now_(19477) { 469322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org } 470322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 471322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double GetTimeNow() override { 472322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org return time_now_; 473322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org } 474322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 475322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org private: 476322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double time_now_; 477322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org}; 478322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 48128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 4825b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org : media_engine_(new cricket::FakeMediaEngine()), 48328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_manager_( 48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::ChannelManager(media_engine_, 48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::FakeDeviceManager(), 486d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current())), 487487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org signaling_(channel_manager_.get()), 4884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org session_(channel_manager_.get()) { 48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false)); 491487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, mediastream_signaling()).WillRepeatedly( 492487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org Return(&signaling_)); 49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4955b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org ~StatsCollectorTest() {} 4965b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org 49797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 49897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 49997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 500242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org void InitSessionStats(const std::string& vc_name) { 50197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 50297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 50397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 50497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 50597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.content_name = kTransportName; 50697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 50797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 50897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 50997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 51097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 51197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing video track with a given SSRC into the stats. 5134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingVideoTrackStats() { 51497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kLocalTrackId, NULL); 51697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 5174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 5184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 51997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 52097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming video track with a given SSRC into the stats. 5224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingVideoTrackStats() { 5234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kRemoteTrackId, NULL); 5254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(track_); 5264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 52701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 5284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing audio track with a given SSRC into the stats. 5314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingAudioTrackStats() { 53240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 53340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 53440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 535d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kLocalTrackId); 53740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 5384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 53901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 5404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming audio track with a given SSRC into the stats. 5434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingAudioTrackStats() { 5444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org if (stream_ == NULL) 5454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 547d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kRemoteTrackId); 5494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(audio_track_); 5504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 55101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 55201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 55301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 554950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org std::string AddCandidateReport(StatsCollector* collector, 555950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const cricket::Candidate& candidate, 5564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org bool local) { 5574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return collector->AddCandidateReport(candidate, local); 558950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org } 559950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 56001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org void SetupAndVerifyAudioTrackStats( 56101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org FakeAudioTrack* audio_track, 56201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::MediaStream* stream, 56301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::StatsCollector* stats, 56401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceChannel* voice_channel, 56501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string& vc_name, 56601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel, 56701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo* voice_sender_info, 56801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceReceiverInfo* voice_receiver_info, 56901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo* stats_read, 57001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports* reports) { 57101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // A track can't have both sender report and recv report at the same time 57201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // for now, this might change in the future though. 57301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ASSERT((voice_sender_info == NULL) ^ (voice_receiver_info == NULL)); 57401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 57501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Instruct the session to return stats containing the transport channel. 57601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitSessionStats(vc_name); 57701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 57801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 57901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(true))); 58001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 58101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Constructs an ssrc stats update. 58201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 58301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->senders.push_back(*voice_sender_info); 58401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 58501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->receivers.push_back(*voice_receiver_info); 58601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 58701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly( 58801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(voice_channel)); 58901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 59001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 59101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(*stats_read), Return(true))); 59201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 59301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 59469bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats->ClearUpdateStatsCacheForTest(); 59501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(NULL, reports); 59601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 59701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify the existence of the track report. 59801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* report = FindNthReportByType( 59901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsReportTypeSsrc, 1); 60001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_FALSE(report == NULL); 60101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 60201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameTrackId); 60301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 60401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 60501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameSsrc); 606d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 60701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 60801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verifies the values in the track report. 60901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) { 61001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track, voice_sender_info); 61101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(report, *voice_sender_info); 61201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 61301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) { 61401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(report, *voice_receiver_info); 61501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 61601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 61701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify we get the same result by passing a track to GetStats(). 61801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports track_reports; // returned values. 61901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(audio_track, &track_reports); 62001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* track_report = FindNthReportByType( 62101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 62201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_TRUE(track_report); 62301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 62401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameTrackId); 62501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 62601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 62701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameSsrc); 628d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 62901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 63001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(track_report, *voice_sender_info); 63101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 63201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, *voice_receiver_info); 63340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 63440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 635d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org void TestCertificateReports(const rtc::FakeSSLCertificate& local_cert, 6364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 637d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::FakeSSLCertificate& remote_cert, 6384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 639322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 640487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 64140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 6424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 6467bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org channel_stats.srtp_cipher = "the-srtp-cipher"; 6477bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org channel_stats.ssl_cipher = "the-ssl-cipher"; 6484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 6504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 6514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 6544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 6554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 658d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLIdentity local_identity(local_cert); 659d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<rtc::FakeSSLCertificate> remote_cert_copy( 6604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 6614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 663d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 6644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 6654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 6664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 6674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 6684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 6694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 6704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 6714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 6724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 6734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 6744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 6764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 67706b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 6784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 6794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 6804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 68140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 68240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 6834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 684b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 6854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 6874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 68840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 68940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 6904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 6914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 6934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 69440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 6954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 69640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 697b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 698b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 6994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> id(IdFromCertIdString(local_certificate_id)); 7004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org CheckCertChainReports(reports, local_ders, *id.get()); 701b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 702b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 703b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 7064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 70740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 7084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 70940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 710b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 711b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 7124fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> id(IdFromCertIdString(remote_certificate_id)); 7134fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org CheckCertChainReports(reports, remote_ders, *id.get()); 714b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 715b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 716b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7177bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 7187bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check negotiated ciphers. 7197bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string dtls_cipher = ExtractStatsValue( 7207bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 7217bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 7227bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameDtlsCipher); 7237bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org EXPECT_EQ("the-ssl-cipher", dtls_cipher); 7247bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string srtp_cipher = ExtractStatsValue( 7257bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 7267bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 7277bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameSrtpCipher); 7287bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org EXPECT_EQ("the-srtp-cipher", srtp_cipher); 7294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 73097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 73128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 732d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 73328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 734487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeMediaStreamSignaling signaling_; 735487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeDataChannelProvider data_channel_provider_; 73697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SessionStats session_stats_; 737d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> stream_; 738d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrack> track_; 739d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> audio_track_; 74028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 74128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 742487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org// Verify that ExtractDataInfo populates reports. 743487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.orgTEST_F(StatsCollectorTest, ExtractDataInfo) { 744487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string label = "hacks"; 745487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const int id = 31337; 746487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string state = DataChannelInterface::DataStateString( 747487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org DataChannelInterface::DataState::kConnecting); 748487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 749487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 750487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 751487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 752487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org InternalDataChannelInit config; 753487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org config.id = id; 754487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org signaling_.AddDataChannel(DataChannel::Create( 755487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org &data_channel_provider_, cricket::DCT_SCTP, label, config)); 756322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 757487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 758487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 759487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 760487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReports reports; 761487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.GetStats(NULL, &reports); 762322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 763322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org const StatsReport* report = 764322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org FindNthReportByType(reports, StatsReport::kStatsReportTypeDataChannel, 1); 765322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 766322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org scoped_ptr<StatsReport::Id> reportId = StatsReport::NewTypedIntId( 767322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsReport::kStatsReportTypeDataChannel, id); 768322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 769322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_TRUE(reportId->Equals(report->id())); 770322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 771322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(stats.GetTimeNow(), report->timestamp()); 772487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(label, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 773487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 774487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameLabel)); 775487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(rtc::ToString<int64>(id), 776487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 777487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 778487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameDataChannelId)); 779487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(state, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 780487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 781487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameState)); 782487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ("", ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 783487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 784487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameProtocol)); 785487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org} 786487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 78728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 78828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 789322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 790487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 7914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 792d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 79328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 79440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 79528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 79628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 79728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 79828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 79928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 80028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 80297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 80328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8055bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 80628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 80728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 80828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 81040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 811058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 812058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 813242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org Return(true))); 814b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 81528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 816242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 817242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 81828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 81928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 82028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 82228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 823322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 824487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 8254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 826d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 82728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 82840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 82928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 83028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 83128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 83228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 83328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 83428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 83528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 83797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 83828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 83928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8405bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 84128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 84228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 84328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 84428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 84528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 84628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 84728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 84828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 85040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 851058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 852058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true))); 85397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 854b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 85528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 856242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 857242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 85828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 859242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org result = ExtractBweStatsValue(reports, 860242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameTargetEncBitrate); 86128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 86228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 86328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 86428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 86528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 86628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 867322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 868487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 86940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 87040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 87140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 872b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 87328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 87440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 87540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 87628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 87728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 87828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 88028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 88128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 882322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 883487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 88440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 88540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 88640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 887b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 888b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 88928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 89040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 89140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 89228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 89328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 89440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 89528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 89628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 89728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 89828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 89928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 90028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 901322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 902487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 9034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 904d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 90528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 9064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 90797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 90828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 90928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 91003505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 91128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 91228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 9134fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(StatsReport::kStatsReportTypeTrack, reports[0]->type()); 91428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 91640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 91728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 91840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 9194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, trackValue); 92028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 92128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 92228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 92328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 92428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 925322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 926487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 9274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 928d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 92928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 9304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 93197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 93228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 93328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 93428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 93528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 93628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 93728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 93828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 9395bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 94028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 94128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 94228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 94440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 945058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 946058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 94728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 94828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 949b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 95003505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 95128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 95297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 95397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 95497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 95540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 95640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 9574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 95828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get report for the specific |track|. 9605b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 96197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 96297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 96397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 96497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 96528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 96640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 9674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 96828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 97040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 971d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 97228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 97328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 97440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 9754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 97628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 97728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 97828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 97928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 98028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 981322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 982487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 983242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 984242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 98506b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 9864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 98728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 98828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 989d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 99028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 9914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 99297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 99328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 99528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 99628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 99728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 99828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 10005bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 100128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 100228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 100328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 100440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 100540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1006058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1007058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 100828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 100928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 101097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 101128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 101240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 101340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 101428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1015b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 101603505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 101728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 101828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 101940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 102028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 102140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 102228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 10234fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // Transport id component ID will always be 1. 10244fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 10254fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 10264fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 10274fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = transport_id.find('-'); 10284fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10294fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string content = transport_id.substr(index + 1); 10304fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org index = content.rfind('-'); 10314fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10324fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org content = content.substr(0, index); 10334fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org scoped_ptr<StatsReport::Id> id(StatsReport::NewComponentId(content, 1)); 10344fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_EQ(transport_id, id->ToString()); 10354fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport* transport_report = FindReportById(reports, *id.get()); 103628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 103728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 103828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 103997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 104097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 104197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 1042322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1043487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 10444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 104597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 104697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1047d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 104897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 10494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 105097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 105197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 105240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 105340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 105497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1055b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 105640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 105797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 105840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 105940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 106097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 106197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 106297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 106397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 106497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 106597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 1066322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1067487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1068242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1069242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 107006b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 10714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 107297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 107397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1074d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 107597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 10764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 107797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 107897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 107997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 108097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 108197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 108240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 108340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 108497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 108597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 108697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 108797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 108897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 108997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 109097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 109197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 10925bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 109397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 109497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 109597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 109640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 109740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1098058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1099058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 110097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 110197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1102b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 110303505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 110497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 11054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 110640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 110740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 110897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 1109322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(12345.678, remote_report->timestamp()); 111097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 111197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 11124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that the empty track report exists in the returned stats 11134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 11144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, ReportsFromRemoteTrack) { 1115322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1116487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 11174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1118d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 11194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 11204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingVideoTrackStats(); 11214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 11224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 11244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoReceiverInfo video_receiver_info; 11254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoMediaInfo stats_read; 11261ed6224eafc7816f25d1906e4d709afdf2ad8f0fpbos@webrtc.org const int64 kNumOfPacketsConcealed = 54321; 11274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Construct a stats value to read. 11294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.add_ssrc(1234); 11301ed6224eafc7816f25d1906e4d709afdf2ad8f0fpbos@webrtc.org video_receiver_info.packets_concealed = kNumOfPacketsConcealed; 11314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(video_receiver_info); 11324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 11344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1135058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1136058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 11374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 11384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 114003505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 11414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(NULL, &reports); 11424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |reports| should contain at least one session report, one track report, 11434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // and one ssrc report. 11444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_LE(static_cast<size_t>(3), reports.size()); 11454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 11464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 11474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 11484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 11504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1151d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 11524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 11544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 11554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 11564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 11574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 1158950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// This test verifies the Ice Candidate report should contain the correct 1159950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// information from local/remote candidates. 1160950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgTEST_F(StatsCollectorTest, IceCandidateReport) { 1161322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1162487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1163950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReports reports; // returned values. 1164950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1165950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int local_port = 2000; 1166950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char local_ip[] = "192.168.0.1"; 1167950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int remote_port = 2001; 1168950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char remote_ip[] = "192.168.0.2"; 1169950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1170950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress local_address(local_ip, local_port); 1171950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress remote_address(remote_ip, remote_port); 1172950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::AdapterType network_type = rtc::ADAPTER_TYPE_ETHERNET; 1173950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org uint32 priority = 1000; 1174950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1175950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::Candidate c; 117661c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1177950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::LOCAL_PORT_TYPE); 1178950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1179950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(local_address); 1180950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_priority(priority); 1181950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_network_type(network_type); 11824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string report_id = AddCandidateReport(&stats, c, true); 118361c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1184950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 118561c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c = cricket::Candidate(); 118661c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1187950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::PRFLX_PORT_TYPE); 118861c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1189950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(remote_address); 119061c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_priority(priority); 119161c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_network_type(network_type); 11924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org report_id = AddCandidateReport(&stats, c, false); 119361c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1194950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1195950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org stats.GetStats(NULL, &reports); 1196950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1197950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the local candidate report is populated correctly. 1198950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1199950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org local_ip, 1200950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1201950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1202950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1203950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(local_port), 1204950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1205950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1206950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1207950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::UDP_PROTOCOL_NAME, 1208950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1209950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1210950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1211950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(priority), 1212950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1213950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1214950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1215950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::LOCAL_PORT_TYPE), 1216950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1217950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateType)); 1218950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1219950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org AdapterTypeToStatsType(network_type), 1220950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1221950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1222950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1223950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the remote candidate report is populated correctly. 1224950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(remote_ip, 1225950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1226950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1227950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1228950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(remote_port), 1229950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1230950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1231950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1232950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, 1233950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1234950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1235950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1236950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(priority), 1237950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1238950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1239950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1240950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1241950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::PRFLX_PORT_TYPE), 1242950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1243950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, StatsReport::kStatsValueNameCandidateType)); 1244950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(kNotFound, 1245950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1246950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1247950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1248950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} 1249950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 12504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 12514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 125219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 12534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 12544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 12554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 12564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 12574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 12584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 12594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 1260d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DersToPems(local_ders)); 12614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 12634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 12644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 12654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 12664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 12674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 1268d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 12694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 12714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 12724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 12744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 127519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 12764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 12774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 1278d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 12794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 12814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 1282d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 12834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 12854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 12864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 12874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 12894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 129019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 1291322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1292487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 129340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 12944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 12964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 12974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 12984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 13004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 13014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 13024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 13044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 13054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 13064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 13084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 130906b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(ReturnNull()); 13104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 13114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 13124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 131397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 131440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 131540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 13164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1317b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 13194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 13214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 132240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 132440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 13254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 13264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 13284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 132940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 133140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 13324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 13337bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 13347bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check that the negotiated ciphers are absent. 13357bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string dtls_cipher = ExtractStatsValue( 13367bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 13377bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 13387bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameDtlsCipher); 13397bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org ASSERT_EQ(kNotFound, dtls_cipher); 13407bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string srtp_cipher = ExtractStatsValue( 13417bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 13427bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 13437bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameSrtpCipher); 13447bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org ASSERT_EQ(kNotFound, srtp_cipher); 13454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 13484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 134919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 1350322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1351487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 135240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 13534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 13554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 13564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 13574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 13594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 13604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 13614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 13634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 13644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 13654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 1367d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 13684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 13694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 13704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 13714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 13724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 13744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 137506b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 13764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 13774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 13784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 137940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 138040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 13814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1382b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 13844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 13864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 138740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 138940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 13904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 13914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 13934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 139440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 139640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 13974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 13984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1400b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 1401b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 1402b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 1403b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 1404b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 1405d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 1406b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1407b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 1408b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 1409d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 1410b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 1411b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1412b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 1413b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 1414b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1415b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 141640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 141740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 141840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 1419322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1420487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1421242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1422242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 142306b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 1424242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org 142540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 142640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 142740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1428d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 142940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 14304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 143140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 143201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 143340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 143440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 14354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 143640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 143740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 143840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 143901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 144001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 144101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 144240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify that there is no remote report for the local audio track because 14444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // we did not set it up. 14454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 14464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 14474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(remote_report == NULL); 14484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 14493e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 14503e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// This test verifies that audio receive streams populate stats reports 14513e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// correctly. 14523e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromRemoteStream) { 1453322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1454487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1455242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1456242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 145706b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 14583e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 14593e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org // The content_name known by the voice channel. 14603e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const std::string kVcName("vcname"); 1461d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 14623e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 14634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingAudioTrackStats(); 14643e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.AddStream(stream_); 14653e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 14663e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 14674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 14687e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org voice_receiver_info.codec_name = "fake_codec"; 14693e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 14703e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceMediaInfo stats_read; 14713e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org StatsReports reports; // returned values. 147201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 147301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 147401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, NULL, &voice_receiver_info, &stats_read, &reports); 14753e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 14763e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 147740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 147840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 147940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 1480322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1481487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1482242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1483242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 148406b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 148540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 148640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 148740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1488d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 148940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 14904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 149140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 149240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 149340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 149440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 149540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 149640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 149740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 149840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 149940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 150040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 150140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 150340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 150440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 150540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 150640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 150740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 150840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 150940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 151040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 151140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 151240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 151340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 151440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 151540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 151640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 151740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 151840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 151940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 152040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 152140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 152240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 152340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 15244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 152540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 152640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1527d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 152840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 152940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 153040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 153140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 153240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 153340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 153440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that when ongoing and incoming audio tracks are using 15364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// the same ssrc, they populate stats reports correctly. 15374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) { 1538322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1539487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1540242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1541242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 154206b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 15434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 15444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // The content_name known by the voice channel. 15454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string kVcName("vcname"); 1546d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 15474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 15484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 15504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 15514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 15524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 15534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a remote stream with a remote audio track and adds it to the stats. 1555d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> remote_stream( 15564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::MediaStream::Create("remotestreamlabel")); 1557d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> remote_track( 1558d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId)); 15594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 156001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 15614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org remote_stream->AddTrack(remote_track); 15624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(remote_stream); 15634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Instruct the session to return stats containing the transport channel. 15654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitSessionStats(kVcName); 15664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 15674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 15684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 15694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 15724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Some of the contents in |voice_sender_info| needs to be updated from the 15744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |audio_track_|. 15754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 15764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 15784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 15794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 15814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceMediaInfo stats_read; 15824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.senders.push_back(voice_sender_info); 15834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 15844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 15864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 15874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 15884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 15894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 15904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; // returned values. 15924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 15934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the local track. 15954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(audio_track_.get(), &reports); 15964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 15974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 15984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 15994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 16004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 16014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 16024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 16034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the remote track. 16055b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 16064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(remote_track.get(), &reports); 16074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_report = FindNthReportByType(reports, 16084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeSsrc, 1); 16094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 16104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_id = ExtractSsrcStatsValue(reports, 16114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsValueNameTrackId); 16124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 16134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info); 16144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 16154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 161601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// This test verifies that when two outgoing audio tracks are using the same 161701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// ssrc at different times, they populate stats reports correctly. 161801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// TODO(xians): Figure out if it is possible to encapsulate the setup and 161901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// avoid duplication of code in test cases. 162001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.orgTEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) { 1621322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1622487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1623242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1624242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 1625242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 162601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 162701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // The content_name known by the voice channel. 162801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string kVcName("vcname"); 1629d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 163001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 163101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 163201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 163301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org AddOutgoingAudioTrackStats(); 163401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddStream(stream_); 163501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 163601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 163701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 163801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 163901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 164001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo stats_read; 164101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports reports; // returned values. 164201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 164301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 164401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 164501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 164601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Remove the previous audio track from the stream. 164701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->RemoveTrack(audio_track_.get()); 164801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 164901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 165001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a new audio track and adds it to the stream and stats. 165101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org static const std::string kNewTrackId = "new_track_id"; 1652d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> new_audio_track( 1653d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kNewTrackId)); 165401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 165501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNewTrackId), Return(true))); 165601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->AddTrack(new_audio_track); 165701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 165801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(new_audio_track, kSsrcOfTrack); 165969bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats.ClearUpdateStatsCacheForTest(); 166001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo new_voice_sender_info; 166101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitVoiceSenderInfo(&new_voice_sender_info); 166201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo new_stats_read; 16635b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 166401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 166501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, 166601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); 166701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org} 166801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 1669950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} // namespace webrtc 1670