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