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 |
index a918aeb2ba8b47b5af480db41799bd056a7b8aee..9f38da7fcabc377e7a8d171df3dbfae88941551b 100644 |
--- a/net/quic/quic_fec_group_test.cc |
+++ b/net/quic/quic_fec_group_test.cc |
@@ -19,22 +19,32 @@ namespace net { |
namespace { |
-const char* const kData[] = { |
- "abc12345678", |
- "987defg", |
- "ghi12345", |
- "987jlkmno", |
- "mno4567890", |
- "789pqrstuvw", |
+// kData[] and kEntropyFlag[] are indexed by packet sequence numbers, which |
+// start at 1, so their first elements are dummy. |
+const char* kData[] = { |
+ "", // dummy |
+ // kData[1] must be at least as long as every element of kData[], because |
+ // it is used to calculate kDataMaxLen. |
+ "abc12345678", |
+ "987defg", |
+ "ghi12345", |
+ "987jlkmno", |
+ "mno4567890", |
+ "789pqrstuvw", |
}; |
+// The maximum length of an element of kData. |
+const size_t kDataMaxLen = strlen(kData[1]); |
+// A suitable test data string, whose length is kDataMaxLen. |
+const char* kDataSingle = kData[1]; |
const bool kEntropyFlag[] = { |
- false, |
- true, |
- true, |
- false, |
- true, |
- true, |
+ false, // dummy |
+ false, |
+ true, |
+ true, |
+ false, |
+ true, |
+ true, |
}; |
} // namespace |
@@ -42,16 +52,16 @@ const bool kEntropyFlag[] = { |
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. |
+ // kData[] and kEntropyFlag[] are indexed by packet sequence numbers, which |
+ // start at 1. |
+ DCHECK_GE(arraysize(kData), num_packets); |
+ scoped_ptr<char[]> redundancy(new char[kDataMaxLen]); |
+ for (size_t i = 0; i < kDataMaxLen; i++) { |
+ redundancy[i] = 0x00; |
+ } |
+ // XOR in the packets. |
+ for (size_t packet = 1; packet <= num_packets; ++packet) { |
+ for (size_t i = 0; i < kDataMaxLen; i++) { |
uint8 byte = i > strlen(kData[packet]) ? 0x00 : kData[packet][i]; |
redundancy[i] = redundancy[i] ^ byte; |
} |
@@ -63,14 +73,14 @@ class QuicFecGroupTest : public ::testing::Test { |
// 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++) { |
+ for (size_t packet = 1; 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)); |
+ fec.fec_group = 1u; |
+ fec.redundancy = StringPiece(redundancy.get(), kDataMaxLen); |
+ ASSERT_TRUE( |
+ group.UpdateFec(ENCRYPTION_FORWARD_SECURE, num_packets + 1, fec)); |
} else { |
QuicPacketHeader header; |
header.packet_sequence_number = packet; |
@@ -78,11 +88,11 @@ class QuicFecGroupTest : public ::testing::Test { |
ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, |
kData[packet])); |
} |
- ASSERT_TRUE(group.CanRevive() == (packet == num_packets - 1)); |
+ ASSERT_TRUE(group.CanRevive() == (packet == num_packets)); |
} |
} else { |
// Update the FEC state for each non-lost packet. |
- for (size_t packet = 0; packet < num_packets; packet++) { |
+ for (size_t packet = 1; packet <= num_packets; packet++) { |
if (packet == lost_packet) { |
continue; |
} |
@@ -98,11 +108,11 @@ class QuicFecGroupTest : public ::testing::Test { |
ASSERT_FALSE(group.IsFinished()); |
// Attempt to revive the missing packet. |
QuicFecData fec; |
- fec.fec_group = 0; |
- fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0])); |
+ fec.fec_group = 1u; |
+ fec.redundancy = StringPiece(redundancy.get(), kDataMaxLen); |
- ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, num_packets, |
- fec)); |
+ ASSERT_TRUE( |
+ group.UpdateFec(ENCRYPTION_FORWARD_SECURE, num_packets + 1, fec)); |
} |
QuicPacketHeader header; |
char recovered[kMaxPacketSize]; |
@@ -125,21 +135,21 @@ class QuicFecGroupTest : public ::testing::Test { |
}; |
TEST_F(QuicFecGroupTest, UpdateAndRevive) { |
- RunTest(2, 0, false); |
RunTest(2, 1, false); |
+ RunTest(2, 2, false); |
- RunTest(3, 0, false); |
RunTest(3, 1, false); |
RunTest(3, 2, false); |
+ RunTest(3, 3, false); |
} |
TEST_F(QuicFecGroupTest, UpdateAndReviveOutOfOrder) { |
- RunTest(2, 0, true); |
RunTest(2, 1, true); |
+ RunTest(2, 2, true); |
- RunTest(3, 0, true); |
RunTest(3, 1, true); |
RunTest(3, 2, true); |
+ RunTest(3, 3, true); |
} |
TEST_F(QuicFecGroupTest, UpdateFecIfReceivedPacketIsNotCovered) { |
@@ -156,7 +166,7 @@ TEST_F(QuicFecGroupTest, UpdateFecIfReceivedPacketIsNotCovered) { |
group.Update(ENCRYPTION_FORWARD_SECURE, header, data1); |
QuicFecData fec; |
- fec.fec_group = 1; |
+ fec.fec_group = 1u; |
fec.redundancy = redundancy; |
header.packet_sequence_number = 2; |
@@ -168,7 +178,7 @@ TEST_F(QuicFecGroupTest, ProtectsPacketsBefore) { |
header.packet_sequence_number = 3; |
QuicFecGroup group; |
- ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0])); |
+ ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kDataSingle)); |
EXPECT_FALSE(group.ProtectsPacketsBefore(1)); |
EXPECT_FALSE(group.ProtectsPacketsBefore(2)); |
@@ -183,13 +193,13 @@ TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithSeveralPackets) { |
header.packet_sequence_number = 3; |
QuicFecGroup group; |
- ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0])); |
+ ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kDataSingle)); |
header.packet_sequence_number = 7; |
- ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0])); |
+ ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kDataSingle)); |
header.packet_sequence_number = 5; |
- ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kData[0])); |
+ ASSERT_TRUE(group.Update(ENCRYPTION_FORWARD_SECURE, header, kDataSingle)); |
EXPECT_FALSE(group.ProtectsPacketsBefore(1)); |
EXPECT_FALSE(group.ProtectsPacketsBefore(2)); |
@@ -205,8 +215,8 @@ TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithSeveralPackets) { |
TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithFecData) { |
QuicFecData fec; |
- fec.fec_group = 2; |
- fec.redundancy = kData[0]; |
+ fec.fec_group = 2u; |
+ fec.redundancy = kDataSingle; |
QuicFecGroup group; |
ASSERT_TRUE(group.UpdateFec(ENCRYPTION_FORWARD_SECURE, 3, fec)); |
@@ -225,17 +235,17 @@ TEST_F(QuicFecGroupTest, EffectiveEncryptionLevel) { |
QuicPacketHeader header; |
header.packet_sequence_number = 5; |
- ASSERT_TRUE(group.Update(ENCRYPTION_INITIAL, header, kData[0])); |
+ ASSERT_TRUE(group.Update(ENCRYPTION_INITIAL, header, kDataSingle)); |
EXPECT_EQ(ENCRYPTION_INITIAL, group.effective_encryption_level()); |
QuicFecData fec; |
- fec.fec_group = 0; |
- fec.redundancy = kData[0]; |
+ fec.fec_group = 1u; |
+ fec.redundancy = kDataSingle; |
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])); |
+ ASSERT_TRUE(group.Update(ENCRYPTION_NONE, header, kDataSingle)); |
EXPECT_EQ(ENCRYPTION_NONE, group.effective_encryption_level()); |
} |