statscollector_unittest.cc revision a09a99950ec40aef6421e4ba35eee7196b7a6e68
128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 34cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org * Copyright 2014, Google Inc. 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <stdio.h> 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/statscollector.h" 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastream.h" 3340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h" 3440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreamtrack.h" 3528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 3628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h" 3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/devices/fakedevicemanager.h" 3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/p2p/base/fakesession.h" 3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/channelmanager.h" 404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 42a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/base64.h" 43a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/fakesslidentity.h" 44a09a99950ec40aef6421e4ba35eee7196b7a6e68buildbot@webrtc.org#include "webrtc/base/gunit.h" 4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 46b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing cricket::StatsOptions; 4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_; 4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll; 49b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing testing::Field; 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return; 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee; 53b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing webrtc::PeerConnectionInterface; 5440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReport; 5540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReports; 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager; 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeDeviceManager; 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace { 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND"; 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNoReports[] = "NO REPORTS"; 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Constant names for track identification. 714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kLocalTrackId[] = "local_track_id"; 724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgconst char kRemoteTrackId[] = "remote_track_id"; 7397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst uint32 kSsrcOfTrack = 1234; 7497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession { 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org explicit MockWebRtcSession(cricket::ChannelManager* channel_manager) 78d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org : WebRtcSession(channel_manager, rtc::Thread::Current(), 79d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current(), NULL, NULL) { 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 8140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD0(voice_channel, cricket::VoiceChannel*()); 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD0(video_channel, cricket::VideoChannel*()); 834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Libjingle uses "local" for a outgoing track, and "remote" for a incoming 844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // track. 854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MOCK_METHOD2(GetLocalTrackIdBySsrc, bool(uint32, std::string*)); 864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MOCK_METHOD2(GetRemoteTrackIdBySsrc, bool(uint32, std::string*)); 8728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::SessionStats*)); 884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org MOCK_METHOD1(GetTransport, cricket::Transport*(const std::string&)); 8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel { 9228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel() 9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : cricket::FakeVideoMediaChannel(NULL) { 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 9628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // MOCK_METHOD0(transport_channel, cricket::TransportChannel*()); 97b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org MOCK_METHOD2(GetStats, bool(const StatsOptions&, cricket::VideoMediaInfo*)); 9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 10040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass MockVoiceMediaChannel : public cricket::FakeVoiceMediaChannel { 10140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 10240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel() : cricket::FakeVoiceMediaChannel(NULL) { 10340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 10440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VoiceMediaInfo*)); 10540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 10640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 10740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeAudioProcessor : public webrtc::AudioProcessorInterface { 10840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 10940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org FakeAudioProcessor() {} 11040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ~FakeAudioProcessor() {} 11140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 11240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 11340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void GetStats( 11440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org AudioProcessorInterface::AudioProcessorStats* stats) OVERRIDE { 11540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->typing_noise_detected = true; 11640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss = 2; 11740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_return_loss_enhancement = 3; 11840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_median_ms = 4; 11940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->aec_quality_min = 5.1f; 12040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats->echo_delay_std_ms = 6; 12140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 12240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 12340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 1244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgclass FakeAudioTrack 12540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> { 12640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public: 1274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org explicit FakeAudioTrack(const std::string& id) 12840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id), 129d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org processor_(new rtc::RefCountedObject<FakeAudioProcessor>()) {} 13040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string kind() const OVERRIDE { 13140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return "audio"; 13240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 13340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual webrtc::AudioSourceInterface* GetSource() const OVERRIDE { 13440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return NULL; 13540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 13640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void AddSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {} 13740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual void RemoveSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {} 13840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org virtual bool GetSignalLevel(int* level) OVERRIDE { 13940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org *level = 1; 14040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org return true; 14140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 142d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org virtual rtc::scoped_refptr<webrtc::AudioProcessorInterface> 143b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org GetAudioProcessor() OVERRIDE { 144b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org return processor_; 14540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 14640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 148d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioProcessor> processor_; 14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 15040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 152242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name, 1534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 15440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::Values::const_iterator it = report->values.begin(); 1554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org for (; it != report->values.end(); ++it) { 1564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (it->name == name) { 1574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org *value = it->value; 1584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return true; 1594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return false; 1624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractStatsValue(const std::string& type, 16540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, 166242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports.empty()) { 16828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNoReports; 16928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 171730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org if (reports[i]->type != type) 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org continue; 1734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 174730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org if (GetValue(reports[i], name, &ret)) { 1754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 17928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 18028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 18128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 18228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 18328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 18440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType( 18540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReports& reports, const std::string& type, int n) { 18628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 187730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org if (reports[i]->type == type) { 18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 190730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org return reports[i]; 19128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 19640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports, 19740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string& id) { 19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 199730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org if (reports[i]->id == id) { 200730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org return reports[i]; 20128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 20328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 20640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports, 207242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 20940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, reports, name); 21028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 21240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports, 213242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::StatsValueName name) { 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 21540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeBwe, reports, name); 21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 219d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org return rtc::SSLIdentity::DerToPem( 220d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::kPemTypeCertificate, 2214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 2224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 2234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 2264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 2274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 2284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 2294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 2304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 23240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports, 2334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 2344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& start_id) { 2354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string certificate_id = start_id; 2364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 2374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 23840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindReportById(reports, certificate_id); 2394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 24019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 2424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 24340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameDer, &der_base64)); 244d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string der = rtc::Base64::Decode(der_base64, 245d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Base64::DO_STRICT); 2464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 24719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 24819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 24919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 25019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 25140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprintAlgorithm, 25219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 25319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 254d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org std::string sha_1_str = rtc::DIGEST_SHA_1; 25519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 25619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 25719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string dummy_fingerprint; // Value is not checked. 25819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 25919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 26040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameFingerprint, 26119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &dummy_fingerprint)); 26219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 2644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (!GetValue( 26540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameIssuerId, &certificate_id)) 2664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 2674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 2684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 2694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid VerifyVoiceReceiverInfoReport( 2724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* report, 2734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const cricket::VoiceReceiverInfo& info) { 2743e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org std::string value_in_report; 2753e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2763e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameAudioOutputLevel, &value_in_report)); 277d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.audio_level), value_in_report); 2783e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2793e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameBytesReceived, &value_in_report)); 280d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(info.bytes_rcvd), value_in_report); 2813e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2823e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 283d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_ms), value_in_report); 2843e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2853e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report)); 286d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_ms), value_in_report); 2873e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2883e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePreferredJitterBufferMs, 2893e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org &value_in_report)); 290d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.jitter_buffer_preferred_ms), 2913e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 2923e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2933e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameCurrentDelayMs, &value_in_report)); 294d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.delay_estimate_ms), value_in_report); 2953e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2963e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameExpandRate, &value_in_report)); 297d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(info.expand_rate), value_in_report); 2983e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2993e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); 300d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.packets_rcvd), value_in_report); 3013e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3023e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report)); 303d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_silence_generator), 3043e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3053e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3063e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTN, &value_in_report)); 307d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_calls_to_neteq), 3083e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org value_in_report); 3093e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3103e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingNormal, &value_in_report)); 311d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_normal), value_in_report); 3123e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3133e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report)); 314d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc), value_in_report); 3153e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3163e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report)); 317d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_cng), value_in_report); 3183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report)); 320d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(info.decoding_plc_cng), value_in_report); 3217e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org EXPECT_TRUE(GetValue( 3227e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 3233e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 3243e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 3253e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 32640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report, 32740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const cricket::VoiceSenderInfo& sinfo) { 32840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string value_in_report; 32940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 33040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameCodecName, &value_in_report)); 33140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(sinfo.codec_name, value_in_report); 33240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 33340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameBytesSent, &value_in_report)); 334d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int64>(sinfo.bytes_sent), value_in_report); 33540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 33640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 337d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_sent), value_in_report); 33840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 339ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org report, StatsReport::kStatsValueNamePacketsLost, &value_in_report)); 340d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.packets_lost), value_in_report); 341ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_TRUE(GetValue( 34240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 343d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 34440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 34540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 346d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.rtt_ms), value_in_report); 34740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 34840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 349d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.jitter_ms), value_in_report); 35040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 35140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoCancellationQualityMin, 35240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 353d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<float>(sinfo.aec_quality_min), value_in_report); 35440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 35540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 356d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_median_ms), 35740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 35840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 35940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report)); 360d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_delay_std_ms), 36140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 36240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report)); 364d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss), 36540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 36640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 36740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoReturnLossEnhancement, 36840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org &value_in_report)); 369d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.echo_return_loss_enhancement), 37040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org value_in_report); 37140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report)); 373d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<int>(sinfo.audio_level), value_in_report); 37440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 37540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report)); 37640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false"; 37740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(typing_detected, value_in_report); 37840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 37940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 3804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// Helper methods to avoid duplication of code. 3814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceSenderInfo(cricket::VoiceSenderInfo* voice_sender_info) { 3824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->add_ssrc(kSsrcOfTrack); 3834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->codec_name = "fake_codec"; 3844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->bytes_sent = 100; 3854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_sent = 101; 3864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->rtt_ms = 102; 3874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->fraction_lost = 103; 3884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->jitter_ms = 104; 3894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->packets_lost = 105; 3904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->ext_seqnum = 106; 3914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->audio_level = 107; 3924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = 108; 3934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 109; 3944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 110; 3954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 111; 3964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = 112.0f; 3974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = false; 3984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 3994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid UpdateVoiceSenderInfoFromAudioTrack( 4014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org FakeAudioTrack* audio_track, cricket::VoiceSenderInfo* voice_sender_info) { 4024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetSignalLevel(&voice_sender_info->audio_level); 4034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats; 4044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track->GetAudioProcessor()->GetStats(&audio_processor_stats); 4054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->typing_noise_detected = 4064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.typing_noise_detected; 4074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss = audio_processor_stats.echo_return_loss; 4084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_return_loss_enhancement = 4094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_return_loss_enhancement; 4104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_median_ms = 4114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_median_ms; 4124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->aec_quality_min = audio_processor_stats.aec_quality_min; 4134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_sender_info->echo_delay_std_ms = 4144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_processor_stats.echo_delay_std_ms; 4154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgvoid InitVoiceReceiverInfo(cricket::VoiceReceiverInfo* voice_receiver_info) { 4184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->add_ssrc(kSsrcOfTrack); 4194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->bytes_rcvd = 110; 4204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_rcvd = 111; 4214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 112; 4224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->fraction_lost = 113; 4234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->packets_lost = 114; 4244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->ext_seqnum = 115; 4254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_ms = 116; 4264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_ms = 117; 4274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->jitter_buffer_preferred_ms = 118; 4284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->delay_estimate_ms = 119; 4294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->audio_level = 120; 4304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org voice_receiver_info->expand_rate = 121; 4314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 4324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 43328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 43428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 43528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 436730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org : media_engine_(new cricket::FakeMediaEngine()), 43728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_manager_( 43828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::ChannelManager(media_engine_, 43928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::FakeDeviceManager(), 440d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::Thread::Current())), 4414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org session_(channel_manager_.get()) { 44228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 44328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false)); 44428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 44528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 446730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org ~StatsCollectorTest() {} 447730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org 44897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 44997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 45097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 451242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org void InitSessionStats(const std::string& vc_name) { 45297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 45397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 45497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 45597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 45697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.content_name = kTransportName; 45797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 45897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 45997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 46097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 46197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 46297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 4634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing video track with a given SSRC into the stats. 4644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingVideoTrackStats() { 46597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 4664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kLocalTrackId, NULL); 46797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 4684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 4694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 47097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 47197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 4724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming video track with a given SSRC into the stats. 4734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingVideoTrackStats() { 4744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 4754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kRemoteTrackId, NULL); 4764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(track_); 4774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 47801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 4794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 4804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing audio track with a given SSRC into the stats. 4824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingAudioTrackStats() { 48340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 48440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 48540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 486d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 4874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kLocalTrackId); 48840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 4894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 49001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 4914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 4924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming audio track with a given SSRC into the stats. 4944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingAudioTrackStats() { 4954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org if (stream_ == NULL) 4964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 4974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 498d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org audio_track_ = new rtc::RefCountedObject<FakeAudioTrack>( 4994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kRemoteTrackId); 5004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(audio_track_); 5014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 50201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 50301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 50401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 50501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org void SetupAndVerifyAudioTrackStats( 50601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org FakeAudioTrack* audio_track, 50701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::MediaStream* stream, 50801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org webrtc::StatsCollector* stats, 50901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceChannel* voice_channel, 51001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string& vc_name, 51101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel, 51201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo* voice_sender_info, 51301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceReceiverInfo* voice_receiver_info, 51401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo* stats_read, 51501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports* reports) { 51601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // A track can't have both sender report and recv report at the same time 51701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // for now, this might change in the future though. 51801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ASSERT((voice_sender_info == NULL) ^ (voice_receiver_info == NULL)); 51901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 52001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Instruct the session to return stats containing the transport channel. 52101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitSessionStats(vc_name); 52201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 52301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 52401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(true))); 52501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 52601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Constructs an ssrc stats update. 52701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 52801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->senders.push_back(*voice_sender_info); 52901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 53001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats_read->receivers.push_back(*voice_receiver_info); 53101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 53201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly( 53301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org Return(voice_channel)); 53401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 53501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 53601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(*stats_read), Return(true))); 53701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 53801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 53901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->ClearUpdateStatsCache(); 54001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(NULL, reports); 54101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 54201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify the existence of the track report. 54301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* report = FindNthReportByType( 54401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsReportTypeSsrc, 1); 54501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_FALSE(report == NULL); 54601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 54701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameTrackId); 54801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 54901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 55001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org *reports, StatsReport::kStatsValueNameSsrc); 551d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 55201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 55301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verifies the values in the track report. 55401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) { 55501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track, voice_sender_info); 55601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(report, *voice_sender_info); 55701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 55801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) { 55901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(report, *voice_receiver_info); 56001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org } 56101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 56201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Verify we get the same result by passing a track to GetStats(). 56301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports track_reports; // returned values. 56401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats->GetStats(audio_track, &track_reports); 56501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const StatsReport* track_report = FindNthReportByType( 56601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 56701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_TRUE(track_report); 56801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 56901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameTrackId); 57001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_EQ(audio_track->id(), track_id); 57101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 57201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReport::kStatsValueNameSsrc); 573d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 57401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_sender_info) 57501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceSenderInfoReport(track_report, *voice_sender_info); 57601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org if (voice_receiver_info) 57701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, *voice_receiver_info); 57840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 57940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 580d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org void TestCertificateReports(const rtc::FakeSSLCertificate& local_cert, 5814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 582d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org const rtc::FakeSSLCertificate& remote_cert, 5834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 58403505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 58540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 5864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 5884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 5894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 5904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 5924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 5934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 5944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 5964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 5974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 5984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 600d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLIdentity local_identity(local_cert); 601d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<rtc::FakeSSLCertificate> remote_cert_copy( 6024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 6034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 605d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 6064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 6074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 6084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 6094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 6104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 6114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 6124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 6134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 6144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 6154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 6164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 6184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 61906b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 6204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 6214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 6224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 62340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 62440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 6254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 626b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 6274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 6294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 63040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 63140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 6324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 6334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 6354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 63640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 6374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 63840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 639b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 640b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 641b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org CheckCertChainReports(reports, local_ders, local_certificate_id); 642b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 643b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 644b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 6454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 6474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 64840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 6494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 65040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 651b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 652b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 653b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org CheckCertChainReports(reports, remote_ders, remote_certificate_id); 654b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 655b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 656b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 6574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 65897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 65928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 660d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::ChannelManager> channel_manager_; 66128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 66297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SessionStats session_stats_; 663d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> stream_; 664d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::VideoTrack> track_; 665d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> audio_track_; 66628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 66728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 66928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 67003505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 6714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 672d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 67328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 67440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 67528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 67628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 67728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 67828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 67928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 68028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 68297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 68328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 68428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 6855bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 68628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 68728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 68828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 68940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 69040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 691b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 692242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 693242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org Return(true))); 694b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 69528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 696242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 697242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 69828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 69928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 70028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 70128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 70228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 70303505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 7044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 705d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 70628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 70740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 70828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 70928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 71028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 71128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 71228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 71328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 71428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 71697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 71728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 71828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 7195bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 72028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 72128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 72228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 72328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 72428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 72528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 72628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 72728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 72840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 72940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 730b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 731b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 73228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 73397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 734b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 73528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 736242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org std::string result = ExtractSsrcStatsValue(reports, 737242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameBytesSent); 73828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 739242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org result = ExtractBweStatsValue(reports, 740242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameTargetEncBitrate); 74128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 74228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 74328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 74428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 74528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 74628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 74703505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 74840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 74940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 75040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 751b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 75228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 75340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 75440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 75528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 75628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 75728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 75828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 75928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 76028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 76103505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 76240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 76340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 76440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 765b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 766b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 76728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 76840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 76940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 77028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 77128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 77240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 77328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 77428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 77528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 77628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 77728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 77828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 77903505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 7804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 781d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 78228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 7834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 78497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 78528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 78628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 78703505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 78828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 78928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 79040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(std::string(StatsReport::kStatsReportTypeTrack), 791730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org reports[0]->type); 79228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 79328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 79440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 79528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 79640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 7974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, trackValue); 79828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 79928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 80128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 80228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 80303505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 8044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 805d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 80628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 8074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 80897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 80928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 81128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 81328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 81428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8165bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 81728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 81828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 81928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 82140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 822b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 823b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 82428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 82528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 826b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 82703505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 82828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 82997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 83097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 83197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 83240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 83340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 8344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 83528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 8364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get report for the specific |track|. 837730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org reports.clear(); 83897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 83997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 84097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 84197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 84228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 84340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 8444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 84528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 84740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 848d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 84928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 85140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 8524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 85328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 85428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 85528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 85628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 85728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 85803505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 859242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 860242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 86106b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 8624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 86328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 86428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 865d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 86628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 8674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 86897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 86928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 87128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 87228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 87328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 87428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 87528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8765bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 87728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 87828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 87928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 88040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 88140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 882b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 883b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 88428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 88528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 88697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 88728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 88840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 88940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 89028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 891b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 89203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 89328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 89428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 89540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 89628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 89740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 89828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 89940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* transport_report = FindReportById(reports, 90040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org transport_id); 90128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 90228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 90328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 90497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 90597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 90697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 90703505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 9084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 90997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 91097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 911d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 91297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 9134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 91497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 91597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 91640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 91740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 91897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 919b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 92040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 92197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 92240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 92340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 92497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 92597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 92697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 92797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 92897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 92997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 93003505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 931242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 932242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 93306b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 9344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 93597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 93697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 937d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 93897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 9394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 94097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 94197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 94297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 94397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 94497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 94540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 94640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 94797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 94897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 94997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 95097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 95197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 95297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 95397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 95497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 9555bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 95697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 95797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 95897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 95940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 96040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 961b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 962b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 96397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 96497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 965b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 96603505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 96797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 9684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 96940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 97040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 97197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 97297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_NE(0, remote_report->timestamp); 97397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 97497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 9754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that the empty track report exists in the returned stats 9764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 9774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, ReportsFromRemoteTrack) { 97803505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 9794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 980d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 9814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 9824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingVideoTrackStats(); 9834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 9844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 9864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoReceiverInfo video_receiver_info; 9874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoMediaInfo stats_read; 9884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const int64 kNumOfPacketsConcealed = 54321; 9894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Construct a stats value to read. 9914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.add_ssrc(1234); 9924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.packets_concealed = kNumOfPacketsConcealed; 9934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(video_receiver_info); 9944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 9964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 9974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 9984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 9994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 10004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 100203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; 10034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(NULL, &reports); 10044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |reports| should contain at least one session report, one track report, 10054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // and one ssrc report. 10064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_LE(static_cast<size_t>(3), reports.size()); 10074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 10084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 10094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 10104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 10124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1013d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 10144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 10164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 10174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 10184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 10194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 10204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 10214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 102219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 10234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 10244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 10254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 10264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 10274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 10284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 10294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 1030d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DersToPems(local_ders)); 10314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 10334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 10344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 10354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 10364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 10374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 1038d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 10394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 10414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 10424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 10444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 104519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 10464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 10474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 1048d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 10494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 10514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 1052d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 10534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 10554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 10564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 10574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 10594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 106019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 106103505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 106240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 10634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 10654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 10664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 10674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 10694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 10704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 10714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 10734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 10744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 10754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 10774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 107806b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(ReturnNull()); 10794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 10804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 10814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 108297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 108340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 108440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 10854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1086b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 10874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 10884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 10904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 109140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 10924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 109340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 10944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 10954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 10974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 109840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 10994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 110040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 11014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 11024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 11034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 11054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 110619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 110703505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 110840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 11094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 11114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 11124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 11134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 11154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 11164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 11174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 11194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 11204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 11214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 1123d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_ptr<cricket::FakeTransport> transport( 11244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 11254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 11264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 11274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 11284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 11304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 113106b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(transport.get())); 11324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 11334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 11344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 113540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 113640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 11374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1138b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 11394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 11404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 11424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 114340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 11444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 114540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 11464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 11474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 11484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 11494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 115040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 11514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 115240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 11534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 11544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 11554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1156b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 1157b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 1158b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 1159b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 1160b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 1161d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate local_cert(DerToPem(local_der)); 1162b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1163b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 1164b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 1165d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 1166b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 1167b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1168b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 1169b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 1170b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1171b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1172b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// Verifies the correct optons are passed to the VideoMediaChannel when using 1173b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// verbose output level. 1174b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, StatsOutputLevelVerbose) { 117503505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 11764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1177d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VideoChannel video_channel(rtc::Thread::Current(), 1178b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 1179b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1180b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::VideoMediaInfo stats_read; 1181b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::BandwidthEstimationInfo bwe; 1182b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.total_received_propagation_delta_ms = 10; 1183b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(100); 1184b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(200); 1185b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(1000); 1186b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(2000); 1187b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats_read.bw_estimations.push_back(bwe); 1188b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1189b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(session_, video_channel()) 1190b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(Return(&video_channel)); 119140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1192b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1193b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org StatsOptions options; 1194b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org options.include_received_propagation_stats = true; 1195b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats( 1196b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Field(&StatsOptions::include_received_propagation_stats, true), 1197b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org _)) 1198b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 1199b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Return(true))); 1200b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1201b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelDebug); 120203505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org StatsReports reports; // returned values. 1203b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.GetStats(NULL, &reports); 1204b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string result = ExtractBweStatsValue( 1205242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, 1206242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameRecvPacketGroupPropagationDeltaSumDebug); 1207b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("10", result); 1208b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 1209242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, 1210242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org StatsReport::kStatsValueNameRecvPacketGroupPropagationDeltaDebug); 1211b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[100, 200]", result); 1212b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 1213242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org reports, StatsReport::kStatsValueNameRecvPacketGroupArrivalTimeDebug); 1214b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[1000, 2000]", result); 1215b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1216b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 121740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 121840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 121940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 122003505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 1221242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1222242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 122306b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 1224242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org 122540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 122640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 122740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1228d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 122940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 12304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 123140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 123201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 123340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 123440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 12354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 123640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 123740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 123840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 123901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 124001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 124101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 124240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 12434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify that there is no remote report for the local audio track because 12444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // we did not set it up. 12454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 12464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 12474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(remote_report == NULL); 12484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 12493e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12503e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// This test verifies that audio receive streams populate stats reports 12513e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// correctly. 12523e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromRemoteStream) { 125303505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 1254242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1255242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 125606b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 12573e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 12583e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org // The content_name known by the voice channel. 12593e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const std::string kVcName("vcname"); 1260d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 12613e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 12624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingAudioTrackStats(); 12633e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.AddStream(stream_); 12643e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12653e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 12664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 12677e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org voice_receiver_info.codec_name = "fake_codec"; 12683e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12693e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceMediaInfo stats_read; 12703e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org StatsReports reports; // returned values. 127101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 127201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 127301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, NULL, &voice_receiver_info, &stats_read, &reports); 12743e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 12753e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 127640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 127740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 127840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 127903505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 1280242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1281242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 128206b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 128340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 128440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 128540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 1286d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 128740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 12884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 128940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 129040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 129140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 129240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 129340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 129440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 129540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 129640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 129740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 129840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 129940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 13004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 130140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 130240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 130340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 130440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 130540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 130640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 130740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 130840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 130940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 131040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 131140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 131240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 131340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 131440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 131540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 131640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 131740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 131840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 131940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 132040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 132140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 13224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 132340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 132440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 1325d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org EXPECT_EQ(rtc::ToString<uint32>(kSsrcOfTrack), ssrc_id); 132640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 132740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 132840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 132940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 133040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 133140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 133240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 13334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that when ongoing and incoming audio tracks are using 13344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// the same ssrc, they populate stats reports correctly. 13354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) { 133603505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 1337242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1338242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 133906b04ec4ab5f0366fa20b286588c63f74141ea11jiayl@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 13404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 13414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // The content_name known by the voice channel. 13424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string kVcName("vcname"); 1343d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 13444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 13454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 13474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 13484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 13494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 13504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a remote stream with a remote audio track and adds it to the stats. 1352d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<webrtc::MediaStream> remote_stream( 13534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::MediaStream::Create("remotestreamlabel")); 1354d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> remote_track( 1355d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kRemoteTrackId)); 13564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 135701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 13584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org remote_stream->AddTrack(remote_track); 13594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(remote_stream); 13604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Instruct the session to return stats containing the transport channel. 13624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitSessionStats(kVcName); 13634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 13644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 13654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 13664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 13684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 13694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Some of the contents in |voice_sender_info| needs to be updated from the 13714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |audio_track_|. 13724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 13734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 13754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 13764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 13784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceMediaInfo stats_read; 13794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.senders.push_back(voice_sender_info); 13804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 13814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 13834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 13844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 13854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 13864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 13874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; // returned values. 13894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the local track. 13924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(audio_track_.get(), &reports); 13934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 13944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 13954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 13964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 13974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 13984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 13994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 14004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 14014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the remote track. 1402730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org reports.clear(); 14034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(remote_track.get(), &reports); 14044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_report = FindNthReportByType(reports, 14054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeSsrc, 1); 14064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 14074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_id = ExtractSsrcStatsValue(reports, 14084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsValueNameTrackId); 14094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 14104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info); 14114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 14124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 141301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// This test verifies that when two outgoing audio tracks are using the same 141401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// ssrc at different times, they populate stats reports correctly. 141501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// TODO(xians): Figure out if it is possible to encapsulate the setup and 141601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org// avoid duplication of code in test cases. 141701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.orgTEST_F(StatsCollectorTest, TwoLocalTracksWithSameSsrc) { 141803505bcb7a369add7abfe306004e7803ab096f21tommi@webrtc.org webrtc::StatsCollector stats(&session_); // Implementation under test. 1419242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org // Ignore unused callback (logspam). 1420242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org EXPECT_CALL(session_, GetTransport(_)) 1421242068d58cc01640aa9f733fa67f078fc65c4ae5tommi@webrtc.org .WillRepeatedly(Return(static_cast<cricket::Transport*>(NULL))); 142201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 142301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // The content_name known by the voice channel. 142401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org const std::string kVcName("vcname"); 1425d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org cricket::VoiceChannel voice_channel(rtc::Thread::Current(), 142601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 142701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 142801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 142901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org AddOutgoingAudioTrackStats(); 143001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddStream(stream_); 143101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(audio_track_, kSsrcOfTrack); 143201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 143301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 143401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org voice_sender_info.add_ssrc(kSsrcOfTrack); 143501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 143601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo stats_read; 143701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org StatsReports reports; // returned values. 143801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 143901bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org audio_track_.get(), stream_.get(), &stats, &voice_channel, kVcName, 144001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &voice_sender_info, NULL, &stats_read, &reports); 144101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 144201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Remove the previous audio track from the stream. 144301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->RemoveTrack(audio_track_.get()); 144401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 144501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 144601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org // Create a new audio track and adds it to the stream and stats. 144701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org static const std::string kNewTrackId = "new_track_id"; 1448d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org rtc::scoped_refptr<FakeAudioTrack> new_audio_track( 1449d4e598d57aed714a599444a7eab5e8fdde52a950buildbot@webrtc.org new rtc::RefCountedObject<FakeAudioTrack>(kNewTrackId)); 145001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 145101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNewTrackId), Return(true))); 145201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stream_->AddTrack(new_audio_track); 145301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 145401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.AddLocalAudioTrack(new_audio_track, kSsrcOfTrack); 145501bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org stats.ClearUpdateStatsCache(); 145601bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceSenderInfo new_voice_sender_info; 145701bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org InitVoiceSenderInfo(&new_voice_sender_info); 145801bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org cricket::VoiceMediaInfo new_stats_read; 1459730bf30da75514f22fc1869a93e130e582a8e045tommi@webrtc.org reports.clear(); 146001bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org SetupAndVerifyAudioTrackStats( 146101bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org new_audio_track.get(), stream_.get(), &stats, &voice_channel, kVcName, 146201bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org media_channel, &new_voice_sender_info, NULL, &new_stats_read, &reports); 146301bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org} 146401bda2068bebb65a610c0d951f938db5dd028394xians@webrtc.org 146528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace 1466