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