receiver_rtcp_event_subscriber_unittest.cc revision 116680a4aac90f2aa7413d9095a592090648e557
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