| Index: net/quic/quic_fec_group_test.cc
|
| diff --git a/net/quic/quic_fec_group_test.cc b/net/quic/quic_fec_group_test.cc
|
| deleted file mode 100644
|
| index a918aeb2ba8b47b5af480db41799bd056a7b8aee..0000000000000000000000000000000000000000
|
| --- a/net/quic/quic_fec_group_test.cc
|
| +++ /dev/null
|
| @@ -1,242 +0,0 @@
|
| -// Copyright (c) 2012 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 "net/quic/quic_fec_group.h"
|
| -
|
| -#include <algorithm>
|
| -#include <vector>
|
| -
|
| -#include "base/basictypes.h"
|
| -#include "base/logging.h"
|
| -#include "base/memory/scoped_ptr.h"
|
| -#include "testing/gmock/include/gmock/gmock.h"
|
| -
|
| -using ::testing::_;
|
| -using base::StringPiece;
|
| -
|
| -namespace net {
|
| -
|
| -namespace {
|
| -
|
| -const char* const kData[] = {
|
| - "abc12345678",
|
| - "987defg",
|
| - "ghi12345",
|
| - "987jlkmno",
|
| - "mno4567890",
|
| - "789pqrstuvw",
|
| -};
|
| -
|
| -const bool kEntropyFlag[] = {
|
| - false,
|
| - true,
|
| - true,
|
| - false,
|
| - true,
|
| - true,
|
| -};
|
| -
|
| -} // namespace
|
| -
|
| -class QuicFecGroupTest : public ::testing::Test {
|
| - protected:
|
| - void RunTest(size_t num_packets, size_t lost_packet, bool out_of_order) {
|
| - size_t max_len = strlen(kData[0]);
|
| - scoped_ptr<char[]> redundancy(new char[max_len]);
|
| - for (size_t packet = 0; packet < num_packets; ++packet) {
|
| - for (size_t i = 0; i < max_len; i++) {
|
| - if (packet == 0) {
|
| - // Initialize to the first packet.
|
| - redundancy[i] = kData[0][i];
|
| - continue;
|
| - }
|
| - // XOR in the remaining packets.
|
| - uint8 byte = i > strlen(kData[packet]) ? 0x00 : kData[packet][i];
|
| - redundancy[i] = redundancy[i] ^ byte;
|
| - }
|
| - }
|
| -
|
| - QuicFecGroup group;
|
| -
|
| - // If we're out of order, send the FEC packet in the position of the
|
| - // lost packet. Otherwise send all (non-missing) packets, then FEC.
|
| - if (out_of_order) {
|
| - // Update the FEC state for each non-lost packet.
|
| - for (size_t packet = 0; packet < num_packets; packet++) {
|
| - if (packet == lost_packet) {
|
| - ASSERT_FALSE(group.IsFinished());
|
| - QuicFecData fec;
|
| - fec.fec_group = 0;
|
| - fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0]));
|
| - ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, num_packets,
|
| - fec));
|
| - } else {
|
| - QuicPacketHeader header;
|
| - header.packet_sequence_number = packet;
|
| - header.entropy_flag = kEntropyFlag[packet];
|
| - ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header,
|
| - kData[packet]));
|
| - }
|
| - ASSERT_TRUE(group.CanRevive() == (packet == num_packets - 1));
|
| - }
|
| - } else {
|
| - // Update the FEC state for each non-lost packet.
|
| - for (size_t packet = 0; packet < num_packets; packet++) {
|
| - if (packet == lost_packet) {
|
| - continue;
|
| - }
|
| -
|
| - QuicPacketHeader header;
|
| - header.packet_sequence_number = packet;
|
| - header.entropy_flag = kEntropyFlag[packet];
|
| - ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header,
|
| - kData[packet]));
|
| - ASSERT_FALSE(group.CanRevive());
|
| - }
|
| -
|
| - ASSERT_FALSE(group.IsFinished());
|
| - // Attempt to revive the missing packet.
|
| - QuicFecData fec;
|
| - fec.fec_group = 0;
|
| - fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0]));
|
| -
|
| - ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, num_packets,
|
| - fec));
|
| - }
|
| - QuicPacketHeader header;
|
| - char recovered[kMaxPacketSize];
|
| - ASSERT_TRUE(group.CanRevive());
|
| - size_t len = group.Revive(&header, recovered, arraysize(recovered));
|
| - ASSERT_NE(0u, len)
|
| - << "Failed to revive packet " << lost_packet << " out of "
|
| - << num_packets;
|
| - EXPECT_EQ(lost_packet, header.packet_sequence_number)
|
| - << "Failed to revive packet " << lost_packet << " out of "
|
| - << num_packets;
|
| - // Revived packets have an unknown entropy.
|
| - EXPECT_FALSE(header.entropy_flag);
|
| - ASSERT_GE(len, strlen(kData[lost_packet])) << "Incorrect length";
|
| - for (size_t i = 0; i < strlen(kData[lost_packet]); i++) {
|
| - EXPECT_EQ(kData[lost_packet][i], recovered[i]);
|
| - }
|
| - ASSERT_TRUE(group.IsFinished());
|
| - }
|
| -};
|
| -
|
| -TEST_F(QuicFecGroupTest, UpdateAndRevive) {
|
| - RunTest(2, 0, false);
|
| - RunTest(2, 1, false);
|
| -
|
| - RunTest(3, 0, false);
|
| - RunTest(3, 1, false);
|
| - RunTest(3, 2, false);
|
| -}
|
| -
|
| -TEST_F(QuicFecGroupTest, UpdateAndReviveOutOfOrder) {
|
| - RunTest(2, 0, true);
|
| - RunTest(2, 1, true);
|
| -
|
| - RunTest(3, 0, true);
|
| - RunTest(3, 1, true);
|
| - RunTest(3, 2, true);
|
| -}
|
| -
|
| -TEST_F(QuicFecGroupTest, UpdateFecIfReceivedPacketIsNotCovered) {
|
| - char data1[] = "abc123";
|
| - char redundancy[arraysize(data1)];
|
| - for (size_t i = 0; i < arraysize(data1); i++) {
|
| - redundancy[i] = data1[i];
|
| - }
|
| -
|
| - QuicFecGroup group;
|
| -
|
| - QuicPacketHeader header;
|
| - header.packet_sequence_number = 3;
|
| - group.Update(ENCRYPTION_FORWARD_SECURE, header, data1);
|
| -
|
| - QuicFecData fec;
|
| - fec.fec_group = 1;
|
| - fec.redundancy = redundancy;
|
| -
|
| - header.packet_sequence_number = 2;
|
| - ASSERT_FALSE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, 2, fec));
|
| -}
|
| -
|
| -TEST_F(QuicFecGroupTest, ProtectsPacketsBefore) {
|
| - QuicPacketHeader header;
|
| - header.packet_sequence_number = 3;
|
| -
|
| - QuicFecGroup group;
|
| - ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0]));
|
| -
|
| - EXPECT_FALSE(group.ProtectsPacketsBefore(1));
|
| - EXPECT_FALSE(group.ProtectsPacketsBefore(2));
|
| - EXPECT_FALSE(group.ProtectsPacketsBefore(3));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(4));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(5));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(50));
|
| -}
|
| -
|
| -TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithSeveralPackets) {
|
| - QuicPacketHeader header;
|
| - header.packet_sequence_number = 3;
|
| -
|
| - QuicFecGroup group;
|
| - ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0]));
|
| -
|
| - header.packet_sequence_number = 7;
|
| - ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0]));
|
| -
|
| - header.packet_sequence_number = 5;
|
| - ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0]));
|
| -
|
| - EXPECT_FALSE(group.ProtectsPacketsBefore(1));
|
| - EXPECT_FALSE(group.ProtectsPacketsBefore(2));
|
| - EXPECT_FALSE(group.ProtectsPacketsBefore(3));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(4));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(5));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(6));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(7));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(8));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(9));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(50));
|
| -}
|
| -
|
| -TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithFecData) {
|
| - QuicFecData fec;
|
| - fec.fec_group = 2;
|
| - fec.redundancy = kData[0];
|
| -
|
| - QuicFecGroup group;
|
| - ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, 3, fec));
|
| -
|
| - EXPECT_FALSE(group.ProtectsPacketsBefore(1));
|
| - EXPECT_FALSE(group.ProtectsPacketsBefore(2));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(3));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(4));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(5));
|
| - EXPECT_TRUE(group.ProtectsPacketsBefore(50));
|
| -}
|
| -
|
| -TEST_F(QuicFecGroupTest, EffectiveEncryptionLevel) {
|
| - QuicFecGroup group;
|
| - EXPECT_EQ(NUM_ENCRYPTION_LEVELS, group.effective_encryption_level());
|
| -
|
| - QuicPacketHeader header;
|
| - header.packet_sequence_number = 5;
|
| - ASSERT_TRUE(group.Update(ENCRYPTION_INITIAL, header, kData[0]));
|
| - EXPECT_EQ(ENCRYPTION_INITIAL, group.effective_encryption_level());
|
| -
|
| - QuicFecData fec;
|
| - fec.fec_group = 0;
|
| - fec.redundancy = kData[0];
|
| - ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, 7, fec));
|
| - EXPECT_EQ(ENCRYPTION_INITIAL, group.effective_encryption_level());
|
| -
|
| - header.packet_sequence_number = 3;
|
| - ASSERT_TRUE(group.Update(ENCRYPTION_NONE, header, kData[0]));
|
| - EXPECT_EQ(ENCRYPTION_NONE, group.effective_encryption_level());
|
| -}
|
| -
|
| -} // namespace net
|
|
|