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 ff18993829896fe4488ca18c8cdad0fd95fe5982..233c5972b3e8fbce99edc882019d5becce5e7666 100644 |
--- a/webrtc/test/fake_network_pipe_unittest.cc |
+++ b/webrtc/test/fake_network_pipe_unittest.cc |
@@ -23,28 +23,45 @@ using ::testing::Invoke; |
namespace webrtc { |
-class MockReceiver : public PacketReceiver { |
+class TestReceiver : public PacketReceiver { |
public: |
- MockReceiver() {} |
- virtual ~MockReceiver() {} |
+ TestReceiver() {} |
+ virtual ~TestReceiver() {} |
void IncomingPacket(const uint8_t* data, size_t length) { |
DeliverPacket(MediaType::ANY, data, length, PacketTime()); |
delete [] data; |
} |
- MOCK_METHOD4( |
+ virtual MOCK_METHOD4( |
DeliverPacket, |
DeliveryStatus(MediaType, const uint8_t*, size_t, const PacketTime&)); |
}; |
+class ReorderTestReceiver : public TestReceiver { |
+ public: |
+ ReorderTestReceiver() {} |
+ virtual ~ReorderTestReceiver() {} |
+ |
+ DeliveryStatus DeliverPacket(MediaType media_type, |
+ const uint8_t* packet, |
+ size_t length, |
+ const PacketTime& packet_time) override { |
+ int seq_num; |
+ memcpy(&seq_num, packet, sizeof(int)); |
+ delivered_sequence_numbers_.push_back(seq_num); |
+ return PacketReceiver::DELIVERY_OK; |
+ } |
+ std::vector<int> delivered_sequence_numbers_; |
+}; |
+ |
class FakeNetworkPipeTest : public ::testing::Test { |
public: |
FakeNetworkPipeTest() : fake_clock_(12345) {} |
protected: |
virtual void SetUp() { |
- receiver_.reset(new MockReceiver()); |
+ receiver_.reset(new TestReceiver()); |
ON_CALL(*receiver_, DeliverPacket(_, _, _, _)) |
.WillByDefault(Return(PacketReceiver::DELIVERY_OK)); |
} |
@@ -52,19 +69,23 @@ class FakeNetworkPipeTest : public ::testing::Test { |
virtual void TearDown() { |
} |
- void SendPackets(FakeNetworkPipe* pipe, int number_packets, int kPacketSize) { |
- rtc::scoped_ptr<uint8_t[]> packet(new uint8_t[kPacketSize]); |
+ void SendPackets(FakeNetworkPipe* pipe, int number_packets, int packet_size) { |
+ RTC_DCHECK_GE(packet_size, static_cast<int>(sizeof(int))); |
+ rtc::scoped_ptr<uint8_t[]> packet(new uint8_t[packet_size]); |
for (int i = 0; i < number_packets; ++i) { |
- pipe->SendPacket(packet.get(), kPacketSize); |
+ // Set a sequence number for the packets by |
+ // using the first bytes in the packet. |
+ memcpy(packet.get(), &i, sizeof(int)); |
+ pipe->SendPacket(packet.get(), packet_size); |
} |
} |
- int PacketTimeMs(int capacity_kbps, int kPacketSize) const { |
- return 8 * kPacketSize / capacity_kbps; |
+ int PacketTimeMs(int capacity_kbps, int packet_size) const { |
+ return 8 * packet_size / capacity_kbps; |
} |
SimulatedClock fake_clock_; |
- rtc::scoped_ptr<MockReceiver> receiver_; |
+ rtc::scoped_ptr<TestReceiver> receiver_; |
}; |
void DeleteMemory(uint8_t* data, int length) { delete [] data; } |
@@ -308,4 +329,53 @@ TEST_F(FakeNetworkPipeTest, ChangingCapacityWithPacketsInPipeTest) { |
EXPECT_CALL(*receiver_, DeliverPacket(_, _, _, _)).Times(0); |
pipe->Process(); |
} |
+ |
+// At first disallow reordering and then allow reordering. |
+TEST_F(FakeNetworkPipeTest, DisallowReorderingThenAllowReordering) { |
+ FakeNetworkPipe::Config config; |
+ config.queue_length_packets = 1000; |
+ config.link_capacity_kbps = 800; |
+ config.queue_delay_ms = 100; |
+ config.delay_standard_deviation_ms = 10; |
+ rtc::scoped_ptr<FakeNetworkPipe> pipe( |
+ new FakeNetworkPipe(&fake_clock_, config)); |
+ ReorderTestReceiver* receiver = new ReorderTestReceiver(); |
+ receiver_.reset(receiver); |
+ pipe->SetReceiver(receiver_.get()); |
+ |
+ const uint32_t kNumPackets = 100; |
+ const int kPacketSize = 10; |
+ SendPackets(pipe.get(), kNumPackets, kPacketSize); |
+ fake_clock_.AdvanceTimeMilliseconds(1000); |
+ pipe->Process(); |
+ |
+ // Confirm that all packets have been delivered in order. |
+ EXPECT_EQ(kNumPackets, receiver->delivered_sequence_numbers_.size()); |
+ int last_seq_num = -1; |
+ for (int seq_num : receiver->delivered_sequence_numbers_) { |
+ EXPECT_GT(seq_num, last_seq_num); |
+ last_seq_num = seq_num; |
+ } |
+ |
+ config.allow_reordering = true; |
+ pipe->SetConfig(config); |
+ SendPackets(pipe.get(), kNumPackets, kPacketSize); |
+ fake_clock_.AdvanceTimeMilliseconds(1000); |
+ receiver->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()); |
+ bool reordering_has_occured = false; |
+ last_seq_num = -1; |
+ for (int seq_num : receiver->delivered_sequence_numbers_) { |
+ if (last_seq_num > seq_num) { |
+ reordering_has_occured = true; |
+ break; |
+ } |
+ last_seq_num = seq_num; |
+ } |
+ EXPECT_TRUE(reordering_has_occured); |
+} |
} // namespace webrtc |