statscollector_unittest.cc revision 5bc25c41fc7880545052770dbcfe67f233c9b0c0
128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org/* 228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * libjingle 328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer. 928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 1028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 1128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * and/or other materials provided with the distribution. 1228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 1328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * derived from this software without specific prior written permission. 1428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * 1528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 1628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 1728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 1828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 1928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 2028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 2128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 2228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 2328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 2428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org */ 2628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include <stdio.h> 2828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/statscollector.h" 3028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 3128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/mediastream.h" 3228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h" 334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org#include "talk/base/base64.h" 344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org#include "talk/base/fakesslidentity.h" 3528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/gunit.h" 3628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h" 3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/devices/fakedevicemanager.h" 3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/p2p/base/fakesession.h" 3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/channelmanager.h" 4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "testing/base/public/gmock.h" 4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_; 4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll; 4428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return; 4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull; 4628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee; 4728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket { 4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager; 5128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeDeviceManager; 5228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace cricket 5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace { 5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values 5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND"; 5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNoReports[] = "NO REPORTS"; 6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 6197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Constant names for track identification. 6297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst char kTrackId[] = "somename"; 6397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst uint32 kSsrcOfTrack = 1234; 6497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession { 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org explicit MockWebRtcSession(cricket::ChannelManager* channel_manager) 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : WebRtcSession(channel_manager, talk_base::Thread::Current(), 694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::Thread::Current(), NULL, NULL) { 7028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD0(video_channel, cricket::VideoChannel*()); 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD2(GetTrackIdBySsrc, bool(uint32, std::string*)); 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::SessionStats*)); 744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org MOCK_METHOD1(GetTransport, cricket::Transport*(const std::string&)); 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel { 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel() 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : cricket::FakeVideoMediaChannel(NULL) { 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // MOCK_METHOD0(transport_channel, cricket::TransportChannel*()); 8328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VideoMediaInfo*)); 8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgbool GetValue(const webrtc::StatsReport* report, 874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& name, 884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::Values::const_iterator it = report->values.begin(); 904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org for (; it != report->values.end(); ++it) { 914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (it->name == name) { 924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org *value = it->value; 934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return true; 944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return false; 974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractStatsValue(const std::string& type, 1004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const webrtc::StatsReports& reports, 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string name) { 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports.empty()) { 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNoReports; 10428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 10628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].type != type) 10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org continue; 1084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (GetValue(&reports[i], name, &ret)) { 1104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 11128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 11328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 11528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 11628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 11828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 1194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgconst webrtc::StatsReport* FindNthReportByType( 1204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const webrtc::StatsReports& reports, const std::string& type, int n) { 12128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].type == type) { 12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return &reports[i]; 12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 12928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 13028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgconst webrtc::StatsReport* FindReportById(const webrtc::StatsReports& reports, 13228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& id) { 13328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].id == id) { 13528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return &reports[i]; 13628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractSsrcStatsValue(webrtc::StatsReports reports, 14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& name) { 14328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsReportTypeSsrc, reports, name); 14528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 14628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractBweStatsValue(webrtc::StatsReports reports, 14828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& name) { 14928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 15028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsReportTypeBwe, reports, name); 15128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 15228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 1544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return talk_base::SSLIdentity::DerToPem( 1554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::kPemTypeCertificate, 1564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 1574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 1584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 1614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 1624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 1634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 1644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 1654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgvoid CheckCertChainReports(const webrtc::StatsReports& reports, 1684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 1694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& start_id) { 1704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string certificate_id = start_id; 1714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 1724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 1734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const webrtc::StatsReport* report = FindReportById(reports, certificate_id); 1744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 17519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 1764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 1774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 1784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org report, webrtc::StatsReport::kStatsValueNameDer, &der_base64)); 1794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der = talk_base::Base64::Decode(der_base64, 1804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::Base64::DO_STRICT); 1814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 18219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 18319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 18419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 18519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 18619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org webrtc::StatsReport::kStatsValueNameFingerprintAlgorithm, 18719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 18819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 18919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string sha_1_str = talk_base::DIGEST_SHA_1; 19019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 19119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 19219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string dummy_fingerprint; // Value is not checked. 19319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 19419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 19519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org webrtc::StatsReport::kStatsValueNameFingerprint, 19619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &dummy_fingerprint)); 19719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 1984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 1994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (!GetValue( 2004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org report, webrtc::StatsReport::kStatsValueNameIssuerId, &certificate_id)) 2014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 2024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 2034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 2044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : media_engine_(new cricket::FakeMediaEngine), 21028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_manager_( 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::ChannelManager(media_engine_, 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::FakeDeviceManager(), 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::Thread::Current())), 21497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_(channel_manager_.get()), 21597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org track_id_(kTrackId) { 21628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 21728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false)); 21828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 22097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // This creates a standard setup with a transport called "trspname" 22197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // having one transport channel 22297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and the specified virtual connection name. 22397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org void InitSessionStats(const std::string vc_name) { 22497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kTransportName("trspname"); 22597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportStats transport_stats; 22697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::TransportChannelStats channel_stats; 22797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org channel_stats.component = 1; 22897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.content_name = kTransportName; 22997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 23097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 23197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.transport_stats[kTransportName] = transport_stats; 23297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org session_stats_.proxy_to_transport[vc_name] = kTransportName; 23397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 23497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 23597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Adds a track with a given SSRC into the stats. 23697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org void AddVideoTrackStats() { 23797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_ = webrtc::MediaStream::Create("streamlabel"); 23897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org track_= webrtc::VideoTrack::Create(kTrackId, NULL); 23997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stream_->AddTrack(track_); 24097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) 24197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<1>(track_id_), 24297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 24397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org } 24497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 2454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org void TestCertificateReports(const talk_base::FakeSSLCertificate& local_cert, 2464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 2474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const talk_base::FakeSSLCertificate& remote_cert, 2484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 2494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 2504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReports reports; // returned values. 2514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 2524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 2544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 2554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 2564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 2584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 2594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 2604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 2624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 2644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 2664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLIdentity local_identity(local_cert); 2674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<talk_base::FakeSSLCertificate> remote_cert_copy( 2684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 2694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 2714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<cricket::FakeTransport> transport( 2724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 2734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 2744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 2754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 2764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 2774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 2784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 2794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 2804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 2814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 2824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 2844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 2854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(Return(transport.get())); 2864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 2874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 2884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 2894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, video_channel()) 2904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillRepeatedly(ReturnNull()); 2914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.UpdateStats(); 2934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 2954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const webrtc::StatsReport* channel_report = FindNthReportByType( 2974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeComponent, 1); 2984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 2994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 3014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 3024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 3034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 3044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameLocalCertificateId); 3054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 3064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org CheckCertChainReports(reports, local_ders, local_certificate_id); 3074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 3084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 3094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 3104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 3114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 3124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameRemoteCertificateId); 3134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 3144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org CheckCertChainReports(reports, remote_ders, remote_certificate_id); 3154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 31697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 31728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 31828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_; 31928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 32097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SessionStats session_stats_; 32197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> stream_; 32297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org talk_base::scoped_refptr<webrtc::VideoTrack> track_; 32397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org std::string track_id_; 32428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 32528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 32628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 32728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 32828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 32928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 33028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 33128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 33228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; // returned values. 33328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 33428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 33528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 33628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 33728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 33828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 33928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 34097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 34197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 34228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 34328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 3445bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 34528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 34628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 34728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 34828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 34928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(Return(&video_channel)); 35028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 35128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 35228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 35328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 35428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 35528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); 35628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 35728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 35828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 35928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 36028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 36128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 36228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 36328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 36428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 36528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; // returned values. 36628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 36728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 36828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 36928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 37028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 37128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 37228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 37328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 37497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 37597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 37628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 37728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 3785bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 37928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 38028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 38128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 38228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 38328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 38428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 38528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 38628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 38728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 38828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(Return(&video_channel)); 38928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 39028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 39128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 39297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 39328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 39428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 39528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); 39628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 39728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org result = ExtractBweStatsValue(reports, "googTargetEncBitrate"); 39828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 39928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 40028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 40128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 40228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 40328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 40428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 40528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; // returned values. 40628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 40728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 40828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(ReturnNull()); 40928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 41028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 41128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const webrtc::StatsReport* session_report = FindNthReportByType( 41228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeSession, 1); 41328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 41428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 41528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 41628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 41728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 41828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 41928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 42028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; // returned values. 42128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 42228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 42328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(ReturnNull()); 42428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 42528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 42628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 42728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const webrtc::StatsReport* session_report = FindNthReportByType( 42828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeSession, 1); 42928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 43028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 43128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeSession, 2); 43228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 43328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 43428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 43528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 43628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 43728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 43828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 43928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 44028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 44128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 44297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 44397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 44428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 44528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 44628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 44728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; 44828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 44928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 45028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 45128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 45228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(std::string(webrtc::StatsReport::kStatsReportTypeTrack), 45328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports[0].type); 45428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 45528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 45628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ExtractStatsValue(webrtc::StatsReport::kStatsReportTypeTrack, 45728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 45828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsValueNameTrackId); 45928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTrackId, trackValue); 46028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 46128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 46228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 46328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 46428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 46528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 46628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 46728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 46828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 46997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 47097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 47128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 47328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; 47528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 47728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 47828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 48128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 4825bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 48328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 48628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 48728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(Return(&video_channel)); 48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 49497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 49597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 49697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 49728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const webrtc::StatsReport* track_report = FindNthReportByType( 49828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeTrack, 1); 49928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(track_report == NULL); 50028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(track_, &reports); 50297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // |reports| should contain at least one session report, one track report, 50397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // and one ssrc report. 50497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_LE((size_t)3, reports.size()); 50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 50628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeTrack, 1); 50728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(track_report == NULL); 50828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsValueNameSsrc); 51128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 51428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsValueNameTrackId); 51528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTrackId, track_id); 51628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 51728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 52028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 52128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 52228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 52328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 52428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 52528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 52628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 52797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 52897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 52928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 53128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; 53328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 53528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 53628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 53728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 53828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 5405bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(1234); 54128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 54228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 54328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 54428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 54528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(Return(&video_channel)); 54628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 54728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 54828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 54928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 55097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 55128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 55297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 55328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 55428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 55528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 55628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 55728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 55828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsReportTypeSsrc, 55928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 56028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsValueNameTransportId); 56128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 56228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const webrtc::StatsReport* transport_report = FindReportById(reports, 56328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org transport_id); 56428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 56528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 56628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 56797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for 56897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned. 56997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) { 57097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 57197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 57297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 57397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 57497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 57597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 57697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 57797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 57897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 57997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.set_session(&session_); 58097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 58197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, video_channel()) 58297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org .WillRepeatedly(ReturnNull()); 58397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 58497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.UpdateStats(); 58597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsReports reports; 58697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 58797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const webrtc::StatsReport* remote_report = FindNthReportByType(reports, 58897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsReport::kStatsReportTypeRemoteSsrc, 1); 58997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_TRUE(remote_report == NULL); 59097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 59197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 59297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for 59397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned. 59497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) { 59597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 59697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 59797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // The content_name known by the video channel. 59897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const std::string kVcName("vcname"); 59997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 60097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 60197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org AddVideoTrackStats(); 60297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.AddStream(stream_); 60397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 60497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.set_session(&session_); 60597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 60697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsReports reports; 60797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 60897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Instruct the session to return stats containing the transport channel. 60997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org InitSessionStats(kVcName); 61097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 61197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_), 61297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 61397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 61497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org // Constructs an ssrc stats update. 61597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoMediaInfo stats_read; 61697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 61797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::SsrcReceiverInfo remote_ssrc_stats; 61897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.timestamp = 12345.678; 61997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org remote_ssrc_stats.ssrc = kSsrcOfTrack; 62097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org cricket::VideoSenderInfo video_sender_info; 6215bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org video_sender_info.add_ssrc(kSsrcOfTrack); 62297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org video_sender_info.remote_stats.push_back(remote_ssrc_stats); 62397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats_read.senders.push_back(video_sender_info); 62497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 62597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(session_, video_channel()) 62697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org .WillRepeatedly(Return(&video_channel)); 62797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 62897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 62997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org Return(true))); 63097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 63197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.UpdateStats(); 63297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org stats.GetStats(NULL, &reports); 63397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org const webrtc::StatsReport* remote_report = FindNthReportByType(reports, 63497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org webrtc::StatsReport::kStatsReportTypeRemoteSsrc, 1); 63597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_FALSE(remote_report == NULL); 63697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org EXPECT_NE(0, remote_report->timestamp); 63797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org} 63897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 6394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 6404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 64119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 6424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 6434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 6444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 6454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 6464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 6474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 6484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 6494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate local_cert(DersToPems(local_ders)); 6504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 6524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 6534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 6544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 6554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 6564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 6574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 6584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 6604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 6614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 6634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 66419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 6654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 6664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 6674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate local_cert(DerToPem(local_der)); 6684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 6704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 6714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 6724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 6744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 6754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 6764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 6784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 67919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 6804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 6814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReports reports; // returned values. 6824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 6834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 6874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 6894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 6904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 6934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 6944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 6974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 6984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(ReturnNull()); 6994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 7004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 7014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 70297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org 7034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, video_channel()) 7044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillRepeatedly(ReturnNull()); 7054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.UpdateStats(); 7074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 7084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 7104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 7114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 7124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 7134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameLocalCertificateId); 7144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 7154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 7174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 7184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 7194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 7204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameRemoteCertificateId); 7214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 7224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 7234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 7254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 72619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 7274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 7284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReports reports; // returned values. 7294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 7304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 7324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 7334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 7344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 7364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 7374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 7384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 7404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 7414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 7424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 7444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<cricket::FakeTransport> transport( 7454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 7464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 7474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 7484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 7494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 7514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 7524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(Return(transport.get())); 7534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 7544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 7554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 7564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, video_channel()) 7574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillRepeatedly(ReturnNull()); 7584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.UpdateStats(); 7604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 7614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 7634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 7644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 7654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 7664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameLocalCertificateId); 7674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 7684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 7704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 7714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 7724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 7734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameRemoteCertificateId); 7744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 7754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 7764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 77728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace 778