Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1342)

Unified Diff: webrtc/test/fake_network_pipe_unittest.cc

Issue 2794243002: Making FakeNetworkPipe demux audio and video packets. (Closed)
Patch Set: fixing android Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698