statscollector_unittest.cc revision b90991dade9139e5c14c3b616a9eff07b9d6fdda
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"
3240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreaminterface.h"
3340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org#include "talk/app/webrtc/mediastreamtrack.h"
3428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/app/webrtc/videotrack.h"
354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org#include "talk/base/base64.h"
364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org#include "talk/base/fakesslidentity.h"
3728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/base/gunit.h"
3828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/base/fakemediaengine.h"
3928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/media/devices/fakedevicemanager.h"
4028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/p2p/base/fakesession.h"
4128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "talk/session/media/channelmanager.h"
4228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org#include "testing/base/public/gmock.h"
4328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
44b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing cricket::StatsOptions;
4528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::_;
4628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::DoAll;
47b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing testing::Field;
4828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::Return;
4928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::ReturnNull;
5028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgusing testing::SetArgPointee;
51b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgusing webrtc::PeerConnectionInterface;
5240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReport;
5340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgusing webrtc::StatsReports;
5428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
5528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace cricket {
5628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
5728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass ChannelManager;
5828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass FakeDeviceManager;
5928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}  // namespace cricket
6128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgnamespace {
6328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Error return values
6528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNotFound[] = "NOT FOUND";
6628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgconst char kNoReports[] = "NO REPORTS";
6728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
6897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// Constant names for track identification.
6997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst char kTrackId[] = "somename";
7040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst char kAudioTrackId[] = "audio_track_id";
7197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgconst uint32 kSsrcOfTrack = 1234;
7297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
7328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockWebRtcSession : public webrtc::WebRtcSession {
7428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public:
7528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  explicit MockWebRtcSession(cricket::ChannelManager* channel_manager)
7628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    : WebRtcSession(channel_manager, talk_base::Thread::Current(),
774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                    talk_base::Thread::Current(), NULL, NULL) {
7828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
7940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  MOCK_METHOD0(voice_channel, cricket::VoiceChannel*());
8028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MOCK_METHOD0(video_channel, cricket::VideoChannel*());
8128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MOCK_METHOD2(GetTrackIdBySsrc, bool(uint32, std::string*));
8228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MOCK_METHOD1(GetStats, bool(cricket::SessionStats*));
834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  MOCK_METHOD1(GetTransport, cricket::Transport*(const std::string&));
8428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org};
8528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
8628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass MockVideoMediaChannel : public cricket::FakeVideoMediaChannel {
8728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org public:
8828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MockVideoMediaChannel()
8928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    : cricket::FakeVideoMediaChannel(NULL) {
9028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
9128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // MOCK_METHOD0(transport_channel, cricket::TransportChannel*());
92b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  MOCK_METHOD2(GetStats, bool(const StatsOptions&, cricket::VideoMediaInfo*));
9328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org};
9428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
9540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass MockVoiceMediaChannel : public cricket::FakeVoiceMediaChannel {
9640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public:
9740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  MockVoiceMediaChannel() : cricket::FakeVoiceMediaChannel(NULL) {
9840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  }
9940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  MOCK_METHOD1(GetStats, bool(cricket::VoiceMediaInfo*));
10040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org};
10140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
10240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeAudioProcessor : public webrtc::AudioProcessorInterface {
10340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public:
10440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  FakeAudioProcessor() {}
10540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  ~FakeAudioProcessor() {}
10640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
10740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private:
10840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  virtual void GetStats(
10940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      AudioProcessorInterface::AudioProcessorStats* stats) OVERRIDE {
11040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    stats->typing_noise_detected = true;
11140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    stats->echo_return_loss = 2;
11240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    stats->echo_return_loss_enhancement = 3;
11340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    stats->echo_delay_median_ms = 4;
11440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    stats->aec_quality_min = 5.1f;
11540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    stats->echo_delay_std_ms = 6;
11640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  }
11740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org};
11840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
11940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgclass FakeLocalAudioTrack
12040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    : public webrtc::MediaStreamTrack<webrtc::AudioTrackInterface> {
12140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org public:
12240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  explicit FakeLocalAudioTrack(const std::string& id)
12340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      : webrtc::MediaStreamTrack<webrtc::AudioTrackInterface>(id),
12440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        processor_(new talk_base::RefCountedObject<FakeAudioProcessor>()) {}
12540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  std::string kind() const OVERRIDE {
12640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    return "audio";
12740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  }
12840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  virtual webrtc::AudioSourceInterface* GetSource() const OVERRIDE {
12940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    return NULL;
13040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  }
13140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  virtual void AddSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {}
13240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  virtual void RemoveSink(webrtc::AudioTrackSinkInterface* sink) OVERRIDE {}
13340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  virtual bool GetSignalLevel(int* level) OVERRIDE {
13440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    *level = 1;
13540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    return true;
13640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  }
137b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org  virtual talk_base::scoped_refptr<webrtc::AudioProcessorInterface>
138b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org      GetAudioProcessor() OVERRIDE {
139b90991dade9139e5c14c3b616a9eff07b9d6fddahenrike@webrtc.org    return processor_;
14040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  }
14140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
14240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org private:
14340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  talk_base::scoped_refptr<FakeAudioProcessor> processor_;
14440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org};
14540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
14640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgbool GetValue(const StatsReport* report,
1474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org              const std::string& name,
1484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org              std::string* value) {
14940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReport::Values::const_iterator it = report->values.begin();
1504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  for (; it != report->values.end(); ++it) {
1514551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    if (it->name == name) {
1524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      *value = it->value;
1534551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      return true;
1544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    }
1554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  }
1564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  return false;
1574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org}
1584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
15928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgstd::string ExtractStatsValue(const std::string& type,
16040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                              const StatsReports& reports,
16128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                              const std::string name) {
16228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  if (reports.empty()) {
16328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    return kNoReports;
16428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
16528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < reports.size(); ++i) {
16628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    if (reports[i].type != type)
16728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      continue;
1684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    std::string ret;
1694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    if (GetValue(&reports[i], name, &ret)) {
1704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      return ret;
17128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    }
17228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
17328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
17428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return kNotFound;
17528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
17628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
17728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Finds the |n|-th report of type |type| in |reports|.
17828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// |n| starts from 1 for finding the first report.
17940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindNthReportByType(
18040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    const StatsReports& reports, const std::string& type, int n) {
18128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < reports.size(); ++i) {
18228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    if (reports[i].type == type) {
18328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      n--;
18428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      if (n == 0)
18528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org        return &reports[i];
18628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    }
18728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
18828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return NULL;
18928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
19028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
19140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgconst StatsReport* FindReportById(const StatsReports& reports,
19240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                                  const std::string& id) {
19328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  for (size_t i = 0; i < reports.size(); ++i) {
19428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    if (reports[i].id == id) {
19528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      return &reports[i];
19628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    }
19728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
19828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return NULL;
19928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
20028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
20140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractSsrcStatsValue(StatsReports reports,
20228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                  const std::string& name) {
20328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return ExtractStatsValue(
20440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeSsrc, reports, name);
20528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
20628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
20740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgstd::string ExtractBweStatsValue(StatsReports reports,
20828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                  const std::string& name) {
20928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  return ExtractStatsValue(
21040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeBwe, reports, name);
21128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
21228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
2134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::string DerToPem(const std::string& der) {
2144551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  return talk_base::SSLIdentity::DerToPem(
2154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        talk_base::kPemTypeCertificate,
2164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        reinterpret_cast<const unsigned char*>(der.c_str()),
2174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        der.length());
2184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org}
2194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
2204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.orgstd::vector<std::string> DersToPems(
2214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    const std::vector<std::string>& ders) {
2224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::vector<std::string> pems(ders.size());
2234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::transform(ders.begin(), ders.end(), pems.begin(), DerToPem);
2244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  return pems;
2254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org}
2264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
22740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid CheckCertChainReports(const StatsReports& reports,
2284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                           const std::vector<std::string>& ders,
2294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                           const std::string& start_id) {
2304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::string certificate_id = start_id;
2314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  size_t i = 0;
2324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  while (true) {
23340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    const StatsReport* report = FindReportById(reports, certificate_id);
2344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    ASSERT_TRUE(report != NULL);
23519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org
2364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    std::string der_base64;
2374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    EXPECT_TRUE(GetValue(
23840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        report, StatsReport::kStatsValueNameDer, &der_base64));
2394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    std::string der = talk_base::Base64::Decode(der_base64,
2404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                                                talk_base::Base64::DO_STRICT);
2414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    EXPECT_EQ(ders[i], der);
24219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org
24319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org    std::string fingerprint_algorithm;
24419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org    EXPECT_TRUE(GetValue(
24519f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org        report,
24640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        StatsReport::kStatsValueNameFingerprintAlgorithm,
24719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org        &fingerprint_algorithm));
24819f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org    // The digest algorithm for a FakeSSLCertificate is always SHA-1.
24919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org    std::string sha_1_str = talk_base::DIGEST_SHA_1;
25019f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org    EXPECT_EQ(sha_1_str, fingerprint_algorithm);
25119f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org
25219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org    std::string dummy_fingerprint;  // Value is not checked.
25319f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org    EXPECT_TRUE(GetValue(
25419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org        report,
25540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        StatsReport::kStatsValueNameFingerprint,
25619f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org        &dummy_fingerprint));
25719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.org
2584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    ++i;
2594551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    if (!GetValue(
26040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        report, StatsReport::kStatsValueNameIssuerId, &certificate_id))
2614551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      break;
2624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  }
2634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  EXPECT_EQ(ders.size(), i);
2644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org}
2654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
26640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgvoid VerifyVoiceSenderInfoReport(const StatsReport* report,
26740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                                 const cricket::VoiceSenderInfo& sinfo) {
26840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  std::string value_in_report;
26940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
27040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameCodecName, &value_in_report));
27140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(sinfo.codec_name, value_in_report);
27240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
27340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameBytesSent, &value_in_report));
27440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int64>(sinfo.bytes_sent), value_in_report);
27540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
27640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNamePacketsSent, &value_in_report));
27740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.packets_sent), value_in_report);
27840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
27940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameRtt, &value_in_report));
28040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.rtt_ms), value_in_report);
28140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
28240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameRtt, &value_in_report));
28340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.rtt_ms), value_in_report);
28440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
28540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameJitterReceived, &value_in_report));
28640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.jitter_ms), value_in_report);
28740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
28840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameEchoCancellationQualityMin,
28940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      &value_in_report));
29040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<float>(sinfo.aec_quality_min), value_in_report);
29140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
29240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameEchoDelayMedian, &value_in_report));
29340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.echo_delay_median_ms),
29440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org            value_in_report);
29540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
29640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameEchoDelayStdDev, &value_in_report));
29740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.echo_delay_std_ms),
29840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org            value_in_report);
29940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
30040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameEchoReturnLoss, &value_in_report));
30140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.echo_return_loss),
30240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org            value_in_report);
30340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
30440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameEchoReturnLossEnhancement,
30540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      &value_in_report));
30640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.echo_return_loss_enhancement),
30740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org            value_in_report);
30840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
30940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameAudioInputLevel, &value_in_report));
31040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<int>(sinfo.audio_level), value_in_report);
31140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_TRUE(GetValue(
31240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      report, StatsReport::kStatsValueNameTypingNoiseState, &value_in_report));
31340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  std::string typing_detected = sinfo.typing_noise_detected ? "true" : "false";
31440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(typing_detected, value_in_report);
31540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}
31640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
31728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgclass StatsCollectorTest : public testing::Test {
31828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org protected:
31928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  StatsCollectorTest()
32028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    : media_engine_(new cricket::FakeMediaEngine),
32128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      channel_manager_(
32228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org          new cricket::ChannelManager(media_engine_,
32328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                      new cricket::FakeDeviceManager(),
32428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                                      talk_base::Thread::Current())),
32597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      session_(channel_manager_.get()),
32697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      track_id_(kTrackId) {
32728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    // By default, we ignore session GetStats calls.
32828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org    EXPECT_CALL(session_, GetStats(_)).WillRepeatedly(Return(false));
32928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  }
33028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
33197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // This creates a standard setup with a transport called "trspname"
33297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // having one transport channel
33397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // and the specified virtual connection name.
33497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  void InitSessionStats(const std::string vc_name) {
33597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    const std::string kTransportName("trspname");
33697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    cricket::TransportStats transport_stats;
33797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    cricket::TransportChannelStats channel_stats;
33897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    channel_stats.component = 1;
33997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    transport_stats.content_name = kTransportName;
34097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    transport_stats.channel_stats.push_back(channel_stats);
34197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
34297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    session_stats_.transport_stats[kTransportName] = transport_stats;
34397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    session_stats_.proxy_to_transport[vc_name] = kTransportName;
34497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  }
34597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
34697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // Adds a track with a given SSRC into the stats.
34797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  void AddVideoTrackStats() {
34897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    stream_ = webrtc::MediaStream::Create("streamlabel");
34997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    track_= webrtc::VideoTrack::Create(kTrackId, NULL);
35097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    stream_->AddTrack(track_);
35197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org    EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _))
35297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      .WillRepeatedly(DoAll(SetArgPointee<1>(track_id_),
35397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org                            Return(true)));
35497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  }
35597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
35640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Adds a local audio track with a given SSRC into the stats.
35740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  void AddLocalAudioTrackStats() {
35840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    if (stream_ == NULL)
35940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      stream_ = webrtc::MediaStream::Create("streamlabel");
36040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
36140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    audio_track_ =
36240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        new talk_base::RefCountedObject<FakeLocalAudioTrack>(kAudioTrackId);
36340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    stream_->AddTrack(audio_track_);
36440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    EXPECT_CALL(session_, GetTrackIdBySsrc(kSsrcOfTrack, _))
36540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        .WillRepeatedly(DoAll(SetArgPointee<1>(kAudioTrackId),
36640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                              Return(true)));
36740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  }
36840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
3694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  void TestCertificateReports(const talk_base::FakeSSLCertificate& local_cert,
3704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                              const std::vector<std::string>& local_ders,
3714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                              const talk_base::FakeSSLCertificate& remote_cert,
3724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                              const std::vector<std::string>& remote_ders) {
3734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    webrtc::StatsCollector stats;  // Implementation under test.
37440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    StatsReports reports;  // returned values.
3754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    stats.set_session(&session_);
3764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
3774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    // Fake stats to process.
3784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    cricket::TransportChannelStats channel_stats;
3794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    channel_stats.component = 1;
3804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
3814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    cricket::TransportStats transport_stats;
3824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    transport_stats.content_name = "audio";
3834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    transport_stats.channel_stats.push_back(channel_stats);
3844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
3854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    cricket::SessionStats session_stats;
3864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    session_stats.transport_stats[transport_stats.content_name] =
3874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        transport_stats;
3884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
3894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    // Fake certificates to report.
3904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    talk_base::FakeSSLIdentity local_identity(local_cert);
3914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    talk_base::scoped_ptr<talk_base::FakeSSLCertificate> remote_cert_copy(
3924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        remote_cert.GetReference());
3934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
3944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    // Fake transport object.
3954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    talk_base::scoped_ptr<cricket::FakeTransport> transport(
3964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        new cricket::FakeTransport(
3974551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org            session_.signaling_thread(),
3984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org            session_.worker_thread(),
3994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org            transport_stats.content_name));
4004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    transport->SetIdentity(&local_identity);
4014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    cricket::FakeTransportChannel* channel =
4024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        static_cast<cricket::FakeTransportChannel*>(
4034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org            transport->CreateChannel(channel_stats.component));
4044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    EXPECT_FALSE(channel == NULL);
4054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    channel->SetRemoteCertificate(remote_cert_copy.get());
4064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
4074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    // Configure MockWebRtcSession
4084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    EXPECT_CALL(session_, GetTransport(transport_stats.content_name))
4094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      .WillOnce(Return(transport.get()));
4104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    EXPECT_CALL(session_, GetStats(_))
4114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      .WillOnce(DoAll(SetArgPointee<0>(session_stats),
4124551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                      Return(true)));
41340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
41440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
4154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
416b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
4174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
4184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    stats.GetStats(NULL, &reports);
4194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
42040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org    const StatsReport* channel_report = FindNthReportByType(
42140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        reports, StatsReport::kStatsReportTypeComponent, 1);
4224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    EXPECT_TRUE(channel_report != NULL);
4234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
4244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    // Check local certificate chain.
4254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    std::string local_certificate_id = ExtractStatsValue(
42640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        StatsReport::kStatsReportTypeComponent,
4274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        reports,
42840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        StatsReport::kStatsValueNameLocalCertificateId);
429b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    if (local_ders.size() > 0) {
430b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      EXPECT_NE(kNotFound, local_certificate_id);
431b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      CheckCertChainReports(reports, local_ders, local_certificate_id);
432b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    } else {
433b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      EXPECT_EQ(kNotFound, local_certificate_id);
434b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    }
4354551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
4364551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    // Check remote certificate chain.
4374551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    std::string remote_certificate_id = ExtractStatsValue(
43840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        StatsReport::kStatsReportTypeComponent,
4394551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org        reports,
44040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org        StatsReport::kStatsValueNameRemoteCertificateId);
441b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    if (remote_ders.size() > 0) {
442b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      EXPECT_NE(kNotFound, remote_certificate_id);
443b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      CheckCertChainReports(reports, remote_ders, remote_certificate_id);
444b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    } else {
445b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      EXPECT_EQ(kNotFound, remote_certificate_id);
446b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    }
4474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  }
44897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
44928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::FakeMediaEngine* media_engine_;
45028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  talk_base::scoped_ptr<cricket::ChannelManager> channel_manager_;
45128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MockWebRtcSession session_;
45297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  cricket::SessionStats session_stats_;
45397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  talk_base::scoped_refptr<webrtc::MediaStream> stream_;
45497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  talk_base::scoped_refptr<webrtc::VideoTrack> track_;
45540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  talk_base::scoped_refptr<FakeLocalAudioTrack> audio_track_;
45697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  std::string track_id_;
45728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org};
45828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
45928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that 64-bit counters are passed successfully.
46028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BytesCounterHandles64Bits) {
46128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
46228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
46328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoChannel video_channel(talk_base::Thread::Current(),
46428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      media_engine_, media_channel, &session_, "", false, NULL);
46540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
46628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoSenderInfo video_sender_info;
46728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoMediaInfo stats_read;
46828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // The number of bytes must be larger than 0xFFFFFFFF for this test.
46928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const int64 kBytesSent = 12345678901234LL;
47028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const std::string kBytesSentString("12345678901234");
47128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
47228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.set_session(&session_);
47397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  AddVideoTrackStats();
47497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.AddStream(stream_);
47528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
47628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Construct a stats value to read.
4775bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org  video_sender_info.add_ssrc(1234);
47828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  video_sender_info.bytes_sent = kBytesSent;
47928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats_read.senders.push_back(video_sender_info);
48028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
48140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
48240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
483b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_CALL(*media_channel, GetStats(_, _))
484b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    .WillOnce(DoAll(SetArgPointee<1>(stats_read),
48528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                    Return(true)));
486b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
48728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.GetStats(NULL, &reports);
48828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::string result = ExtractSsrcStatsValue(reports, "bytesSent");
48928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(kBytesSentString, result);
49028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
49128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
49228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// Test that BWE information is reported via stats.
49328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, BandwidthEstimationInfoIsReported) {
49428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
49528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
49628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoChannel video_channel(talk_base::Thread::Current(),
49728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      media_engine_, media_channel, &session_, "", false, NULL);
49840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
49928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoSenderInfo video_sender_info;
50028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoMediaInfo stats_read;
50128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Set up an SSRC just to test that we get both kinds of stats back: SSRC and
50228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // BWE.
50328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const int64 kBytesSent = 12345678901234LL;
50428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const std::string kBytesSentString("12345678901234");
50528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
50628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.set_session(&session_);
50797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  AddVideoTrackStats();
50897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.AddStream(stream_);
50928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
51028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Construct a stats value to read.
5115bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org  video_sender_info.add_ssrc(1234);
51228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  video_sender_info.bytes_sent = kBytesSent;
51328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats_read.senders.push_back(video_sender_info);
51428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::BandwidthEstimationInfo bwe;
51528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const int kTargetEncBitrate = 123456;
51628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const std::string kTargetEncBitrateString("123456");
51728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  bwe.target_enc_bitrate = kTargetEncBitrate;
51828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats_read.bw_estimations.push_back(bwe);
51928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
52040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
52140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
522b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_CALL(*media_channel, GetStats(_, _))
523b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    .WillOnce(DoAll(SetArgPointee<1>(stats_read),
52428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                    Return(true)));
52597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
526b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
52728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.GetStats(NULL, &reports);
52828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::string result = ExtractSsrcStatsValue(reports, "bytesSent");
52928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(kBytesSentString, result);
53028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  result = ExtractBweStatsValue(reports, "googTargetEncBitrate");
53128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(kTargetEncBitrateString, result);
53228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
53328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
53428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an object of type "googSession" always
53528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// exists in the returned stats.
53628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, SessionObjectExists) {
53728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
53840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
53928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.set_session(&session_);
54040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
54140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
542b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
54328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.GetStats(NULL, &reports);
54440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* session_report = FindNthReportByType(
54540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsReportTypeSession, 1);
54628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(session_report == NULL);
54728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
54828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
54928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that only one object of type "googSession" exists
55028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// in the returned stats.
55128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, OnlyOneSessionObjectExists) {
55228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
55340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
55428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.set_session(&session_);
55540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
55640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
557b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
558b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
55928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.GetStats(NULL, &reports);
56040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* session_report = FindNthReportByType(
56140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsReportTypeSession, 1);
56228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(session_report == NULL);
56328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  session_report = FindNthReportByType(
56440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsReportTypeSession, 2);
56528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(NULL, session_report);
56628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
56728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
56828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats
56928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// without calling StatsCollector::UpdateStats.
57028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackObjectExistsWithoutUpdateStats) {
57128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
57228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
57328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoChannel video_channel(talk_base::Thread::Current(),
57428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      media_engine_, media_channel, &session_, "", false, NULL);
57597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  AddVideoTrackStats();
57697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.AddStream(stream_);
57728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
57828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.set_session(&session_);
57928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
58040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;
58128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
58228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Verfies the existence of the track report.
58328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.GetStats(NULL, &reports);
58428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ((size_t)1, reports.size());
58540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(std::string(StatsReport::kStatsReportTypeTrack),
58628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org            reports[0].type);
58728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
58828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::string trackValue =
58940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      ExtractStatsValue(StatsReport::kStatsReportTypeTrack,
59028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                        reports,
59140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                        StatsReport::kStatsValueNameTrackId);
59228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(kTrackId, trackValue);
59328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
59428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
59528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that the empty track report exists in the returned stats
59628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// when StatsCollector::UpdateStats is called with ssrc stats.
59728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TrackAndSsrcObjectExistAfterUpdateSsrcStats) {
59828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
59928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
60028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoChannel video_channel(talk_base::Thread::Current(),
60128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      media_engine_, media_channel, &session_, "", false, NULL);
60297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  AddVideoTrackStats();
60397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.AddStream(stream_);
60428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
60528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.set_session(&session_);
60628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
60740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;
60828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
60928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Constructs an ssrc stats update.
61028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoSenderInfo video_sender_info;
61128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoMediaInfo stats_read;
61228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const int64 kBytesSent = 12345678901234LL;
61328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
61428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Construct a stats value to read.
6155bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org  video_sender_info.add_ssrc(1234);
61628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  video_sender_info.bytes_sent = kBytesSent;
61728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats_read.senders.push_back(video_sender_info);
61828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
61940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
62040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
621b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_CALL(*media_channel, GetStats(_, _))
622b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    .WillOnce(DoAll(SetArgPointee<1>(stats_read),
62328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                    Return(true)));
62428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
625b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
62628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.GetStats(NULL, &reports);
62797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // |reports| should contain at least one session report, one track report,
62897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // and one ssrc report.
62997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  EXPECT_LE((size_t)3, reports.size());
63040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* track_report = FindNthReportByType(
63140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsReportTypeTrack, 1);
63228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(track_report == NULL);
63328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
63497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.GetStats(track_, &reports);
63597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // |reports| should contain at least one session report, one track report,
63697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // and one ssrc report.
63797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  EXPECT_LE((size_t)3, reports.size());
63828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  track_report = FindNthReportByType(
63940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsReportTypeTrack, 1);
64028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_FALSE(track_report == NULL);
64128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
64228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::string ssrc_id = ExtractSsrcStatsValue(
64340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsValueNameSsrc);
64428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id);
64528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
64628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::string track_id = ExtractSsrcStatsValue(
64740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsValueNameTrackId);
64828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_EQ(kTrackId, track_id);
64928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
65028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
65128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// This test verifies that an SSRC object has the identifier of a Transport
65228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org// stats object, and that this transport stats object exists in stats.
65328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.orgTEST_F(StatsCollectorTest, TransportObjectLinkedFromSsrcObject) {
65428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
65528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
65628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // The content_name known by the video channel.
65728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const std::string kVcName("vcname");
65828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoChannel video_channel(talk_base::Thread::Current(),
65928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      media_engine_, media_channel, &session_, kVcName, false, NULL);
66097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  AddVideoTrackStats();
66197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.AddStream(stream_);
66228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
66328e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.set_session(&session_);
66428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
66540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;
66628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
66728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Constructs an ssrc stats update.
66828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoSenderInfo video_sender_info;
66928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  cricket::VideoMediaInfo stats_read;
67028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  const int64 kBytesSent = 12345678901234LL;
67128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
67228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  // Construct a stats value to read.
6735bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org  video_sender_info.add_ssrc(1234);
67428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  video_sender_info.bytes_sent = kBytesSent;
67528e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats_read.senders.push_back(video_sender_info);
67628e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
67740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
67840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
679b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_CALL(*media_channel, GetStats(_, _))
680b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read),
68128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org                          Return(true)));
68228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
68397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  InitSessionStats(kVcName);
68428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  EXPECT_CALL(session_, GetStats(_))
68540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_),
68640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                            Return(true)));
68728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
688b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
68928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  stats.GetStats(NULL, &reports);
69028e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  std::string transport_id = ExtractStatsValue(
69140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeSsrc,
69228e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org      reports,
69340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsValueNameTransportId);
69428e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  ASSERT_NE(kNotFound, transport_id);
69540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* transport_report = FindReportById(reports,
69640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                                                       transport_id);
69728e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org  ASSERT_FALSE(transport_report == NULL);
69828e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}
69928e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org
70097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will not be created for
70197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where remote stats are not returned.
70297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsAbsent) {
70397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
70497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
70597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // The content_name known by the video channel.
70697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  const std::string kVcName("vcname");
70797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  cricket::VideoChannel video_channel(talk_base::Thread::Current(),
70897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      media_engine_, media_channel, &session_, kVcName, false, NULL);
70997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  AddVideoTrackStats();
71097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.AddStream(stream_);
71197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
71297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.set_session(&session_);
71397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
71440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
71540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
71697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
717b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
71840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;
71997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.GetStats(NULL, &reports);
72040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* remote_report = FindNthReportByType(reports,
72140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeRemoteSsrc, 1);
72297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  EXPECT_TRUE(remote_report == NULL);
72397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org}
72497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
72597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// This test verifies that a remote stats object will be created for
72697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org// an outgoing SSRC where stats are returned.
72797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.orgTEST_F(StatsCollectorTest, RemoteSsrcInfoIsPresent) {
72897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
72997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
73097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // The content_name known by the video channel.
73197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  const std::string kVcName("vcname");
73297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  cricket::VideoChannel video_channel(talk_base::Thread::Current(),
73397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org      media_engine_, media_channel, &session_, kVcName, false, NULL);
73497077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  AddVideoTrackStats();
73597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.AddStream(stream_);
73697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
73797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.set_session(&session_);
73897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
73940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;
74097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
74197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // Instruct the session to return stats containing the transport channel.
74297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  InitSessionStats(kVcName);
74397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  EXPECT_CALL(session_, GetStats(_))
74440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_),
74540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                            Return(true)));
74697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
74797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  // Constructs an ssrc stats update.
74897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  cricket::VideoMediaInfo stats_read;
74997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
75097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  cricket::SsrcReceiverInfo remote_ssrc_stats;
75197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  remote_ssrc_stats.timestamp = 12345.678;
75297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  remote_ssrc_stats.ssrc = kSsrcOfTrack;
75397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  cricket::VideoSenderInfo video_sender_info;
7545bc25c41fc7880545052770dbcfe67f233c9b0c0sergeyu@chromium.org  video_sender_info.add_ssrc(kSsrcOfTrack);
75597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  video_sender_info.remote_stats.push_back(remote_ssrc_stats);
75697077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats_read.senders.push_back(video_sender_info);
75797077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
75840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(Return(&video_channel));
75940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
760b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_CALL(*media_channel, GetStats(_, _))
761b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    .WillRepeatedly(DoAll(SetArgPointee<1>(stats_read),
76297077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org                          Return(true)));
76397077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
764b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
76597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  stats.GetStats(NULL, &reports);
76640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* remote_report = FindNthReportByType(reports,
76740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeRemoteSsrc, 1);
76897077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  EXPECT_FALSE(remote_report == NULL);
76997077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org  EXPECT_NE(0, remote_report->timestamp);
77097077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org}
77197077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
7724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all chained certificates are correctly
7734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported
77419f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainedCertificateReportsCreated) {
7754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Build local certificate chain.
7764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::vector<std::string> local_ders(5);
7774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  local_ders[0] = "These";
7784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  local_ders[1] = "are";
7794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  local_ders[2] = "some";
7804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  local_ders[3] = "der";
7814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  local_ders[4] = "values";
7824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  talk_base::FakeSSLCertificate local_cert(DersToPems(local_ders));
7834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
7844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Build remote certificate chain
7854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::vector<std::string> remote_ders(4);
7864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  remote_ders[0] = "A";
7874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  remote_ders[1] = "non-";
7884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  remote_ders[2] = "intersecting";
7894551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  remote_ders[3] = "set";
7904551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  talk_base::FakeSSLCertificate remote_cert(DersToPems(remote_ders));
7914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
7924551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  TestCertificateReports(local_cert, local_ders, remote_cert, remote_ders);
7934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org}
7944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
7954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that all certificates without chains are correctly
7964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// reported.
79719f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, ChainlessCertificateReportsCreated) {
7984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Build local certificate.
7994551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::string local_der = "This is the local der.";
8004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  talk_base::FakeSSLCertificate local_cert(DerToPem(local_der));
8014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Build remote certificate.
8034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::string remote_der = "This is somebody else's der.";
8044551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der));
8054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8064551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  TestCertificateReports(local_cert, std::vector<std::string>(1, local_der),
8074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                         remote_cert, std::vector<std::string>(1, remote_der));
8084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org}
8094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8104551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when no
8114551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// transport is present.
81219f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoTransport) {
8134551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
81440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
8154551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  stats.set_session(&session_);
8164551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8174551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Fake stats to process.
8184551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  cricket::TransportChannelStats channel_stats;
8194551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  channel_stats.component = 1;
8204551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8214551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  cricket::TransportStats transport_stats;
8224551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  transport_stats.content_name = "audio";
8234551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  transport_stats.channel_stats.push_back(channel_stats);
8244551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8254551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  cricket::SessionStats session_stats;
8264551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  session_stats.transport_stats[transport_stats.content_name] =
8274551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      transport_stats;
8284551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8294551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Configure MockWebRtcSession
8304551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  EXPECT_CALL(session_, GetTransport(transport_stats.content_name))
8314551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    .WillOnce(ReturnNull());
8324551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  EXPECT_CALL(session_, GetStats(_))
8334551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    .WillOnce(DoAll(SetArgPointee<0>(session_stats),
8344551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                    Return(true)));
83597077a3ab27259164eb121034b6e0ebe9ba592dfwu@webrtc.org
83640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
83740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
8384551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
839b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
8404551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  stats.GetStats(NULL, &reports);
8414551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8424551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Check that the local certificate is absent.
8434551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::string local_certificate_id = ExtractStatsValue(
84440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeComponent,
8454551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      reports,
84640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsValueNameLocalCertificateId);
8474551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  ASSERT_EQ(kNotFound, local_certificate_id);
8484551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8494551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Check that the remote certificate is absent.
8504551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::string remote_certificate_id = ExtractStatsValue(
85140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeComponent,
8524551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      reports,
85340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsValueNameRemoteCertificateId);
8544551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  ASSERT_EQ(kNotFound, remote_certificate_id);
8554551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org}
8564551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8574551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// This test verifies that the stats are generated correctly when the transport
8584551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org// does not have any certificates.
85919f27e6a24f877fc2b0409a94b02d5f40ba3dc8cmallinath@webrtc.orgTEST_F(StatsCollectorTest, NoCertificates) {
8604551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
86140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
8624551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  stats.set_session(&session_);
8634551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8644551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Fake stats to process.
8654551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  cricket::TransportChannelStats channel_stats;
8664551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  channel_stats.component = 1;
8674551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8684551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  cricket::TransportStats transport_stats;
8694551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  transport_stats.content_name = "audio";
8704551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  transport_stats.channel_stats.push_back(channel_stats);
8714551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8724551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  cricket::SessionStats session_stats;
8734551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  session_stats.transport_stats[transport_stats.content_name] =
8744551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      transport_stats;
8754551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8764551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Fake transport object.
8774551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  talk_base::scoped_ptr<cricket::FakeTransport> transport(
8784551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      new cricket::FakeTransport(
8794551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org          session_.signaling_thread(),
8804551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org          session_.worker_thread(),
8814551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org          transport_stats.content_name));
8824551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8834551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Configure MockWebRtcSession
8844551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  EXPECT_CALL(session_, GetTransport(transport_stats.content_name))
8854551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    .WillOnce(Return(transport.get()));
8864551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  EXPECT_CALL(session_, GetStats(_))
8874551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org    .WillOnce(DoAll(SetArgPointee<0>(session_stats),
8884551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org                    Return(true)));
88940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
89040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
8914551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
892b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
8934551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  stats.GetStats(NULL, &reports);
8944551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
8954551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Check that the local certificate is absent.
8964551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::string local_certificate_id = ExtractStatsValue(
89740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeComponent,
8984551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      reports,
89940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsValueNameLocalCertificateId);
9004551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  ASSERT_EQ(kNotFound, local_certificate_id);
9014551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
9024551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  // Check that the remote certificate is absent.
9034551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  std::string remote_certificate_id = ExtractStatsValue(
90440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsReportTypeComponent,
9054551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org      reports,
90640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      StatsReport::kStatsValueNameRemoteCertificateId);
9074551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org  ASSERT_EQ(kNotFound, remote_certificate_id);
9084551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org}
9094551b793dea4b5451cbfa13b206b6d11a25081d0wu@webrtc.org
910b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// This test verifies that a remote certificate with an unsupported digest
911b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// algorithm is correctly ignored.
912b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, UnsupportedDigestIgnored) {
913b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  // Build a local certificate.
914b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  std::string local_der = "This is the local der.";
915b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  talk_base::FakeSSLCertificate local_cert(DerToPem(local_der));
916b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org
917b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  // Build a remote certificate with an unsupported digest algorithm.
918b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  std::string remote_der = "This is somebody else's der.";
919b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  talk_base::FakeSSLCertificate remote_cert(DerToPem(remote_der));
920b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  remote_cert.set_digest_algorithm("foobar");
921b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org
922b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  TestCertificateReports(local_cert, std::vector<std::string>(1, local_der),
923b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org                         remote_cert, std::vector<std::string>());
924b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org}
925b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org
926b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// Verifies the correct optons are passed to the VideoMediaChannel when using
927b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org// verbose output level.
928b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.orgTEST_F(StatsCollectorTest, StatsOutputLevelVerbose) {
929b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
930b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  MockVideoMediaChannel* media_channel = new MockVideoMediaChannel;
931b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  cricket::VideoChannel video_channel(talk_base::Thread::Current(),
932b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      media_engine_, media_channel, &session_, "", false, NULL);
933b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.set_session(&session_);
934b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org
93540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
936b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  cricket::VideoMediaInfo stats_read;
937b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  cricket::BandwidthEstimationInfo bwe;
938b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  bwe.total_received_propagation_delta_ms = 10;
939b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  bwe.recent_received_propagation_delta_ms.push_back(100);
940b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  bwe.recent_received_propagation_delta_ms.push_back(200);
941b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  bwe.recent_received_packet_group_arrival_time_ms.push_back(1000);
942b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  bwe.recent_received_packet_group_arrival_time_ms.push_back(2000);
943b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats_read.bw_estimations.push_back(bwe);
944b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org
945b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_CALL(session_, video_channel())
946b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    .WillRepeatedly(Return(&video_channel));
94740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(ReturnNull());
948b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org
949b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  StatsOptions options;
950b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  options.include_received_propagation_stats = true;
951b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_CALL(*media_channel, GetStats(
952b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      Field(&StatsOptions::include_received_propagation_stats, true),
953b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      _))
954b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org    .WillOnce(DoAll(SetArgPointee<1>(stats_read),
955b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org                    Return(true)));
956b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org
957b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelDebug);
958b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  stats.GetStats(NULL, &reports);
959b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  std::string result = ExtractBweStatsValue(
960b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      reports, "googReceivedPacketGroupPropagationDeltaSumDebug");
961b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_EQ("10", result);
962b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  result = ExtractBweStatsValue(
963b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      reports, "googReceivedPacketGroupPropagationDeltaDebug");
964b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_EQ("[100, 200]", result);
965b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  result = ExtractBweStatsValue(
966b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org      reports, "googReceivedPacketGroupArrivalTimeDebug");
967b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org  EXPECT_EQ("[1000, 2000]", result);
968b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org}
969b9a088b920d1ba16e0593698d4a613bb7bb5481fwu@webrtc.org
97040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object can get statistics via
97140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// AudioTrackInterface::GetStats() method.
97240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsFromLocalAudioTrack) {
97340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
97440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
97540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // The content_name known by the voice channel.
97640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const std::string kVcName("vcname");
97740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  cricket::VoiceChannel voice_channel(talk_base::Thread::Current(),
97840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      media_engine_, media_channel, &session_, kVcName, false);
97940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  AddLocalAudioTrackStats();
98040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.AddStream(stream_);
98140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
98240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
98340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.set_session(&session_);
98440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
98540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Instruct the session to return stats containing the transport channel.
98640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  InitSessionStats(kVcName);
98740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, GetStats(_))
98840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_),
98940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                            Return(true)));
99040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
99140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  cricket::VoiceSenderInfo voice_sender_info;
99240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Contents won't be modified by the AudioTrackInterface::GetStats().
99340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.add_ssrc(kSsrcOfTrack);
99440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.codec_name = "fake_codec";
99540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.bytes_sent = 100;
99640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.packets_sent = 101;
99740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.rtt_ms = 102;
99840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.fraction_lost = 103;
99940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.jitter_ms = 104;
100040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.packets_lost = 105;
100140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.ext_seqnum = 106;
100240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
100340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Contents will be modified by the AudioTrackInterface::GetStats().
100440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.audio_level = 107;
100540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_return_loss = 108;;
100640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_return_loss_enhancement = 109;
100740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_delay_median_ms = 110;
100840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_delay_std_ms = 111;
100940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.aec_quality_min = 112.0f;
101040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.typing_noise_detected = false;
101140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
101240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Constructs an ssrc stats update.
101340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  cricket::VoiceMediaInfo stats_read;
101440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats_read.senders.push_back(voice_sender_info);
101540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
101640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel));
101740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
101840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(*media_channel, GetStats(_))
101940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read),
102040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                            Return(true)));
102140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
102240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
102340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
102440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.GetStats(NULL, &reports);
102540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
102640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Verfy the existence of the track report.
102740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* report = FindNthReportByType(
102840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsReportTypeSsrc, 1);
102940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_FALSE(report == NULL);
103040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  std::string track_id = ExtractSsrcStatsValue(
103140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsValueNameTrackId);
103240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(kAudioTrackId, track_id);
103340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  std::string ssrc_id = ExtractSsrcStatsValue(
103440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsValueNameSsrc);
103540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id);
103640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
103740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Verifies the values in the track report.
103840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  audio_track_->GetSignalLevel(&voice_sender_info.audio_level);
103940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  webrtc::AudioProcessorInterface::AudioProcessorStats audio_processor_stats;
104040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  audio_track_->GetAudioProcessor()->GetStats(&audio_processor_stats);
104140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.typing_noise_detected =
104240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      audio_processor_stats.typing_noise_detected;
104340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_return_loss = audio_processor_stats.echo_return_loss;
104440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_return_loss_enhancement =
104540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      audio_processor_stats.echo_return_loss_enhancement;
104640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_delay_median_ms =
104740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      audio_processor_stats.echo_delay_median_ms;
104840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.aec_quality_min = audio_processor_stats.aec_quality_min;
104940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_delay_std_ms = audio_processor_stats.echo_delay_std_ms;
105040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  VerifyVoiceSenderInfoReport(report, voice_sender_info);
105140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
105240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Verify we get the same result by passing a track to GetStats().
105340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports track_reports;  // returned values.
105440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.GetStats(audio_track_.get(), &track_reports);
105540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* track_report = FindNthReportByType(
105640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      track_reports, StatsReport::kStatsReportTypeSsrc, 1);
105740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_FALSE(track_report == NULL);
105840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  track_id = ExtractSsrcStatsValue(track_reports,
105940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                                   StatsReport::kStatsValueNameTrackId);
106040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(kAudioTrackId, track_id);
106140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  ssrc_id = ExtractSsrcStatsValue(track_reports,
106240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                                  StatsReport::kStatsValueNameSsrc);
106340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id);
106440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  VerifyVoiceSenderInfoReport(track_report, voice_sender_info);
106540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}
106640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
106740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// This test verifies that a local stats object won't update its statistics
106840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org// after a RemoveLocalAudioTrack() call.
106940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.orgTEST_F(StatsCollectorTest, GetStatsAfterRemoveAudioStream) {
107040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  webrtc::StatsCollector stats;  // Implementation under test.
107140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  MockVoiceMediaChannel* media_channel = new MockVoiceMediaChannel();
107240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // The content_name known by the voice channel.
107340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const std::string kVcName("vcname");
107440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  cricket::VoiceChannel voice_channel(talk_base::Thread::Current(),
107540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      media_engine_, media_channel, &session_, kVcName, false);
107640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  AddLocalAudioTrackStats();
107740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.AddStream(stream_);
107840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.AddLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
107940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
108040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.set_session(&session_);
108140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
108240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Instruct the session to return stats containing the transport channel.
108340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  InitSessionStats(kVcName);
108440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, GetStats(_))
108540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      .WillRepeatedly(DoAll(SetArgPointee<0>(session_stats_),
108640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                            Return(true)));
108740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
108840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.RemoveLocalAudioTrack(audio_track_.get(), kSsrcOfTrack);
108940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  cricket::VoiceSenderInfo voice_sender_info;
109040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Contents won't be modified by the AudioTrackInterface::GetStats().
109140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.add_ssrc(kSsrcOfTrack);
109240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.codec_name = "fake_codec";
109340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.bytes_sent = 100;
109440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.packets_sent = 101;
109540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.rtt_ms = 102;
109640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.fraction_lost = 103;
109740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.jitter_ms = 104;
109840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.packets_lost = 105;
109940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.ext_seqnum = 106;
110040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
110140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Contents will be modified by the AudioTrackInterface::GetStats().
110240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.audio_level = 107;
110340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_return_loss = 108;;
110440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_return_loss_enhancement = 109;
110540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_delay_median_ms = 110;
110640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.echo_delay_std_ms = 111;
110740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.aec_quality_min = 112;
110840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  voice_sender_info.typing_noise_detected = false;
110940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
111040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Constructs an ssrc stats update.
111140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  cricket::VoiceMediaInfo stats_read;
111240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats_read.senders.push_back(voice_sender_info);
111340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
111440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, voice_channel()).WillRepeatedly(Return(&voice_channel));
111540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(session_, video_channel()).WillRepeatedly(ReturnNull());
111640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_CALL(*media_channel, GetStats(_))
111740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      .WillRepeatedly(DoAll(SetArgPointee<0>(stats_read),
111840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org                            Return(true)));
111940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
112040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  StatsReports reports;  // returned values.
112140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.UpdateStats(PeerConnectionInterface::kStatsOutputLevelStandard);
112240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  stats.GetStats(NULL, &reports);
112340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
112440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // The report will exist since we don't remove them in RemoveStream().
112540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  const StatsReport* report = FindNthReportByType(
112640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsReportTypeSsrc, 1);
112740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_FALSE(report == NULL);
112840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  std::string track_id = ExtractSsrcStatsValue(
112940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsValueNameTrackId);
113040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(kAudioTrackId, track_id);
113140b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  std::string ssrc_id = ExtractSsrcStatsValue(
113240b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org      reports, StatsReport::kStatsValueNameSsrc);
113340b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  EXPECT_EQ(talk_base::ToString<uint32>(kSsrcOfTrack), ssrc_id);
113440b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
113540b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // Verifies the values in the track report, no value will be changed by the
113640b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // AudioTrackInterface::GetSignalValue() and
113740b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  // AudioProcessorInterface::AudioProcessorStats::GetStats();
113840b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org  VerifyVoiceSenderInfoReport(report, voice_sender_info);
113940b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org}
114040b3b68cdf47d7c9c3b57fca5d0a372292025f9ehenrike@webrtc.org
114128e20752806a492f5a6a5d343c02f9556f39b1cdhenrike@webrtc.org}  // namespace
1142