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