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" 3840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreamtrack.h" 39487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org#include "talk/app/webrtc/test/fakedatachannelprovider.h" 4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h" 4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/channelmanager.h" 434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 45a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/base64.h" 46a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/fakesslidentity.h" 47a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h" 48950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org#include "webrtc/base/network.h" 49cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef#include "webrtc/p2p/base/faketransportcontroller.h" 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 514fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgusing rtc::scoped_ptr; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_; 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll; 54b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing testing::Field; 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull; 57ab9b2d1516cad017c6e0236c468934582530c965deadbeefusing testing::ReturnRef; 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee; 59b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing webrtc::PeerConnectionInterface; 6040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReport; 6140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReports; 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 63456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shiehnamespace { 64456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh// This value comes from openssl/tls1.h 656caafbe5b6b777b309a6eb90a02cf54d5106fb9bGuo-wei Shiehconst int TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = 0xC014; 66456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh} // namespace 67456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager; 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 74950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgnamespace webrtc { 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND"; 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Constant names for track identification. 804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kLocalTrackId[] = "local_track_id"; 814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kRemoteTrackId[] = "remote_track_id"; 820c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boströmconst uint32_t kSsrcOfTrack = 1234; 8397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession { 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 86c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan explicit MockWebRtcSession(webrtc::MediaControllerInterface* media_controller) 87c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan : WebRtcSession(media_controller, 88ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::Thread::Current(), 89ab9b2d1516cad017c6e0236c468934582530c965deadbeef rtc::Thread::Current(), 90ab9b2d1516cad017c6e0236c468934582530c965deadbeef nullptr) {} 9140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD0(voice_channel, cricket::VoiceChannel*()); 9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD0(video_channel, cricket::VideoChannel*()); 934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Libjingle uses "local" for a outgoing track, and "remote" for a incoming 944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // track. 950c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström MOCK_METHOD2(GetLocalTrackIdBySsrc, bool(uint32_t, std::string*)); 960c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström MOCK_METHOD2(GetRemoteTrackIdBySsrc, bool(uint32_t, std::string*)); 97d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef MOCK_METHOD1(GetTransportStats, bool(SessionStats*)); 98cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef MOCK_METHOD2(GetLocalCertificate, 99cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef bool(const std::string& transport_name, 100cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef rtc::scoped_refptr<rtc::RTCCertificate>* certificate)); 101cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef MOCK_METHOD2(GetRemoteSSLCertificate, 102cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef bool(const std::string& transport_name, 103cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef rtc::SSLCertificate** cert)); 10428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106ab9b2d1516cad017c6e0236c468934582530c965deadbeef// The factory isn't really used; it just satisfies the base PeerConnection. 107ab9b2d1516cad017c6e0236c468934582530c965deadbeefclass FakePeerConnectionFactory 108ab9b2d1516cad017c6e0236c468934582530c965deadbeef : public rtc::RefCountedObject<PeerConnectionFactory> {}; 109ab9b2d1516cad017c6e0236c468934582530c965deadbeef 110ab9b2d1516cad017c6e0236c468934582530c965deadbeefclass MockPeerConnection 111ab9b2d1516cad017c6e0236c468934582530c965deadbeef : public rtc::RefCountedObject<webrtc::PeerConnection> { 112ab9b2d1516cad017c6e0236c468934582530c965deadbeef public: 113ab9b2d1516cad017c6e0236c468934582530c965deadbeef MockPeerConnection() 114ab9b2d1516cad017c6e0236c468934582530c965deadbeef : rtc::RefCountedObject<webrtc::PeerConnection>( 115ab9b2d1516cad017c6e0236c468934582530c965deadbeef new FakePeerConnectionFactory()) {} 116ab9b2d1516cad017c6e0236c468934582530c965deadbeef MOCK_METHOD0(session, WebRtcSession*()); 117ab9b2d1516cad017c6e0236c468934582530c965deadbeef MOCK_CONST_METHOD0(sctp_data_channels, 118ab9b2d1516cad017c6e0236c468934582530c965deadbeef const std::vector<rtc::scoped_refptr<DataChannel>>&()); 119ab9b2d1516cad017c6e0236c468934582530c965deadbeef}; 120ab9b2d1516cad017c6e0236c468934582530c965deadbeef 12128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel { 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 123b071a19019a0a2173cc139c960d6ef6946a1c581Fredrik Solenberg MockVideoMediaChannel() : 124b071a19019a0a2173cc139c960d6ef6946a1c581Fredrik Solenberg cricket::FakeVideoMediaChannel(NULL, cricket::VideoOptions()) {} 125058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VideoMediaInfo*)); 12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 12840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass MockVoiceMediaChannel : public cricket::FakeVoiceMediaChannel { 12940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 130b071a19019a0a2173cc139c960d6ef6946a1c581Fredrik Solenberg MockVoiceMediaChannel() : 131b071a19019a0a2173cc139c960d6ef6946a1c581Fredrik Solenberg cricket::FakeVoiceMediaChannel(NULL, cricket::AudioOptions()) {} 13240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VoiceMediaInfo*)); 13340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 13440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 13540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeAudioProcessor : public webrtc::AudioProcessorInterface { 13640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 13740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org FakeAudioProcessor() {} 13840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ~FakeAudioProcessor() {} 13940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 14114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void GetStats(AudioProcessorInterface::AudioProcessorStats* stats) override { 14240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->typing_noise_detected = true; 14340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss = 2; 14440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss_enhancement = 3; 14540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_median_ms = 4; 14640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->aec_quality_min = 5.1f; 14740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_std_ms = 6; 14840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 15040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 1514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgclass FakeAudioTrack 15240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> { 15340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 1544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org explicit FakeAudioTrack(const std::string& id) 15540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id), 156d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org processor_(new rtc::RefCountedObject<FakeAudioProcessor>()) {} 15714665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org std::string kind() const override { return "audio"; } 15814665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org webrtc::AudioSourceInterface* GetSource() const override { return NULL; } 15914665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void AddSink(webrtc::AudioTrackSinkInterface* sink) override {} 16014665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org void RemoveSink(webrtc::AudioTrackSinkInterface* sink) override {} 16114665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org bool GetSignalLevel(int* level) override { 16240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org *level = 1; 16340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return true; 16440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 16514665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org rtc::scoped_refptr<webrtc::AudioProcessorInterface> GetAudioProcessor() 16614665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org override { 167b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org return processor_; 16840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 16940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 17040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 171d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioProcessor> processor_; 17240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 17340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 17440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 175242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name, 1764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 17792f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org const StatsReport::Value* v = report->FindValue(name); 17892f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org if (!v) 17992f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org return false; 18092f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org *value = v->ToString(); 18192f4018d80ec8b092b7c1a35528e57e926f75111tommi@webrtc.org return true; 1824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.orgstd::string ExtractStatsValue(const StatsReport::StatsType& type, 18540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, 186242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 1874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org for (const auto* r : reports) { 1884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (r->type() == type && GetValue(r, name, &ret)) 1904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 19128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 196d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id TypedIdFromIdString(StatsReport::StatsType type, 197d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const std::string& value) { 1984fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(value.empty()); 199d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id; 2004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (value.empty()) 201d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 2024fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 2034fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 2044fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 2054fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 2064fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = value.find('_'); 2074fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_NE(index, std::string::npos); 2084fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (index == std::string::npos || index == (value.length() - 1)) 209d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 2104fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 2114fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org id = StatsReport::NewTypedId(type, value.substr(index + 1)); 2124fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(id->ToString(), value); 213d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return id; 2144fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 2154fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 216d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.orgStatsReport::Id IdFromCertIdString(const std::string& cert_id) { 217d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org return TypedIdFromIdString(StatsReport::kStatsReportTypeCertificate, cert_id); 2184fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org} 2194fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 22028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 22128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 22240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType( 2234fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReports& reports, const StatsReport::StatsType& type, int n) { 22428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 2254fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (reports[i]->type() == type) { 22628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 22728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 2285b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org return reports[i]; 22928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 23028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2314fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return nullptr; 23228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 23328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 23440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports, 2354fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& id) { 2368e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org for (const auto* r : reports) { 237d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org if (r->id()->Equals(id)) 2388e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return r; 23928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 2408e327c45d0940fd5bc46c3fe8d24363be07706actommi@webrtc.org return nullptr; 24128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 24228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports, 244242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 2454fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return ExtractStatsValue(StatsReport::kStatsReportTypeSsrc, reports, name); 24628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 24728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 24840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports, 249242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 25028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 25140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeBwe, reports, name); 25228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 25328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 255d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return rtc::SSLIdentity::DerToPem( 256d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::kPemTypeCertificate, 2574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 2584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 2594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 2624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 2644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 2654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 2664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 26840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports, 2694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 2704fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id& start_id) { 271d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id cert_id; 2724fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport::Id* certificate_id = &start_id; 2734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 2744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 2754fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org const StatsReport* report = FindReportById(reports, *certificate_id); 2764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 27719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 2794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 28040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameDer, &der_base64)); 2814fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string der = rtc::Base64::Decode(der_base64, rtc::Base64::DO_STRICT); 2824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 28319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 28419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 28519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 28619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 28740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprintAlgorithm, 28819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 28919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 290d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string sha_1_str = rtc::DIGEST_SHA_1; 29119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 29219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2934fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string fingerprint; 2944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameFingerprint, 2954fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &fingerprint)); 2964fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_FALSE(fingerprint.empty()); 29719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 2994fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string issuer_id; 3004fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org if (!GetValue(report, StatsReport::kStatsValueNameIssuerId, 3014fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org &issuer_id)) { 3024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 3034fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org } 3044fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org 305d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org cert_id = IdFromCertIdString(issuer_id); 306d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org certificate_id = &cert_id; 3074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 3084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 3094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 3104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid VerifyVoiceReceiverInfoReport( 3124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* report, 3134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const cricket::VoiceReceiverInfo& info) { 3143e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org std::string value_in_report; 3153e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3163e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report)); 317d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.audio_level), value_in_report); 3183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameBytesReceived, &value_in_report)); 3200c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<int64_t>(info.bytes_rcvd), value_in_report); 3213e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3223e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 323d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_ms), value_in_report); 3243e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3253e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report)); 326d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_ms), value_in_report); 3273e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3283e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePreferredJitterBufferMs, 3293e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org &value_in_report)); 330d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_preferred_ms), 3313e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3323e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3333e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report)); 334d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.delay_estimate_ms), value_in_report); 3353e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3363e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameExpandRate, &value_in_report)); 337d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.expand_rate), value_in_report); 3383e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 339652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org report, StatsReport::kStatsValueNameSpeechExpandRate, &value_in_report)); 340652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.speech_expand_rate), value_in_report); 3418e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameAccelerateRate, 3428e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin &value_in_report)); 3438e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_EQ(rtc::ToString<float>(info.accelerate_rate), value_in_report); 3448e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNamePreemptiveExpandRate, 3458e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin &value_in_report)); 3468e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin EXPECT_EQ(rtc::ToString<float>(info.preemptive_expand_rate), value_in_report); 347652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue(report, StatsReport::kStatsValueNameSecondaryDecodedRate, 348652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org &value_in_report)); 349652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.secondary_decoded_rate), value_in_report); 350652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org EXPECT_TRUE(GetValue( 3513e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); 352d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report); 3533e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3543e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report)); 355d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_silence_generator), 3563e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3573e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3583e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report)); 359d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_neteq), 3603e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3613e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3623e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report)); 363d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_normal), value_in_report); 3643e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3653e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report)); 366d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc), value_in_report); 3673e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3683e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report)); 369d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_cng), value_in_report); 3703e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3713e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report)); 372d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc_cng), value_in_report); 3737e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org EXPECT_TRUE(GetValue( 3747e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 3753e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 3763e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 3773e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 37840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report, 37940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const cricket::VoiceSenderInfo& sinfo) { 38040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string value_in_report; 38140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 38340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(sinfo.codec_name, value_in_report); 38440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameBytesSent, &value_in_report)); 3860c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<int64_t>(sinfo.bytes_sent), value_in_report); 38740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 38840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 389d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_sent), value_in_report); 39040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 391ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org report, StatsReport::kStatsValueNamePacketsLost, &value_in_report)); 392d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_lost), value_in_report); 393ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_TRUE(GetValue( 39440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 395d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 39640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 39740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 398d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 39940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 401d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.jitter_ms), value_in_report); 40240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoCancellationQualityMin, 40440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 405d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(sinfo.aec_quality_min), value_in_report); 40640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 40740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 408d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_median_ms), 40940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 41040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 41140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report)); 412d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_std_ms), 41340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 41440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 41540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report)); 416d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss), 41740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 41840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 41940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLossEnhancement, 42040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 421d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss_enhancement), 42240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 42340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 42440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); 425d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report); 42640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 42740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); 42840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false"; 42940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(typing_detected, value_in_report); 43040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 43140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 4324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// Helper methods to avoid duplication of code. 4334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceSenderInfo(cricket::VoiceSenderInfo* voice_sender_info) { 4344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->add_ssrc(kSsrcOfTrack); 4354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->codec_name = "fake_codec"; 4364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->bytes_sent = 100; 4374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_sent = 101; 4384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->rtt_ms = 102; 4394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->fraction_lost = 103; 4404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->jitter_ms = 104; 4414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_lost = 105; 4424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->ext_seqnum = 106; 4434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->audio_level = 107; 4444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = 108; 4454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 109; 4464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 110; 4474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 111; 4484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = 112.0f; 4494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = false; 4504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid UpdateVoiceSenderInfoFromAudioTrack( 4534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org FakeAudioTrack* audio_track, cricket::VoiceSenderInfo* voice_sender_info) { 4544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetSignalLevel(&voice_sender_info->audio_level); 4554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; 4564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); 4574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = 4584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.typing_noise_detected; 4594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; 4604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 4614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_return_loss_enhancement; 4624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 4634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_median_ms; 4644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = audio_processor_stats.aec_quality_min; 4654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 4664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_std_ms; 4674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { 4704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->add_ssrc(kSsrcOfTrack); 4714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->bytes_rcvd = 110; 4724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_rcvd = 111; 4734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 112; 4744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->fraction_lost = 113; 4754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 114; 4764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->ext_seqnum = 115; 4774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_ms = 116; 4784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_ms = 117; 4794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_preferred_ms = 118; 4804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->delay_estimate_ms = 119; 4814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->audio_level = 120; 4824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->expand_rate = 121; 483652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->speech_expand_rate = 122; 484652bc37a07f5ab2559fd217c22be391b45af5b53minyue@webrtc.org voice_receiver_info->secondary_decoded_rate = 123; 4858e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin voice_receiver_info->accelerate_rate = 124; 4868e6fd46cc324f8946e68396edcb252ffaf2d4579Henrik Lundin voice_receiver_info->preemptive_expand_rate = 125; 4874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 489322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.orgclass StatsCollectorForTest : public webrtc::StatsCollector { 490322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org public: 491ab9b2d1516cad017c6e0236c468934582530c965deadbeef explicit StatsCollectorForTest(PeerConnection* pc) 492ab9b2d1516cad017c6e0236c468934582530c965deadbeef : StatsCollector(pc), time_now_(19477) {} 493322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 494322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double GetTimeNow() override { 495322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org return time_now_; 496322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org } 497322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 498322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org private: 499322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org double time_now_; 500322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org}; 501322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 50228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 505ab9b2d1516cad017c6e0236c468934582530c965deadbeef : media_engine_(new cricket::FakeMediaEngine()), 506ab9b2d1516cad017c6e0236c468934582530c965deadbeef channel_manager_( 507ab9b2d1516cad017c6e0236c468934582530c965deadbeef new cricket::ChannelManager(media_engine_, rtc::Thread::Current())), 508c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan media_controller_( 509c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan webrtc::MediaControllerInterface::Create(rtc::Thread::Current(), 510c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan channel_manager_.get())), 511c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan session_(media_controller_.get()) { 51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 513c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)).WillRepeatedly(Return(false)); 514ab9b2d1516cad017c6e0236c468934582530c965deadbeef // Add default returns for mock classes. 515ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 516ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 517ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_CALL(pc_, session()).WillRepeatedly(Return(&session_)); 518ab9b2d1516cad017c6e0236c468934582530c965deadbeef EXPECT_CALL(pc_, sctp_data_channels()) 519ab9b2d1516cad017c6e0236c468934582530c965deadbeef .WillRepeatedly(ReturnRef(data_channels_)); 52028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 52128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5225b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org ~StatsCollectorTest() {} 5235b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org 52497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 52597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 52697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 527242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org void InitSessionStats(const std::string& vc_name) { 52897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 52997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 53097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 53197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 532cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef transport_stats.transport_name = kTransportName; 53397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 53497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 53597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 53697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 53797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 53897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing video track with a given SSRC into the stats. 5404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingVideoTrackStats() { 54197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kLocalTrackId, NULL); 54397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 5444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 5454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 54697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 54797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 5484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming video track with a given SSRC into the stats. 5494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingVideoTrackStats() { 5504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kRemoteTrackId, NULL); 5524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(track_); 5534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 55401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 5554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing audio track with a given SSRC into the stats. 5584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingAudioTrackStats() { 55940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 56040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 56140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 562d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kLocalTrackId); 56440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 5654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 56601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 5674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 5684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming audio track with a given SSRC into the stats. 5704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingAudioTrackStats() { 5714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org if (stream_ == NULL) 5724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 574d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 5754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kRemoteTrackId); 5764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(audio_track_); 5774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 57801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 57901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 58001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 581ab9b2d1516cad017c6e0236c468934582530c965deadbeef void AddDataChannel(cricket::DataChannelType type, 582ab9b2d1516cad017c6e0236c468934582530c965deadbeef const std::string& label, 583ab9b2d1516cad017c6e0236c468934582530c965deadbeef int id) { 584ab9b2d1516cad017c6e0236c468934582530c965deadbeef InternalDataChannelInit config; 585ab9b2d1516cad017c6e0236c468934582530c965deadbeef config.id = id; 586ab9b2d1516cad017c6e0236c468934582530c965deadbeef 587ab9b2d1516cad017c6e0236c468934582530c965deadbeef data_channels_.push_back(DataChannel::Create( 588ab9b2d1516cad017c6e0236c468934582530c965deadbeef &data_channel_provider_, cricket::DCT_SCTP, label, config)); 589ab9b2d1516cad017c6e0236c468934582530c965deadbeef } 590ab9b2d1516cad017c6e0236c468934582530c965deadbeef 591d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport* AddCandidateReport(StatsCollector* collector, 592d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const cricket::Candidate& candidate, 593d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org bool local) { 5944fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org return collector->AddCandidateReport(candidate, local); 595950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org } 596950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 59701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org void SetupAndVerifyAudioTrackStats( 59801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org FakeAudioTrack* audio_track, 59901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::MediaStream* stream, 60001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::StatsCollector* stats, 60101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceChannel* voice_channel, 60201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string& vc_name, 60301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel, 60401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo* voice_sender_info, 60501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceReceiverInfo* voice_receiver_info, 60601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo* stats_read, 60701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports* reports) { 60801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // A track can't have both sender report and recv report at the same time 60901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // for now, this might change in the future though. 61001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ASSERT((voice_sender_info == NULL) ^ (voice_receiver_info == NULL)); 61101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 61201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Instruct the session to return stats containing the transport channel. 61301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitSessionStats(vc_name); 614c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 61501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 61601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(true))); 61701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 61801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Constructs an ssrc stats update. 61901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 62001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->senders.push_back(*voice_sender_info); 62101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 62201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->receivers.push_back(*voice_receiver_info); 62301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 62401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly( 62501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(voice_channel)); 62601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 62701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 62801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(*stats_read), Return(true))); 62901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 63001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 63169bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats->ClearUpdateStatsCacheForTest(); 63201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(NULL, reports); 63301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 63401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify the existence of the track report. 63501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* report = FindNthReportByType( 63601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsReportTypeSsrc, 1); 63701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_FALSE(report == NULL); 638be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats->GetTimeNow(), report->timestamp()); 63901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 64001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameTrackId); 64101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 64201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 64301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameSsrc); 6440c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 64501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 64601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verifies the values in the track report. 64701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) { 64801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track, voice_sender_info); 64901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(report, *voice_sender_info); 65001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 65101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) { 65201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(report, *voice_receiver_info); 65301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 65401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 65501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify we get the same result by passing a track to GetStats(). 65601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports track_reports; // returned values. 65701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(audio_track, &track_reports); 65801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* track_report = FindNthReportByType( 65901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 66001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_TRUE(track_report); 661be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats->GetTimeNow(), track_report->timestamp()); 66201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 66301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameTrackId); 66401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 66501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 66601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameSsrc); 6670c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 66801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 66901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(track_report, *voice_sender_info); 67001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 67101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, *voice_receiver_info); 67240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 67340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 674d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org void TestCertificateReports(const rtc::FakeSSLCertificate& local_cert, 6754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 676d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::FakeSSLCertificate& remote_cert, 6774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 678ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 679487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 68040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 6814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 685521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh channel_stats.srtp_crypto_suite = rtc::SRTP_AES128_CM_SHA1_80; 686521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh channel_stats.ssl_cipher_suite = TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA; 6874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 689cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef transport_stats.transport_name = "audio"; 6904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 692d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef SessionStats session_stats; 693cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef session_stats.transport_stats[transport_stats.transport_name] = 6944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 696cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // Fake certificate to report 697d82819892a382899a82ced756a9922a84ca9ca98Henrik Boström rtc::scoped_refptr<rtc::RTCCertificate> local_certificate( 698d82819892a382899a82ced756a9922a84ca9ca98Henrik Boström rtc::RTCCertificate::Create(rtc::scoped_ptr<rtc::FakeSSLIdentity>( 6990eb15ed7b806125774bd13fb214aeb403e2c6857kwiberg new rtc::FakeSSLIdentity(local_cert)))); 7004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 702cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, 703cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef GetLocalCertificate(transport_stats.transport_name, _)) 704cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillOnce(DoAll(SetArgPointee<1>(local_certificate), Return(true))); 705cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, 706cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef GetRemoteSSLCertificate(transport_stats.transport_name, _)) 707cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillOnce( 708cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef DoAll(SetArgPointee<1>(remote_cert.GetReference()), Return(true))); 709c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 7104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 7114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 7124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 713b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 7144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 7164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 71740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 71840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 7194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 7204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 7224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 72340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 7244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 72540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 726b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 727b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 728d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(IdFromCertIdString(local_certificate_id)); 729d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org CheckCertChainReports(reports, local_ders, id); 730b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 731b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 732b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 7354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 73640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 7374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 73840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 739b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 740b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 741d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(IdFromCertIdString(remote_certificate_id)); 742d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org CheckCertChainReports(reports, remote_ders, id); 743b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 744b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 745b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 7467bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 7477bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check negotiated ciphers. 748521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::string dtls_cipher_suite = 749521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ExtractStatsValue(StatsReport::kStatsReportTypeComponent, reports, 750521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh StatsReport::kStatsValueNameDtlsCipher); 751521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh EXPECT_EQ(rtc::SSLStreamAdapter::SslCipherSuiteToName( 752456696a9c1bbd586701dcca3e4b2695e419a10baGuo-wei Shieh TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA), 753521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh dtls_cipher_suite); 754521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::string srtp_crypto_suite = 755521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ExtractStatsValue(StatsReport::kStatsReportTypeComponent, reports, 756521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh StatsReport::kStatsValueNameSrtpCipher); 757521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh EXPECT_EQ(rtc::SrtpCryptoSuiteToName(rtc::SRTP_AES128_CM_SHA1_80), 758521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh srtp_crypto_suite); 7594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 76097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 76128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 762d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 763c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan rtc::scoped_ptr<webrtc::MediaControllerInterface> media_controller_; 76428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 765ab9b2d1516cad017c6e0236c468934582530c965deadbeef MockPeerConnection pc_; 766487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org FakeDataChannelProvider data_channel_provider_; 767d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef SessionStats session_stats_; 768d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> stream_; 769d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrack> track_; 770d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> audio_track_; 771ab9b2d1516cad017c6e0236c468934582530c965deadbeef std::vector<rtc::scoped_refptr<DataChannel>> data_channels_; 77228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 77328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 774487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org// Verify that ExtractDataInfo populates reports. 775487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.orgTEST_F(StatsCollectorTest, ExtractDataInfo) { 776487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string label = "hacks"; 777487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const int id = 31337; 778487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org const std::string state = DataChannelInterface::DataStateString( 779487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org DataChannelInterface::DataState::kConnecting); 780487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 781ab9b2d1516cad017c6e0236c468934582530c965deadbeef AddDataChannel(cricket::DCT_SCTP, label, id); 782ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 783487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 784487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 785487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 786487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReports reports; 787487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org stats.GetStats(NULL, &reports); 788322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 789322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org const StatsReport* report = 790322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org FindNthReportByType(reports, StatsReport::kStatsReportTypeDataChannel, 1); 791322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 792d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id reportId = StatsReport::NewTypedIntId( 793322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org StatsReport::kStatsReportTypeDataChannel, id); 794322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 795322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_TRUE(reportId->Equals(report->id())); 796322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org 797322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(stats.GetTimeNow(), report->timestamp()); 798487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(label, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 799487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 800487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameLabel)); 8010c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<int64_t>(id), 8020c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, reports, 803487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameDataChannelId)); 804487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ(state, ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 805487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 806487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameState)); 807487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org EXPECT_EQ("", ExtractStatsValue(StatsReport::kStatsReportTypeDataChannel, 808487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org reports, 809487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org StatsReport::kStatsValueNameProtocol)); 810487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org} 811487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 81328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 814ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 815487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 816cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 817cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 818cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 819cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 820cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 821d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 822d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 823d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 824c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 825d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 826d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 827d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 8284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 829c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VideoChannel video_channel(rtc::Thread::Current(), media_channel, 830c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan nullptr, kVideoChannelName, false); 83140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 83228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 83328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 83428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 8350c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kBytesSent = 12345678901234LL; 83628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 83728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 83997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 84028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8425bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 84328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 84428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 84528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 84740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 848058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 849058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 850242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org Return(true))); 851b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 85228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 853242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 854242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 85528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 85628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 85928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 860ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 861487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 862cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 863cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 864cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 865cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 866cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 867d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 868d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 869d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 870c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 871d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 872d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 873d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 8744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 875c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VideoChannel video_channel(rtc::Thread::Current(), media_channel, 876c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan nullptr, kVideoChannelName, false); 877d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 87840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 87928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 88028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 88128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 88228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 8830c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kBytesSent = 12345678901234LL; 88428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 88528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 88797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 88828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 88928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8905bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 89128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 89228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 89328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 89428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 89528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 89628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 89728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 89828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 89940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 90040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 901058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 902058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), Return(true))); 90397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 904b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 90528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 906242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 907242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 90828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 909242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org result = ExtractBweStatsValue(reports, 910242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameTargetEncBitrate); 91128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 91228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 91328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 91428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 91528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 91628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 917ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 918487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 91940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 920b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 92128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 92240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 92340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 92428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 92528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 92628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 92728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 92828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 92928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 930ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 931487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 93240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 933b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 934b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 93528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 93640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 93740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 93828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 93928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 94040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 94128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 94228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 94328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 94428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 94528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 94628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 947ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 948487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 9494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 950c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VideoChannel video_channel(rtc::Thread::Current(), media_channel, 951c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan nullptr, "video", false); 9524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 95397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 95428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 95528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 95603505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 95728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 95828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 9594fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org EXPECT_EQ(StatsReport::kStatsReportTypeTrack, reports[0]->type()); 960be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(0, reports[0]->timestamp()); 96128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 96340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 96428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 96540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 9664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, trackValue); 96728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 96828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 96928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 97028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 97128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 972ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 973487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 974cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 975cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 976cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 977cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 978cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 979d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 980d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 981c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 982d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 983d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 984d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 9854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 986c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VideoChannel video_channel(rtc::Thread::Current(), media_channel, 987c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan nullptr, kVideoChannelName, false); 9884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 98997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 99028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 99228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 99328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 9940c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kBytesSent = 12345678901234LL; 99528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 99628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 9975bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 99828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 99928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 100028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 100140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 100240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1003058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1004058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 100528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 100628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1007b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 100803505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 100928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 101097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 101197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 101297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 101340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 101440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 10154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 101628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get report for the specific |track|. 10185b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 101997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 102097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 102197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 102297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 102328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 102440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 10254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 1026be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp()); 102728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 102828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 102940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 10300c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 103128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 103228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 103340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 10344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 103528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 103628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 103728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 103828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 103928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 1040ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1041487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1042cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1043cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1044cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1045cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1046cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 10474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1048cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the video channel. 104928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 1050c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VideoChannel video_channel(rtc::Thread::Current(), media_channel, 1051c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan nullptr, kVcName, false); 10524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 105397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 105428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 105528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 105628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 105728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 10580c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kBytesSent = 12345678901234LL; 105928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 10615bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 106228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 106328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 106428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 106540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 106640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1067058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1068058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 106928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 107028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 107197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 1072c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 107340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 107440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 107528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1076b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 107703505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 107828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 107928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 108040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 108128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 108240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 108328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 10844fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // Transport id component ID will always be 1. 10854fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // This has assumptions about how the ID is constructed. As is, this is 10864fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // OK since this is for testing purposes only, but if we ever need this 10874fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org // in production, we should add a generic method that does this. 10884fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org size_t index = transport_id.find('-'); 10894fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10904fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org std::string content = transport_id.substr(index + 1); 10914fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org index = content.rfind('-'); 10924fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_NE(std::string::npos, index); 10934fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org content = content.substr(0, index); 1094d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org StatsReport::Id id(StatsReport::NewComponentId(content, 1)); 10954fb7e2584326050a707aef544028fa9cb616ec89tommi@webrtc.org ASSERT_EQ(transport_id, id->ToString()); 1096d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const StatsReport* transport_report = FindReportById(reports, id); 109728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 109828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 109928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 110097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 110197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 110297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 1103ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1104487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 11054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1106cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the video channel. 110797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1108c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VideoChannel video_channel(rtc::Thread::Current(), media_channel, 1109c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan nullptr, kVcName, false); 11104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 111197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 111297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1113b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 111440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 111597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 111640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 111740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 111897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 111997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 112097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 112197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 112297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 112397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 1124ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1125487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1126cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1127cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1128cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1129cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1130cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 11314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1132cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the video channel. 113397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 1134c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VideoChannel video_channel(rtc::Thread::Current(), media_channel, 1135c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan nullptr, kVcName, false); 11364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 113797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 113897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 113997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 114097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 1141c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 114240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 114340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 114497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 114597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 114697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 114797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 114897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 114997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 115097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 115197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 11525bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 115397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 115497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 115597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 115640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 115740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1158058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1159058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 116097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 116197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1162b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 116303505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 116497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 11654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 116640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 116740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 116897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 1169322a564f49d9c995cfffbaabd3d8c5d5aa326e86decurtis@webrtc.org EXPECT_EQ(12345.678, remote_report->timestamp()); 117097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 117197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 11724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that the empty track report exists in the returned stats 11734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 11744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, ReportsFromRemoteTrack) { 1175ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1176487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1177cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1178cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1179cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1180cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1181cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 1182d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org const char kVideoChannelName[] = "video"; 1183d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org InitSessionStats(kVideoChannelName); 1184c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 1185d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 1186d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org Return(true))); 1187d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org 11884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1189c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VideoChannel video_channel(rtc::Thread::Current(), media_channel, 1190c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan nullptr, kVideoChannelName, false); 11914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingVideoTrackStats(); 11924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 11934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 11954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoReceiverInfo video_receiver_info; 11964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoMediaInfo stats_read; 11970c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström const int64_t kNumOfPacketsConcealed = 54321; 11984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 11994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Construct a stats value to read. 12004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.add_ssrc(1234); 12011ed6224eafc7816f25d1906e4d709afdf2ad8f0fpbos@webrtc.org video_receiver_info.packets_concealed = kNumOfPacketsConcealed; 12024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(video_receiver_info); 12034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 12054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1206058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 1207058b1f17ac43b1fe69a8c18aaa7999ba88733dfdpbos@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 12084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 12094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 121103505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 12124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(NULL, &reports); 12134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |reports| should contain at least one session report, one track report, 12144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // and one ssrc report. 12154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_LE(static_cast<size_t>(3), reports.size()); 12164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 12174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 12184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 1219be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp()); 12204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 12224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 12230c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 12244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 12264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 12274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 12284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 12294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 1230950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// This test verifies the Ice Candidate report should contain the correct 1231950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org// information from local/remote candidates. 1232950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.orgTEST_F(StatsCollectorTest, IceCandidateReport) { 1233ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1234487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1235950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReports reports; // returned values. 1236950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1237950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int local_port = 2000; 1238950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char local_ip[] = "192.168.0.1"; 1239950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const int remote_port = 2001; 1240950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org const char remote_ip[] = "192.168.0.2"; 1241950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1242950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress local_address(local_ip, local_port); 1243950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::SocketAddress remote_address(remote_ip, remote_port); 1244950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::AdapterType network_type = rtc::ADAPTER_TYPE_ETHERNET; 12450c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström uint32_t priority = 1000; 1246950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1247950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::Candidate c; 124861c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1249950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::LOCAL_PORT_TYPE); 1250950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1251950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(local_address); 1252950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_priority(priority); 1253950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_network_type(network_type); 1254d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org std::string report_id = AddCandidateReport(&stats, c, true)->id()->ToString(); 125561c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1256950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 125761c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c = cricket::Candidate(); 125861c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org ASSERT(c.id().length() > 0); 1259950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_type(cricket::PRFLX_PORT_TYPE); 126061c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_protocol(cricket::UDP_PROTOCOL_NAME); 1261950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org c.set_address(remote_address); 126261c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_priority(priority); 126361c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org c.set_network_type(network_type); 1264d3900296ae4416de2ea21be4548ea4adba8f3280tommi@webrtc.org report_id = AddCandidateReport(&stats, c, false)->id()->ToString(); 126561c1247224e2b696b10303b0b5479b3a246f4ff0guoweis@webrtc.org EXPECT_EQ("Cand-" + c.id(), report_id); 1266950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1267950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org stats.GetStats(NULL, &reports); 1268950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1269950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the local candidate report is populated correctly. 1270950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1271950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org local_ip, 1272950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1273950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1274950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1275950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(local_port), 1276950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1277950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1278950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1279950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org cricket::UDP_PROTOCOL_NAME, 1280950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1281950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1282950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1283950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org rtc::ToString<int>(priority), 1284950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1285950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1286950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1287950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::LOCAL_PORT_TYPE), 1288950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1289950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateType)); 1290950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1291950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org AdapterTypeToStatsType(network_type), 1292950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceLocalCandidate, reports, 1293950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1294950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 1295950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org // Verify the remote candidate report is populated correctly. 1296950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(remote_ip, 1297950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1298950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1299950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateIPAddress)); 1300950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(remote_port), 1301950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1302950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1303950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePortNumber)); 1304950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(cricket::UDP_PROTOCOL_NAME, 1305950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1306950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1307950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateTransportType)); 1308950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(rtc::ToString<int>(priority), 1309950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1310950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, 1311950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidatePriority)); 1312950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ( 1313950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org IceCandidateTypeToStatsType(cricket::PRFLX_PORT_TYPE), 1314950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeIceRemoteCandidate, 1315950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org reports, StatsReport::kStatsValueNameCandidateType)); 1316950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org EXPECT_EQ(kNotFound, 1317950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org ExtractStatsValue( 1318950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsReportTypeIceRemoteCandidate, reports, 1319950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org StatsReport::kStatsValueNameCandidateNetworkType)); 1320950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} 1321950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org 13224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 13234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 132419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 13254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 13264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 13274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 13284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 13294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 13304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 13314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 1332d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DersToPems(local_ders)); 13334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 13354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 13364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 13374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 13384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 13394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 1340d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 13414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 13434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 13464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 134719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 13484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 13494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 1350d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 13514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 13534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 1354d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 13554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 13574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 13584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 13594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 13614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 136219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 1363ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1364487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1365cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1366cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1367cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1368cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1369cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 137040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 13714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 13734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 13744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 13754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 1377cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef transport_stats.transport_name = "audio"; 13784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 13794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1380d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef SessionStats session_stats; 1381cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef session_stats.transport_stats[transport_stats.transport_name] = 13824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 13834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 1385c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 13864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 13874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 138897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 1389b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 13914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 13934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 139440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 13954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 139640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 13974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 13984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 13994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 14004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 140140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 14024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 140340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 14044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 14057bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org 14067bea1ffe772e837d96f8faa5c9dd06e531b95379pthatcher@webrtc.org // Check that the negotiated ciphers are absent. 1407521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::string dtls_cipher_suite = 1408521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ExtractStatsValue(StatsReport::kStatsReportTypeComponent, reports, 1409521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh StatsReport::kStatsValueNameDtlsCipher); 1410521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_EQ(kNotFound, dtls_cipher_suite); 1411521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh std::string srtp_crypto_suite = 1412521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ExtractStatsValue(StatsReport::kStatsReportTypeComponent, reports, 1413521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh StatsReport::kStatsValueNameSrtpCipher); 1414521ed7bf022c4e30574d7970c2be5be46567f4cdGuo-wei Shieh ASSERT_EQ(kNotFound, srtp_crypto_suite); 14154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 14164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 14184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 141919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 1420ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1421487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1422cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1423cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1424cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1425cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1426cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 142740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 14284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 14304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 14314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 14324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 1434cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef transport_stats.transport_name = "audio"; 14354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 14364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1437d59daf8023286d63a1b6c8af82eedb684181c1ebdeadbeef SessionStats session_stats; 1438cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef session_stats.transport_stats[transport_stats.transport_name] = 14394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 14404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 1442d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 1443cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef new cricket::FakeTransport(transport_stats.transport_name)); 14444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 1446c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 14474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 14484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 1449b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 14504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 14514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 14534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 145440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 14554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 145640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 14574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 14584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 14594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 14604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 146140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 14624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 146340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 14644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 14654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 14664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1467b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 1468b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 1469b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 1470b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 1471b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 1472d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 1473b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1474b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 1475b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 1476d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 1477b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 1478b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1479b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 1480b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 1481b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1482b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 148340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 148440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 148540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 1486ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1487487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1488cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1489cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1490cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1491cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1492242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org 149340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1494cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 149540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1496c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VoiceChannel voice_channel(rtc::Thread::Current(), media_engine_, 1497c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan media_channel, nullptr, kVcName, false); 14984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 149940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 150001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 150140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 150240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 150440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 150540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 150640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 150701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 150801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 150901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 151040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify that there is no remote report for the local audio track because 15124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // we did not set it up. 15134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 15144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 15154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(remote_report == NULL); 15164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 15173e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// This test verifies that audio receive streams populate stats reports 15193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// correctly. 15203e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromRemoteStream) { 1521ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1522487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1523cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1524cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1525cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1526cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1527cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 15283e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1529cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 15303e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const std::string kVcName("vcname"); 1531c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VoiceChannel voice_channel(rtc::Thread::Current(), media_engine_, 1532c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan media_channel, nullptr, kVcName, false); 15334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingAudioTrackStats(); 15343e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.AddStream(stream_); 15353e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15363e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 15374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 15387e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org voice_receiver_info.codec_name = "fake_codec"; 15393e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 15403e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceMediaInfo stats_read; 15413e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org StatsReports reports; // returned values. 154201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 154301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 154401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, NULL, &voice_receiver_info, &stats_read, &reports); 15453e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 15463e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 154740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 154840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 154940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 1550ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1551487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1552cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1553cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1554cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1555cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1556cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 155740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1558cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 155940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1560c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VoiceChannel voice_channel(rtc::Thread::Current(), media_engine_, 1561c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan media_channel, nullptr, kVcName, false); 15624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 156340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 156440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 156540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 156640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 156740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 1568c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 156940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 157040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 157140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 157240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 157340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 15744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 157540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 157640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 157740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 157840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 157940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 158040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 158140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 158240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 158340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 158440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 158540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 158640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 158740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 158840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 158940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 159040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 159140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 159240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 159340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 1594be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), report->timestamp()); 159540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 159640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 15974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 159840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 159940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 16000c4e06b4c6107a1b94f764e279e4fb4161e905b0Peter Boström EXPECT_EQ(rtc::ToString<uint32_t>(kSsrcOfTrack), ssrc_id); 160140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 160240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 160340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 160440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 160540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 160640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 160740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 16084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that when ongoing and incoming audio tracks are using 16094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// the same ssrc, they populate stats reports correctly. 16104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) { 1611ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1612487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1613cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1614cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1615cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1616cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1617cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 16184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1619cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 16204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string kVcName("vcname"); 1621c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VoiceChannel voice_channel(rtc::Thread::Current(), media_engine_, 1622c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan media_channel, nullptr, kVcName, false); 16234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 16254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 16264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 16274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 16284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a remote stream with a remote audio track and adds it to the stats. 1630d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> remote_stream( 16314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::MediaStream::Create("remotestreamlabel")); 1632d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> remote_track( 1633d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId)); 16344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 163501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 16364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org remote_stream->AddTrack(remote_track); 16374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(remote_stream); 16384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Instruct the session to return stats containing the transport channel. 16404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitSessionStats(kVcName); 1641c04a97f054348909c5b0c24369fb4272c2c16041pthatcher@webrtc.org EXPECT_CALL(session_, GetTransportStats(_)) 16424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 16434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 16444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 16464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 16474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Some of the contents in |voice_sender_info| needs to be updated from the 16494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |audio_track_|. 16504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 16514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 16534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 16544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 16564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceMediaInfo stats_read; 16574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.senders.push_back(voice_sender_info); 16584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 16594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 16614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 16624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 16634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 16644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 16654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; // returned values. 16674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 16684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the local track. 16704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(audio_track_.get(), &reports); 16714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 16724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 16734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 1674be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp()); 16754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 16764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 16774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 16784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 16794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 16804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the remote track. 16815b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 16824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(remote_track.get(), &reports); 16834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_report = FindNthReportByType(reports, 16844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeSsrc, 1); 16854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 1686be24c94c95056e4f0a22039f25f2fa8a27be6b66jbauch EXPECT_EQ(stats.GetTimeNow(), track_report->timestamp()); 16874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_id = ExtractSsrcStatsValue(reports, 16884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsValueNameTrackId); 16894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 16904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info); 16914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 16924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 169301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// This test verifies that when two outgoing audio tracks are using the same 169401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// ssrc at different times, they populate stats reports correctly. 169501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// TODO(xians): Figure out if it is possible to encapsulate the setup and 169601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// avoid duplication of code in test cases. 169701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.orgTEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) { 1698ab9b2d1516cad017c6e0236c468934582530c965deadbeef StatsCollectorForTest stats(&pc_); 1699487a4442152e2c70146aa2d2c6ccb370233c056cdecurtis@webrtc.org 1700cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetLocalCertificate(_, _)) 1701cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1702cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef EXPECT_CALL(session_, GetRemoteSSLCertificate(_, _)) 1703cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef .WillRepeatedly(Return(false)); 1704cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef 170501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 1706cbecd358e032021eac11fb13e04ec7f070d4f407deadbeef // The transport_name known by the voice channel. 170701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string kVcName("vcname"); 1708c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan cricket::VoiceChannel voice_channel(rtc::Thread::Current(), media_engine_, 1709c1aeaf0dc37d96f31c92f893f4e30e7a5f7cc2b7stefan media_channel, nullptr, kVcName, false); 171001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 171101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 171201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org AddOutgoingAudioTrackStats(); 171301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddStream(stream_); 171401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 171501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 171601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 171701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 171801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 171901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo stats_read; 172001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports reports; // returned values. 172101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 172201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 172301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 172401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 172501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Remove the previous audio track from the stream. 172601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->RemoveTrack(audio_track_.get()); 172701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 172801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 172901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a new audio track and adds it to the stream and stats. 173001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org static const std::string kNewTrackId = "new_track_id"; 1731d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> new_audio_track( 1732d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kNewTrackId)); 173301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 173401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNewTrackId), Return(true))); 173501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->AddTrack(new_audio_track); 173601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 173701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(new_audio_track, kSsrcOfTrack); 173869bc5a300fe27448bcb61670f2800d3919ed2975tommi@webrtc.org stats.ClearUpdateStatsCacheForTest(); 173901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo new_voice_sender_info; 174001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitVoiceSenderInfo(&new_voice_sender_info); 174101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo new_stats_read; 17425b06b06cc0ef5a051fa5b1ed687218a21639d93etommi@webrtc.org reports.clear(); 174301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 174401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, 174501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); 174601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org} 174701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 1748950c51825109c2ca352317edef0a33777d0e6678guoweis@webrtc.org} // namespace webrtc 1749