blob: 0e33c5fc835c3de3b76c52a9861a2de870600348 [file] [log] [blame]
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "base/memory/ref_counted.h"
#include "base/memory/scoped_ptr.h"
#include "base/test/simple_test_tick_clock.h"
#include "base/time/tick_clock.h"
#include "media/cast/cast_environment.h"
#include "media/cast/logging/encoding_event_subscriber.h"
#include "media/cast/logging/logging_defines.h"
#include "media/cast/test/fake_single_thread_task_runner.h"
#include "testing/gtest/include/gtest/gtest.h"
using media::cast::proto::AggregatedFrameEvent;
using media::cast::proto::AggregatedPacketEvent;
using media::cast::proto::BasePacketEvent;
using media::cast::proto::LogMetadata;
namespace {
int64 InMilliseconds(base::TimeTicks event_time) {
return (event_time - base::TimeTicks()).InMilliseconds();
}
}
namespace media {
namespace cast {
class EncodingEventSubscriberTest : public ::testing::Test {
protected:
EncodingEventSubscriberTest()
: testing_clock_(new base::SimpleTestTickClock()),
task_runner_(new test::FakeSingleThreadTaskRunner(testing_clock_)),
cast_environment_(new CastEnvironment(
scoped_ptr<base::TickClock>(testing_clock_).Pass(),
task_runner_,
task_runner_,
task_runner_)),
first_rtp_timestamp_(0) {}
void Init(EventMediaType event_media_type) {
DCHECK(!event_subscriber_);
event_subscriber_.reset(new EncodingEventSubscriber(event_media_type, 10));
cast_environment_->Logging()->AddRawEventSubscriber(
event_subscriber_.get());
}
~EncodingEventSubscriberTest() override {
if (event_subscriber_) {
cast_environment_->Logging()->RemoveRawEventSubscriber(
event_subscriber_.get());
}
}
void GetEventsAndReset() {
event_subscriber_->GetEventsAndReset(
&metadata_, &frame_events_, &packet_events_);
first_rtp_timestamp_ = metadata_.first_rtp_timestamp();
}
base::SimpleTestTickClock* testing_clock_; // Owned by CastEnvironment.
scoped_refptr<test::FakeSingleThreadTaskRunner> task_runner_;
scoped_refptr<CastEnvironment> cast_environment_;
scoped_ptr<EncodingEventSubscriber> event_subscriber_;
FrameEventList frame_events_;
PacketEventList packet_events_;
LogMetadata metadata_;
RtpTimestamp first_rtp_timestamp_;
};
TEST_F(EncodingEventSubscriberTest, FrameEventTruncating) {
Init(VIDEO_EVENT);
base::TimeTicks now(testing_clock_->NowTicks());
// Entry with RTP timestamp 0 should get dropped.
for (int i = 0; i < 11; i++) {
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_CAPTURE_BEGIN,
VIDEO_EVENT,
i * 100,
/*frame_id*/ 0);
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_DECODED,
VIDEO_EVENT,
i * 100,
/*frame_id*/ 0);
}
GetEventsAndReset();
ASSERT_EQ(10u, frame_events_.size());
EXPECT_EQ(100u, frame_events_.front()->relative_rtp_timestamp());
EXPECT_EQ(1000u, frame_events_.back()->relative_rtp_timestamp());
}
TEST_F(EncodingEventSubscriberTest, PacketEventTruncating) {
Init(AUDIO_EVENT);
base::TimeTicks now(testing_clock_->NowTicks());
// Entry with RTP timestamp 0 should get dropped.
for (int i = 0; i < 11; i++) {
cast_environment_->Logging()->InsertPacketEvent(now,
PACKET_RECEIVED,
AUDIO_EVENT,
/*rtp_timestamp*/ i * 100,
/*frame_id*/ 0,
/*packet_id*/ i,
/*max_packet_id*/ 10,
/*size*/ 123);
}
GetEventsAndReset();
ASSERT_EQ(10u, packet_events_.size());
EXPECT_EQ(100u, packet_events_.front()->relative_rtp_timestamp());
EXPECT_EQ(1000u, packet_events_.back()->relative_rtp_timestamp());
}
TEST_F(EncodingEventSubscriberTest, EventFiltering) {
Init(VIDEO_EVENT);
base::TimeTicks now(testing_clock_->NowTicks());
RtpTimestamp rtp_timestamp = 100;
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_DECODED,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0);
// This is an AUDIO_EVENT and shouldn't be processed by the subscriber.
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_DECODED,
AUDIO_EVENT,
rtp_timestamp,
/*frame_id*/ 0);
GetEventsAndReset();
ASSERT_EQ(1u, frame_events_.size());
FrameEventList::iterator it = frame_events_.begin();
linked_ptr<AggregatedFrameEvent> frame_event = *it;
ASSERT_EQ(1, frame_event->event_type_size());
EXPECT_EQ(media::cast::proto::FRAME_DECODED,
frame_event->event_type(0));
GetEventsAndReset();
EXPECT_TRUE(packet_events_.empty());
}
TEST_F(EncodingEventSubscriberTest, FrameEvent) {
Init(VIDEO_EVENT);
base::TimeTicks now(testing_clock_->NowTicks());
RtpTimestamp rtp_timestamp = 100;
cast_environment_->Logging()->InsertFrameEvent(now, FRAME_DECODED,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0);
GetEventsAndReset();
ASSERT_EQ(1u, frame_events_.size());
RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
FrameEventList::iterator it = frame_events_.begin();
linked_ptr<AggregatedFrameEvent> event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(1, event->event_type_size());
EXPECT_EQ(media::cast::proto::FRAME_DECODED, event->event_type(0));
ASSERT_EQ(1, event->event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
EXPECT_EQ(0, event->encoded_frame_size());
EXPECT_EQ(0, event->delay_millis());
GetEventsAndReset();
EXPECT_TRUE(frame_events_.empty());
}
TEST_F(EncodingEventSubscriberTest, FrameEventDelay) {
Init(AUDIO_EVENT);
base::TimeTicks now(testing_clock_->NowTicks());
RtpTimestamp rtp_timestamp = 100;
int delay_ms = 100;
cast_environment_->Logging()->InsertFrameEventWithDelay(
now, FRAME_PLAYOUT, AUDIO_EVENT, rtp_timestamp,
/*frame_id*/ 0, base::TimeDelta::FromMilliseconds(delay_ms));
GetEventsAndReset();
ASSERT_EQ(1u, frame_events_.size());
RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
FrameEventList::iterator it = frame_events_.begin();
linked_ptr<AggregatedFrameEvent> event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(1, event->event_type_size());
EXPECT_EQ(media::cast::proto::FRAME_PLAYOUT, event->event_type(0));
ASSERT_EQ(1, event->event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
EXPECT_EQ(0, event->encoded_frame_size());
EXPECT_EQ(100, event->delay_millis());
EXPECT_FALSE(event->has_key_frame());
}
TEST_F(EncodingEventSubscriberTest, FrameEventSize) {
Init(VIDEO_EVENT);
base::TimeTicks now(testing_clock_->NowTicks());
RtpTimestamp rtp_timestamp = 100;
int size = 123;
bool key_frame = true;
int target_bitrate = 1024;
cast_environment_->Logging()->InsertEncodedFrameEvent(
now, FRAME_ENCODED, VIDEO_EVENT, rtp_timestamp,
/*frame_id*/ 0, size, key_frame, target_bitrate);
GetEventsAndReset();
ASSERT_EQ(1u, frame_events_.size());
RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
FrameEventList::iterator it = frame_events_.begin();
linked_ptr<AggregatedFrameEvent> event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(1, event->event_type_size());
EXPECT_EQ(media::cast::proto::FRAME_ENCODED, event->event_type(0));
ASSERT_EQ(1, event->event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now), event->event_timestamp_ms(0));
EXPECT_EQ(size, event->encoded_frame_size());
EXPECT_EQ(0, event->delay_millis());
EXPECT_TRUE(event->has_key_frame());
EXPECT_EQ(key_frame, event->key_frame());
EXPECT_EQ(target_bitrate, event->target_bitrate());
}
TEST_F(EncodingEventSubscriberTest, MultipleFrameEvents) {
Init(AUDIO_EVENT);
RtpTimestamp rtp_timestamp1 = 100;
RtpTimestamp rtp_timestamp2 = 200;
base::TimeTicks now1(testing_clock_->NowTicks());
cast_environment_->Logging()->InsertFrameEventWithDelay(
now1, FRAME_PLAYOUT, AUDIO_EVENT, rtp_timestamp1,
/*frame_id*/ 0, /*delay*/ base::TimeDelta::FromMilliseconds(100));
testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
base::TimeTicks now2(testing_clock_->NowTicks());
cast_environment_->Logging()->InsertEncodedFrameEvent(
now2, FRAME_ENCODED, AUDIO_EVENT, rtp_timestamp2,
/*frame_id*/ 0, /*size*/ 123, /* key_frame - unused */ false,
/*target_bitrate - unused*/ 0);
testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
base::TimeTicks now3(testing_clock_->NowTicks());
cast_environment_->Logging()->InsertFrameEvent(
now3, FRAME_DECODED, AUDIO_EVENT, rtp_timestamp1, /*frame_id*/ 0);
GetEventsAndReset();
ASSERT_EQ(2u, frame_events_.size());
RtpTimestamp relative_rtp_timestamp = rtp_timestamp1 - first_rtp_timestamp_;
FrameEventList::iterator it = frame_events_.begin();
linked_ptr<AggregatedFrameEvent> event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(2, event->event_type_size());
EXPECT_EQ(media::cast::proto::FRAME_PLAYOUT, event->event_type(0));
EXPECT_EQ(media::cast::proto::FRAME_DECODED, event->event_type(1));
ASSERT_EQ(2, event->event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now1), event->event_timestamp_ms(0));
EXPECT_EQ(InMilliseconds(now3), event->event_timestamp_ms(1));
EXPECT_FALSE(event->has_key_frame());
relative_rtp_timestamp = rtp_timestamp2 - first_rtp_timestamp_;
++it;
event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(1, event->event_type_size());
EXPECT_EQ(media::cast::proto::FRAME_ENCODED, event->event_type(0));
ASSERT_EQ(1, event->event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now2), event->event_timestamp_ms(0));
EXPECT_FALSE(event->has_key_frame());
}
TEST_F(EncodingEventSubscriberTest, PacketEvent) {
Init(AUDIO_EVENT);
base::TimeTicks now(testing_clock_->NowTicks());
RtpTimestamp rtp_timestamp = 100;
int packet_id = 2;
int size = 100;
cast_environment_->Logging()->InsertPacketEvent(
now, PACKET_RECEIVED, AUDIO_EVENT,
rtp_timestamp, /*frame_id*/ 0, packet_id,
/*max_packet_id*/ 10, size);
GetEventsAndReset();
ASSERT_EQ(1u, packet_events_.size());
RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
PacketEventList::iterator it = packet_events_.begin();
linked_ptr<AggregatedPacketEvent> event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(1, event->base_packet_event_size());
const BasePacketEvent& base_event = event->base_packet_event(0);
EXPECT_EQ(packet_id, base_event.packet_id());
ASSERT_EQ(1, base_event.event_type_size());
EXPECT_EQ(media::cast::proto::PACKET_RECEIVED,
base_event.event_type(0));
ASSERT_EQ(1, base_event.event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now), base_event.event_timestamp_ms(0));
EXPECT_EQ(size, base_event.size());
GetEventsAndReset();
EXPECT_TRUE(packet_events_.empty());
}
TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForPacket) {
Init(VIDEO_EVENT);
base::TimeTicks now1(testing_clock_->NowTicks());
RtpTimestamp rtp_timestamp = 100;
int packet_id = 2;
int size = 100;
cast_environment_->Logging()->InsertPacketEvent(now1,
PACKET_SENT_TO_NETWORK,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0,
packet_id,
/*max_packet_id*/ 10,
size);
testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
base::TimeTicks now2(testing_clock_->NowTicks());
cast_environment_->Logging()->InsertPacketEvent(now2,
PACKET_RETRANSMITTED,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0,
packet_id,
/*max_packet_id*/ 10,
size);
GetEventsAndReset();
ASSERT_EQ(1u, packet_events_.size());
RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
PacketEventList::iterator it = packet_events_.begin();
linked_ptr<AggregatedPacketEvent> event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(1, event->base_packet_event_size());
const BasePacketEvent& base_event = event->base_packet_event(0);
EXPECT_EQ(packet_id, base_event.packet_id());
ASSERT_EQ(2, base_event.event_type_size());
EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK,
base_event.event_type(0));
EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED,
base_event.event_type(1));
ASSERT_EQ(2, base_event.event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
EXPECT_EQ(InMilliseconds(now2), base_event.event_timestamp_ms(1));
}
TEST_F(EncodingEventSubscriberTest, MultiplePacketEventsForFrame) {
Init(VIDEO_EVENT);
base::TimeTicks now1(testing_clock_->NowTicks());
RtpTimestamp rtp_timestamp = 100;
int packet_id_1 = 2;
int packet_id_2 = 3;
int size = 100;
cast_environment_->Logging()->InsertPacketEvent(now1,
PACKET_SENT_TO_NETWORK,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0,
packet_id_1,
/*max_packet_id*/ 10,
size);
testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
base::TimeTicks now2(testing_clock_->NowTicks());
cast_environment_->Logging()->InsertPacketEvent(now2,
PACKET_RETRANSMITTED,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0,
packet_id_2,
/*max_packet_id*/ 10,
size);
GetEventsAndReset();
ASSERT_EQ(1u, packet_events_.size());
RtpTimestamp relative_rtp_timestamp = rtp_timestamp - first_rtp_timestamp_;
PacketEventList::iterator it = packet_events_.begin();
linked_ptr<AggregatedPacketEvent> event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(2, event->base_packet_event_size());
const BasePacketEvent& base_event = event->base_packet_event(0);
EXPECT_EQ(packet_id_1, base_event.packet_id());
ASSERT_EQ(1, base_event.event_type_size());
EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK,
base_event.event_type(0));
ASSERT_EQ(1, base_event.event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
const BasePacketEvent& base_event_2 = event->base_packet_event(1);
EXPECT_EQ(packet_id_2, base_event_2.packet_id());
ASSERT_EQ(1, base_event_2.event_type_size());
EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED,
base_event_2.event_type(0));
ASSERT_EQ(1, base_event_2.event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now2), base_event_2.event_timestamp_ms(0));
}
TEST_F(EncodingEventSubscriberTest, MultiplePacketEvents) {
Init(VIDEO_EVENT);
base::TimeTicks now1(testing_clock_->NowTicks());
RtpTimestamp rtp_timestamp_1 = 100;
RtpTimestamp rtp_timestamp_2 = 200;
int packet_id_1 = 2;
int packet_id_2 = 3;
int size = 100;
cast_environment_->Logging()->InsertPacketEvent(now1,
PACKET_SENT_TO_NETWORK,
VIDEO_EVENT,
rtp_timestamp_1,
/*frame_id*/ 0,
packet_id_1,
/*max_packet_id*/ 10,
size);
testing_clock_->Advance(base::TimeDelta::FromMilliseconds(20));
base::TimeTicks now2(testing_clock_->NowTicks());
cast_environment_->Logging()->InsertPacketEvent(now2,
PACKET_RETRANSMITTED,
VIDEO_EVENT,
rtp_timestamp_2,
/*frame_id*/ 0,
packet_id_2,
/*max_packet_id*/ 10,
size);
GetEventsAndReset();
ASSERT_EQ(2u, packet_events_.size());
RtpTimestamp relative_rtp_timestamp = rtp_timestamp_1 - first_rtp_timestamp_;
PacketEventList::iterator it = packet_events_.begin();
linked_ptr<AggregatedPacketEvent> event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(1, event->base_packet_event_size());
const BasePacketEvent& base_event = event->base_packet_event(0);
EXPECT_EQ(packet_id_1, base_event.packet_id());
ASSERT_EQ(1, base_event.event_type_size());
EXPECT_EQ(media::cast::proto::PACKET_SENT_TO_NETWORK,
base_event.event_type(0));
ASSERT_EQ(1, base_event.event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now1), base_event.event_timestamp_ms(0));
relative_rtp_timestamp = rtp_timestamp_2 - first_rtp_timestamp_;
++it;
ASSERT_TRUE(it != packet_events_.end());
event = *it;
EXPECT_EQ(relative_rtp_timestamp, event->relative_rtp_timestamp());
ASSERT_EQ(1, event->base_packet_event_size());
const BasePacketEvent& base_event_2 = event->base_packet_event(0);
EXPECT_EQ(packet_id_2, base_event_2.packet_id());
ASSERT_EQ(1, base_event_2.event_type_size());
EXPECT_EQ(media::cast::proto::PACKET_RETRANSMITTED,
base_event_2.event_type(0));
ASSERT_EQ(1, base_event_2.event_timestamp_ms_size());
EXPECT_EQ(InMilliseconds(now2), base_event_2.event_timestamp_ms(0));
}
TEST_F(EncodingEventSubscriberTest, FirstRtpTimestamp) {
Init(VIDEO_EVENT);
RtpTimestamp rtp_timestamp = 12345;
base::TimeTicks now(testing_clock_->NowTicks());
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_CAPTURE_BEGIN,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0);
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_CAPTURE_END,
VIDEO_EVENT,
rtp_timestamp + 30,
/*frame_id*/ 1);
GetEventsAndReset();
EXPECT_EQ(rtp_timestamp, first_rtp_timestamp_);
FrameEventList::iterator it = frame_events_.begin();
ASSERT_NE(frame_events_.end(), it);
EXPECT_EQ(0u, (*it)->relative_rtp_timestamp());
++it;
ASSERT_NE(frame_events_.end(), it);
EXPECT_EQ(30u, (*it)->relative_rtp_timestamp());
rtp_timestamp = 67890;
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_CAPTURE_BEGIN,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0);
GetEventsAndReset();
EXPECT_EQ(rtp_timestamp, first_rtp_timestamp_);
}
TEST_F(EncodingEventSubscriberTest, RelativeRtpTimestampWrapAround) {
Init(VIDEO_EVENT);
RtpTimestamp rtp_timestamp = 0xffffffff - 20;
base::TimeTicks now(testing_clock_->NowTicks());
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_CAPTURE_BEGIN,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0);
// RtpTimestamp has now wrapped around.
cast_environment_->Logging()->InsertFrameEvent(now,
FRAME_CAPTURE_END,
VIDEO_EVENT,
rtp_timestamp + 30,
/*frame_id*/ 1);
GetEventsAndReset();
FrameEventList::iterator it = frame_events_.begin();
ASSERT_NE(frame_events_.end(), it);
EXPECT_EQ(0u, (*it)->relative_rtp_timestamp());
++it;
ASSERT_NE(frame_events_.end(), it);
EXPECT_EQ(30u, (*it)->relative_rtp_timestamp());
}
TEST_F(EncodingEventSubscriberTest, MaxEventsPerProto) {
Init(VIDEO_EVENT);
RtpTimestamp rtp_timestamp = 100;
for (int i = 0; i < kMaxEventsPerProto + 1; i++) {
cast_environment_->Logging()->InsertFrameEvent(testing_clock_->NowTicks(),
FRAME_ACK_RECEIVED,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0);
testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
}
GetEventsAndReset();
ASSERT_EQ(2u, frame_events_.size());
FrameEventList::iterator frame_it = frame_events_.begin();
ASSERT_TRUE(frame_it != frame_events_.end());
linked_ptr<AggregatedFrameEvent> frame_event = *frame_it;
EXPECT_EQ(kMaxEventsPerProto, frame_event->event_type_size());
for (int i = 0; i < kMaxPacketsPerFrame + 1; i++) {
cast_environment_->Logging()->InsertPacketEvent(
testing_clock_->NowTicks(),
PACKET_SENT_TO_NETWORK,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0,
i,
kMaxPacketsPerFrame,
123);
testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
}
GetEventsAndReset();
EXPECT_EQ(2u, packet_events_.size());
PacketEventList::iterator packet_it = packet_events_.begin();
ASSERT_TRUE(packet_it != packet_events_.end());
linked_ptr<AggregatedPacketEvent> packet_event = *packet_it;
EXPECT_EQ(kMaxPacketsPerFrame,
packet_event->base_packet_event_size());
++packet_it;
packet_event = *packet_it;
EXPECT_EQ(1, packet_event->base_packet_event_size());
for (int j = 0; j < kMaxEventsPerProto + 1; j++) {
cast_environment_->Logging()->InsertPacketEvent(
testing_clock_->NowTicks(),
PACKET_SENT_TO_NETWORK,
VIDEO_EVENT,
rtp_timestamp,
/*frame_id*/ 0,
0,
0,
123);
testing_clock_->Advance(base::TimeDelta::FromMilliseconds(30));
}
GetEventsAndReset();
EXPECT_EQ(2u, packet_events_.size());
packet_it = packet_events_.begin();
ASSERT_TRUE(packet_it != packet_events_.end());
packet_event = *packet_it;
EXPECT_EQ(kMaxEventsPerProto,
packet_event->base_packet_event(0).event_type_size());
++packet_it;
packet_event = *packet_it;
EXPECT_EQ(1, packet_event->base_packet_event(0).event_type_size());
}
} // namespace cast
} // namespace media