statscollector_unittest.cc revision 7e71b77f8aab5b7a6f2b669c16f90ec9a4b4609c
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" 364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org#include "talk/base/base64.h" 374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org#include "talk/base/fakesslidentity.h" 3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/gunit.h" 3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h" 4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/devices/fakedevicemanager.h" 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/p2p/base/fakesession.h" 4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/channelmanager.h" 434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gmock/include/gmock/gmock.h" 444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org#include "testing/gtest/include/gtest/gtest.h" 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) 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : WebRtcSession(channel_manager, talk_base::Thread::Current(), 794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::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), 12940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org processor_(new talk_base::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 } 142b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org virtual talk_base::scoped_refptr<webrtc::AudioProcessorInterface> 143b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org GetAudioProcessor() OVERRIDE { 144b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org return processor_; 14540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 14640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 14740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private: 14840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org talk_base::scoped_refptr<FakeAudioProcessor> processor_; 14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}; 15040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 15140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report, 1524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& 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, 16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string 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) { 17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].type != type) 17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org continue; 1734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1744551b793dea4b5451cbfa13b206b6d11a25081d0wu@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) { 18728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].type == type) { 18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 19028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@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) { 19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].id == id) { 20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@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, 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& 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, 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& 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) { 2194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return talk_base::SSLIdentity::DerToPem( 2204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::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)); 2444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der = talk_base::Base64::Decode(der_base64, 2454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::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. 25419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string sha_1_str = talk_base::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)); 2774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<int>(info.audio_level), value_in_report); 2783e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2793e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameBytesReceived, &value_in_report)); 2804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<int64>(info.bytes_rcvd), value_in_report); 2813e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2823e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 2834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<int>(info.jitter_ms), value_in_report); 2843e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2853e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameJitterBufferMs, &value_in_report)); 2864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::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)); 2904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::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)); 2944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<int>(info.delay_estimate_ms), value_in_report); 2953e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2963e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameExpandRate, &value_in_report)); 2974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<float>(info.expand_rate), value_in_report); 2983e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 2993e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNamePacketsReceived, &value_in_report)); 3004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<int>(info.packets_rcvd), value_in_report); 3013e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3023e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCTSG, &value_in_report)); 3034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::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)); 3074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::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)); 3114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<int>(info.decoding_normal), value_in_report); 3123e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3133e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLC, &value_in_report)); 3144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<int>(info.decoding_plc), value_in_report); 3153e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3163e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingCNG, &value_in_report)); 3174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<int>(info.decoding_cng), value_in_report); 3183e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_TRUE(GetValue( 3193e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org report, StatsReport::kStatsValueNameDecodingPLCCNG, &value_in_report)); 3204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::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)); 33440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int64>(sinfo.bytes_sent), value_in_report); 33540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 33640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNamePacketsSent, &value_in_report)); 33740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.packets_sent), value_in_report); 33840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 339ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org report, StatsReport::kStatsValueNamePacketsLost, &value_in_report)); 340ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.packets_lost), value_in_report); 341ffe2620c97c2b7bfe42b04453b5a981dbf1e5f06henrike@webrtc.org EXPECT_TRUE(GetValue( 34240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 34340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.rtt_ms), value_in_report); 34440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 34540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameRtt, &value_in_report)); 34640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<int>(sinfo.rtt_ms), value_in_report); 34740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 34840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameJitterReceived, &value_in_report)); 34940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::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)); 35340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<float>(sinfo.aec_quality_min), value_in_report); 35440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_TRUE(GetValue( 35540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report)); 35640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::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)); 36040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::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)); 36440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::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)); 36940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::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)); 37340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::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() 43628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@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(), 44028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::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 44697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 44797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 44897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 44997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org void InitSessionStats(const std::string vc_name) { 45097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 45197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 45297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 45397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 45497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.content_name = kTransportName; 45597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 45697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 45797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 45897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 45997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 46097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 4614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing video track with a given SSRC into the stats. 4624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingVideoTrackStats() { 46397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 4644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_= webrtc::VideoTrack::Create(kLocalTrackId, NULL); 46597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 4664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 4674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), Return(true))); 4684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 4694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(Return(false)); 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_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 4784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(Return(false)); 4794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 4804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), 4814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 4824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 4834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a outgoing audio track with a given SSRC into the stats. 4854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddOutgoingAudioTrackStats() { 48640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org if (stream_ == NULL) 48740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 48840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 4894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track_ = new talk_base::RefCountedObject<FakeAudioTrack>( 4904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kLocalTrackId); 49140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stream_->AddTrack(audio_track_); 4924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 4934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kLocalTrackId), 49440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 4954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 4964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(Return(false)); 4974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org } 4984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 4994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Adds a incoming audio track with a given SSRC into the stats. 5004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org void AddIncomingAudioTrackStats() { 5014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org if (stream_ == NULL) 5024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 5034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 5044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org audio_track_ = new talk_base::RefCountedObject<FakeAudioTrack>( 5054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org kRemoteTrackId); 5064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stream_->AddTrack(audio_track_); 5074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetLocalTrackIdBySsrc(kSsrcOfTrack, _)) 5084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(Return(false)); 5094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 5104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 51140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org } 51240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 5134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org void TestCertificateReports(const talk_base::FakeSSLCertificate& local_cert, 5144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 5154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const talk_base::FakeSSLCertificate& remote_cert, 5164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 5174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 51840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 5194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 5204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 5224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 5234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 5244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 5264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 5274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 5284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 5304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 5314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 5324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 5344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLIdentity local_identity(local_cert); 5354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<talk_base::FakeSSLCertificate> remote_cert_copy( 5364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 5374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 5394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<cricket::FakeTransport> transport( 5404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 5414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 5424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 5434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 5444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 5454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 5464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 5474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 5484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 5494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 5504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 5524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 5534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(Return(transport.get())); 5544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 5554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 5564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 55740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 55840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 5594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 560b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 5614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 5634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 56440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* channel_report = FindNthReportByType( 56540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeComponent, 1); 5664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 5674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 5694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 57040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 5714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 57240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 573b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (local_ders.size() > 0) { 574b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 575b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org CheckCertChainReports(reports, local_ders, local_certificate_id); 576b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 577b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, local_certificate_id); 578b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 5794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 5814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 58240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 5834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 58440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 585b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org if (remote_ders.size() > 0) { 586b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 587b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org CheckCertChainReports(reports, remote_ders, remote_certificate_id); 588b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } else { 589b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ(kNotFound, remote_certificate_id); 590b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org } 5914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 59297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 59328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 59428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_; 59528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 59697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SessionStats session_stats_; 59797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> stream_; 59897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org talk_base::scoped_refptr<webrtc::VideoTrack> track_; 5994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org talk_base::scoped_refptr<FakeAudioTrack> audio_track_; 60028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 60128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 60228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 60328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 60428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 6054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 60628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 60728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 60840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 60928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 61028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 61128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 61228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 61328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 61428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 61528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 6164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 61797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 61828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 61928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 6205bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 62128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 62228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 62328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 62440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 62540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 626b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 627b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 62828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 629b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 63028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 63128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); 63228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 63328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 63428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 63528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 63628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 63728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 6384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 63928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 64028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 64140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 64228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 64328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 64428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 64528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 64628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 64728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 64828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 64928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 6504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 65197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 65228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 65328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 6545bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 65528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 65628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 65728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 65828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 65928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 66028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 66128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 66228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 66340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 66440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 665b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 666b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 66728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 66897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 669b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 67028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 67128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); 67228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 67328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org result = ExtractBweStatsValue(reports, "googTargetEncBitrate"); 67428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 67528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 67628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 67728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 67828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 67928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 68028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 68140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 68228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 68340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 68440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 685b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 68628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 68740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 68840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 68928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 69028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 69128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 69228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 69328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 69428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 69528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 69640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 69728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 69840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 69940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 700b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 701b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 70228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 70340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* session_report = FindNthReportByType( 70440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 1); 70528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 70628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 70740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSession, 2); 70828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 70928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 71028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 71128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 71228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 71328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 71428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 7154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 71628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 71728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 7184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 71997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 72028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 72128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 72228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 72340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 72428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 72528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 72628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 72728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 72840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(std::string(StatsReport::kStatsReportTypeTrack), 72928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports[0].type); 73028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 73128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 73240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ExtractStatsValue(StatsReport::kStatsReportTypeTrack, 73328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 73440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 7354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, trackValue); 73628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 73728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 73828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 73928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 74028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 74128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 7424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 74328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 74428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 7454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 74697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 74728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 74828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 74928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 75040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 75128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 75228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 75328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 75428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 75528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 75628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 75728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 7585bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 75928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 76028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 76128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 76240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 76340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 764b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 765b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 76628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 76728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 768b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 76928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 77097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 77197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 77297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 77340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 77440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 7754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 77628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get report for the specific |track|. 77897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 77997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 78097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 78197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 78228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 78340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 7844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 78528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 78628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 78740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 78828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 78928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 79028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 79140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 7924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 79328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 79428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 79528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 79628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 79728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 79828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 7994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 80028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 80128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 80228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 80328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 8044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 80597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 80628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 80828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 80940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 81028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 81228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 81328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 81428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 81528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 81628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 8175bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 81828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 81928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 82028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 82240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 823b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 824b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 82528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 82628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 82797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 82828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 82940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 83040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 83128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 832b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 83328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 83428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 83540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeSsrc, 83628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 83740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTransportId); 83828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 83940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* transport_report = FindReportById(reports, 84040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org transport_id); 84128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 84228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 84328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 84497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 84597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 84697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 84797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 8484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 84997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 85097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 85197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 85297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 8534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 85497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 85597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 85697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.set_session(&session_); 85797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 85840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 85940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 86097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 861b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 86240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 86397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 86440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 86540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 86697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 86797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 86897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 86997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 87097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 87197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 87297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 8734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 87497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 87597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 87697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 87797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 8784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingVideoTrackStats(); 87997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 88097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 88197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.set_session(&session_); 88297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 88340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; 88497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 88597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 88697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 88797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 88840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 88940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 89097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 89197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 89297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 89397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 89497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 89597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 89697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 89797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 8985bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 89997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 90097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 90197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 90240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 90340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 904b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 905b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read), 90697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 90797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 908b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 90997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 9104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 91140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 91240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 91397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 91497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_NE(0, remote_report->timestamp); 91597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 91697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 9174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that the empty track report exists in the returned stats 9184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 9194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, ReportsFromRemoteTrack) { 9204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 9214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 9224cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 9234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 9244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingVideoTrackStats(); 9254cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 9264cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9274cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.set_session(&session_); 9284cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9294cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; 9304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 9324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoReceiverInfo video_receiver_info; 9334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VideoMediaInfo stats_read; 9344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const int64 kNumOfPacketsConcealed = 54321; 9354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9364cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Construct a stats value to read. 9374cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.add_ssrc(1234); 9384cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org video_receiver_info.packets_concealed = kNumOfPacketsConcealed; 9394cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(video_receiver_info); 9404cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9414cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel)); 9424cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 9434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_, _)) 9444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 9454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 9464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 9484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(NULL, &reports); 9494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |reports| should contain at least one session report, one track report, 9504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // and one ssrc report. 9514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_LE(static_cast<size_t>(3), reports.size()); 9524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 9534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeTrack, 1); 9544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 9554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 9574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 9584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 9594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 9614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 9624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 9634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 9644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 9654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 9664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 96719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 9684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 9694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 9704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 9714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 9724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 9734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 9744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 9754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate local_cert(DersToPems(local_ders)); 9764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 9774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 9784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 9794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 9804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 9814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 9824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 9834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 9844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 9854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 9864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 9874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 9884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 9894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 99019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 9914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 9924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 9934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate local_cert(DerToPem(local_der)); 9944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 9954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 9964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 9974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 9984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 9994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 10004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 10014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 10024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 10044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 100519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 10064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 100740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 10084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 10094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 10114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 10124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 10134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 10154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 10164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 10174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 10194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 10204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 10214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 10234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 10244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(ReturnNull()); 10254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 10264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 10274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 102897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 102940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 103040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 10314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1032b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 10334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 10344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 10364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 103740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 10384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 103940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 10404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 10414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 10434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 104440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 10454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 104640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 10474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 10484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 10494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 10514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 105219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 10534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 105440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 10554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 10564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 10584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 10594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 10604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 10624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 10634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 10644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 10664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 10674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 10684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 10704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<cricket::FakeTransport> transport( 10714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 10724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 10734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 10744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 10754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 10774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 10784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(Return(transport.get())); 10794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 10804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 10814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 108240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 108340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 10844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1085b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 10864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 10874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 10894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 109040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 10914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 109240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameLocalCertificateId); 10934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 10944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 10954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 10964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 109740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsReportTypeComponent, 10984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 109940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameRemoteCertificateId); 11004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 11014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 11024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1103b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest 1104b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored. 1105b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) { 1106b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a local certificate. 1107b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string local_der = "This is the local der."; 1108b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org talk_base::FakeSSLCertificate local_cert(DerToPem(local_der)); 1109b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1110b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org // Build a remote certificate with an unsupported digest algorithm. 1111b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string remote_der = "This is somebody else's der."; 1112b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 1113b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert.set_digest_algorithm("foobar"); 1114b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1115b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 1116b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org remote_cert, std::vector<std::string>()); 1117b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1118b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1119b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// Verifies the correct optons are passed to the VideoMediaChannel when using 1120b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// verbose output level. 1121b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, StatsOutputLevelVerbose) { 1122b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 11234cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel(); 1124b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 1125b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 1126b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.set_session(&session_); 1127b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 112840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 1129b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::VideoMediaInfo stats_read; 1130b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org cricket::BandwidthEstimationInfo bwe; 1131b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.total_received_propagation_delta_ms = 10; 1132b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(100); 1133b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_propagation_delta_ms.push_back(200); 1134b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(1000); 1135b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org bwe.recent_received_packet_group_arrival_time_ms.push_back(2000); 1136b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats_read.bw_estimations.push_back(bwe); 1137b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1138b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(session_, video_channel()) 1139b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillRepeatedly(Return(&video_channel)); 114040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull()); 1141b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1142b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org StatsOptions options; 1143b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org options.include_received_propagation_stats = true; 1144b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_CALL(*media_channel, GetStats( 1145b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Field(&StatsOptions::include_received_propagation_stats, true), 1146b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org _)) 1147b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(stats_read), 1148b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org Return(true))); 1149b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 1150b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelDebug); 1151b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org stats.GetStats(NULL, &reports); 1152b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org std::string result = ExtractBweStatsValue( 1153b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org reports, "googReceivedPacketGroupPropagationDeltaSumDebug"); 1154b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("10", result); 1155b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 1156b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org reports, "googReceivedPacketGroupPropagationDeltaDebug"); 1157b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[100, 200]", result); 1158b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org result = ExtractBweStatsValue( 1159b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org reports, "googReceivedPacketGroupArrivalTimeDebug"); 1160b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org EXPECT_EQ("[1000, 2000]", result); 1161b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org} 1162b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org 116340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via 116440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method. 116540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) { 116640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 116740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 116840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 116940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 117040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceChannel voice_channel(talk_base::Thread::Current(), 117140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 11724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 117340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 117440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 117540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 117640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.set_session(&session_); 117740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 117840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 117940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 118040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 118140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 118240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 118340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 118440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 11854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 118640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 118740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 118840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 118940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 119040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 119140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 119240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 119340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 119440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 119540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 119640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 119740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 119840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 119940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 120040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 120140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verfy the existence of the track report. 120240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 120340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 120440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 120540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 120640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 12074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 120840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 120940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 121040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 121140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 121240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report. 12134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 121440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 121540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 121640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verify we get the same result by passing a track to GetStats(). 121740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports track_reports; // returned values. 121840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(audio_track_.get(), &track_reports); 121940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* track_report = FindNthReportByType( 122040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org track_reports, StatsReport::kStatsReportTypeSsrc, 1); 12214cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 122240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org track_id = ExtractSsrcStatsValue(track_reports, 122340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameTrackId); 12244cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 122540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org ssrc_id = ExtractSsrcStatsValue(track_reports, 122640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReport::kStatsValueNameSsrc); 122740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 122840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 122940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 12304cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify that there is no remote report for the local audio track because 12314cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // we did not set it up. 12324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* remote_report = FindNthReportByType(reports, 12334cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeRemoteSsrc, 1); 12344cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(remote_report == NULL); 12354cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 12363e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12373e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// This test verifies that audio receive streams populate stats reports 12383e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org// correctly. 12393e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromRemoteStream) { 12403e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 12413e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 12423e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org // The content_name known by the voice channel. 12433e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const std::string kVcName("vcname"); 12443e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceChannel voice_channel(talk_base::Thread::Current(), 12453e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 12464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddIncomingAudioTrackStats(); 12473e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.AddStream(stream_); 12483e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12493e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.set_session(&session_); 12503e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12513e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org // Instruct the session to return stats containing the transport channel. 12523e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org InitSessionStats(kVcName); 12533e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_CALL(session_, GetStats(_)) 12543e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 12553e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org Return(true))); 12563e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12573e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 12584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 12597e71b77f8aab5b7a6f2b669c16f90ec9a4b4609cbuildbot@webrtc.org voice_receiver_info.codec_name = "fake_codec"; 12603e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12613e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org // Constructs an ssrc stats update. 12623e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org cricket::VoiceMediaInfo stats_read; 12633e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 12643e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12653e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 12663e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 12673e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 12683e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 12693e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org Return(true))); 12703e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12713e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org StatsReports reports; // returned values. 12723e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 12733e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org stats.GetStats(NULL, &reports); 12743e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 12754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify the track id is |kRemoteTrackId|. 12764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string track_id = ExtractSsrcStatsValue( 12774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 12784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 12794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 12804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Verify the report for this remote track. 12813e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org const StatsReport* report = FindNthReportByType( 12823e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 12833e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org EXPECT_FALSE(report == NULL); 12843e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org VerifyVoiceReceiverInfoReport(report, voice_receiver_info); 12853e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org} 12863e01e0b16cbde481241b9bcfdbbdd591cd920b99buildbot@webrtc.org 128740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics 128840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call. 128940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) { 129040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 129140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 129240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The content_name known by the voice channel. 129340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const std::string kVcName("vcname"); 129440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceChannel voice_channel(talk_base::Thread::Current(), 129540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 12964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 129740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddStream(stream_); 129840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 129940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 130040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.set_session(&session_); 130140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 130240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 130340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org InitSessionStats(kVcName); 130440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 130540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 130640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 130740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 130840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 130940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 13104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 131140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 131240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Constructs an ssrc stats update. 131340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org cricket::VoiceMediaInfo stats_read; 131440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats_read.senders.push_back(voice_sender_info); 131540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 131640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 131740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 131840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 131940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 132040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org Return(true))); 132140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 132240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org StatsReports reports; // returned values. 132340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 132440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org stats.GetStats(NULL, &reports); 132540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 132640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // The report will exist since we don't remove them in RemoveStream(). 132740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org const StatsReport* report = FindNthReportByType( 132840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 132940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_FALSE(report == NULL); 133040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 133140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 13324cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 133340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 133440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org reports, StatsReport::kStatsValueNameSsrc); 133540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 133640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 133740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // Verifies the values in the track report, no value will be changed by the 133840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioTrackInterface::GetSignalValue() and 133940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org // AudioProcessorInterface::AudioProcessorStats::GetStats(); 134040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org VerifyVoiceSenderInfoReport(report, voice_sender_info); 134140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org} 134240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org 13434cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// This test verifies that when ongoing and incoming audio tracks are using 13444cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org// the same ssrc, they populate stats reports correctly. 13454cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.orgTEST_F(StatsCollectorTest, LocalAndRemoteTracksWithSameSsrc) { 13464cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 13474cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel(); 13484cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // The content_name known by the voice channel. 13494cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const std::string kVcName("vcname"); 13504cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceChannel voice_channel(talk_base::Thread::Current(), 13514cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org media_engine_, media_channel, &session_, kVcName, false); 13524cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13534cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a local stream with a local audio track and adds it to the stats. 13544cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org AddOutgoingAudioTrackStats(); 13554cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(stream_); 13564cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack); 13574cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13584cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Create a remote stream with a remote audio track and adds it to the stats. 13594cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> remote_stream( 13604cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org webrtc::MediaStream::Create("remotestreamlabel")); 13614cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org talk_base::scoped_refptr<FakeAudioTrack> remote_track( 13624cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org new talk_base::RefCountedObject<FakeAudioTrack>(kRemoteTrackId)); 13634cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetRemoteTrackIdBySsrc(kSsrcOfTrack, _)) 13644cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(kRemoteTrackId), Return(true))); 13654cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org remote_stream->AddTrack(remote_track); 13664cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.AddStream(remote_stream); 13674cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13684cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.set_session(&session_); 13694cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13704cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Instruct the session to return stats containing the transport channel. 13714cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitSessionStats(kVcName); 13724cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, GetStats(_)) 13734cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 13744cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 13754cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13764cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceSenderInfo voice_sender_info; 13774cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceSenderInfo(&voice_sender_info); 13784cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13794cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Some of the contents in |voice_sender_info| needs to be updated from the 13804cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // |audio_track_|. 13814cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org UpdateVoiceSenderInfoFromAudioTrack(audio_track_.get(), &voice_sender_info); 13824cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13834cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceReceiverInfo voice_receiver_info; 13844cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org InitVoiceReceiverInfo(&voice_receiver_info); 13854cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13864cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Constructs an ssrc stats update. 13874cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org cricket::VoiceMediaInfo stats_read; 13884cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.senders.push_back(voice_sender_info); 13894cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats_read.receivers.push_back(voice_receiver_info); 13904cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13914cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel)); 13924cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull()); 13934cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 13944cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 13954cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org Return(true))); 13964cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 13974cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReports reports; // returned values. 13984cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard); 13994cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 14004cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the local track. 14014cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(audio_track_.get(), &reports); 14024cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org const StatsReport* track_report = FindNthReportByType( 14034cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsReportTypeSsrc, 1); 14044cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 14054cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org std::string track_id = ExtractSsrcStatsValue( 14064cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org reports, StatsReport::kStatsValueNameTrackId); 14074cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kLocalTrackId, track_id); 14084cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceSenderInfoReport(track_report, voice_sender_info); 14094cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 14104cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org // Get stats for the remote track. 14114cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org stats.GetStats(remote_track.get(), &reports); 14124cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_report = FindNthReportByType(reports, 14134cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsReportTypeSsrc, 1); 14144cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_TRUE(track_report); 14154cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org track_id = ExtractSsrcStatsValue(reports, 14164cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org StatsReport::kStatsValueNameTrackId); 14174cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org EXPECT_EQ(kRemoteTrackId, track_id); 14184cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org VerifyVoiceReceiverInfoReport(track_report, voice_receiver_info); 14194cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org} 14204cb012858f7461015e405c0c2cfc4b9f10a086cexians@webrtc.org 142128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace 1422