statscollector_unittest.cc revision 19f27e6a24f877fc2b0409a94b02d5f40ba3dc8c
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 6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession { 6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org explicit MockWebRtcSession(cricket::ChannelManager* channel_manager) 6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : WebRtcSession(channel_manager, talk_base::Thread::Current(), 654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::Thread::Current(), NULL, NULL) { 6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD0(video_channel, cricket::VideoChannel*()); 6828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD2(GetTrackIdBySsrc, bool(uint32, std::string*)); 6928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::SessionStats*)); 704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org MOCK_METHOD1(GetTransport, cricket::Transport*(const std::string&)); 7128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 7228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel { 7428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public: 7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel() 7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : cricket::FakeVideoMediaChannel(NULL) { 7728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // MOCK_METHOD0(transport_channel, cricket::TransportChannel*()); 7928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MOCK_METHOD1(GetStats, bool(cricket::VideoMediaInfo*)); 8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgbool GetValue(const webrtc::StatsReport* report, 834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& name, 844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string* value) { 854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::Values::const_iterator it = report->values.begin(); 864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org for (; it != report->values.end(); ++it) { 874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (it->name == name) { 884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org *value = it->value; 894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return true; 904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return false; 934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 9528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractStatsValue(const std::string& type, 964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const webrtc::StatsReports& reports, 9728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string name) { 9828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports.empty()) { 9928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNoReports; 10028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 10228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].type != type) 10328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org continue; 1044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string ret; 1054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (GetValue(&reports[i], name, &ret)) { 1064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return ret; 10728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 10928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return kNotFound; 11128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 11228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 11328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|. 11428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report. 1154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgconst webrtc::StatsReport* FindNthReportByType( 1164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const webrtc::StatsReports& reports, const std::string& type, int n) { 11728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 11828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].type == type) { 11928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org n--; 12028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (n == 0) 12128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return &reports[i]; 12228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 12428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 12528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 12628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgconst webrtc::StatsReport* FindReportById(const webrtc::StatsReports& reports, 12828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& id) { 12928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org for (size_t i = 0; i < reports.size(); ++i) { 13028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org if (reports[i].id == id) { 13128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return &reports[i]; 13228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 13428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return NULL; 13528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 13628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 13728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractSsrcStatsValue(webrtc::StatsReports reports, 13828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& name) { 13928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 14028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsReportTypeSsrc, reports, name); 14128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 14228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 14328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractBweStatsValue(webrtc::StatsReports reports, 14428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string& name) { 14528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org return ExtractStatsValue( 14628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsReportTypeBwe, reports, name); 14728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 14828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 1494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) { 1504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return talk_base::SSLIdentity::DerToPem( 1514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::kPemTypeCertificate, 1524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reinterpret_cast<const unsigned char*>(der.c_str()), 1534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org der.length()); 1544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems( 1574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders) { 1584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> pems(ders.size()); 1594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem); 1604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org return pems; 1614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 1624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 1634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgvoid CheckCertChainReports(const webrtc::StatsReports& reports, 1644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& ders, 1654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::string& start_id) { 1664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string certificate_id = start_id; 1674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org size_t i = 0; 1684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org while (true) { 1694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const webrtc::StatsReport* report = FindReportById(reports, certificate_id); 1704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_TRUE(report != NULL); 17119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 1724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der_base64; 1734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(GetValue( 1744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org report, webrtc::StatsReport::kStatsValueNameDer, &der_base64)); 1754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string der = talk_base::Base64::Decode(der_base64, 1764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::Base64::DO_STRICT); 1774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders[i], der); 17819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 17919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string fingerprint_algorithm; 18019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 18119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 18219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org webrtc::StatsReport::kStatsValueNameFingerprintAlgorithm, 18319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &fingerprint_algorithm)); 18419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org // The digest algorithm for a FakeSSLCertificate is always SHA-1. 18519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string sha_1_str = talk_base::DIGEST_SHA_1; 18619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_EQ(sha_1_str, fingerprint_algorithm); 18719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 18819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org std::string dummy_fingerprint; // Value is not checked. 18919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org EXPECT_TRUE(GetValue( 19019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org report, 19119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org webrtc::StatsReport::kStatsValueNameFingerprint, 19219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org &dummy_fingerprint)); 19319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org 1944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ++i; 1954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org if (!GetValue( 1964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org report, webrtc::StatsReport::kStatsValueNameIssuerId, &certificate_id)) 1974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org break; 1984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 1994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_EQ(ders.size(), i); 2004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 2014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test { 20328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected: 20428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org StatsCollectorTest() 20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org : media_engine_(new cricket::FakeMediaEngine), 20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_manager_( 20728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::ChannelManager(media_engine_, 20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org new cricket::FakeDeviceManager(), 20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::Thread::Current())), 21028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_(channel_manager_.get()) { 21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // By default, we ignore session GetStats calls. 21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false)); 21328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org } 21428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 2154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org void TestCertificateReports(const talk_base::FakeSSLCertificate& local_cert, 2164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& local_ders, 2174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const talk_base::FakeSSLCertificate& remote_cert, 2184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const std::vector<std::string>& remote_ders) { 2194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 2204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReports reports; // returned values. 2214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 2224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 2244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 2254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 2264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 2284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 2294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 2304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 2324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 2334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 2344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake certificates to report. 2364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLIdentity local_identity(local_cert); 2374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<talk_base::FakeSSLCertificate> remote_cert_copy( 2384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert.GetReference()); 2394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 2414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<cricket::FakeTransport> transport( 2424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 2434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 2444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 2454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 2464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->SetIdentity(&local_identity); 2474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::FakeTransportChannel* channel = 2484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org static_cast<cricket::FakeTransportChannel*>( 2494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport->CreateChannel(channel_stats.component)); 2504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_FALSE(channel == NULL); 2514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel->SetRemoteCertificate(remote_cert_copy.get()); 2524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 2544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 2554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(Return(transport.get())); 2564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 2574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 2584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 2594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, video_channel()) 2604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillRepeatedly(ReturnNull()); 2614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.UpdateStats(); 2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 2654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org const webrtc::StatsReport* channel_report = FindNthReportByType( 2674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeComponent, 1); 2684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_TRUE(channel_report != NULL); 2694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check local certificate chain. 2714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 2724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 2734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 2744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameLocalCertificateId); 2754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_NE(kNotFound, local_certificate_id); 2764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org CheckCertChainReports(reports, local_ders, local_certificate_id); 2774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 2784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check remote certificate chain. 2794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 2804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 2814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 2824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameRemoteCertificateId); 2834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_NE(kNotFound, remote_certificate_id); 2844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org CheckCertChainReports(reports, remote_ders, remote_certificate_id); 2854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org } 28628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::FakeMediaEngine* media_engine_; 28728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_; 28828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockWebRtcSession session_; 28928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}; 29028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 29128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully. 29228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) { 29328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 29428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 29528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 29628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 29728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; // returned values. 29828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 29928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 30028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const uint32 kSsrcOfTrack = 1234; 30128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kNameOfTrack("somename"); 30228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The number of bytes must be larger than 0xFFFFFFFF for this test. 30328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 30428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 30528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 30628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 30728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> stream( 30828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::MediaStream::Create("streamlabel")); 30928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(webrtc::VideoTrack::Create(kNameOfTrack, NULL)); 31028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.AddStream(stream); 31128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 31228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 31328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.ssrcs.push_back(1234); 31428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 31528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 31628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 31728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 31828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(Return(&video_channel)); 31928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 32028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 32128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 32228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) 32328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNameOfTrack), 32428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 32528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 32628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 32728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); 32828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 32928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 33028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 33128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats. 33228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) { 33328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 33428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 33528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 33628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 33728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; // returned values. 33828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 33928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 34028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Set up an SSRC just to test that we get both kinds of stats back: SSRC and 34128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // BWE. 34228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const uint32 kSsrcOfTrack = 1234; 34328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kNameOfTrack("somename"); 34428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 34528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kBytesSentString("12345678901234"); 34628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 34728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 34828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> stream( 34928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::MediaStream::Create("streamlabel")); 35028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(webrtc::VideoTrack::Create(kNameOfTrack, NULL)); 35128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.AddStream(stream); 35228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 35328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 35428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.ssrcs.push_back(1234); 35528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 35628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 35728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::BandwidthEstimationInfo bwe; 35828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int kTargetEncBitrate = 123456; 35928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTargetEncBitrateString("123456"); 36028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org bwe.target_enc_bitrate = kTargetEncBitrate; 36128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.bw_estimations.push_back(bwe); 36228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 36328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 36428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(Return(&video_channel)); 36528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 36628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 36728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 36828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) 36928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kNameOfTrack), 37028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 37128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 37228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 37328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string result = ExtractSsrcStatsValue(reports, "bytesSent"); 37428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kBytesSentString, result); 37528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org result = ExtractBweStatsValue(reports, "googTargetEncBitrate"); 37628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTargetEncBitrateString, result); 37728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 37828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 37928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always 38028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats. 38128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) { 38228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 38328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; // returned values. 38428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 38528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 38628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(ReturnNull()); 38728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 38828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 38928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const webrtc::StatsReport* session_report = FindNthReportByType( 39028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeSession, 1); 39128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 39228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 39328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 39428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists 39528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats. 39628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) { 39728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 39828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; // returned values. 39928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 40028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 40128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(ReturnNull()); 40228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 40328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 40428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 40528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const webrtc::StatsReport* session_report = FindNthReportByType( 40628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeSession, 1); 40728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(session_report == NULL); 40828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_report = FindNthReportByType( 40928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeSession, 2); 41028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(NULL, session_report); 41128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 41228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 41328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 41428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats. 41528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) { 41628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 41728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 41828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 41928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 42028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTrackId("somename"); 42128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> stream( 42228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::MediaStream::Create("streamlabel")); 42328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_refptr<webrtc::VideoTrack> track = 42428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::VideoTrack::Create(kTrackId, NULL); 42528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(track); 42628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.AddStream(stream); 42728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 42828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 42928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 43028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; 43128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 43228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Verfies the existence of the track report. 43328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 43428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)1, reports.size()); 43528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(std::string(webrtc::StatsReport::kStatsReportTypeTrack), 43628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports[0].type); 43728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 43828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string trackValue = 43928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ExtractStatsValue(webrtc::StatsReport::kStatsReportTypeTrack, 44028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 44128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsValueNameTrackId); 44228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTrackId, trackValue); 44328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 44428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 44528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats 44628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats. 44728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) { 44828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 44928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 45028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 45128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, "", false, NULL); 45228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTrackId("somename"); 45328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> stream( 45428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::MediaStream::Create("streamlabel")); 45528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_refptr<webrtc::VideoTrack> track = 45628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::VideoTrack::Create(kTrackId, NULL); 45728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(track); 45828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.AddStream(stream); 45928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 46028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 46128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 46228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; 46328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 46428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 46528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 46628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 46728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const uint32 kSsrcOfTrack = 1234; 46828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 46928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 47128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.ssrcs.push_back(1234); 47228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 47328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 47428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 47528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 47628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(Return(&video_channel)); 47728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 47828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(stats_read), 47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) 48128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kTrackId), 48228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 48328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 48428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 48628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // |reports| should contain one session report, one track report, and one ssrc 48728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // report. 48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)3, reports.size()); 48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const webrtc::StatsReport* track_report = FindNthReportByType( 49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeTrack, 1); 49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(track_report == NULL); 49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(track, &reports); 49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // |reports| should contain one session report, one track report, and one ssrc 49528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // report. 49628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ((size_t)3, reports.size()); 49728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org track_report = FindNthReportByType( 49828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsReportTypeTrack, 1); 49928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_FALSE(track_report == NULL); 50028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string ssrc_id = ExtractSsrcStatsValue( 50228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsValueNameSsrc); 50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id); 50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string track_id = ExtractSsrcStatsValue( 50628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, webrtc::StatsReport::kStatsValueNameTrackId); 50728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_EQ(kTrackId, track_id); 50828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 50928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport 51128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats. 51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) { 51328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 51428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org MockVideoMediaChannel* media_channel = new MockVideoMediaChannel; 51528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // The content_name known by the video channel. 51628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kVcName("vcname"); 51728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoChannel video_channel(talk_base::Thread::Current(), 51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org media_engine_, media_channel, &session_, kVcName, false, NULL); 51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTrackId("somename"); 52028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_refptr<webrtc::MediaStream> stream( 52128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::MediaStream::Create("streamlabel")); 52228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org talk_base::scoped_refptr<webrtc::VideoTrack> track = 52328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::VideoTrack::Create(kTrackId, NULL); 52428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stream->AddTrack(track); 52528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.AddStream(stream); 52628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 52728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.set_session(&session_); 52828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 52928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReports reports; 53028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Constructs an ssrc stats update. 53228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoSenderInfo video_sender_info; 53328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::VideoMediaInfo stats_read; 53428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const uint32 kSsrcOfTrack = 1234; 53528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const int64 kBytesSent = 12345678901234LL; 53628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 53728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Construct a stats value to read. 53828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.ssrcs.push_back(1234); 53928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org video_sender_info.bytes_sent = kBytesSent; 54028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats_read.senders.push_back(video_sender_info); 54128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 54228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, video_channel()) 54328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(Return(&video_channel)); 54428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(*media_channel, GetStats(_)) 54528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read), 54628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 54728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _)) 54828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillOnce(DoAll(SetArgPointee<1>(kTrackId), 54928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 55028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 55128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org // Instruct the session to return stats containing the transport channel. 55228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const std::string kTransportName("trspname"); 55328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::SessionStats session_stats; 55428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::TransportStats transport_stats; 55528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org cricket::TransportChannelStats channel_stats; 55628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org channel_stats.component = 1; 55728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org transport_stats.content_name = kTransportName; 55828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 55928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 56028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_stats.transport_stats[kTransportName] = transport_stats; 56128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org session_stats.proxy_to_transport[kVcName] = kTransportName; 56228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org EXPECT_CALL(session_, GetStats(_)) 56328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats), 56428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org Return(true))); 56528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 56628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.UpdateStats(); 56728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org stats.GetStats(NULL, &reports); 56828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org std::string transport_id = ExtractStatsValue( 56928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsReportTypeSsrc, 57028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org reports, 57128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org webrtc::StatsReport::kStatsValueNameTransportId); 57228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_NE(kNotFound, transport_id); 57328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org const webrtc::StatsReport* transport_report = FindReportById(reports, 57428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org transport_id); 57528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org ASSERT_FALSE(transport_report == NULL); 57628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} 57728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org 5784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly 5794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported 58019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) { 5814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate chain. 5824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> local_ders(5); 5834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[0] = "These"; 5844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[1] = "are"; 5854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[2] = "some"; 5864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[3] = "der"; 5874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org local_ders[4] = "values"; 5884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate local_cert(DersToPems(local_ders)); 5894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate chain 5914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::vector<std::string> remote_ders(4); 5924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[0] = "A"; 5934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[1] = "non-"; 5944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[2] = "intersecting"; 5954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_ders[3] = "set"; 5964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DersToPems(remote_ders)); 5974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 5984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders); 5994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 6004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly 6024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported. 60319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) { 6044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build local certificate. 6054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_der = "This is the local der."; 6064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate local_cert(DerToPem(local_der)); 6074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Build remote certificate. 6094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_der = "This is somebody else's der."; 6104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der)); 6114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org TestCertificateReports(local_cert, std::vector<std::string>(1, local_der), 6134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org remote_cert, std::vector<std::string>(1, remote_der)); 6144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 6154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no 6174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present. 61819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) { 6194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 6204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReports reports; // returned values. 6214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 6224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 6264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 6284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 6294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 6324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 6334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 6364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 6374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(ReturnNull()); 6384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 6394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 6404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 6414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, video_channel()) 6424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillRepeatedly(ReturnNull()); 6434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6444551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.UpdateStats(); 6454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 6464551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 6484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 6494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 6504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 6514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameLocalCertificateId); 6524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 6534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 6554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 6564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 6574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 6584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameRemoteCertificateId); 6594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 6604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 6614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport 6634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates. 66419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) { 6654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsCollector stats; // Implementation under test. 6664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReports reports; // returned values. 6674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.set_session(&session_); 6684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake stats to process. 6704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportChannelStats channel_stats; 6714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org channel_stats.component = 1; 6724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::TransportStats transport_stats; 6744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name = "audio"; 6754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.channel_stats.push_back(channel_stats); 6764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org cricket::SessionStats session_stats; 6784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_stats.transport_stats[transport_stats.content_name] = 6794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats; 6804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Fake transport object. 6824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org talk_base::scoped_ptr<cricket::FakeTransport> transport( 6834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org new cricket::FakeTransport( 6844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.signaling_thread(), 6854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org session_.worker_thread(), 6864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org transport_stats.content_name)); 6874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Configure MockWebRtcSession 6894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetTransport(transport_stats.content_name)) 6904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(Return(transport.get())); 6914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, GetStats(_)) 6924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillOnce(DoAll(SetArgPointee<0>(session_stats), 6934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org Return(true))); 6944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org EXPECT_CALL(session_, video_channel()) 6954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org .WillRepeatedly(ReturnNull()); 6964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 6974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.UpdateStats(); 6984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org stats.GetStats(NULL, &reports); 6994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the local certificate is absent. 7014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string local_certificate_id = ExtractStatsValue( 7024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 7034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 7044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameLocalCertificateId); 7054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, local_certificate_id); 7064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org // Check that the remote certificate is absent. 7084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org std::string remote_certificate_id = ExtractStatsValue( 7094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsReportTypeComponent, 7104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org reports, 7114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org webrtc::StatsReport::kStatsValueNameRemoteCertificateId); 7124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org ASSERT_EQ(kNotFound, remote_certificate_id); 7134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org} 7144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 7154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org 71628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org} // namespace 717