1effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Copyright 2014 The Chromium Authors. All rights reserved.
2effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// Use of this source code is governed by a BSD-style license that can be
3effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// found in the LICENSE file.
4effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
5effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "content/renderer/media/webrtc/media_stream_track_metrics.h"
6cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h"
7effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "testing/gmock/include/gmock/gmock.h"
8effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "testing/gtest/include/gtest/gtest.h"
9effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h"
10effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::AudioSourceInterface;
12effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::AudioTrackInterface;
13effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::AudioTrackSinkInterface;
14effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::MediaStreamInterface;
15effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::ObserverInterface;
16effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::PeerConnectionInterface;
17effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::VideoRendererInterface;
18effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::VideoSourceInterface;
19effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochusing webrtc::VideoTrackInterface;
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace content {
22effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
23effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A very simple mock that implements only the id() method.
24effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass MockAudioTrackInterface : public AudioTrackInterface {
25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  explicit MockAudioTrackInterface(const std::string& id) : id_(id) {}
27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~MockAudioTrackInterface() {}
28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
29effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual std::string id() const OVERRIDE { return id_; }
30effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(RegisterObserver, void(ObserverInterface*));
32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(UnregisterObserver, void(ObserverInterface*));
33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(kind, std::string());
34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(enabled, bool());
35effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(state, TrackState());
36effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(set_enabled, bool(bool));
37effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(set_state, bool(TrackState));
38effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(GetSource, AudioSourceInterface*());
39effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(AddSink, void(AudioTrackSinkInterface*));
40effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(RemoveSink, void(AudioTrackSinkInterface*));
41effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
42effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
43effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string id_;
44effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
45effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch// A very simple mock that implements only the id() method.
47effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass MockVideoTrackInterface : public VideoTrackInterface {
48effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
49effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  explicit MockVideoTrackInterface(const std::string& id) : id_(id) {}
50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~MockVideoTrackInterface() {}
51effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
52effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual std::string id() const OVERRIDE { return id_; }
53effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
54effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(RegisterObserver, void(ObserverInterface*));
55effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(UnregisterObserver, void(ObserverInterface*));
56effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(kind, std::string());
57effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(enabled, bool());
58effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(state, TrackState());
59effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(set_enabled, bool(bool));
60effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(set_state, bool(TrackState));
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(AddRenderer, void(VideoRendererInterface*));
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD1(RemoveRenderer, void(VideoRendererInterface*));
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_CONST_METHOD0(GetSource, VideoSourceInterface*());
64effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
65effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch private:
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  std::string id_;
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
68effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
69effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass MockMediaStreamTrackMetrics : public MediaStreamTrackMetrics {
70effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
71effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual ~MockMediaStreamTrackMetrics() {}
72effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
73effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  MOCK_METHOD4(SendLifetimeMessage,
74effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch               void(const std::string&, TrackType, LifetimeEvent, StreamType));
75effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
76effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  using MediaStreamTrackMetrics::MakeUniqueIdImpl;
77effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
78effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
79effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochclass MediaStreamTrackMetricsTest : public testing::Test {
80effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch public:
81effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void SetUp() OVERRIDE {
82effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    metrics_.reset(new MockMediaStreamTrackMetrics());
83effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    stream_ = new talk_base::RefCountedObject<MockMediaStream>("stream");
84effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
85effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
86effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  virtual void TearDown() OVERRIDE {
87effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    metrics_.reset();
88effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    stream_ = NULL;
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> MakeAudioTrack(std::string id) {
92effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return new talk_base::RefCountedObject<MockAudioTrackInterface>(id);
93effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
94effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
95effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockVideoTrackInterface> MakeVideoTrack(std::string id) {
96effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    return new talk_base::RefCountedObject<MockVideoTrackInterface>(id);
97effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
98effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
99effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_ptr<MockMediaStreamTrackMetrics> metrics_;
100effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MediaStreamInterface> stream_;
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch};
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
103effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, MakeUniqueId) {
104effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The important testable properties of the unique ID are that it
105effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // should differ when any of the three constituents differ
106effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // (PeerConnection pointer, track ID, remote or not. Also, testing
107effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // that the implementation does not discard the upper 32 bits of the
108effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // PeerConnection pointer is important.
109effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  //
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // The important hard-to-test property is that the ID be generated
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // using a hash function with virtually zero chance of
112effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // collisions. We don't test this, we rely on MD5 having this
113effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // property.
114effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Lower 32 bits the same, upper 32 differ.
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_NE(
117effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      metrics_->MakeUniqueIdImpl(
118effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          0x1000000000000001, "x", MediaStreamTrackMetrics::RECEIVED_STREAM),
119effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      metrics_->MakeUniqueIdImpl(
120effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch          0x2000000000000001, "x", MediaStreamTrackMetrics::RECEIVED_STREAM));
121effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
122effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Track ID differs.
123effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_NE(metrics_->MakeUniqueIdImpl(
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                42, "x", MediaStreamTrackMetrics::RECEIVED_STREAM),
125effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            metrics_->MakeUniqueIdImpl(
126effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                42, "y", MediaStreamTrackMetrics::RECEIVED_STREAM));
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Remove vs. local track differs.
129effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_NE(metrics_->MakeUniqueIdImpl(
130effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                42, "x", MediaStreamTrackMetrics::RECEIVED_STREAM),
131effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch            metrics_->MakeUniqueIdImpl(
132effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                42, "x", MediaStreamTrackMetrics::SENT_STREAM));
133effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
134effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
135effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, BasicRemoteStreams) {
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio(MakeAudioTrack("audio"));
137effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockVideoTrackInterface> video(MakeVideoTrack("video"));
138effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio);
139effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(video);
140effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM, stream_);
141effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
142effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
143effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio",
144effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
145effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
146effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
147effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
148effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video",
149effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
150effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
151effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
152effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
153effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionConnected);
154effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
155effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
156effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio",
157effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
160effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
161effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video",
162effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionDisconnected);
167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
169effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, BasicLocalStreams) {
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio(MakeAudioTrack("audio"));
171effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockVideoTrackInterface> video(MakeVideoTrack("video"));
172effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio);
173effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(video);
174effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::SENT_STREAM, stream_);
175effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
176effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
177effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio",
178effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video",
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionConnected);
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio",
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
194effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
195effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video",
196effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
197effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
198effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(PeerConnectionInterface::kIceConnectionFailed);
200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
202c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(MediaStreamTrackMetricsTest, LocalStreamAddedAferIceConnect) {
203c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  metrics_->IceConnectionChange(
204c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        PeerConnectionInterface::kIceConnectionConnected);
205c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
206c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*metrics_,
207c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              SendLifetimeMessage("audio",
208c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
209c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
210c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
211c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*metrics_,
212c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              SendLifetimeMessage("video",
213c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
214c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
215c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
216c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
217c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio(MakeAudioTrack("audio"));
218c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<MockVideoTrackInterface> video(MakeVideoTrack("video"));
219c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  stream_->AddTrack(audio);
220c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  stream_->AddTrack(video);
221c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::SENT_STREAM, stream_);
222c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
223c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
224c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen MurdochTEST_F(MediaStreamTrackMetricsTest, RemoteStreamAddedAferIceConnect) {
225c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  metrics_->IceConnectionChange(
226c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch        PeerConnectionInterface::kIceConnectionConnected);
227c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
228c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*metrics_,
229c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              SendLifetimeMessage("audio",
230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  EXPECT_CALL(*metrics_,
234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch              SendLifetimeMessage("video",
235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio(MakeAudioTrack("audio"));
240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  scoped_refptr<MockVideoTrackInterface> video(MakeVideoTrack("video"));
241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  stream_->AddTrack(audio);
242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  stream_->AddTrack(video);
243c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM, stream_);
244c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
245c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
246effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, RemoteStreamTrackAdded) {
247effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> initial(MakeAudioTrack("initial"));
248effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> added(MakeAudioTrack("added"));
249effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(initial);
250effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM, stream_);
251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("initial",
254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
255effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
256effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
257effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
258effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionConnected);
259effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
260effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
261effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("added",
262effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
263effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
264effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
265effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(added);
266effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
267effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
268effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("initial",
269effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
270effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
271effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
272effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
273effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("added",
274effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
275effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
276effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
277effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(PeerConnectionInterface::kIceConnectionFailed);
278effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
279effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
280effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, LocalStreamTrackRemoved) {
281effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> first(MakeAudioTrack("first"));
282effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> second(MakeAudioTrack("second"));
283effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(first);
284effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(second);
285effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::SENT_STREAM, stream_);
286effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
287effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
288effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("first",
289effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
290effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
291effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
292effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
293effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("second",
294effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
295effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
296effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
297effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
298effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionConnected);
299effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
300effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
301effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("first",
302effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
303effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
304effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
305effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(first);
306effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
307effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
308effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("second",
309effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
310effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
311effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
312effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(PeerConnectionInterface::kIceConnectionFailed);
313effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
314effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
315effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, LocalStreamModificationsBeforeAndAfter) {
316effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> first(MakeAudioTrack("first"));
317effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> second(MakeAudioTrack("second"));
318effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(first);
319effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::SENT_STREAM, stream_);
320effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
321effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // This gets added after we start observing, but no lifetime message
322effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // should be sent at this point since the call is not connected. It
323effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // should get sent only once it gets connected.
324effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(second);
325effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
326effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
327effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("first",
328effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
329effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
330effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
331effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
332effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("second",
333effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
334effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
335effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
336effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
337effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionConnected);
338effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
339effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
340effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("first",
341effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
342effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
343effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
344effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
345effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("second",
346effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
347effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
348effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
349effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(PeerConnectionInterface::kIceConnectionFailed);
350effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
351effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // This happens after the call is disconnected so no lifetime
352effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // message should be sent.
353effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(first);
354effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
355effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
356effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, RemoteStreamMultipleDisconnects) {
357effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio(MakeAudioTrack("audio"));
358effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio);
359effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM, stream_);
360effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
361effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
362effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio",
363effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
364effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
365effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
366effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
367effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionConnected);
368effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
369effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
370effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio",
371effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
372effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
373effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::RECEIVED_STREAM));
374effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
375effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionDisconnected);
376effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(PeerConnectionInterface::kIceConnectionFailed);
377effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(audio);
378effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
379effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
380effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, RemoteStreamConnectDisconnectTwice) {
381effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio(MakeAudioTrack("audio"));
382effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio);
383effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::RECEIVED_STREAM, stream_);
384effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
385effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  for (size_t i = 0; i < 2; ++i) {
386effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_CALL(*metrics_,
387effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                SendLifetimeMessage("audio",
388effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    MediaStreamTrackMetrics::AUDIO_TRACK,
389effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    MediaStreamTrackMetrics::CONNECTED,
390effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    MediaStreamTrackMetrics::RECEIVED_STREAM));
391effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    metrics_->IceConnectionChange(
392effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        PeerConnectionInterface::kIceConnectionConnected);
393effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
394effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    EXPECT_CALL(*metrics_,
395effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                SendLifetimeMessage("audio",
396effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    MediaStreamTrackMetrics::AUDIO_TRACK,
397effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    MediaStreamTrackMetrics::DISCONNECTED,
398effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                    MediaStreamTrackMetrics::RECEIVED_STREAM));
399effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    metrics_->IceConnectionChange(
400effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch        PeerConnectionInterface::kIceConnectionDisconnected);
401effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  }
402effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
403effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(audio);
404effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
405effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
406effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, LocalStreamRemovedNoDisconnect) {
407effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio(MakeAudioTrack("audio"));
408effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockVideoTrackInterface> video(MakeVideoTrack("video"));
409effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio);
410effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(video);
411effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::SENT_STREAM, stream_);
412effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
413effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
414effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio",
415effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
416effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
417effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
418effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
419effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video",
420effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
421effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
422effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
423effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
424effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionConnected);
425effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio",
428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
431effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
432effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video",
433effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
434effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
435effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
436effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->RemoveStream(MediaStreamTrackMetrics::SENT_STREAM, stream_);
437effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
438effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
439effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochTEST_F(MediaStreamTrackMetricsTest, LocalStreamLargerTest) {
440effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio1(MakeAudioTrack("audio1"));
441effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio2(MakeAudioTrack("audio2"));
442effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockAudioTrackInterface> audio3(MakeAudioTrack("audio3"));
443effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockVideoTrackInterface> video1(MakeVideoTrack("video1"));
444effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockVideoTrackInterface> video2(MakeVideoTrack("video2"));
445effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  scoped_refptr<MockVideoTrackInterface> video3(MakeVideoTrack("video3"));
446effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio1);
447effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(video1);
448effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->AddStream(MediaStreamTrackMetrics::SENT_STREAM, stream_);
449effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
450effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
451effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio1",
452effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
453effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
454effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
455effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
456effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video1",
457effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
458effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
459effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
460effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->IceConnectionChange(
461effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      PeerConnectionInterface::kIceConnectionConnected);
462effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
463effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
464effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio2",
465effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
466effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
467effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
468effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio2);
469effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
470effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video2",
471effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
472effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
473effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
474effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(video2);
475effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
476effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
477effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio1",
478effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
479effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
480effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
481effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(audio1);
482effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
483effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
484effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio3",
485effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
486effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
487effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
488effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio3);
489effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
490effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video3",
491effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
492effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
493effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
494effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(video3);
495effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
496effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // Add back audio1
497effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
498effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio1",
499effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
500effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::CONNECTED,
501effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
502effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->AddTrack(audio1);
503effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
504effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
505effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio2",
506effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
507effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
508effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
509effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(audio2);
510effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
511effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video2",
512effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
513effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
514effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
515effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(video2);
516effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
517effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
518effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio1",
519effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
520effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
521effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
522effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(audio1);
523effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
524effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video1",
525effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
526effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
527effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
528effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  stream_->RemoveTrack(video1);
529effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
530effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
531effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("audio3",
532effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::AUDIO_TRACK,
533effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
534effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
535effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  EXPECT_CALL(*metrics_,
536effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch              SendLifetimeMessage("video3",
537effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::VIDEO_TRACK,
538effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::DISCONNECTED,
539effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                  MediaStreamTrackMetrics::SENT_STREAM));
540effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  metrics_->RemoveStream(MediaStreamTrackMetrics::SENT_STREAM, stream_);
541effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}
542effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
543effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch}  // namespace content
544