statscollector_unittest.cc revision d59daf8023286d63a1b6c8af82eedb684181c1eb
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 30cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef#include <algorithm> 31cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/statscollector.h" 3328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 34ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/peerconnection.h" 35ab9b2d1516cad017c6e0236c468934582530c965deadbeef#include "talk/app/webrtc/peerconnectionfactory.h" 3628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastream.h" 3740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h" 38487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org#include "talk/app/webrtc/mediastreamsignaling.h" 3940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreamtrack.h" 40487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org#include "talk/app/webrtc/test/fakedatachannelprovider.h" 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h" 4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/channelmanager.h" 444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 46a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/base64.h" 47a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/fakesslidentity.h" 48a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h" 49950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org#include "webrtc/base/network.h" 50cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef#include "webrtc/p2p/base/faketransportcontroller.h" 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 524fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgusing rtc::scoped_ptr; 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_; 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll; 55b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing testing::Field; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return; 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull; 58ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing testing::ReturnRef; 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee; 60b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing webrtc::PeerConnectionInterface; 6140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReport; 6240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReports; 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 64456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shiehnamespace { 65456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh// This value comes from openssl/tls1.h 666caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shiehconst int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014; 67456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh} // namespace 68456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager; 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 7428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 75950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgnamespace webrtc { 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND"; 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Constant names for track identification. 814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kLocalTrackId[] = "local_track_id"; 824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kRemoteTrackId[] = "remote_track_id"; 830c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmconst uint32_t kSsrcOfTrack = 1234; 8497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession { 8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 8728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org explicit MockWebRtcSession(cricket::ChannelManager* channel_manager) 88ab9b2d1516cad017c6e0236c468934582530c965deadbeef : WebRtcSession(channel_manager, 89ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::Thread::Current(), 90ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::Thread::Current(), 91ab9b2d1516cad017c6e0236c468934582530c965deadbeef nullptr) {} 9240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD0(voice_channel, cricket::VoiceChannel*()); 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD0(video_channel, cricket::VideoChannel*()); 944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Libjingle uses "local" for a outgoing track, and "remote" for a incoming 954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // track. 960c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström MOCK_METHOD2(GetLocalTrackIdBySsrc, bool(uint32_t, std::string*)); 970c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström MOCK_METHOD2(GetRemoteTrackIdBySsrc, bool(uint32_t, std::string*)); 98d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef MOCK_METHOD1(GetTransportStats, bool(SessionStats*)); 99cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef MOCK_METHOD2(GetLocalCertificate, 100cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef bool(const std::string& transport_name, 101cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef rtc::scoped_refptr<rtc::RTCCertificate>* certificate)); 102cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef MOCK_METHOD2(GetRemoteSSLCertificate, 103cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef bool(const std::string& transport_name, 104cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef rtc::SSLCertificate** cert)); 10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 107ab9b2d1516cad017c6e0236c468934582530c965deadbeef// The factory isn't really used; it just satisfies the base PeerConnection. 108ab9b2d1516cad017c6e0236c468934582530c965deadbeefclass FakePeerConnectionFactory 109ab9b2d1516cad017c6e0236c468934582530c965deadbeef : public rtc::RefCountedObject<PeerConnectionFactory> {}; 110ab9b2d1516cad017c6e0236c468934582530c965deadbeef 111ab9b2d1516cad017c6e0236c468934582530c965deadbeefclass MockPeerConnection 112ab9b2d1516cad017c6e0236c468934582530c965deadbeef : public rtc::RefCountedObject<webrtc::PeerConnection> { 113ab9b2d1516cad017c6e0236c468934582530c965deadbeef public: 114ab9b2d1516cad017c6e0236c468934582530c965deadbeef MockPeerConnection() 115ab9b2d1516cad017c6e0236c468934582530c965deadbeef : rtc::RefCountedObject<webrtc::PeerConnection>( 116ab9b2d1516cad017c6e0236c468934582530c965deadbeef new FakePeerConnectionFactory()) {} 117ab9b2d1516cad017c6e0236c468934582530c965deadbeef MOCK_METHOD0(session, WebRtcSession*()); 118ab9b2d1516cad017c6e0236c468934582530c965deadbeef MOCK_CONST_METHOD0(sctp_data_channels, 119ab9b2d1516cad017c6e0236c468934582530c965deadbeef const std::vector<rtc::scoped_refptr<DataChannel>>&()); 120ab9b2d1516cad017c6e0236c468934582530c965deadbeef}; 121ab9b2d1516cad017c6e0236c468934582530c965deadbeef 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel { 12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 124b071a19019a0a2173cc139c960d6ef6946a1c581Fredrik Solenberg MockVideoMediaChannel() : 125b071a19019a0a2173cc139c960d6ef6946a1c581Fredrik Solenberg cricket::FakeVideoMediaChannel(NULL, cricket::VideoOptions()) {} 126058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VideoMediaInfo*)); 12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 12828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass MockVoiceMediaChannel : public cricket::FakeVoiceMediaChannel { 13040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 131b071a19019a0a2173cc139c960d6ef6946a1c581Fredrik Solenberg MockVoiceMediaChannel() : 132b071a19019a0a2173cc139c960d6ef6946a1c581Fredrik Solenberg cricket::FakeVoiceMediaChannel(NULL, cricket::AudioOptions()) {} 13340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VoiceMediaInfo*)); 13440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 13540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 13640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeAudioProcessor : public webrtc::AudioProcessorInterface { 13740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 13840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org FakeAudioProcessor() {} 13940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ~FakeAudioProcessor() {} 14040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 14214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override { 14340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->typing_noise_detected = true; 14440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss = 2; 14540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss_enhancement = 3; 14640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_median_ms = 4; 14740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->aec_quality_min = 5.1f; 14840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_std_ms = 6; 14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 15040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 15140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 1524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgclass FakeAudioTrack 15340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> { 15440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 1554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org explicit FakeAudioTrack(const std::string& id) 15640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id), 157d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org processor_(new rtc::RefCountedObject<FakeAudioProcessor>()) {} 15814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org std::string kind() const override { return "audio"; } 15914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org webrtc::AudioSourceInterface* GetSource() const override { return NULL; } 16014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void AddSink(webrtc::AudioTrackSinkInterface* sink) override {} 16114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {} 16214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org bool GetSignalLevel(int* level) override { 16340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org *level = 1; 16440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return true; 16540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 16614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org rtc::scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor() 16714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org override { 168b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org return processor_; 16940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 17040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 17140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 172d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioProcessor> processor_; 17340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 17440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 17540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 176242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name, 1774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 17892f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org const StatsReport::Value* v = report->FindValue(name); 17992f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org if (!v) 18092f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org return false; 18192f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org *value = v->ToString(); 18292f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org return true; 1834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgstd::string ExtractStatsValue(const StatsReport::StatsType& type, 18640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, 187242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 1884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org for (const auto* r : reports) { 1894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (r->type() == type && GetValue(r, name, &ret)) 1914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 197d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id TypedIdFromIdString(StatsReport::StatsType type, 198d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const std::string& value) { 1994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(value.empty()); 200d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id; 2014fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (value.empty()) 202d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 2034fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 2044fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 2054fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 2064fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 2074fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = value.find('_'); 2084fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_NE(index, std::string::npos); 2094fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (index == std::string::npos || index == (value.length() - 1)) 210d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 2114fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 2124fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org id = StatsReport::NewTypedId(type, value.substr(index + 1)); 2134fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(id->ToString(), value); 214d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 2154fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 2164fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 217d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id IdFromCertIdString(const std::string& cert_id) { 218d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return TypedIdFromIdString(StatsReport::kStatsReportTypeCertificate, cert_id); 2194fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 2204fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 22128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 22228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 22340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType( 2244fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReports& reports, const StatsReport::StatsType& type, int n) { 22528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 2264fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (reports[i]->type() == type) { 22728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 22828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 2295b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org return reports[i]; 23028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 23128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2324fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return nullptr; 23328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 23428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 23540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports, 2364fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& id) { 2378e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto* r : reports) { 238d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org if (r->id()->Equals(id)) 2398e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return r; 24028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2418e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return nullptr; 24228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 24328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports, 245242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 2464fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return ExtractStatsValue(StatsReport::kStatsReportTypeSsrc, reports, name); 24728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 24828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports, 250242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 25128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 25240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeBwe, reports, name); 25328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 25428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 256d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return rtc::SSLIdentity::DerToPem( 257d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::kPemTypeCertificate, 2584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 2594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 2604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 2644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 2654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 2664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 2674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 26940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports, 2704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 2714fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& start_id) { 272d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id cert_id; 2734fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id* certificate_id = &start_id; 2744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 2754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 2764fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport* report = FindReportById(reports, *certificate_id); 2774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 27819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 2804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 28140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameDer, &der_base64)); 2824fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string der = rtc::Base64::Decode(der_base64, rtc::Base64::DO_STRICT); 2834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 28419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 28519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 28619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 28719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 28840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprintAlgorithm, 28919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 29019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 291d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string sha_1_str = rtc::DIGEST_SHA_1; 29219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 29319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string fingerprint; 2954fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameFingerprint, 2964fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &fingerprint)); 2974fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(fingerprint.empty()); 29819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 3004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string issuer_id; 3014fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (!GetValue(report, StatsReport::kStatsValueNameIssuerId, 3024fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &issuer_id)) { 3034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 3044fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org } 3054fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 306d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org cert_id = IdFromCertIdString(issuer_id); 307d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org certificate_id = &cert_id; 3084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 3094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 3104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 3114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid VerifyVoiceReceiverInfoReport( 3134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* report, 3144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const cricket::VoiceReceiverInfo& info) { 3153e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org std::string value_in_report; 3163e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3173e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report)); 318d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.audio_level), value_in_report); 3193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3203e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameBytesReceived, &value_in_report)); 3210c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<int64_t>(info.bytes_rcvd), value_in_report); 3223e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3233e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 324d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_ms), value_in_report); 3253e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3263e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report)); 327d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_ms), value_in_report); 3283e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3293e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePreferredJitterBufferMs, 3303e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org &value_in_report)); 331d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_preferred_ms), 3323e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3333e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3343e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report)); 335d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.delay_estimate_ms), value_in_report); 3363e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3373e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameExpandRate, &value_in_report)); 338d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.expand_rate), value_in_report); 3393e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 340652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org report, StatsReport::kStatsValueNameSpeechExpandRate, &value_in_report)); 341652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.speech_expand_rate), value_in_report); 3428e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAccelerateRate, 3438e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin &value_in_report)); 3448e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_EQ(rtc::ToString<float>(info.accelerate_rate), value_in_report); 3458e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNamePreemptiveExpandRate, 3468e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin &value_in_report)); 3478e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_EQ(rtc::ToString<float>(info.preemptive_expand_rate), value_in_report); 348652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate, 349652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org &value_in_report)); 350652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.secondary_decoded_rate), value_in_report); 351652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue( 3523e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); 353d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report); 3543e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3553e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report)); 356d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_silence_generator), 3573e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3583e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3593e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report)); 360d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_neteq), 3613e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3623e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3633e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report)); 364d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_normal), value_in_report); 3653e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3663e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report)); 367d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc), value_in_report); 3683e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3693e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report)); 370d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_cng), value_in_report); 3713e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3723e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report)); 373d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc_cng), value_in_report); 3747e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org EXPECT_TRUE(GetValue( 3757e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 3763e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 3773e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 3783e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 37940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report, 38040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const cricket::VoiceSenderInfo& sinfo) { 38140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string value_in_report; 38240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 38440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(sinfo.codec_name, value_in_report); 38540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameBytesSent, &value_in_report)); 3870c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<int64_t>(sinfo.bytes_sent), value_in_report); 38840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 390d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_sent), value_in_report); 39140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 392ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org report, StatsReport::kStatsValueNamePacketsLost, &value_in_report)); 393d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_lost), value_in_report); 394ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_TRUE(GetValue( 39540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 396d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 39740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 399d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 40040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 402d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.jitter_ms), value_in_report); 40340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoCancellationQualityMin, 40540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 406d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(sinfo.aec_quality_min), value_in_report); 40740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 409d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_median_ms), 41040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 41140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 41240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report)); 413d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_std_ms), 41440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 41540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 41640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report)); 417d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss), 41840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 41940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 42040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLossEnhancement, 42140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 422d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss_enhancement), 42340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 42440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 42540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); 426d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report); 42740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 42840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); 42940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false"; 43040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(typing_detected, value_in_report); 43140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 43240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 4334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// Helper methods to avoid duplication of code. 4344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceSenderInfo(cricket::VoiceSenderInfo* voice_sender_info) { 4354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->add_ssrc(kSsrcOfTrack); 4364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->codec_name = "fake_codec"; 4374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->bytes_sent = 100; 4384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_sent = 101; 4394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->rtt_ms = 102; 4404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->fraction_lost = 103; 4414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->jitter_ms = 104; 4424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_lost = 105; 4434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->ext_seqnum = 106; 4444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->audio_level = 107; 4454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = 108; 4464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 109; 4474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 110; 4484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 111; 4494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = 112.0f; 4504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = false; 4514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid UpdateVoiceSenderInfoFromAudioTrack( 4544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org FakeAudioTrack* audio_track, cricket::VoiceSenderInfo* voice_sender_info) { 4554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetSignalLevel(&voice_sender_info->audio_level); 4564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; 4574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); 4584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = 4594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.typing_noise_detected; 4604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; 4614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 4624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_return_loss_enhancement; 4634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 4644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_median_ms; 4654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = audio_processor_stats.aec_quality_min; 4664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 4674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_std_ms; 4684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { 4714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->add_ssrc(kSsrcOfTrack); 4724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->bytes_rcvd = 110; 4734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_rcvd = 111; 4744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 112; 4754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->fraction_lost = 113; 4764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 114; 4774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->ext_seqnum = 115; 4784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_ms = 116; 4794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_ms = 117; 4804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_preferred_ms = 118; 4814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->delay_estimate_ms = 119; 4824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->audio_level = 120; 4834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->expand_rate = 121; 484652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->speech_expand_rate = 122; 485652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->secondary_decoded_rate = 123; 4868e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin voice_receiver_info->accelerate_rate = 124; 4878e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin voice_receiver_info->preemptive_expand_rate = 125; 4884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 490322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.orgclass StatsCollectorForTest : public webrtc::StatsCollector { 491322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org public: 492ab9b2d1516cad017c6e0236c468934582530c965deadbeef explicit StatsCollectorForTest(PeerConnection* pc) 493ab9b2d1516cad017c6e0236c468934582530c965deadbeef : StatsCollector(pc), time_now_(19477) {} 494322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 495322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double GetTimeNow() override { 496322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org return time_now_; 497322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org } 498322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 499322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org private: 500322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double time_now_; 501322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org}; 502322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 506ab9b2d1516cad017c6e0236c468934582530c965deadbeef : media_engine_(new cricket::FakeMediaEngine()), 507ab9b2d1516cad017c6e0236c468934582530c965deadbeef channel_manager_( 508ab9b2d1516cad017c6e0236c468934582530c965deadbeef new cricket::ChannelManager(media_engine_, rtc::Thread::Current())), 509ab9b2d1516cad017c6e0236c468934582530c965deadbeef session_(channel_manager_.get()) { 51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 511c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)).WillRepeatedly(Return(false)); 512ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Add default returns for mock classes. 513ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 514ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 515ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_CALL(pc_, session()).WillRepeatedly(Return(&session_)); 516ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_CALL(pc_, sctp_data_channels()) 517ab9b2d1516cad017c6e0236c468934582530c965deadbeef .WillRepeatedly(ReturnRef(data_channels_)); 51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5205b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org ~StatsCollectorTest() {} 5215b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org 52297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 52397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 52497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 525242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org void InitSessionStats(const std::string& vc_name) { 52697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 52797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 52897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 52997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 530cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef transport_stats.transport_name = kTransportName; 53197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 53297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 53397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 53497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 53597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 53697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing video track with a given SSRC into the stats. 5384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingVideoTrackStats() { 53997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kLocalTrackId, NULL); 54197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 5424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 5434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 54497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 54597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming video track with a given SSRC into the stats. 5474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingVideoTrackStats() { 5484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kRemoteTrackId, NULL); 5504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(track_); 5514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 55201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 5534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing audio track with a given SSRC into the stats. 5564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingAudioTrackStats() { 55740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 55840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 55940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 560d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kLocalTrackId); 56240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 5634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 56401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 5654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming audio track with a given SSRC into the stats. 5684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingAudioTrackStats() { 5694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org if (stream_ == NULL) 5704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 572d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kRemoteTrackId); 5744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(audio_track_); 5754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 57601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 57701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 57801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 579ab9b2d1516cad017c6e0236c468934582530c965deadbeef void AddDataChannel(cricket::DataChannelType type, 580ab9b2d1516cad017c6e0236c468934582530c965deadbeef const std::string& label, 581ab9b2d1516cad017c6e0236c468934582530c965deadbeef int id) { 582ab9b2d1516cad017c6e0236c468934582530c965deadbeef InternalDataChannelInit config; 583ab9b2d1516cad017c6e0236c468934582530c965deadbeef config.id = id; 584ab9b2d1516cad017c6e0236c468934582530c965deadbeef 585ab9b2d1516cad017c6e0236c468934582530c965deadbeef data_channels_.push_back(DataChannel::Create( 586ab9b2d1516cad017c6e0236c468934582530c965deadbeef &data_channel_provider_, cricket::DCT_SCTP, label, config)); 587ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 588ab9b2d1516cad017c6e0236c468934582530c965deadbeef 589d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport* AddCandidateReport(StatsCollector* collector, 590d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const cricket::Candidate& candidate, 591d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org bool local) { 5924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return collector->AddCandidateReport(candidate, local); 593950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org } 594950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 59501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org void SetupAndVerifyAudioTrackStats( 59601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org FakeAudioTrack* audio_track, 59701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::MediaStream* stream, 59801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::StatsCollector* stats, 59901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceChannel* voice_channel, 60001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string& vc_name, 60101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel, 60201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo* voice_sender_info, 60301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceReceiverInfo* voice_receiver_info, 60401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo* stats_read, 60501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports* reports) { 60601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // A track can't have both sender report and recv report at the same time 60701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // for now, this might change in the future though. 60801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ASSERT((voice_sender_info == NULL) ^ (voice_receiver_info == NULL)); 60901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 61001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Instruct the session to return stats containing the transport channel. 61101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitSessionStats(vc_name); 612c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 61301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 61401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(true))); 61501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 61601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Constructs an ssrc stats update. 61701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 61801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->senders.push_back(*voice_sender_info); 61901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 62001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->receivers.push_back(*voice_receiver_info); 62101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 62201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly( 62301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(voice_channel)); 62401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 62501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 62601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(*stats_read), Return(true))); 62701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 62801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 62969bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats->ClearUpdateStatsCacheForTest(); 63001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(NULL, reports); 63101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 63201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify the existence of the track report. 63301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* report = FindNthReportByType( 63401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsReportTypeSsrc, 1); 63501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_FALSE(report == NULL); 636be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats->GetTimeNow(), report->timestamp()); 63701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 63801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameTrackId); 63901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 64001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 64101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameSsrc); 6420c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 64301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 64401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verifies the values in the track report. 64501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) { 64601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track, voice_sender_info); 64701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(report, *voice_sender_info); 64801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 64901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) { 65001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(report, *voice_receiver_info); 65101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 65201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 65301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify we get the same result by passing a track to GetStats(). 65401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports track_reports; // returned values. 65501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(audio_track, &track_reports); 65601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* track_report = FindNthReportByType( 65701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 65801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_TRUE(track_report); 659be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats->GetTimeNow(), track_report->timestamp()); 66001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 66101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameTrackId); 66201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 66301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 66401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameSsrc); 6650c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 66601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 66701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(track_report, *voice_sender_info); 66801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 66901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, *voice_receiver_info); 67040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 67140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 672d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org void TestCertificateReports(const rtc::FakeSSLCertificate& local_cert, 6734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 674d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::FakeSSLCertificate& remote_cert, 6754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 676ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 677487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 67840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 6794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 6837bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org channel_stats.srtp_cipher = "the-srtp-cipher"; 684456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh channel_stats.ssl_cipher = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA; 6854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 687cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef transport_stats.transport_name = "audio"; 6884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 690d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef SessionStats session_stats; 691cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef session_stats.transport_stats[transport_stats.transport_name] = 6924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 694cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // Fake certificate to report 695d82819892a382899a82ced756a9922a84ca9ca98Henrik Boström rtc::scoped_refptr<rtc::RTCCertificate> local_certificate( 696d82819892a382899a82ced756a9922a84ca9ca98Henrik Boström rtc::RTCCertificate::Create(rtc::scoped_ptr<rtc::FakeSSLIdentity>( 697cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef new rtc::FakeSSLIdentity(local_cert)) 698cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .Pass())); 6994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 701cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, 702cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef GetLocalCertificate(transport_stats.transport_name, _)) 703cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillOnce(DoAll(SetArgPointee<1>(local_certificate), Return(true))); 704cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, 705cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef GetRemoteSSLCertificate(transport_stats.transport_name, _)) 706cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillOnce( 707cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef DoAll(SetArgPointee<1>(remote_cert.GetReference()), Return(true))); 708c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 7094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 7104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 7114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 712b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 7134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 7154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 71640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 71740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 7184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 7194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 7214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 72240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 7234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 72440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 725b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 726b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 727d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(IdFromCertIdString(local_certificate_id)); 728d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org CheckCertChainReports(reports, local_ders, id); 729b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 730b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 731b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 7344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 73540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 7364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 73740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 738b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 739b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 740d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(IdFromCertIdString(remote_certificate_id)); 741d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org CheckCertChainReports(reports, remote_ders, id); 742b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 743b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 744b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7457bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 7467bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check negotiated ciphers. 7477bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string dtls_cipher = ExtractStatsValue( 7487bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 7497bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 7507bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameDtlsCipher); 751456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh EXPECT_EQ(rtc::SSLStreamAdapter::GetSslCipherSuiteName( 752456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA), 753456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh dtls_cipher); 7547bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string srtp_cipher = ExtractStatsValue( 7557bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 7567bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 7577bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameSrtpCipher); 7587bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org EXPECT_EQ("the-srtp-cipher", srtp_cipher); 7594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 76097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 76128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 762d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 76328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 764ab9b2d1516cad017c6e0236c468934582530c965deadbeef MockPeerConnection pc_; 765487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeDataChannelProvider data_channel_provider_; 766d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef SessionStats session_stats_; 767d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> stream_; 768d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrack> track_; 769d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> audio_track_; 770ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::vector<rtc::scoped_refptr<DataChannel>> data_channels_; 77128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 77228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 773487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org// Verify that ExtractDataInfo populates reports. 774487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.orgTEST_F(StatsCollectorTest, ExtractDataInfo) { 775487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string label = "hacks"; 776487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const int id = 31337; 777487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string state = DataChannelInterface::DataStateString( 778487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org DataChannelInterface::DataState::kConnecting); 779487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 780ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddDataChannel(cricket::DCT_SCTP, label, id); 781ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 782487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 783487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 784487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 785487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReports reports; 786487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.GetStats(NULL, &reports); 787322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 788322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org const StatsReport* report = 789322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org FindNthReportByType(reports, StatsReport::kStatsReportTypeDataChannel, 1); 790322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 791d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id reportId = StatsReport::NewTypedIntId( 792322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsReport::kStatsReportTypeDataChannel, id); 793322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 794322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_TRUE(reportId->Equals(report->id())); 795322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 796322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(stats.GetTimeNow(), report->timestamp()); 797487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(label, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 798487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 799487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameLabel)); 8000c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<int64_t>(id), 8010c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, reports, 802487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameDataChannelId)); 803487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(state, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 804487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 805487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameState)); 806487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ("", ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 807487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 808487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameProtocol)); 809487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org} 810487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 81128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 813ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 814487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 815cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 816cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 817cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 818cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 819cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 820d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 821d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 822d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 823c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 824d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 825d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 826d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 8274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 828d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 8290c0226408dc6f42abc2cd53cab2de02d3ee610d7Fredrik Solenberg media_channel, NULL, kVideoChannelName, false); 83040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 83128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 83228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 83328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 8340c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kBytesSent = 12345678901234LL; 83528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 83628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 83897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 83928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8415bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 84228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 84328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 84428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 84640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 847058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 848058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 849242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org Return(true))); 850b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 85128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 852242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 853242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 85428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 85528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 85628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 85828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 859ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 860487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 861cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 862cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 863cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 864cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 865cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 866d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 867d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 868d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 869c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 870d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 871d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 872d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 8734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 874d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 8750c0226408dc6f42abc2cd53cab2de02d3ee610d7Fredrik Solenberg media_channel, NULL, kVideoChannelName, false); 876d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 87740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 87828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 87928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 88028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 88128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 8820c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kBytesSent = 12345678901234LL; 88328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 88428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 88697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 88728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 88828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8895bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 89028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 89128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 89228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 89328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 89428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 89528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 89628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 89728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 89840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 89940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 900058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 901058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true))); 90297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 903b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 90428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 905242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 906242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 90728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 908242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org result = ExtractBweStatsValue(reports, 909242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameTargetEncBitrate); 91028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 91128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 91228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 91428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 91528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 916ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 917487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 91840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 919b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 92028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 92140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 92240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 92328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 92428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 92528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 92628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 92728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 92828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 929ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 930487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 93140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 932b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 933b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 93428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 93540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 93640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 93728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 93828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 93940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 94028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 94128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 94228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 94428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 94528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 946ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 947487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 9484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 949d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 9500c0226408dc6f42abc2cd53cab2de02d3ee610d7Fredrik Solenberg media_channel, NULL, "video", false); 9514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 95297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 95328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 95428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 95503505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 95628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 95728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 9584fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(StatsReport::kStatsReportTypeTrack, reports[0]->type()); 959be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(0, reports[0]->timestamp()); 96028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 96240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 96328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 96440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 9654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, trackValue); 96628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 96728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 96928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 97028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 971ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 972487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 973cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 974cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 975cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 976cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 977cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 978d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 979d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 980c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 981d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 982d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 983d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 9844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 985d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 9860c0226408dc6f42abc2cd53cab2de02d3ee610d7Fredrik Solenberg media_channel, NULL, kVideoChannelName, false); 9874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 98897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 98928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 99128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 99228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 9930c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kBytesSent = 12345678901234LL; 99428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 9965bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 99728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 99828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 99928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 100040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 100140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1002058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1003058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 100428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 100528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1006b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 100703505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 100828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 100997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 101097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 101197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 101240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 101340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 10144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 101528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get report for the specific |track|. 10175b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 101897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 101997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 102097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 102197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 102228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 102340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 10244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 1025be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp()); 102628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 102728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 102840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 10290c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 103028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 103128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 103240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 10334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 103428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 103528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 103628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 103728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 103828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 1039ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1040487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1041cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1042cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1043cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1044cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1045cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 10464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1047cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the video channel. 104828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 1049d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 10500c0226408dc6f42abc2cd53cab2de02d3ee610d7Fredrik Solenberg media_channel, NULL, kVcName, false); 10514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 105297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 105328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 105428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 105528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 105628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 10570c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kBytesSent = 12345678901234LL; 105828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 105928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 10605bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 106128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 106228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 106328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 106540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1066058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1067058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 106828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 106928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 107097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 1071c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 107240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 107340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 107428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1075b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 107603505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 107728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 107828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 107940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 108028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 108140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 108228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 10834fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // Transport id component ID will always be 1. 10844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 10854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 10864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 10874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = transport_id.find('-'); 10884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string content = transport_id.substr(index + 1); 10904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org index = content.rfind('-'); 10914fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org content = content.substr(0, index); 1093d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(StatsReport::NewComponentId(content, 1)); 10944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_EQ(transport_id, id->ToString()); 1095d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const StatsReport* transport_report = FindReportById(reports, id); 109628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 109728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 109828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 109997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 110097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 110197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 1102ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1103487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 11044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1105cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the video channel. 110697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1107d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 11080c0226408dc6f42abc2cd53cab2de02d3ee610d7Fredrik Solenberg media_channel, NULL, kVcName, false); 11094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 111097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 111197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1112b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 111340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 111497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 111540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 111640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 111797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 111897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 111997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 112097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 112197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 112297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 1123ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1124487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1125cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1126cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1127cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1128cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1129cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 11304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1131cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the video channel. 113297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1133d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 11340c0226408dc6f42abc2cd53cab2de02d3ee610d7Fredrik Solenberg media_channel, NULL, kVcName, false); 11354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 113697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 113797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 113897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 113997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 1140c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 114140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 114240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 114397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 114497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 114597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 114697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 114797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 114897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 114997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 115097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 11515bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 115297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 115397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 115497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 115540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 115640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1157058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1158058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 115997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 116097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1161b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 116203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 116397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 11644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 116540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 116640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 116797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 1168322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(12345.678, remote_report->timestamp()); 116997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 117097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 11714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that the empty track report exists in the returned stats 11724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 11734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, ReportsFromRemoteTrack) { 1174ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1175487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1176cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1177cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1178cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1179cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1180cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 1181d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 1182d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 1183c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 1184d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 1185d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 1186d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 11874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1188d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 11890c0226408dc6f42abc2cd53cab2de02d3ee610d7Fredrik Solenberg media_channel, NULL, kVideoChannelName, false); 11904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingVideoTrackStats(); 11914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 11924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 11944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoReceiverInfo video_receiver_info; 11954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoMediaInfo stats_read; 11960c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kNumOfPacketsConcealed = 54321; 11974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Construct a stats value to read. 11994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.add_ssrc(1234); 12001ed6224eafc7816f25d1906e4d709afdf2ad8f0fpbos@webrtc.org video_receiver_info.packets_concealed = kNumOfPacketsConcealed; 12014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(video_receiver_info); 12024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 12044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1205058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1206058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 12074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 12084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 121003505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 12114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(NULL, &reports); 12124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |reports| should contain at least one session report, one track report, 12134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // and one ssrc report. 12144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_LE(static_cast<size_t>(3), reports.size()); 12154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 12164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 12174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 1218be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp()); 12194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 12214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 12220c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 12234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 12254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 12264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 12274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 12284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 1229950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// This test verifies the Ice Candidate report should contain the correct 1230950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// information from local/remote candidates. 1231950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgTEST_F(StatsCollectorTest, IceCandidateReport) { 1232ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1233487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1234950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReports reports; // returned values. 1235950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1236950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int local_port = 2000; 1237950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char local_ip[] = "192.168.0.1"; 1238950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int remote_port = 2001; 1239950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char remote_ip[] = "192.168.0.2"; 1240950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1241950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress local_address(local_ip, local_port); 1242950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress remote_address(remote_ip, remote_port); 1243950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::AdapterType network_type = rtc::ADAPTER_TYPE_ETHERNET; 12440c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t priority = 1000; 1245950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1246950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::Candidate c; 124761c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1248950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::LOCAL_PORT_TYPE); 1249950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1250950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(local_address); 1251950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_priority(priority); 1252950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_network_type(network_type); 1253d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org std::string report_id = AddCandidateReport(&stats, c, true)->id()->ToString(); 125461c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1255950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 125661c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c = cricket::Candidate(); 125761c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1258950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::PRFLX_PORT_TYPE); 125961c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1260950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(remote_address); 126161c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_priority(priority); 126261c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_network_type(network_type); 1263d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org report_id = AddCandidateReport(&stats, c, false)->id()->ToString(); 126461c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1265950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1266950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org stats.GetStats(NULL, &reports); 1267950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1268950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the local candidate report is populated correctly. 1269950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1270950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org local_ip, 1271950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1272950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1273950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1274950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(local_port), 1275950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1276950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1277950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1278950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::UDP_PROTOCOL_NAME, 1279950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1280950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1281950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1282950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(priority), 1283950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1284950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1285950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1286950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::LOCAL_PORT_TYPE), 1287950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1288950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateType)); 1289950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1290950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org AdapterTypeToStatsType(network_type), 1291950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1292950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1293950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1294950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the remote candidate report is populated correctly. 1295950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(remote_ip, 1296950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1297950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1298950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1299950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(remote_port), 1300950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1301950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1302950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1303950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, 1304950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1305950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1306950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1307950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(priority), 1308950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1309950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1310950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1311950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1312950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::PRFLX_PORT_TYPE), 1313950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1314950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, StatsReport::kStatsValueNameCandidateType)); 1315950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(kNotFound, 1316950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1317950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1318950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1319950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} 1320950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 13214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 13224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 132319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 13244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 13254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 13264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 13274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 13284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 13294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 13304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 1331d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DersToPems(local_ders)); 13324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 13344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 13354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 13364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 13374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 13384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 1339d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 13404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 13424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 13454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 134619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 13474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 13484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 1349d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 13504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 13524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 1353d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 13544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 13564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 13574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 13604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 136119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 1362ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1363487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1364cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1365cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1366cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1367cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1368cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 136940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 13704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 13724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 13734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 13744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 1376cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef transport_stats.transport_name = "audio"; 13774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 13784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1379d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef SessionStats session_stats; 1380cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef session_stats.transport_stats[transport_stats.transport_name] = 13814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 13824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 1384c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 13854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 13864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 138797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1388b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 13904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 13924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 139340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 139540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 13964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 13974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 13994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 140040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 14014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 140240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 14034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 14047bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 14057bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check that the negotiated ciphers are absent. 14067bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string dtls_cipher = ExtractStatsValue( 14077bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 14087bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 14097bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameDtlsCipher); 14107bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org ASSERT_EQ(kNotFound, dtls_cipher); 14117bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org std::string srtp_cipher = ExtractStatsValue( 14127bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsReportTypeComponent, 14137bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org reports, 14147bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org StatsReport::kStatsValueNameSrtpCipher); 14157bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org ASSERT_EQ(kNotFound, srtp_cipher); 14164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 14174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 14194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 142019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 1421ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1422487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1423cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1424cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1425cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1426cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1427cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 142840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 14294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 14314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 14324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 14334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 1435cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef transport_stats.transport_name = "audio"; 14364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 14374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1438d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef SessionStats session_stats; 1439cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef session_stats.transport_stats[transport_stats.transport_name] = 14404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 14414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 1443d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 1444cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef new cricket::FakeTransport(transport_stats.transport_name)); 14454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 1447c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 14484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 14494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 1450b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 14514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 14524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 14544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 145540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 14564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 145740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 14584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 14594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 14614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 146240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 14634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 146440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 14654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 14664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 14674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1468b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 1469b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 1470b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 1471b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 1472b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 1473d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 1474b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1475b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 1476b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 1477d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 1478b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 1479b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1480b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 1481b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 1482b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1483b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 148440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 148540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 148640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 1487ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1488487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1489cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1490cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1491cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1492cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1493242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org 149440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1495cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 149640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1497d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1498b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 14994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 150040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 150101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 150240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 150340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 150540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 150640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 150740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 150801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 150901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 151001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 151140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify that there is no remote report for the local audio track because 15134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // we did not set it up. 15144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 15154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 15164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(remote_report == NULL); 15174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 15183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// This test verifies that audio receive streams populate stats reports 15203e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// correctly. 15213e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromRemoteStream) { 1522ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1523487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1524cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1525cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1526cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1527cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1528cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 15293e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1530cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 15313e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const std::string kVcName("vcname"); 1532d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1533b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 15344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingAudioTrackStats(); 15353e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.AddStream(stream_); 15363e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15373e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 15384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 15397e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org voice_receiver_info.codec_name = "fake_codec"; 15403e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15413e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceMediaInfo stats_read; 15423e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org StatsReports reports; // returned values. 154301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 154401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 154501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, NULL, &voice_receiver_info, &stats_read, &reports); 15463e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 15473e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 154840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 154940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 155040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 1551ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1552487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1553cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1554cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1555cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1556cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1557cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 155840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1559cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 156040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1561d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1562b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 15634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 156440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 156540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 156640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 156740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 156840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 1569c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 157040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 157140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 157240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 157340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 157440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 157640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 157740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 157840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 157940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 158040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 158140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 158240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 158340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 158440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 158540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 158640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 158740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 158840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 158940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 159040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 159140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 159240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 159340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 159440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 1595be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), report->timestamp()); 159640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 159740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 15984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 159940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 160040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 16010c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 160240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 160340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 160440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 160540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 160640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 160740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 160840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 16094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that when ongoing and incoming audio tracks are using 16104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// the same ssrc, they populate stats reports correctly. 16114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) { 1612ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1613487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1614cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1615cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1616cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1617cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1618cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 16194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1620cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 16214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string kVcName("vcname"); 1622d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1623b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 16244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 16264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 16274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 16284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 16294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a remote stream with a remote audio track and adds it to the stats. 1631d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> remote_stream( 16324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::MediaStream::Create("remotestreamlabel")); 1633d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> remote_track( 1634d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId)); 16354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 163601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 16374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org remote_stream->AddTrack(remote_track); 16384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(remote_stream); 16394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Instruct the session to return stats containing the transport channel. 16414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitSessionStats(kVcName); 1642c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 16434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 16444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 16454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 16474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 16484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Some of the contents in |voice_sender_info| needs to be updated from the 16504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |audio_track_|. 16514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 16524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 16544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 16554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 16574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceMediaInfo stats_read; 16584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.senders.push_back(voice_sender_info); 16594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 16604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 16624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 16634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 16644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 16654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 16664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; // returned values. 16684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 16694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the local track. 16714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(audio_track_.get(), &reports); 16724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 16734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 16744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 1675be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp()); 16764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 16774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 16784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 16794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 16804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the remote track. 16825b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 16834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(remote_track.get(), &reports); 16844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_report = FindNthReportByType(reports, 16854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeSsrc, 1); 16864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 1687be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp()); 16884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_id = ExtractSsrcStatsValue(reports, 16894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsValueNameTrackId); 16904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 16914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info); 16924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 16934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 169401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// This test verifies that when two outgoing audio tracks are using the same 169501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// ssrc at different times, they populate stats reports correctly. 169601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// TODO(xians): Figure out if it is possible to encapsulate the setup and 169701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// avoid duplication of code in test cases. 169801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.orgTEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) { 1699ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1700487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1701cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1702cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1703cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1704cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1705cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 170601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1707cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 170801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string kVcName("vcname"); 1709d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 1710b01c707209eff893223ed7af1e5fdb75b34a22a4pthatcher@webrtc.org media_engine_, media_channel, NULL, kVcName, false); 171101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 171201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 171301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org AddOutgoingAudioTrackStats(); 171401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddStream(stream_); 171501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 171601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 171701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 171801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 171901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 172001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo stats_read; 172101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports reports; // returned values. 172201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 172301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 172401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 172501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 172601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Remove the previous audio track from the stream. 172701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->RemoveTrack(audio_track_.get()); 172801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 172901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 173001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a new audio track and adds it to the stream and stats. 173101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org static const std::string kNewTrackId = "new_track_id"; 1732d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> new_audio_track( 1733d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kNewTrackId)); 173401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 173501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNewTrackId), Return(true))); 173601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->AddTrack(new_audio_track); 173701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 173801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(new_audio_track, kSsrcOfTrack); 173969bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats.ClearUpdateStatsCacheForTest(); 174001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo new_voice_sender_info; 174101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitVoiceSenderInfo(&new_voice_sender_info); 174201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo new_stats_read; 17435b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 174401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 174501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, 174601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); 174701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org} 174801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 1749950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} // namespace webrtc 1750