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

Side by Side Diff: net/quic/quic_fec_group_test.cc

Issue 157803007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: win_x64 compiler error fix Created 6 years, 10 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_fec_group.cc ('k') | net/quic/quic_framer.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <algorithm> 5 #include <algorithm>
6 #include <vector> 6 #include <vector>
7 7
8 #include "base/basictypes.h" 8 #include "base/basictypes.h"
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/memory/scoped_ptr.h" 10 #include "base/memory/scoped_ptr.h"
(...skipping 18 matching lines...) Expand all
29 29
30 const bool kEntropyFlag[] = { 30 const bool kEntropyFlag[] = {
31 false, 31 false,
32 true, 32 true,
33 true, 33 true,
34 false, 34 false,
35 true, 35 true,
36 true, 36 true,
37 }; 37 };
38 38
39 const bool kTestFecPacketEntropy = false;
40
41 } // namespace 39 } // namespace
42 40
43 class QuicFecGroupTest : public ::testing::Test { 41 class QuicFecGroupTest : public ::testing::Test {
44 protected: 42 protected:
45 void RunTest(size_t num_packets, size_t lost_packet, bool out_of_order) { 43 void RunTest(size_t num_packets, size_t lost_packet, bool out_of_order) {
46 size_t max_len = strlen(kData[0]); 44 size_t max_len = strlen(kData[0]);
47 scoped_ptr<char[]> redundancy(new char[max_len]); 45 scoped_ptr<char[]> redundancy(new char[max_len]);
48 bool entropy_redundancy = false;
49 for (size_t packet = 0; packet < num_packets; ++packet) { 46 for (size_t packet = 0; packet < num_packets; ++packet) {
50 for (size_t i = 0; i < max_len; i++) { 47 for (size_t i = 0; i < max_len; i++) {
51 if (packet == 0) { 48 if (packet == 0) {
52 // Initialize to the first packet. 49 // Initialize to the first packet.
53 redundancy[i] = kData[0][i]; 50 redundancy[i] = kData[0][i];
54 continue; 51 continue;
55 } 52 }
56 // XOR in the remaining packets. 53 // XOR in the remaining packets.
57 uint8 byte = i > strlen(kData[packet]) ? 0x00 : kData[packet][i]; 54 uint8 byte = i > strlen(kData[packet]) ? 0x00 : kData[packet][i];
58 redundancy[i] = redundancy[i] ^ byte; 55 redundancy[i] = redundancy[i] ^ byte;
59 } 56 }
60 entropy_redundancy = (entropy_redundancy != kEntropyFlag[packet]);
61 } 57 }
62 58
63 QuicFecGroup group; 59 QuicFecGroup group;
64 60
65 // If we're out of order, send the FEC packet in the position of the 61 // If we're out of order, send the FEC packet in the position of the
66 // lost packet. Otherwise send all (non-missing) packets, then FEC. 62 // lost packet. Otherwise send all (non-missing) packets, then FEC.
67 if (out_of_order) { 63 if (out_of_order) {
68 // Update the FEC state for each non-lost packet. 64 // Update the FEC state for each non-lost packet.
69 for (size_t packet = 0; packet < num_packets; packet++) { 65 for (size_t packet = 0; packet < num_packets; packet++) {
70 if (packet == lost_packet) { 66 if (packet == lost_packet) {
71 ASSERT_FALSE(group.IsFinished()); 67 ASSERT_FALSE(group.IsFinished());
72 QuicFecData fec; 68 QuicFecData fec;
73 fec.fec_group = 0; 69 fec.fec_group = 0;
74 fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0])); 70 fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0]));
75 ASSERT_TRUE(group.UpdateFec(num_packets, entropy_redundancy, fec)); 71 ASSERT_TRUE(group.UpdateFec(num_packets, fec));
76 } else { 72 } else {
77 QuicPacketHeader header; 73 QuicPacketHeader header;
78 header.packet_sequence_number = packet; 74 header.packet_sequence_number = packet;
79 header.entropy_flag = kEntropyFlag[packet]; 75 header.entropy_flag = kEntropyFlag[packet];
80 ASSERT_TRUE(group.Update(header, kData[packet])); 76 ASSERT_TRUE(group.Update(header, kData[packet]));
81 } 77 }
82 ASSERT_TRUE(group.CanRevive() == (packet == num_packets - 1)); 78 ASSERT_TRUE(group.CanRevive() == (packet == num_packets - 1));
83 } 79 }
84 } else { 80 } else {
85 // Update the FEC state for each non-lost packet. 81 // Update the FEC state for each non-lost packet.
86 for (size_t packet = 0; packet < num_packets; packet++) { 82 for (size_t packet = 0; packet < num_packets; packet++) {
87 if (packet == lost_packet) { 83 if (packet == lost_packet) {
88 continue; 84 continue;
89 } 85 }
90 86
91 QuicPacketHeader header; 87 QuicPacketHeader header;
92 header.packet_sequence_number = packet; 88 header.packet_sequence_number = packet;
93 header.entropy_flag = kEntropyFlag[packet]; 89 header.entropy_flag = kEntropyFlag[packet];
94 ASSERT_TRUE(group.Update(header, kData[packet])); 90 ASSERT_TRUE(group.Update(header, kData[packet]));
95 ASSERT_FALSE(group.CanRevive()); 91 ASSERT_FALSE(group.CanRevive());
96 } 92 }
97 93
98 ASSERT_FALSE(group.IsFinished()); 94 ASSERT_FALSE(group.IsFinished());
99 // Attempt to revive the missing packet. 95 // Attempt to revive the missing packet.
100 QuicFecData fec; 96 QuicFecData fec;
101 fec.fec_group = 0; 97 fec.fec_group = 0;
102 fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0])); 98 fec.redundancy = StringPiece(redundancy.get(), strlen(kData[0]));
103 99
104 ASSERT_TRUE(group.UpdateFec(num_packets, entropy_redundancy, fec)); 100 ASSERT_TRUE(group.UpdateFec(num_packets, fec));
105 } 101 }
106 QuicPacketHeader header; 102 QuicPacketHeader header;
107 char recovered[kMaxPacketSize]; 103 char recovered[kMaxPacketSize];
108 ASSERT_TRUE(group.CanRevive()); 104 ASSERT_TRUE(group.CanRevive());
109 size_t len = group.Revive(&header, recovered, arraysize(recovered)); 105 size_t len = group.Revive(&header, recovered, arraysize(recovered));
110 ASSERT_NE(0u, len) 106 ASSERT_NE(0u, len)
111 << "Failed to revive packet " << lost_packet << " out of " 107 << "Failed to revive packet " << lost_packet << " out of "
112 << num_packets; 108 << num_packets;
113 EXPECT_EQ(lost_packet, header.packet_sequence_number) 109 EXPECT_EQ(lost_packet, header.packet_sequence_number)
114 << "Failed to revive packet " << lost_packet << " out of " 110 << "Failed to revive packet " << lost_packet << " out of "
115 << num_packets; 111 << num_packets;
116 EXPECT_EQ(kEntropyFlag[lost_packet], header.entropy_flag); 112 // Revived packets have an unknown entropy.
113 EXPECT_FALSE(header.entropy_flag);
117 ASSERT_GE(len, strlen(kData[lost_packet])) << "Incorrect length"; 114 ASSERT_GE(len, strlen(kData[lost_packet])) << "Incorrect length";
118 for (size_t i = 0; i < strlen(kData[lost_packet]); i++) { 115 for (size_t i = 0; i < strlen(kData[lost_packet]); i++) {
119 EXPECT_EQ(kData[lost_packet][i], recovered[i]); 116 EXPECT_EQ(kData[lost_packet][i], recovered[i]);
120 } 117 }
121 ASSERT_TRUE(group.IsFinished()); 118 ASSERT_TRUE(group.IsFinished());
122 } 119 }
123 }; 120 };
124 121
125 TEST_F(QuicFecGroupTest, UpdateAndRevive) { 122 TEST_F(QuicFecGroupTest, UpdateAndRevive) {
126 RunTest(2, 0, false); 123 RunTest(2, 0, false);
(...skipping 24 matching lines...) Expand all
151 148
152 QuicPacketHeader header; 149 QuicPacketHeader header;
153 header.packet_sequence_number = 3; 150 header.packet_sequence_number = 3;
154 group.Update(header, data1); 151 group.Update(header, data1);
155 152
156 QuicFecData fec; 153 QuicFecData fec;
157 fec.fec_group = 1; 154 fec.fec_group = 1;
158 fec.redundancy = redundancy; 155 fec.redundancy = redundancy;
159 156
160 header.packet_sequence_number = 2; 157 header.packet_sequence_number = 2;
161 ASSERT_FALSE(group.UpdateFec(2, kTestFecPacketEntropy, fec)); 158 ASSERT_FALSE(group.UpdateFec(2, fec));
162 } 159 }
163 160
164 TEST_F(QuicFecGroupTest, ProtectsPacketsBefore) { 161 TEST_F(QuicFecGroupTest, ProtectsPacketsBefore) {
165 QuicPacketHeader header; 162 QuicPacketHeader header;
166 header.packet_sequence_number = 3; 163 header.packet_sequence_number = 3;
167 164
168 QuicFecGroup group; 165 QuicFecGroup group;
169 ASSERT_TRUE(group.Update(header, kData[0])); 166 ASSERT_TRUE(group.Update(header, kData[0]));
170 167
171 EXPECT_FALSE(group.ProtectsPacketsBefore(1)); 168 EXPECT_FALSE(group.ProtectsPacketsBefore(1));
(...skipping 28 matching lines...) Expand all
200 EXPECT_TRUE(group.ProtectsPacketsBefore(9)); 197 EXPECT_TRUE(group.ProtectsPacketsBefore(9));
201 EXPECT_TRUE(group.ProtectsPacketsBefore(50)); 198 EXPECT_TRUE(group.ProtectsPacketsBefore(50));
202 } 199 }
203 200
204 TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithFecData) { 201 TEST_F(QuicFecGroupTest, ProtectsPacketsBeforeWithFecData) {
205 QuicFecData fec; 202 QuicFecData fec;
206 fec.fec_group = 2; 203 fec.fec_group = 2;
207 fec.redundancy = kData[0]; 204 fec.redundancy = kData[0];
208 205
209 QuicFecGroup group; 206 QuicFecGroup group;
210 ASSERT_TRUE(group.UpdateFec(3, kTestFecPacketEntropy, fec)); 207 ASSERT_TRUE(group.UpdateFec(3, fec));
211 208
212 EXPECT_FALSE(group.ProtectsPacketsBefore(1)); 209 EXPECT_FALSE(group.ProtectsPacketsBefore(1));
213 EXPECT_FALSE(group.ProtectsPacketsBefore(2)); 210 EXPECT_FALSE(group.ProtectsPacketsBefore(2));
214 EXPECT_TRUE(group.ProtectsPacketsBefore(3)); 211 EXPECT_TRUE(group.ProtectsPacketsBefore(3));
215 EXPECT_TRUE(group.ProtectsPacketsBefore(4)); 212 EXPECT_TRUE(group.ProtectsPacketsBefore(4));
216 EXPECT_TRUE(group.ProtectsPacketsBefore(5)); 213 EXPECT_TRUE(group.ProtectsPacketsBefore(5));
217 EXPECT_TRUE(group.ProtectsPacketsBefore(50)); 214 EXPECT_TRUE(group.ProtectsPacketsBefore(50));
218 } 215 }
219 216
220 } // namespace net 217 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_fec_group.cc ('k') | net/quic/quic_framer.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698