statscollector_unittest.cc revision 8e6fd46cc324f8946e68396edcb252ffaf2d4579
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*)); 91c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org MOCK_METHOD1(GetTransportStats, 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: 11614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override { 11740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->typing_noise_detected = true; 11840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss = 2; 11940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss_enhancement = 3; 12040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_median_ms = 4; 12140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->aec_quality_min = 5.1f; 12240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_std_ms = 6; 12340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 12440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 12540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 1264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgclass FakeAudioTrack 12740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> { 12840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 1294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org explicit FakeAudioTrack(const std::string& id) 13040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id), 131d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org processor_(new rtc::RefCountedObject<FakeAudioProcessor>()) {} 13214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org std::string kind() const override { return "audio"; } 13314665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org webrtc::AudioSourceInterface* GetSource() const override { return NULL; } 13414665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void AddSink(webrtc::AudioTrackSinkInterface* sink) override {} 13514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {} 13614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org bool GetSignalLevel(int* level) override { 13740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org *level = 1; 13840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return true; 13940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 14014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org rtc::scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor() 14114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org override { 142b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org return processor_; 14340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 14440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 146d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioProcessor> processor_; 14740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 14840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 150242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name, 1514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 15292f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org const StatsReport::Value* v = report->FindValue(name); 15392f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org if (!v) 15492f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org return false; 15592f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org *value = v->ToString(); 15692f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org return true; 1574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1594fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgstd::string ExtractStatsValue(const StatsReport::StatsType& type, 16040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, 161242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 1624fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org for (const auto* r : reports) { 1634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1644fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (r->type() == type && GetValue(r, name, &ret)) 1654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 16828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 171d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id TypedIdFromIdString(StatsReport::StatsType type, 172d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const std::string& value) { 1734fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(value.empty()); 174d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id; 1754fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (value.empty()) 176d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 1774fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 1784fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 1794fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 1804fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 1814fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = value.find('_'); 1824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_NE(index, std::string::npos); 1834fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (index == std::string::npos || index == (value.length() - 1)) 184d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 1854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 1864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org id = StatsReport::NewTypedId(type, value.substr(index + 1)); 1874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(id->ToString(), value); 188d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 1894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 1904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 191d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id IdFromCertIdString(const std::string& cert_id) { 192d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return TypedIdFromIdString(StatsReport::kStatsReportTypeCertificate, cert_id); 1934fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 1944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 19740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType( 1984fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReports& reports, const StatsReport::StatsType& type, int n) { 19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 2004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (reports[i]->type() == type) { 20128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 2035b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org return reports[i]; 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2064fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return nullptr; 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports, 2104fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& id) { 2118e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto* r : reports) { 212d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org if (r->id()->Equals(id)) 2138e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return r; 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2158e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return nullptr; 21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports, 219242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 2204fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return ExtractStatsValue(StatsReport::kStatsReportTypeSsrc, reports, name); 22128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 22228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports, 224242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 22528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 22640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeBwe, reports, name); 22728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 22828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 230d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return rtc::SSLIdentity::DerToPem( 231d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::kPemTypeCertificate, 2324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 2334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 2344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 2374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 2384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 2394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 2404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 2414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 24340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports, 2444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 2454fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& start_id) { 246d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id cert_id; 2474fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id* certificate_id = &start_id; 2484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 2494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 2504fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport* report = FindReportById(reports, *certificate_id); 2514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 25219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 2544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 25540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameDer, &der_base64)); 2564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string der = rtc::Base64::Decode(der_base64, rtc::Base64::DO_STRICT); 2574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 25819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 25919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 26019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 26119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 26240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprintAlgorithm, 26319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 26419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 265d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string sha_1_str = rtc::DIGEST_SHA_1; 26619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 26719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2684fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string fingerprint; 2694fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameFingerprint, 2704fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &fingerprint)); 2714fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(fingerprint.empty()); 27219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 2744fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string issuer_id; 2754fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (!GetValue(report, StatsReport::kStatsValueNameIssuerId, 2764fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &issuer_id)) { 2774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 2784fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org } 2794fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 280d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org cert_id = IdFromCertIdString(issuer_id); 281d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org certificate_id = &cert_id; 2824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 2834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 2844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid VerifyVoiceReceiverInfoReport( 2874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* report, 2884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const cricket::VoiceReceiverInfo& info) { 2893e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org std::string value_in_report; 2903e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2913e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report)); 292d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.audio_level), value_in_report); 2933e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2943e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameBytesReceived, &value_in_report)); 295d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(info.bytes_rcvd), value_in_report); 2963e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2973e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 298d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_ms), value_in_report); 2993e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3003e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report)); 301d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_ms), value_in_report); 3023e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3033e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePreferredJitterBufferMs, 3043e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org &value_in_report)); 305d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_preferred_ms), 3063e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3073e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3083e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report)); 309d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.delay_estimate_ms), value_in_report); 3103e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3113e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameExpandRate, &value_in_report)); 312d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.expand_rate), value_in_report); 3133e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 314652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org report, StatsReport::kStatsValueNameSpeechExpandRate, &value_in_report)); 315652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.speech_expand_rate), value_in_report); 3168e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAccelerateRate, 3178e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin &value_in_report)); 3188e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_EQ(rtc::ToString<float>(info.accelerate_rate), value_in_report); 3198e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNamePreemptiveExpandRate, 3208e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin &value_in_report)); 3218e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_EQ(rtc::ToString<float>(info.preemptive_expand_rate), value_in_report); 322652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate, 323652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org &value_in_report)); 324652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.secondary_decoded_rate), value_in_report); 325652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue( 3263e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); 327d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report); 3283e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3293e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report)); 330d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_silence_generator), 3313e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3323e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3333e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report)); 334d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_neteq), 3353e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3363e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3373e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report)); 338d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_normal), value_in_report); 3393e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3403e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report)); 341d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc), value_in_report); 3423e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3433e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report)); 344d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_cng), value_in_report); 3453e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3463e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report)); 347d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc_cng), value_in_report); 3487e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org EXPECT_TRUE(GetValue( 3497e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 3503e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 3513e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 3523e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 35340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report, 35440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const cricket::VoiceSenderInfo& sinfo) { 35540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string value_in_report; 35640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 35740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 35840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(sinfo.codec_name, value_in_report); 35940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameBytesSent, &value_in_report)); 361d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(sinfo.bytes_sent), value_in_report); 36240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 364d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_sent), value_in_report); 36540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 366ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org report, StatsReport::kStatsValueNamePacketsLost, &value_in_report)); 367d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_lost), value_in_report); 368ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_TRUE(GetValue( 36940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 370d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 37140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@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::kStatsValueNameJitterReceived, &value_in_report)); 376d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.jitter_ms), value_in_report); 37740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoCancellationQualityMin, 37940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 380d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(sinfo.aec_quality_min), value_in_report); 38140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 383d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_median_ms), 38440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 38540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report)); 387d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_std_ms), 38840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 38940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report)); 391d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss), 39240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 39340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLossEnhancement, 39540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 396d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss_enhancement), 39740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 39840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); 400d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report); 40140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); 40340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false"; 40440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(typing_detected, value_in_report); 40540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 40640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 4074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// Helper methods to avoid duplication of code. 4084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceSenderInfo(cricket::VoiceSenderInfo* voice_sender_info) { 4094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->add_ssrc(kSsrcOfTrack); 4104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->codec_name = "fake_codec"; 4114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->bytes_sent = 100; 4124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_sent = 101; 4134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->rtt_ms = 102; 4144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->fraction_lost = 103; 4154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->jitter_ms = 104; 4164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_lost = 105; 4174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->ext_seqnum = 106; 4184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->audio_level = 107; 4194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = 108; 4204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 109; 4214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 110; 4224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 111; 4234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = 112.0f; 4244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = false; 4254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid UpdateVoiceSenderInfoFromAudioTrack( 4284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org FakeAudioTrack* audio_track, cricket::VoiceSenderInfo* voice_sender_info) { 4294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetSignalLevel(&voice_sender_info->audio_level); 4304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; 4314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); 4324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = 4334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.typing_noise_detected; 4344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; 4354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 4364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_return_loss_enhancement; 4374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 4384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_median_ms; 4394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = audio_processor_stats.aec_quality_min; 4404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 4414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_std_ms; 4424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { 4454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->add_ssrc(kSsrcOfTrack); 4464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->bytes_rcvd = 110; 4474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_rcvd = 111; 4484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 112; 4494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->fraction_lost = 113; 4504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 114; 4514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->ext_seqnum = 115; 4524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_ms = 116; 4534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_ms = 117; 4544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_preferred_ms = 118; 4554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->delay_estimate_ms = 119; 4564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->audio_level = 120; 4574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->expand_rate = 121; 458652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->speech_expand_rate = 122; 459652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->secondary_decoded_rate = 123; 4608e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin voice_receiver_info->accelerate_rate = 124; 4618e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin voice_receiver_info->preemptive_expand_rate = 125; 4624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 464322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.orgclass StatsCollectorForTest : public webrtc::StatsCollector { 465322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org public: 466322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org explicit StatsCollectorForTest(WebRtcSession* session) : 467322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollector(session), time_now_(19477) { 468322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org } 469322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 470322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double GetTimeNow() override { 471322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org return time_now_; 472322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org } 473322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 474322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org private: 475322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double time_now_; 476322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org}; 477322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 47828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 4815b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org : media_engine_(new cricket::FakeMediaEngine()), 48228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_manager_( 48328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::ChannelManager(media_engine_, 48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::FakeDeviceManager(), 485d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current())), 4867c027b64ae53a29bc528b4241cc540694c239304Henrik Kjellander session_(channel_manager_.get()), 4877c027b64ae53a29bc528b4241cc540694c239304Henrik Kjellander signaling_(channel_manager_.get()) { 48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 489c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)).WillRepeatedly(Return(false)); 490487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, mediastream_signaling()).WillRepeatedly( 491487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org Return(&signaling_)); 49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4945b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org ~StatsCollectorTest() {} 4955b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org 49697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 49797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 49897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 499242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org void InitSessionStats(const std::string& vc_name) { 50097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 50197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 50297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 50397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 50497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.content_name = kTransportName; 50597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 50697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 50797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 50897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 50997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 51097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing video track with a given SSRC into the stats. 5124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingVideoTrackStats() { 51397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kLocalTrackId, NULL); 51597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 5164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 5174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 51897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 51997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming video track with a given SSRC into the stats. 5214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingVideoTrackStats() { 5224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kRemoteTrackId, NULL); 5244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(track_); 5254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 52601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 5274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing audio track with a given SSRC into the stats. 5304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingAudioTrackStats() { 53140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 53240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 53340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 534d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kLocalTrackId); 53640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 5374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 53801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 5394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming audio track with a given SSRC into the stats. 5424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingAudioTrackStats() { 5434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org if (stream_ == NULL) 5444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 546d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kRemoteTrackId); 5484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(audio_track_); 5494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 55001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 55101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 55201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 553d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport* AddCandidateReport(StatsCollector* collector, 554d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const cricket::Candidate& candidate, 555d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org bool local) { 5564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return collector->AddCandidateReport(candidate, local); 557950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org } 558950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 55901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org void SetupAndVerifyAudioTrackStats( 56001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org FakeAudioTrack* audio_track, 56101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::MediaStream* stream, 56201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::StatsCollector* stats, 56301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceChannel* voice_channel, 56401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string& vc_name, 56501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel, 56601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo* voice_sender_info, 56701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceReceiverInfo* voice_receiver_info, 56801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo* stats_read, 56901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports* reports) { 57001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // A track can't have both sender report and recv report at the same time 57101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // for now, this might change in the future though. 57201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ASSERT((voice_sender_info == NULL) ^ (voice_receiver_info == NULL)); 57301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 57401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Instruct the session to return stats containing the transport channel. 57501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitSessionStats(vc_name); 576c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 57701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 57801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(true))); 57901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 58001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Constructs an ssrc stats update. 58101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 58201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->senders.push_back(*voice_sender_info); 58301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 58401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->receivers.push_back(*voice_receiver_info); 58501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 58601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly( 58701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(voice_channel)); 58801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 58901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 59001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(*stats_read), Return(true))); 59101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 59201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 59369bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats->ClearUpdateStatsCacheForTest(); 59401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(NULL, reports); 59501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 59601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify the existence of the track report. 59701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* report = FindNthReportByType( 59801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsReportTypeSsrc, 1); 59901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_FALSE(report == NULL); 60001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 60101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameTrackId); 60201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 60301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 60401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameSsrc); 605d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 60601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 60701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verifies the values in the track report. 60801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) { 60901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track, voice_sender_info); 61001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(report, *voice_sender_info); 61101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 61201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) { 61301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(report, *voice_receiver_info); 61401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 61501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 61601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify we get the same result by passing a track to GetStats(). 61701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports track_reports; // returned values. 61801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(audio_track, &track_reports); 61901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* track_report = FindNthReportByType( 62001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 62101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_TRUE(track_report); 62201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 62301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameTrackId); 62401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 62501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 62601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameSsrc); 627d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 62801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 62901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(track_report, *voice_sender_info); 63001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 63101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, *voice_receiver_info); 63240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 63340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 634d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org void TestCertificateReports(const rtc::FakeSSLCertificate& local_cert, 6354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 636d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::FakeSSLCertificate& remote_cert, 6374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 638322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 639487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 64040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 6414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 6457bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org channel_stats.srtp_cipher = "the-srtp-cipher"; 6467bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org channel_stats.ssl_cipher = "the-ssl-cipher"; 6474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 6494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 6504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 6534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 6544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 657d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLIdentity local_identity(local_cert); 658d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<rtc::FakeSSLCertificate> remote_cert_copy( 6594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 6604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 662d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 6634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 6644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 6654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 6664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 6674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 6684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 6694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 6704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 6714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 6724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 6734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 6754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 67606b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 677c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 6784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 6794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 68040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 68140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 6824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 683b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 6844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 6864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 68740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 68840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 6894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 6904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 6924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 69340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 6944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 69540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 696b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 697b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 698d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(IdFromCertIdString(local_certificate_id)); 699d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org CheckCertChainReports(reports, local_ders, id); 700b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 701b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 702b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 7054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 70640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 7074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 70840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 709b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 710b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 711d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(IdFromCertIdString(remote_certificate_id)); 712d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org CheckCertChainReports(reports, remote_ders, id); 713b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 714b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 715b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7167bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 7177bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check negotiated ciphers. 7187bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string dtls_cipher = ExtractStatsValue( 7197bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 7207bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 7217bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameDtlsCipher); 7227bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org EXPECT_EQ("the-ssl-cipher", dtls_cipher); 7237bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string srtp_cipher = ExtractStatsValue( 7247bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 7257bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 7267bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameSrtpCipher); 7277bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org EXPECT_EQ("the-srtp-cipher", srtp_cipher); 7284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 72997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 73028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 731d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 73228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 733487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeMediaStreamSignaling signaling_; 734487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeDataChannelProvider data_channel_provider_; 73597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SessionStats session_stats_; 736d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> stream_; 737d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrack> track_; 738d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> audio_track_; 73928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 74028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 741487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org// Verify that ExtractDataInfo populates reports. 742487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.orgTEST_F(StatsCollectorTest, ExtractDataInfo) { 743487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string label = "hacks"; 744487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const int id = 31337; 745487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string state = DataChannelInterface::DataStateString( 746487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org DataChannelInterface::DataState::kConnecting); 747487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 748487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 749487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 750487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 751487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org InternalDataChannelInit config; 752487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org config.id = id; 753487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org signaling_.AddDataChannel(DataChannel::Create( 754487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org &data_channel_provider_, cricket::DCT_SCTP, label, config)); 755322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 756487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 757487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 758487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 759487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReports reports; 760487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.GetStats(NULL, &reports); 761322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 762322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org const StatsReport* report = 763322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org FindNthReportByType(reports, StatsReport::kStatsReportTypeDataChannel, 1); 764322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 765d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id reportId = StatsReport::NewTypedIntId( 766322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsReport::kStatsReportTypeDataChannel, id); 767322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 768322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_TRUE(reportId->Equals(report->id())); 769322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 770322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(stats.GetTimeNow(), report->timestamp()); 771487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(label, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 772487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 773487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameLabel)); 774487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(rtc::ToString<int64>(id), 775487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 776487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 777487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameDataChannelId)); 778487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(state, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 779487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 780487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameState)); 781487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ("", ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 782487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 783487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameProtocol)); 784487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org} 785487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 78628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 78728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 788322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 789487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 790d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 791d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 792d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 793c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 794d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 795d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 796d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 797d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 798d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 7994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 800d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 8017fb711f68312f61f392b3f33b950e97cb07da71fFredrik Solenberg media_engine_, media_channel, NULL, kVideoChannelName, false); 80240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 80328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 80428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 80528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 80628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 80728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 80828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 81097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 81128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8135bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 81428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 81528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 81628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 81840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 819058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 820058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 821242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org Return(true))); 822b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 82328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 824242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 825242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 82628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 82728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 82828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 83028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 831322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 832487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 833d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 834d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 835d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 836c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 837d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 838d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 839d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 840d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 841d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 8424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 843d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 8447fb711f68312f61f392b3f33b950e97cb07da71fFredrik Solenberg media_engine_, media_channel, NULL, kVideoChannelName, false); 845d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 84640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 84728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 84828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 84928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 85028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 85128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 85228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 85328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 85597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 85628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8585bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 85928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 86028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 86128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 86228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 86328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 86428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 86528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 86628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 86740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 86840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 869058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 870058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true))); 87197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 872b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 87328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 874242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 875242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 87628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 877242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org result = ExtractBweStatsValue(reports, 878242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameTargetEncBitrate); 87928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 88028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 88128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 88228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 88328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 88428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 885322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 886487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 88740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 88840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 88940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 890b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 89128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 89240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 89340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 89428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 89528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 89628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 89728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 89828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 89928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 900322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 901487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 90240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 90340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 90440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 905b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 906b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 90728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 90840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 90940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 91028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 91128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 91240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 91328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 91428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 91528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 91728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 91828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 919322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 920487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 9214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 922d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 9237fb711f68312f61f392b3f33b950e97cb07da71fFredrik Solenberg media_engine_, media_channel, NULL, "video", false); 9244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 92597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 92628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 92728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 92803505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 92928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 93028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 9314fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(StatsReport::kStatsReportTypeTrack, reports[0]->type()); 93228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 93328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 93440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 93528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 93640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 9374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, trackValue); 93828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 93928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 94128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 94228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 943322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 944487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 945d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 946d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 947c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 948d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 949d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 950d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 951d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 952d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 9534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 954d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 9557fb711f68312f61f392b3f33b950e97cb07da71fFredrik Solenberg media_engine_, media_channel, NULL, kVideoChannelName, false); 9564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 95797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 95828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 95928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 96028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 96128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 96228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 96328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 9655bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 96628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 96728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 96828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 97040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 971058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 972058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 97328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 97428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 975b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 97603505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 97728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 97897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 97997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 98097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 98140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 98240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 9834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 98428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get report for the specific |track|. 9865b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 98797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 98897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 98997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 99097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 99128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 99240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 9934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 99428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 99640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 997d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 99828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 100040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 10014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 100228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 100328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 100428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 100528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 100628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 1007322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1008487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1009242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1010242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 101106b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 10124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 101328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 101428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 1015d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 10167fb711f68312f61f392b3f33b950e97cb07da71fFredrik Solenberg media_engine_, media_channel, NULL, kVcName, false); 10174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 101897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 101928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 102028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 102128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 102228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 102328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 102428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 102528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 10265bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 102728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 102828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 102928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 103040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 103140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1032058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1033058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 103428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 103528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 103697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 1037c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 103840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 103940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 104028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1041b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 104203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 104328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 104428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 104540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 104628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 104740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 104828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 10494fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // Transport id component ID will always be 1. 10504fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 10514fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 10524fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 10534fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = transport_id.find('-'); 10544fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10554fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string content = transport_id.substr(index + 1); 10564fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org index = content.rfind('-'); 10574fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10584fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org content = content.substr(0, index); 1059d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(StatsReport::NewComponentId(content, 1)); 10604fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_EQ(transport_id, id->ToString()); 1061d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const StatsReport* transport_report = FindReportById(reports, id); 106228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 106328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 106428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 106697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 106797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 1068322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1069487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 10704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 107197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 107297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1073d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 10747fb711f68312f61f392b3f33b950e97cb07da71fFredrik Solenberg media_engine_, media_channel, NULL, kVcName, false); 10754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 107697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 107797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 107840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 107940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 108097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1081b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 108240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 108397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 108440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 108540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 108697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 108797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 108897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 108997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 109097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 109197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 1092322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1093487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1094242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1095242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 109606b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 10974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 109897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 109997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1100d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 11017fb711f68312f61f392b3f33b950e97cb07da71fFredrik Solenberg media_engine_, media_channel, NULL, kVcName, false); 11024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 110397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 110497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 110597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 110697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 1107c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 110840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 110940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 111097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 111197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 111297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 111397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 111497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 111597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 111697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 111797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 11185bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 111997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 112097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 112197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 112240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 112340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1124058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1125058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 112697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 112797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1128b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 112903505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 113097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 11314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 113240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 113340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 113497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 1135322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(12345.678, remote_report->timestamp()); 113697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 113797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 11384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that the empty track report exists in the returned stats 11394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 11404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, ReportsFromRemoteTrack) { 1141322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1142487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1143d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 1144d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 1145c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 1146d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 1147d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 1148d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 1149d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 1150d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 11514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1152d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 11537fb711f68312f61f392b3f33b950e97cb07da71fFredrik Solenberg media_engine_, media_channel, NULL, kVideoChannelName, false); 11544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingVideoTrackStats(); 11554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 11564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 11584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoReceiverInfo video_receiver_info; 11594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoMediaInfo stats_read; 11601ed6224eafc7816f25d1906e4d709afdf2ad8f0fpbos@webrtc.org const int64 kNumOfPacketsConcealed = 54321; 11614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Construct a stats value to read. 11634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.add_ssrc(1234); 11641ed6224eafc7816f25d1906e4d709afdf2ad8f0fpbos@webrtc.org video_receiver_info.packets_concealed = kNumOfPacketsConcealed; 11654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(video_receiver_info); 11664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 11684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1169058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1170058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 11714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 11724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 117403505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 11754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(NULL, &reports); 11764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |reports| should contain at least one session report, one track report, 11774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // and one ssrc report. 11784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_LE(static_cast<size_t>(3), reports.size()); 11794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 11804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 11814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 11824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 11844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1185d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 11864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 11884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 11894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 11904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 11914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 1192950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// This test verifies the Ice Candidate report should contain the correct 1193950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// information from local/remote candidates. 1194950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgTEST_F(StatsCollectorTest, IceCandidateReport) { 1195322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1196487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1197950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReports reports; // returned values. 1198950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1199950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int local_port = 2000; 1200950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char local_ip[] = "192.168.0.1"; 1201950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int remote_port = 2001; 1202950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char remote_ip[] = "192.168.0.2"; 1203950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1204950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress local_address(local_ip, local_port); 1205950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress remote_address(remote_ip, remote_port); 1206950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::AdapterType network_type = rtc::ADAPTER_TYPE_ETHERNET; 1207950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org uint32 priority = 1000; 1208950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1209950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::Candidate c; 121061c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1211950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::LOCAL_PORT_TYPE); 1212950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1213950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(local_address); 1214950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_priority(priority); 1215950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_network_type(network_type); 1216d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org std::string report_id = AddCandidateReport(&stats, c, true)->id()->ToString(); 121761c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1218950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 121961c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c = cricket::Candidate(); 122061c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1221950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::PRFLX_PORT_TYPE); 122261c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1223950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(remote_address); 122461c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_priority(priority); 122561c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_network_type(network_type); 1226d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org report_id = AddCandidateReport(&stats, c, false)->id()->ToString(); 122761c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1228950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1229950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org stats.GetStats(NULL, &reports); 1230950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1231950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the local candidate report is populated correctly. 1232950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1233950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org local_ip, 1234950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1235950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1236950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1237950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(local_port), 1238950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1239950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1240950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1241950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::UDP_PROTOCOL_NAME, 1242950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1243950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1244950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1245950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(priority), 1246950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1247950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1248950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1249950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::LOCAL_PORT_TYPE), 1250950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1251950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateType)); 1252950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1253950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org AdapterTypeToStatsType(network_type), 1254950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1255950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1256950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1257950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the remote candidate report is populated correctly. 1258950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(remote_ip, 1259950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1260950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1261950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1262950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(remote_port), 1263950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1264950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1265950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1266950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, 1267950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1268950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1269950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1270950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(priority), 1271950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1272950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1273950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1274950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1275950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::PRFLX_PORT_TYPE), 1276950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1277950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, StatsReport::kStatsValueNameCandidateType)); 1278950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(kNotFound, 1279950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1280950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1281950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1282950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} 1283950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 12844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 12854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 128619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 12874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 12884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 12894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 12904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 12914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 12924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 12934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 1294d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DersToPems(local_ders)); 12954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 12964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 12974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 12984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 12994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 13004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 13014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 1302d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 13034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 13054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 13084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 130919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 13104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 13114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 1312d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 13134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 13154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 1316d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 13174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 13194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 13204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 13234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 132419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 1325322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1326487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 132740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 13284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 13304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 13314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 13324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 13344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 13354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 13364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 13384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 13394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 13404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 13424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 134306b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(ReturnNull()); 1344c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 13454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 13464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 134797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 134840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 134940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 13504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1351b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 13534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 13554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 135640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 135840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 13594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 13604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 13624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 136340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 136540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 13664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 13677bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 13687bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check that the negotiated ciphers are absent. 13697bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string dtls_cipher = ExtractStatsValue( 13707bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 13717bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 13727bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameDtlsCipher); 13737bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org ASSERT_EQ(kNotFound, dtls_cipher); 13747bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string srtp_cipher = ExtractStatsValue( 13757bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 13767bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 13777bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameSrtpCipher); 13787bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org ASSERT_EQ(kNotFound, srtp_cipher); 13794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 13824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 138319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 1384322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1385487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 138640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 13874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 13894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 13904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 13914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 13934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 13944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 13954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 13974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 13984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 13994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 1401d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 14024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 14034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 14044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 14054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 14064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 14084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 140906b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 1410c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 14114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 14124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 141340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 141440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 14154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1416b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 14174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 14184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 14204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 142140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 14224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 142340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 14244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 14254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 14274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 142840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 14294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 143040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 14314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 14324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 14334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1434b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 1435b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 1436b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 1437b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 1438b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 1439d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 1440b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1441b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 1442b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 1443d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 1444b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 1445b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1446b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 1447b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 1448b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1449b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 145040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 145140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 145240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 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))); 1458242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org 145940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 146040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 146140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1462d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1463b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 14644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 146540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 146601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 146740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 146840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 14694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 147040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 147140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 147240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 147301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 147401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 147501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 147640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify that there is no remote report for the local audio track because 14784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // we did not set it up. 14794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 14804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 14814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(remote_report == NULL); 14824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 14833e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 14843e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// This test verifies that audio receive streams populate stats reports 14853e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// correctly. 14863e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromRemoteStream) { 1487322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1488487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1489242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1490242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 149106b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 14923e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 14933e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org // The content_name known by the voice channel. 14943e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const std::string kVcName("vcname"); 1495d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1496b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 14974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingAudioTrackStats(); 14983e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.AddStream(stream_); 14993e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15003e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 15014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 15027e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org voice_receiver_info.codec_name = "fake_codec"; 15033e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15043e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceMediaInfo stats_read; 15053e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org StatsReports reports; // returned values. 150601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 150701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 150801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, NULL, &voice_receiver_info, &stats_read, &reports); 15093e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 15103e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 151140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 151240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 151340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 1514322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1515487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1516242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1517242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 151806b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 151940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 152040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 152140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1522d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1523b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 15244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 152540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 152640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 152740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 152840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 152940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 1530c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 153140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 153240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 153340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 153440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 153540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 153740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 153840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 153940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 154040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 154140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 154240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 154340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 154440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 154540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 154640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 154740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 154840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 154940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 155040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 155140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 155240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 155340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 155440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 155540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 155640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 155740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 15584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 155940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 156040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1561d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 156240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 156340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 156440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 156540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 156640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 156740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 156840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that when ongoing and incoming audio tracks are using 15704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// the same ssrc, they populate stats reports correctly. 15714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) { 1572322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1573487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1574242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1575242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 157606b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 15774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 15784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // The content_name known by the voice channel. 15794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string kVcName("vcname"); 1580d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1581b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 15824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 15844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 15854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 15864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 15874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a remote stream with a remote audio track and adds it to the stats. 1589d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> remote_stream( 15904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::MediaStream::Create("remotestreamlabel")); 1591d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> remote_track( 1592d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId)); 15934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 159401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 15954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org remote_stream->AddTrack(remote_track); 15964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(remote_stream); 15974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 15984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Instruct the session to return stats containing the transport channel. 15994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitSessionStats(kVcName); 1600c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 16014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 16024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 16034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 16054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 16064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Some of the contents in |voice_sender_info| needs to be updated from the 16084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |audio_track_|. 16094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 16104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 16124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 16134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 16154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceMediaInfo stats_read; 16164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.senders.push_back(voice_sender_info); 16174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 16184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 16204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 16214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 16224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 16234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 16244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; // returned values. 16264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 16274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the local track. 16294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(audio_track_.get(), &reports); 16304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 16314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 16324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 16334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 16344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 16354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 16364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 16374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the remote track. 16395b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 16404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(remote_track.get(), &reports); 16414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_report = FindNthReportByType(reports, 16424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeSsrc, 1); 16434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 16444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_id = ExtractSsrcStatsValue(reports, 16454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsValueNameTrackId); 16464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 16474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info); 16484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 16494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 165001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// This test verifies that when two outgoing audio tracks are using the same 165101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// ssrc at different times, they populate stats reports correctly. 165201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// TODO(xians): Figure out if it is possible to encapsulate the setup and 165301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// avoid duplication of code in test cases. 165401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.orgTEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) { 1655322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsCollectorForTest stats(&session_); 1656487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1657242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1658242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 1659242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 166001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 166101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // The content_name known by the voice channel. 166201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string kVcName("vcname"); 1663d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1664b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 166501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 166601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 166701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org AddOutgoingAudioTrackStats(); 166801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddStream(stream_); 166901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 167001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 167101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 167201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 167301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 167401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo stats_read; 167501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports reports; // returned values. 167601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 167701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 167801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 167901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 168001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Remove the previous audio track from the stream. 168101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->RemoveTrack(audio_track_.get()); 168201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 168301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 168401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a new audio track and adds it to the stream and stats. 168501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org static const std::string kNewTrackId = "new_track_id"; 1686d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> new_audio_track( 1687d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kNewTrackId)); 168801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 168901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNewTrackId), Return(true))); 169001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->AddTrack(new_audio_track); 169101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 169201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(new_audio_track, kSsrcOfTrack); 169369bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats.ClearUpdateStatsCacheForTest(); 169401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo new_voice_sender_info; 169501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitVoiceSenderInfo(&new_voice_sender_info); 169601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo new_stats_read; 16975b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 169801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 169901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, 170001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); 170101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org} 170201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 1703950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} // namespace webrtc 1704