15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// found in the LICENSE file. 45d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/ref_counted.h" 65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/test/simple_test_tick_clock.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/time/tick_clock.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/cast_environment.h" 105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/logging/logging_defines.h" 11116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "media/cast/net/rtcp/receiver_rtcp_event_subscriber.h" 125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cast/test/fake_single_thread_task_runner.h" 135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace cast { 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace { 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const size_t kMaxEventEntries = 10u; 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)const int64 kDelayMs = 20L; 225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class ReceiverRtcpEventSubscriberTest : public ::testing::Test { 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) protected: 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) ReceiverRtcpEventSubscriberTest() 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) : testing_clock_(new base::SimpleTestTickClock()), 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)), 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_(new CastEnvironment( 31effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_ptr<base::TickClock>(testing_clock_).Pass(), 32effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch task_runner_, 33effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch task_runner_, 34effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch task_runner_)) {} 355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual ~ReceiverRtcpEventSubscriberTest() {} 375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void TearDown() OVERRIDE { 395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (event_subscriber_) { 405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->RemoveRawEventSubscriber( 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event_subscriber_.get()); 425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void Init(EventMediaType type) { 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event_subscriber_.reset( 475d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) new ReceiverRtcpEventSubscriber(kMaxEventEntries, type)); 485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->AddRawEventSubscriber( 495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) event_subscriber_.get()); 505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void InsertEvents() { 535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Video events 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->InsertFrameEventWithDelay( 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing_clock_->NowTicks(), FRAME_PLAYOUT, VIDEO_EVENT, 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /*rtp_timestamp*/ 100u, /*frame_id*/ 2u, 57cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kDelayMs)); 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->InsertFrameEvent( 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing_clock_->NowTicks(), FRAME_DECODED, VIDEO_EVENT, 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /*rtp_timestamp*/ 200u, /*frame_id*/ 1u); 615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->InsertPacketEvent( 62cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing_clock_->NowTicks(), PACKET_RECEIVED, VIDEO_EVENT, 635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /*rtp_timestamp */ 200u, /*frame_id*/ 2u, /*packet_id*/ 1u, 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /*max_packet_id*/ 10u, /*size*/ 1024u); 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Audio events 675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->InsertFrameEventWithDelay( 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing_clock_->NowTicks(), FRAME_PLAYOUT, AUDIO_EVENT, 69cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /*rtp_timestamp*/ 300u, /*frame_id*/ 4u, 70cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::TimeDelta::FromMilliseconds(kDelayMs)); 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->InsertFrameEvent( 72cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing_clock_->NowTicks(), FRAME_DECODED, AUDIO_EVENT, 73cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) /*rtp_timestamp*/ 400u, /*frame_id*/ 3u); 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->InsertPacketEvent( 75cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing_clock_->NowTicks(), PACKET_RECEIVED, AUDIO_EVENT, 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /*rtp_timestamp */ 400u, /*frame_id*/ 5u, /*packet_id*/ 1u, 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /*max_packet_id*/ 10u, /*size*/ 128u); 785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Unrelated events 80010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cast_environment_->Logging()->InsertFrameEvent(testing_clock_->NowTicks(), 81cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FRAME_CAPTURE_END, 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) VIDEO_EVENT, 83010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /*rtp_timestamp*/ 100u, 84010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /*frame_id*/ 1u); 85010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) cast_environment_->Logging()->InsertFrameEvent(testing_clock_->NowTicks(), 86cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) FRAME_CAPTURE_END, 87cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) AUDIO_EVENT, 88010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /*rtp_timestamp*/ 100u, 89010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) /*frame_id*/ 1u); 905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment. 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_; 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_refptr<CastEnvironment> cast_environment_; 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<ReceiverRtcpEventSubscriber> event_subscriber_; 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)}; 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ReceiverRtcpEventSubscriberTest, LogVideoEvents) { 99cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Init(VIDEO_EVENT); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InsertEvents(); 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event_subscriber_->GetRtcpEventsAndReset(&rtcp_events); 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(3u, rtcp_events.size()); 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ReceiverRtcpEventSubscriberTest, LogAudioEvents) { 108cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Init(AUDIO_EVENT); 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) InsertEvents(); 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event_subscriber_->GetRtcpEventsAndReset(&rtcp_events); 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(3u, rtcp_events.size()); 1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1165d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(ReceiverRtcpEventSubscriberTest, DropEventsWhenSizeExceeded) { 117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) Init(VIDEO_EVENT); 1185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) for (uint32 i = 1u; i <= 10u; ++i) { 1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) cast_environment_->Logging()->InsertFrameEvent( 121cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) testing_clock_->NowTicks(), FRAME_DECODED, VIDEO_EVENT, 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) /*rtp_timestamp*/ i * 10, /*frame_id*/ i); 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) } 124c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 125c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ReceiverRtcpEventSubscriber::RtcpEventMultiMap rtcp_events; 126c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch event_subscriber_->GetRtcpEventsAndReset(&rtcp_events); 127c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(10u, rtcp_events.size()); 1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace cast 1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // namespace media 132