Index: webrtc/test/fake_network_pipe_unittest.cc |
diff --git a/webrtc/test/fake_network_pipe_unittest.cc b/webrtc/test/fake_network_pipe_unittest.cc |
index c19b0014bb9f6cac21ce2a9d2bb1aa11bebb69e2..92619e1fc5dc3ffe6ec5c2a02a7e83767671e56f 100644 |
--- a/webrtc/test/fake_network_pipe_unittest.cc |
+++ b/webrtc/test/fake_network_pipe_unittest.cc |
@@ -11,6 +11,7 @@ |
#include <memory> |
#include "webrtc/call/call.h" |
+#include "webrtc/modules/rtp_rtcp/include/rtp_header_parser.h" |
#include "webrtc/system_wrappers/include/clock.h" |
#include "webrtc/test/fake_network_pipe.h" |
#include "webrtc/test/gmock.h" |
@@ -23,52 +24,42 @@ using ::testing::Invoke; |
namespace webrtc { |
-class TestReceiver : public PacketReceiver { |
+class TestDemuxer : public Demuxer { |
public: |
- TestReceiver() {} |
- virtual ~TestReceiver() {} |
- |
- void IncomingPacket(const uint8_t* data, size_t length) { |
- DeliverPacket(MediaType::ANY, data, length, PacketTime()); |
- delete [] data; |
+ void IncomingPacket(NetworkPacket* packet) { |
+ DeliverPacket(packet, PacketTime()); |
} |
- virtual MOCK_METHOD4( |
- DeliverPacket, |
- DeliveryStatus(MediaType, const uint8_t*, size_t, const PacketTime&)); |
+ MOCK_METHOD1(SetReceiver, void(PacketReceiver* receiver)); |
+ MOCK_METHOD2(DeliverPacket, |
+ void(const NetworkPacket* packet, |
+ const PacketTime& packet_time)); |
}; |
-class ReorderTestReceiver : public TestReceiver { |
+class ReorderTestDemuxer : public TestDemuxer { |
public: |
- ReorderTestReceiver() {} |
- virtual ~ReorderTestReceiver() {} |
- |
- DeliveryStatus DeliverPacket(MediaType media_type, |
- const uint8_t* packet, |
- size_t length, |
- const PacketTime& packet_time) override { |
+ void DeliverPacket(const NetworkPacket* packet, |
+ const PacketTime& packet_time) override { |
+ RTC_DCHECK_GE(packet->data_length(), sizeof(int)); |
int seq_num; |
- memcpy(&seq_num, packet, sizeof(int)); |
+ memcpy(&seq_num, packet->data(), sizeof(int)); |
delivered_sequence_numbers_.push_back(seq_num); |
- return PacketReceiver::DELIVERY_OK; |
} |
std::vector<int> delivered_sequence_numbers_; |
}; |
+class MockReceiver : public PacketReceiver { |
+ public: |
+ MOCK_METHOD4( |
+ DeliverPacket, |
+ DeliveryStatus(MediaType, const uint8_t*, size_t, const PacketTime&)); |
+}; |
+ |
class FakeNetworkPipeTest : public ::testing::Test { |
public: |
FakeNetworkPipeTest() : fake_clock_(12345) {} |
protected: |
- virtual void SetUp() { |
- receiver_.reset(new TestReceiver()); |
- ON_CALL(*receiver_, DeliverPacket(_, _, _, _)) |
- .WillByDefault(Return(PacketReceiver::DELIVERY_OK)); |
- } |
- |
- virtual void TearDown() { |
- } |
- |
void SendPackets(FakeNetworkPipe* pipe, int number_packets, int packet_size) { |
RTC_DCHECK_GE(packet_size, sizeof(int)); |
std::unique_ptr<uint8_t[]> packet(new uint8_t[packet_size]); |
@@ -85,47 +76,44 @@ class FakeNetworkPipeTest : public ::testing::Test { |
} |
SimulatedClock fake_clock_; |
- std::unique_ptr<TestReceiver> receiver_; |
}; |
-void DeleteMemory(uint8_t* data, int length) { delete [] data; } |
- |
// Test the capacity link and verify we get as many packets as we expect. |
TEST_F(FakeNetworkPipeTest, CapacityTest) { |
FakeNetworkPipe::Config config; |
config.queue_length_packets = 20; |
config.link_capacity_kbps = 80; |
- std::unique_ptr<FakeNetworkPipe> pipe( |
- new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO)); |
- pipe->SetReceiver(receiver_.get()); |
+ TestDemuxer* demuxer = new TestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
// Add 10 packets of 1000 bytes, = 80 kb, and verify it takes one second to |
// get through the pipe. |
const int kNumPackets = 10; |
const int kPacketSize = 1000; |
- SendPackets(pipe.get(), kNumPackets , kPacketSize); |
+ SendPackets(pipe.get(), kNumPackets, kPacketSize); |
// Time to get one packet through the link. |
const int kPacketTimeMs = PacketTimeMs(config.link_capacity_kbps, |
kPacketSize); |
// Time haven't increased yet, so we souldn't get any packets. |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(0); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0); |
pipe->Process(); |
// Advance enough time to release one packet. |
fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(1); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1); |
pipe->Process(); |
// Release all but one packet |
fake_clock_.AdvanceTimeMilliseconds(9 * kPacketTimeMs - 1); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(8); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(8); |
pipe->Process(); |
// And the last one. |
fake_clock_.AdvanceTimeMilliseconds(1); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(1); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1); |
pipe->Process(); |
} |
@@ -135,13 +123,13 @@ TEST_F(FakeNetworkPipeTest, ExtraDelayTest) { |
config.queue_length_packets = 20; |
config.queue_delay_ms = 100; |
config.link_capacity_kbps = 80; |
- std::unique_ptr<FakeNetworkPipe> pipe( |
- new FakeNetworkPipe(&fake_clock_, config, MediaType::AUDIO)); |
- pipe->SetReceiver(receiver_.get()); |
+ TestDemuxer* demuxer = new TestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
const int kNumPackets = 2; |
const int kPacketSize = 1000; |
- SendPackets(pipe.get(), kNumPackets , kPacketSize); |
+ SendPackets(pipe.get(), kNumPackets, kPacketSize); |
// Time to get one packet through the link. |
const int kPacketTimeMs = PacketTimeMs(config.link_capacity_kbps, |
@@ -149,17 +137,17 @@ TEST_F(FakeNetworkPipeTest, ExtraDelayTest) { |
// Increase more than kPacketTimeMs, but not more than the extra delay. |
fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(0); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0); |
pipe->Process(); |
// Advance the network delay to get the first packet. |
fake_clock_.AdvanceTimeMilliseconds(config.queue_delay_ms); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(1); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1); |
pipe->Process(); |
// Advance one more kPacketTimeMs to get the last packet. |
fake_clock_.AdvanceTimeMilliseconds(kPacketTimeMs); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(1); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1); |
pipe->Process(); |
} |
@@ -169,9 +157,9 @@ TEST_F(FakeNetworkPipeTest, QueueLengthTest) { |
FakeNetworkPipe::Config config; |
config.queue_length_packets = 2; |
config.link_capacity_kbps = 80; |
- std::unique_ptr<FakeNetworkPipe> pipe( |
- new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO)); |
- pipe->SetReceiver(receiver_.get()); |
+ TestDemuxer* demuxer = new TestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
const int kPacketSize = 1000; |
const int kPacketTimeMs = PacketTimeMs(config.link_capacity_kbps, |
@@ -183,7 +171,7 @@ TEST_F(FakeNetworkPipeTest, QueueLengthTest) { |
// Increase time enough to deliver all three packets, verify only two are |
// delivered. |
fake_clock_.AdvanceTimeMilliseconds(3 * kPacketTimeMs); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(2); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(2); |
pipe->Process(); |
} |
@@ -193,9 +181,9 @@ TEST_F(FakeNetworkPipeTest, StatisticsTest) { |
config.queue_length_packets = 2; |
config.queue_delay_ms = 20; |
config.link_capacity_kbps = 80; |
- std::unique_ptr<FakeNetworkPipe> pipe( |
- new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO)); |
- pipe->SetReceiver(receiver_.get()); |
+ TestDemuxer* demuxer = new TestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
const int kPacketSize = 1000; |
const int kPacketTimeMs = PacketTimeMs(config.link_capacity_kbps, |
@@ -206,7 +194,7 @@ TEST_F(FakeNetworkPipeTest, StatisticsTest) { |
fake_clock_.AdvanceTimeMilliseconds(3 * kPacketTimeMs + |
config.queue_delay_ms); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(2); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(2); |
pipe->Process(); |
// Packet 1: kPacketTimeMs + config.queue_delay_ms, |
@@ -223,9 +211,9 @@ TEST_F(FakeNetworkPipeTest, ChangingCapacityWithEmptyPipeTest) { |
FakeNetworkPipe::Config config; |
config.queue_length_packets = 20; |
config.link_capacity_kbps = 80; |
- std::unique_ptr<FakeNetworkPipe> pipe( |
- new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO)); |
- pipe->SetReceiver(receiver_.get()); |
+ TestDemuxer* demuxer = new TestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
// Add 10 packets of 1000 bytes, = 80 kb, and verify it takes one second to |
// get through the pipe. |
@@ -237,13 +225,13 @@ TEST_F(FakeNetworkPipeTest, ChangingCapacityWithEmptyPipeTest) { |
int packet_time_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize); |
// Time hasn't increased yet, so we souldn't get any packets. |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(0); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0); |
pipe->Process(); |
// Advance time in steps to release one packet at a time. |
for (int i = 0; i < kNumPackets; ++i) { |
fake_clock_.AdvanceTimeMilliseconds(packet_time_ms); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(1); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1); |
pipe->Process(); |
} |
@@ -259,20 +247,20 @@ TEST_F(FakeNetworkPipeTest, ChangingCapacityWithEmptyPipeTest) { |
packet_time_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize); |
// Time hasn't increased yet, so we souldn't get any packets. |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(0); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0); |
pipe->Process(); |
// Advance time in steps to release one packet at a time. |
for (int i = 0; i < kNumPackets; ++i) { |
fake_clock_.AdvanceTimeMilliseconds(packet_time_ms); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(1); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1); |
pipe->Process(); |
} |
// Check that all the packets were sent. |
EXPECT_EQ(static_cast<size_t>(2 * kNumPackets), pipe->sent_packets()); |
fake_clock_.AdvanceTimeMilliseconds(pipe->TimeUntilNextProcess()); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::VIDEO, _, _, _)).Times(0); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0); |
pipe->Process(); |
} |
@@ -282,9 +270,9 @@ TEST_F(FakeNetworkPipeTest, ChangingCapacityWithPacketsInPipeTest) { |
FakeNetworkPipe::Config config; |
config.queue_length_packets = 20; |
config.link_capacity_kbps = 80; |
- std::unique_ptr<FakeNetworkPipe> pipe( |
- new FakeNetworkPipe(&fake_clock_, config, MediaType::AUDIO)); |
- pipe->SetReceiver(receiver_.get()); |
+ TestDemuxer* demuxer = new TestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
// Add 10 packets of 1000 bytes, = 80 kb. |
const int kNumPackets = 10; |
@@ -306,27 +294,27 @@ TEST_F(FakeNetworkPipeTest, ChangingCapacityWithPacketsInPipeTest) { |
int packet_time_2_ms = PacketTimeMs(config.link_capacity_kbps, kPacketSize); |
// Time hasn't increased yet, so we souldn't get any packets. |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(0); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0); |
pipe->Process(); |
// Advance time in steps to release one packet at a time. |
for (int i = 0; i < kNumPackets; ++i) { |
fake_clock_.AdvanceTimeMilliseconds(packet_time_1_ms); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(1); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1); |
pipe->Process(); |
} |
// Advance time in steps to release one packet at a time. |
for (int i = 0; i < kNumPackets; ++i) { |
fake_clock_.AdvanceTimeMilliseconds(packet_time_2_ms); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(1); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(1); |
pipe->Process(); |
} |
// Check that all the packets were sent. |
EXPECT_EQ(static_cast<size_t>(2 * kNumPackets), pipe->sent_packets()); |
fake_clock_.AdvanceTimeMilliseconds(pipe->TimeUntilNextProcess()); |
- EXPECT_CALL(*receiver_, DeliverPacket(MediaType::AUDIO, _, _, _)).Times(0); |
+ EXPECT_CALL(*demuxer, DeliverPacket(_, _)).Times(0); |
pipe->Process(); |
} |
@@ -337,11 +325,9 @@ TEST_F(FakeNetworkPipeTest, DisallowReorderingThenAllowReordering) { |
config.link_capacity_kbps = 800; |
config.queue_delay_ms = 100; |
config.delay_standard_deviation_ms = 10; |
- std::unique_ptr<FakeNetworkPipe> pipe( |
- new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO)); |
- ReorderTestReceiver* receiver = new ReorderTestReceiver(); |
- receiver_.reset(receiver); |
- pipe->SetReceiver(receiver_.get()); |
+ ReorderTestDemuxer* demuxer = new ReorderTestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
const uint32_t kNumPackets = 100; |
const int kPacketSize = 10; |
@@ -350,9 +336,9 @@ TEST_F(FakeNetworkPipeTest, DisallowReorderingThenAllowReordering) { |
pipe->Process(); |
// Confirm that all packets have been delivered in order. |
- EXPECT_EQ(kNumPackets, receiver->delivered_sequence_numbers_.size()); |
+ EXPECT_EQ(kNumPackets, demuxer->delivered_sequence_numbers_.size()); |
int last_seq_num = -1; |
- for (int seq_num : receiver->delivered_sequence_numbers_) { |
+ for (int seq_num : demuxer->delivered_sequence_numbers_) { |
EXPECT_GT(seq_num, last_seq_num); |
last_seq_num = seq_num; |
} |
@@ -361,15 +347,15 @@ TEST_F(FakeNetworkPipeTest, DisallowReorderingThenAllowReordering) { |
pipe->SetConfig(config); |
SendPackets(pipe.get(), kNumPackets, kPacketSize); |
fake_clock_.AdvanceTimeMilliseconds(1000); |
- receiver->delivered_sequence_numbers_.clear(); |
+ demuxer->delivered_sequence_numbers_.clear(); |
pipe->Process(); |
// Confirm that all packets have been delivered |
// and that reordering has occured. |
- EXPECT_EQ(kNumPackets, receiver->delivered_sequence_numbers_.size()); |
+ EXPECT_EQ(kNumPackets, demuxer->delivered_sequence_numbers_.size()); |
bool reordering_has_occured = false; |
last_seq_num = -1; |
- for (int seq_num : receiver->delivered_sequence_numbers_) { |
+ for (int seq_num : demuxer->delivered_sequence_numbers_) { |
if (last_seq_num > seq_num) { |
reordering_has_occured = true; |
break; |
@@ -389,28 +375,26 @@ TEST_F(FakeNetworkPipeTest, BurstLoss) { |
config.queue_length_packets = kNumPackets; |
config.loss_percent = kLossPercent; |
config.avg_burst_loss_length = kAvgBurstLength; |
- std::unique_ptr<FakeNetworkPipe> pipe( |
- new FakeNetworkPipe(&fake_clock_, config, MediaType::VIDEO)); |
- ReorderTestReceiver* receiver = new ReorderTestReceiver(); |
- receiver_.reset(receiver); |
- pipe->SetReceiver(receiver_.get()); |
+ ReorderTestDemuxer* demuxer = new ReorderTestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
SendPackets(pipe.get(), kNumPackets, kPacketSize); |
fake_clock_.AdvanceTimeMilliseconds(1000); |
pipe->Process(); |
// Check that the average loss is |kLossPercent| percent. |
- int lost_packets = kNumPackets - receiver->delivered_sequence_numbers_.size(); |
+ int lost_packets = kNumPackets - demuxer->delivered_sequence_numbers_.size(); |
double loss_fraction = lost_packets / static_cast<double>(kNumPackets); |
EXPECT_NEAR(kLossPercent / 100.0, loss_fraction, 0.05); |
// Find the number of bursts that has occurred. |
- size_t received_packets = receiver->delivered_sequence_numbers_.size(); |
+ size_t received_packets = demuxer->delivered_sequence_numbers_.size(); |
int num_bursts = 0; |
for (size_t i = 0; i < received_packets - 1; ++i) { |
- int diff = receiver->delivered_sequence_numbers_[i + 1] - |
- receiver->delivered_sequence_numbers_[i]; |
+ int diff = demuxer->delivered_sequence_numbers_[i + 1] - |
+ demuxer->delivered_sequence_numbers_[i]; |
if (diff > 1) |
++num_bursts; |
} |
@@ -419,4 +403,43 @@ TEST_F(FakeNetworkPipeTest, BurstLoss) { |
EXPECT_NEAR(kAvgBurstLength, average_burst_length, 0.3); |
} |
+ |
+TEST_F(FakeNetworkPipeTest, SetReceiver) { |
+ FakeNetworkPipe::Config config; |
+ TestDemuxer* demuxer = new TestDemuxer(); |
+ std::unique_ptr<FakeNetworkPipe> pipe(new FakeNetworkPipe( |
+ &fake_clock_, config, std::unique_ptr<Demuxer>(demuxer))); |
+ MockReceiver packet_receiver; |
+ EXPECT_CALL(*demuxer, SetReceiver(&packet_receiver)).Times(1); |
+ pipe->SetReceiver(&packet_receiver); |
+} |
+ |
+TEST(DemuxerImplTest, Demuxing) { |
+ constexpr uint8_t kVideoPayloadType = 100; |
+ constexpr uint8_t kAudioPayloadType = 101; |
+ constexpr int64_t kTimeNow = 12345; |
+ constexpr int64_t kArrivalTime = kTimeNow - 1; |
+ constexpr size_t kPacketSize = 10; |
+ DemuxerImpl demuxer({{kVideoPayloadType, MediaType::VIDEO}, |
+ {kAudioPayloadType, MediaType::AUDIO}}); |
+ |
+ MockReceiver mock_receiver; |
+ demuxer.SetReceiver(&mock_receiver); |
+ |
+ std::vector<uint8_t> data(kPacketSize); |
+ data[1] = kVideoPayloadType; |
+ std::unique_ptr<NetworkPacket> packet( |
+ new NetworkPacket(&data[0], kPacketSize, kTimeNow, kArrivalTime)); |
+ EXPECT_CALL(mock_receiver, DeliverPacket(MediaType::VIDEO, _, _, _)) |
+ .WillOnce(Return(PacketReceiver::DELIVERY_OK)); |
+ demuxer.DeliverPacket(packet.get(), PacketTime()); |
+ |
+ data[1] = kAudioPayloadType; |
+ packet.reset( |
+ new NetworkPacket(&data[0], kPacketSize, kTimeNow, kArrivalTime)); |
+ EXPECT_CALL(mock_receiver, DeliverPacket(MediaType::AUDIO, _, _, _)) |
+ .WillOnce(Return(PacketReceiver::DELIVERY_OK)); |
+ demuxer.DeliverPacket(packet.get(), PacketTime()); |
+} |
+ |
} // namespace webrtc |