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

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

Issue 862133002: Update from https://crrev.com/312398 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 11 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
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 "net/quic/quic_packet_generator.h" 5 #include "net/quic/quic_packet_generator.h"
6 6
7 #include <string> 7 #include <string>
8 8
9 #include "net/quic/crypto/crypto_protocol.h" 9 #include "net/quic/crypto/crypto_protocol.h"
10 #include "net/quic/crypto/null_encrypter.h" 10 #include "net/quic/crypto/null_encrypter.h"
(...skipping 14 matching lines...) Expand all
25 using testing::InSequence; 25 using testing::InSequence;
26 using testing::Return; 26 using testing::Return;
27 using testing::SaveArg; 27 using testing::SaveArg;
28 using testing::StrictMock; 28 using testing::StrictMock;
29 using testing::_; 29 using testing::_;
30 30
31 namespace net { 31 namespace net {
32 namespace test { 32 namespace test {
33 namespace { 33 namespace {
34 34
35 const int64 kMinFecTimeoutMs = 5u;
36
35 class MockDelegate : public QuicPacketGenerator::DelegateInterface { 37 class MockDelegate : public QuicPacketGenerator::DelegateInterface {
36 public: 38 public:
37 MockDelegate() {} 39 MockDelegate() {}
38 ~MockDelegate() override {} 40 ~MockDelegate() override {}
39 41
40 MOCK_METHOD3(ShouldGeneratePacket, 42 MOCK_METHOD3(ShouldGeneratePacket,
41 bool(TransmissionType transmission_type, 43 bool(TransmissionType transmission_type,
42 HasRetransmittableData retransmittable, 44 HasRetransmittableData retransmittable,
43 IsHandshake handshake)); 45 IsHandshake handshake));
44 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*()); 46 MOCK_METHOD0(CreateAckFrame, QuicAckFrame*());
45 MOCK_METHOD0(CreateFeedbackFrame, QuicCongestionFeedbackFrame*());
46 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*()); 47 MOCK_METHOD0(CreateStopWaitingFrame, QuicStopWaitingFrame*());
47 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet)); 48 MOCK_METHOD1(OnSerializedPacket, void(const SerializedPacket& packet));
48 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool)); 49 MOCK_METHOD2(CloseConnection, void(QuicErrorCode, bool));
49 50
50 void SetCanWriteAnything() { 51 void SetCanWriteAnything() {
51 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) 52 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
52 .WillRepeatedly(Return(true)); 53 .WillRepeatedly(Return(true));
53 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, 54 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
54 NO_RETRANSMITTABLE_DATA, _)) 55 NO_RETRANSMITTABLE_DATA, _))
55 .WillRepeatedly(Return(true)); 56 .WillRepeatedly(Return(true));
56 } 57 }
57 58
58 void SetCanNotWrite() { 59 void SetCanNotWrite() {
59 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) 60 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
60 .WillRepeatedly(Return(false)); 61 .WillRepeatedly(Return(false));
61 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, 62 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
62 NO_RETRANSMITTABLE_DATA, _)) 63 NO_RETRANSMITTABLE_DATA, _))
63 .WillRepeatedly(Return(false)); 64 .WillRepeatedly(Return(false));
64 } 65 }
65 66
66 // Use this when only ack and feedback frames should be allowed to be written. 67 // Use this when only ack frames should be allowed to be written.
67 void SetCanWriteOnlyNonRetransmittable() { 68 void SetCanWriteOnlyNonRetransmittable() {
68 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _)) 69 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, _, _))
69 .WillRepeatedly(Return(false)); 70 .WillRepeatedly(Return(false));
70 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION, 71 EXPECT_CALL(*this, ShouldGeneratePacket(NOT_RETRANSMISSION,
71 NO_RETRANSMITTABLE_DATA, _)) 72 NO_RETRANSMITTABLE_DATA, _))
72 .WillRepeatedly(Return(true)); 73 .WillRepeatedly(Return(true));
73 } 74 }
74 75
75 private: 76 private:
76 DISALLOW_COPY_AND_ASSIGN(MockDelegate); 77 DISALLOW_COPY_AND_ASSIGN(MockDelegate);
77 }; 78 };
78 79
79 // Simple struct for describing the contents of a packet. 80 // Simple struct for describing the contents of a packet.
80 // Useful in conjunction with a SimpleQuicFrame for validating 81 // Useful in conjunction with a SimpleQuicFrame for validating that a packet
81 // that a packet contains the expected frames. 82 // contains the expected frames.
82 struct PacketContents { 83 struct PacketContents {
83 PacketContents() 84 PacketContents()
84 : num_ack_frames(0), 85 : num_ack_frames(0),
85 num_connection_close_frames(0), 86 num_connection_close_frames(0),
86 num_feedback_frames(0),
87 num_goaway_frames(0), 87 num_goaway_frames(0),
88 num_rst_stream_frames(0), 88 num_rst_stream_frames(0),
89 num_stop_waiting_frames(0), 89 num_stop_waiting_frames(0),
90 num_stream_frames(0), 90 num_stream_frames(0),
91 fec_group(0) { 91 fec_group(0) {
92 } 92 }
93 93
94 size_t num_ack_frames; 94 size_t num_ack_frames;
95 size_t num_connection_close_frames; 95 size_t num_connection_close_frames;
96 size_t num_feedback_frames;
97 size_t num_goaway_frames; 96 size_t num_goaway_frames;
98 size_t num_rst_stream_frames; 97 size_t num_rst_stream_frames;
99 size_t num_stop_waiting_frames; 98 size_t num_stop_waiting_frames;
100 size_t num_stream_frames; 99 size_t num_stream_frames;
101 100
102 QuicFecGroupNumber fec_group; 101 QuicFecGroupNumber fec_group;
103 }; 102 };
104 103
105 } // namespace 104 } // namespace
106 105
107 class QuicPacketGeneratorTest : public ::testing::Test { 106 class QuicPacketGeneratorTest : public ::testing::Test {
108 protected: 107 protected:
109 QuicPacketGeneratorTest() 108 QuicPacketGeneratorTest()
110 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false), 109 : framer_(QuicSupportedVersions(), QuicTime::Zero(), false),
111 generator_(42, &framer_, &random_, &delegate_), 110 generator_(42, &framer_, &random_, &delegate_),
112 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)), 111 creator_(QuicPacketGeneratorPeer::GetPacketCreator(&generator_)),
113 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), 112 packet_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
114 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), 113 packet2_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
115 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), 114 packet3_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
116 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), 115 packet4_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
117 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), 116 packet5_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
118 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr), 117 packet6_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
119 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {} 118 packet7_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr),
119 packet8_(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, nullptr) {}
120 120
121 ~QuicPacketGeneratorTest() override { 121 ~QuicPacketGeneratorTest() override {
122 delete packet_.packet; 122 delete packet_.packet;
123 delete packet_.retransmittable_frames; 123 delete packet_.retransmittable_frames;
124 delete packet2_.packet; 124 delete packet2_.packet;
125 delete packet2_.retransmittable_frames; 125 delete packet2_.retransmittable_frames;
126 delete packet3_.packet; 126 delete packet3_.packet;
127 delete packet3_.retransmittable_frames; 127 delete packet3_.retransmittable_frames;
128 delete packet4_.packet; 128 delete packet4_.packet;
129 delete packet4_.retransmittable_frames; 129 delete packet4_.retransmittable_frames;
130 delete packet5_.packet; 130 delete packet5_.packet;
131 delete packet5_.retransmittable_frames; 131 delete packet5_.retransmittable_frames;
132 delete packet6_.packet; 132 delete packet6_.packet;
133 delete packet6_.retransmittable_frames; 133 delete packet6_.retransmittable_frames;
134 delete packet7_.packet; 134 delete packet7_.packet;
135 delete packet7_.retransmittable_frames; 135 delete packet7_.retransmittable_frames;
136 delete packet8_.packet;
137 delete packet8_.retransmittable_frames;
136 } 138 }
137 139
138 QuicAckFrame* CreateAckFrame() { 140 QuicAckFrame* CreateAckFrame() {
139 // TODO(rch): Initialize this so it can be verified later. 141 // TODO(rch): Initialize this so it can be verified later.
140 return new QuicAckFrame(MakeAckFrame(0)); 142 return new QuicAckFrame(MakeAckFrame(0));
141 } 143 }
142 144
143 QuicCongestionFeedbackFrame* CreateFeedbackFrame() {
144 QuicCongestionFeedbackFrame* frame = new QuicCongestionFeedbackFrame;
145 frame->type = kTCP;
146 frame->tcp.receive_window = 0x4030;
147 return frame;
148 }
149
150 QuicStopWaitingFrame* CreateStopWaitingFrame() { 145 QuicStopWaitingFrame* CreateStopWaitingFrame() {
151 QuicStopWaitingFrame* frame = new QuicStopWaitingFrame(); 146 QuicStopWaitingFrame* frame = new QuicStopWaitingFrame();
152 frame->entropy_hash = 0; 147 frame->entropy_hash = 0;
153 frame->least_unacked = 0; 148 frame->least_unacked = 0;
154 return frame; 149 return frame;
155 } 150 }
156 151
157 QuicRstStreamFrame* CreateRstStreamFrame() { 152 QuicRstStreamFrame* CreateRstStreamFrame() {
158 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0); 153 return new QuicRstStreamFrame(1, QUIC_STREAM_NO_ERROR, 0);
159 } 154 }
160 155
161 QuicGoAwayFrame* CreateGoAwayFrame() { 156 QuicGoAwayFrame* CreateGoAwayFrame() {
162 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string()); 157 return new QuicGoAwayFrame(QUIC_NO_ERROR, 1, string());
163 } 158 }
164 159
165 void CheckPacketContains(const PacketContents& contents, 160 void CheckPacketContains(const PacketContents& contents,
166 const SerializedPacket& packet) { 161 const SerializedPacket& packet) {
167 size_t num_retransmittable_frames = contents.num_connection_close_frames + 162 size_t num_retransmittable_frames = contents.num_connection_close_frames +
168 contents.num_goaway_frames + contents.num_rst_stream_frames + 163 contents.num_goaway_frames + contents.num_rst_stream_frames +
169 contents.num_stream_frames; 164 contents.num_stream_frames;
170 size_t num_frames = contents.num_feedback_frames + contents.num_ack_frames + 165 size_t num_frames = contents.num_ack_frames +
171 contents.num_stop_waiting_frames + num_retransmittable_frames; 166 contents.num_stop_waiting_frames +
167 num_retransmittable_frames;
172 168
173 if (num_retransmittable_frames == 0) { 169 if (num_retransmittable_frames == 0) {
174 ASSERT_TRUE(packet.retransmittable_frames == nullptr); 170 ASSERT_TRUE(packet.retransmittable_frames == nullptr);
175 } else { 171 } else {
176 ASSERT_TRUE(packet.retransmittable_frames != nullptr); 172 ASSERT_TRUE(packet.retransmittable_frames != nullptr);
177 EXPECT_EQ(num_retransmittable_frames, 173 EXPECT_EQ(num_retransmittable_frames,
178 packet.retransmittable_frames->frames().size()); 174 packet.retransmittable_frames->frames().size());
179 } 175 }
180 176
181 ASSERT_TRUE(packet.packet != nullptr); 177 ASSERT_TRUE(packet.packet != nullptr);
182 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet)); 178 ASSERT_TRUE(simple_framer_.ProcessPacket(*packet.packet));
183 EXPECT_EQ(num_frames, simple_framer_.num_frames()); 179 EXPECT_EQ(num_frames, simple_framer_.num_frames());
184 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size()); 180 EXPECT_EQ(contents.num_ack_frames, simple_framer_.ack_frames().size());
185 EXPECT_EQ(contents.num_connection_close_frames, 181 EXPECT_EQ(contents.num_connection_close_frames,
186 simple_framer_.connection_close_frames().size()); 182 simple_framer_.connection_close_frames().size());
187 EXPECT_EQ(contents.num_feedback_frames,
188 simple_framer_.feedback_frames().size());
189 EXPECT_EQ(contents.num_goaway_frames, 183 EXPECT_EQ(contents.num_goaway_frames,
190 simple_framer_.goaway_frames().size()); 184 simple_framer_.goaway_frames().size());
191 EXPECT_EQ(contents.num_rst_stream_frames, 185 EXPECT_EQ(contents.num_rst_stream_frames,
192 simple_framer_.rst_stream_frames().size()); 186 simple_framer_.rst_stream_frames().size());
193 EXPECT_EQ(contents.num_stream_frames, 187 EXPECT_EQ(contents.num_stream_frames,
194 simple_framer_.stream_frames().size()); 188 simple_framer_.stream_frames().size());
195 EXPECT_EQ(contents.num_stop_waiting_frames, 189 EXPECT_EQ(contents.num_stop_waiting_frames,
196 simple_framer_.stop_waiting_frames().size()); 190 simple_framer_.stop_waiting_frames().size());
197 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group); 191 EXPECT_EQ(contents.fec_group, simple_framer_.header().fec_group);
198 } 192 }
(...skipping 30 matching lines...) Expand all
229 QuicPacketGenerator generator_; 223 QuicPacketGenerator generator_;
230 QuicPacketCreator* creator_; 224 QuicPacketCreator* creator_;
231 SimpleQuicFramer simple_framer_; 225 SimpleQuicFramer simple_framer_;
232 SerializedPacket packet_; 226 SerializedPacket packet_;
233 SerializedPacket packet2_; 227 SerializedPacket packet2_;
234 SerializedPacket packet3_; 228 SerializedPacket packet3_;
235 SerializedPacket packet4_; 229 SerializedPacket packet4_;
236 SerializedPacket packet5_; 230 SerializedPacket packet5_;
237 SerializedPacket packet6_; 231 SerializedPacket packet6_;
238 SerializedPacket packet7_; 232 SerializedPacket packet7_;
233 SerializedPacket packet8_;
239 234
240 private: 235 private:
241 scoped_ptr<char[]> data_array_; 236 scoped_ptr<char[]> data_array_;
242 }; 237 };
243 238
244 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate { 239 class MockDebugDelegate : public QuicPacketGenerator::DebugDelegate {
245 public: 240 public:
246 MOCK_METHOD1(OnFrameAddedToPacket, 241 MOCK_METHOD1(OnFrameAddedToPacket,
247 void(const QuicFrame&)); 242 void(const QuicFrame&));
248 }; 243 };
249 244
250 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) { 245 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_NotWritable) {
251 delegate_.SetCanNotWrite(); 246 delegate_.SetCanNotWrite();
252 247
253 generator_.SetShouldSendAck(false, false); 248 generator_.SetShouldSendAck(false);
254 EXPECT_TRUE(generator_.HasQueuedFrames()); 249 EXPECT_TRUE(generator_.HasQueuedFrames());
255 } 250 }
256 251
257 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) { 252 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldNotFlush) {
258 StrictMock<MockDebugDelegate> debug_delegate; 253 StrictMock<MockDebugDelegate> debug_delegate;
259 254
260 generator_.set_debug_delegate(&debug_delegate); 255 generator_.set_debug_delegate(&debug_delegate);
261 delegate_.SetCanWriteOnlyNonRetransmittable(); 256 delegate_.SetCanWriteOnlyNonRetransmittable();
262 generator_.StartBatchOperations(); 257 generator_.StartBatchOperations();
263 258
264 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); 259 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
265 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1); 260 EXPECT_CALL(debug_delegate, OnFrameAddedToPacket(_)).Times(1);
266 261
267 generator_.SetShouldSendAck(false, false); 262 generator_.SetShouldSendAck(false);
268 EXPECT_TRUE(generator_.HasQueuedFrames()); 263 EXPECT_TRUE(generator_.HasQueuedFrames());
269 } 264 }
270 265
271 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) { 266 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_WritableAndShouldFlush) {
272 delegate_.SetCanWriteOnlyNonRetransmittable(); 267 delegate_.SetCanWriteOnlyNonRetransmittable();
273 268
274 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); 269 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
275 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); 270 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
276 271
277 generator_.SetShouldSendAck(false, false); 272 generator_.SetShouldSendAck(false);
278 EXPECT_FALSE(generator_.HasQueuedFrames()); 273 EXPECT_FALSE(generator_.HasQueuedFrames());
279 274
280 PacketContents contents; 275 PacketContents contents;
281 contents.num_ack_frames = 1; 276 contents.num_ack_frames = 1;
282 CheckPacketContains(contents, packet_); 277 CheckPacketContains(contents, packet_);
283 } 278 }
284 279
285 TEST_F(QuicPacketGeneratorTest,
286 ShouldSendAckWithFeedback_WritableAndShouldNotFlush) {
287 delegate_.SetCanWriteOnlyNonRetransmittable();
288 generator_.StartBatchOperations();
289
290 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
291 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
292 Return(CreateFeedbackFrame()));
293
294 generator_.SetShouldSendAck(true, false);
295 EXPECT_TRUE(generator_.HasQueuedFrames());
296 }
297
298 TEST_F(QuicPacketGeneratorTest,
299 ShouldSendAckWithFeedback_WritableAndShouldFlush) {
300 delegate_.SetCanWriteOnlyNonRetransmittable();
301
302 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
303 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
304 Return(CreateFeedbackFrame()));
305 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce(
306 Return(CreateStopWaitingFrame()));
307
308 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
309
310 generator_.SetShouldSendAck(true, true);
311 EXPECT_FALSE(generator_.HasQueuedFrames());
312
313 PacketContents contents;
314 contents.num_ack_frames = 1;
315 contents.num_feedback_frames = 1;
316 contents.num_stop_waiting_frames = 1;
317 CheckPacketContains(contents, packet_);
318 }
319
320 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) { 280 TEST_F(QuicPacketGeneratorTest, ShouldSendAck_MultipleCalls) {
321 ValueRestore<bool> old_flag(&FLAGS_quic_disallow_multiple_pending_ack_frames,
322 true);
323
324 // Make sure that calling SetShouldSendAck multiple times does not result in a 281 // Make sure that calling SetShouldSendAck multiple times does not result in a
325 // crash. Previously this would result in multiple QuicFrames queued in the 282 // crash. Previously this would result in multiple QuicFrames queued in the
326 // packet generator, with all but the last with internal pointers to freed 283 // packet generator, with all but the last with internal pointers to freed
327 // memory. 284 // memory.
328 delegate_.SetCanWriteAnything(); 285 delegate_.SetCanWriteAnything();
329 286
330 // Only one AckFrame should be created. 287 // Only one AckFrame should be created.
331 EXPECT_CALL(delegate_, CreateAckFrame()) 288 EXPECT_CALL(delegate_, CreateAckFrame())
332 .Times(1) 289 .Times(1)
333 .WillOnce(Return(CreateAckFrame())); 290 .WillOnce(Return(CreateAckFrame()));
334 EXPECT_CALL(delegate_, OnSerializedPacket(_)) 291 EXPECT_CALL(delegate_, OnSerializedPacket(_))
335 .Times(1) 292 .Times(1)
336 .WillOnce(SaveArg<0>(&packet_)); 293 .WillOnce(SaveArg<0>(&packet_));
337 294
338 generator_.StartBatchOperations(); 295 generator_.StartBatchOperations();
339 generator_.SetShouldSendAck(false, false); 296 generator_.SetShouldSendAck(false);
340 generator_.SetShouldSendAck(false, false); 297 generator_.SetShouldSendAck(false);
341 generator_.FinishBatchOperations(); 298 generator_.FinishBatchOperations();
342 } 299 }
343 300
344 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) { 301 TEST_F(QuicPacketGeneratorTest, AddControlFrame_NotWritable) {
345 delegate_.SetCanNotWrite(); 302 delegate_.SetCanNotWrite();
346 303
347 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); 304 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
348 EXPECT_TRUE(generator_.HasQueuedFrames()); 305 EXPECT_TRUE(generator_.HasQueuedFrames());
349 } 306 }
350 307
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
424 EXPECT_EQ(3u, consumed.bytes_consumed); 381 EXPECT_EQ(3u, consumed.bytes_consumed);
425 EXPECT_TRUE(consumed.fin_consumed); 382 EXPECT_TRUE(consumed.fin_consumed);
426 EXPECT_FALSE(generator_.HasQueuedFrames()); 383 EXPECT_FALSE(generator_.HasQueuedFrames());
427 384
428 PacketContents contents; 385 PacketContents contents;
429 contents.num_stream_frames = 1; 386 contents.num_stream_frames = 1;
430 CheckPacketContains(contents, packet_); 387 CheckPacketContains(contents, packet_);
431 } 388 }
432 389
433 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) { 390 TEST_F(QuicPacketGeneratorTest, ConsumeData_EmptyData) {
434 ValueRestore<bool> old_flag(&FLAGS_quic_empty_data_no_fin_early_return, true);
435 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0, 391 EXPECT_DFATAL(generator_.ConsumeData(kHeadersStreamId, MakeIOVector(""), 0,
436 false, MAY_FEC_PROTECT, nullptr), 392 false, MAY_FEC_PROTECT, nullptr),
437 "Attempt to consume empty data without FIN."); 393 "Attempt to consume empty data without FIN.");
438 } 394 }
439 395
440 TEST_F(QuicPacketGeneratorTest, 396 TEST_F(QuicPacketGeneratorTest,
441 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) { 397 ConsumeDataMultipleTimes_WritableAndShouldNotFlush) {
442 delegate_.SetCanWriteAnything(); 398 delegate_.SetCanWriteAnything();
443 generator_.StartBatchOperations(); 399 generator_.StartBatchOperations();
444 400
(...skipping 21 matching lines...) Expand all
466 // Now both frames will be flushed out. 422 // Now both frames will be flushed out.
467 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); 423 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
468 generator_.FinishBatchOperations(); 424 generator_.FinishBatchOperations();
469 EXPECT_FALSE(generator_.HasQueuedFrames()); 425 EXPECT_FALSE(generator_.HasQueuedFrames());
470 426
471 PacketContents contents; 427 PacketContents contents;
472 contents.num_stream_frames = 2; 428 contents.num_stream_frames = 2;
473 CheckPacketContains(contents, packet_); 429 CheckPacketContains(contents, packet_);
474 } 430 }
475 431
476 TEST_F(QuicPacketGeneratorTest, ConsumeDataFEC) { 432 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnMaxGroupSize) {
477 delegate_.SetCanWriteAnything(); 433 delegate_.SetCanWriteAnything();
478 434
479 // Send FEC every two packets. 435 // Send FEC every two packets.
480 creator_->set_max_packets_per_fec_group(2); 436 creator_->set_max_packets_per_fec_group(2);
481 437
482 { 438 {
483 InSequence dummy; 439 InSequence dummy;
484 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 440 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
485 SaveArg<0>(&packet_)); 441 SaveArg<0>(&packet_));
486 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 442 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
487 SaveArg<0>(&packet2_)); 443 SaveArg<0>(&packet2_));
488 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 444 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
489 SaveArg<0>(&packet3_)); 445 SaveArg<0>(&packet3_));
490 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 446 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
491 SaveArg<0>(&packet4_)); 447 SaveArg<0>(&packet4_));
492 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
493 SaveArg<0>(&packet5_));
494 } 448 }
495 449
496 // Send enough data to create 3 packets: two full and one partial. Send 450 // Send enough data to create 3 packets: two full and one partial. Send with
497 // with MUST_FEC_PROTECT flag. 451 // MUST_FEC_PROTECT flag.
498 size_t data_len = 2 * kDefaultMaxPacketSize + 100; 452 size_t data_len = 2 * kDefaultMaxPacketSize + 100;
499 QuicConsumedData consumed = generator_.ConsumeData( 453 QuicConsumedData consumed = generator_.ConsumeData(
500 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); 454 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr);
501 EXPECT_EQ(data_len, consumed.bytes_consumed); 455 EXPECT_EQ(data_len, consumed.bytes_consumed);
502 EXPECT_TRUE(consumed.fin_consumed); 456 EXPECT_TRUE(consumed.fin_consumed);
503 EXPECT_FALSE(generator_.HasQueuedFrames()); 457 EXPECT_FALSE(generator_.HasQueuedFrames());
504 458
505 CheckPacketHasSingleStreamFrame(packet_); 459 CheckPacketHasSingleStreamFrame(packet_);
506 CheckPacketHasSingleStreamFrame(packet2_); 460 CheckPacketHasSingleStreamFrame(packet2_);
507 CheckPacketIsFec(packet3_, 1); 461 CheckPacketIsFec(packet3_, 1);
462 CheckPacketHasSingleStreamFrame(packet4_);
463 EXPECT_TRUE(creator_->IsFecProtected());
508 464
509 CheckPacketHasSingleStreamFrame(packet4_); 465 // The FEC packet under construction will be sent when one more packet is sent
510 CheckPacketIsFec(packet5_, 4); 466 // (since FEC group size is 2), or when OnFecTimeout is called. Send more data
467 // with MAY_FEC_PROTECT. This packet should also be protected, and FEC packet
468 // is sent since FEC group size is reached.
469 {
470 InSequence dummy;
471 EXPECT_CALL(delegate_, OnSerializedPacket(_))
472 .WillOnce(SaveArg<0>(&packet5_));
473 EXPECT_CALL(delegate_, OnSerializedPacket(_))
474 .WillOnce(SaveArg<0>(&packet6_));
475 }
476 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
477 nullptr);
478 EXPECT_EQ(1u, consumed.bytes_consumed);
479 CheckPacketHasSingleStreamFrame(packet5_);
480 CheckPacketIsFec(packet6_, 4);
481 EXPECT_FALSE(creator_->IsFecProtected());
511 } 482 }
512 483
513 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecAtEnd) { 484 TEST_F(QuicPacketGeneratorTest, ConsumeDataSendsFecOnTimeout) {
514 delegate_.SetCanWriteAnything(); 485 delegate_.SetCanWriteAnything();
486 creator_->set_max_packets_per_fec_group(1000);
515 487
516 // Enable FEC. 488 // Send data with MUST_FEC_PROTECT flag. No FEC packet is emitted, but the
489 // creator FEC protects all data.
490 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
491 QuicConsumedData consumed = generator_.ConsumeData(3, CreateData(1u), 0, true,
492 MUST_FEC_PROTECT, nullptr);
493 EXPECT_EQ(1u, consumed.bytes_consumed);
494 EXPECT_TRUE(consumed.fin_consumed);
495 CheckPacketHasSingleStreamFrame(packet_);
496 EXPECT_TRUE(creator_->IsFecProtected());
497
498 // Send more data with MAY_FEC_PROTECT. This packet should also be protected,
499 // and FEC packet is not yet sent.
500 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_));
501 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
502 nullptr);
503 EXPECT_EQ(1u, consumed.bytes_consumed);
504 CheckPacketHasSingleStreamFrame(packet2_);
505 EXPECT_TRUE(creator_->IsFecProtected());
506
507 // Calling OnFecTimeout should cause the FEC packet to be emitted.
508 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_));
509 generator_.OnFecTimeout();
510 CheckPacketIsFec(packet3_, 1);
511 EXPECT_FALSE(creator_->IsFecProtected());
512
513 // Subsequent data is protected under the next FEC group. Send enough data to
514 // create 2 more packets: one full and one partial.
515 {
516 InSequence dummy;
517 EXPECT_CALL(delegate_, OnSerializedPacket(_))
518 .WillOnce(SaveArg<0>(&packet4_));
519 EXPECT_CALL(delegate_, OnSerializedPacket(_))
520 .WillOnce(SaveArg<0>(&packet5_));
521 }
522 size_t data_len = kDefaultMaxPacketSize + 1;
523 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
524 MUST_FEC_PROTECT, nullptr);
525 EXPECT_EQ(data_len, consumed.bytes_consumed);
526 EXPECT_TRUE(consumed.fin_consumed);
527 CheckPacketHasSingleStreamFrame(packet4_);
528 CheckPacketHasSingleStreamFrame(packet5_);
529 EXPECT_TRUE(creator_->IsFecProtected());
530
531 // Calling OnFecTimeout should cause the FEC packet to be emitted.
532 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_));
533 generator_.OnFecTimeout();
534 CheckPacketIsFec(packet6_, 4);
535 EXPECT_FALSE(creator_->IsFecProtected());
536 }
537
538 TEST_F(QuicPacketGeneratorTest, GetFecTimeoutFiniteOnlyOnFirstPacketInGroup) {
539 delegate_.SetCanWriteAnything();
517 creator_->set_max_packets_per_fec_group(6); 540 creator_->set_max_packets_per_fec_group(6);
541
542 // Send enough data to create 2 packets: one full and one partial. Send with
543 // MUST_FEC_PROTECT flag. No FEC packet is emitted yet, but the creator FEC
544 // protects all data.
518 { 545 {
519 InSequence dummy; 546 InSequence dummy;
520 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 547 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
521 SaveArg<0>(&packet_)); 548 SaveArg<0>(&packet_));
522 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 549 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
523 SaveArg<0>(&packet2_)); 550 SaveArg<0>(&packet2_));
524 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
525 SaveArg<0>(&packet3_));
526 } 551 }
527
528 // Send enough data to create 2 packets: one full and one partial. Send
529 // with MUST_FEC_PROTECT flag.
530 size_t data_len = 1 * kDefaultMaxPacketSize + 100; 552 size_t data_len = 1 * kDefaultMaxPacketSize + 100;
531 QuicConsumedData consumed = generator_.ConsumeData( 553 QuicConsumedData consumed = generator_.ConsumeData(
532 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); 554 3, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr);
533 EXPECT_EQ(data_len, consumed.bytes_consumed); 555 EXPECT_EQ(data_len, consumed.bytes_consumed);
534 EXPECT_TRUE(consumed.fin_consumed); 556 EXPECT_TRUE(consumed.fin_consumed);
535 EXPECT_FALSE(generator_.HasQueuedFrames()); 557 EXPECT_FALSE(generator_.HasQueuedFrames());
536
537 CheckPacketHasSingleStreamFrame(packet_); 558 CheckPacketHasSingleStreamFrame(packet_);
538 CheckPacketHasSingleStreamFrame(packet2_); 559 CheckPacketHasSingleStreamFrame(packet2_);
539 CheckPacketIsFec(packet3_, 1); 560 EXPECT_TRUE(creator_->IsFecProtected());
561
562 // GetFecTimeout returns finite timeout only for first packet in group.
563 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs),
564 generator_.GetFecTimeout(/*sequence_number=*/1u));
565 EXPECT_EQ(QuicTime::Delta::Infinite(),
566 generator_.GetFecTimeout(/*sequence_number=*/2u));
567
568 // Send more data with MAY_FEC_PROTECT. This packet should also be protected,
569 // and FEC packet is not yet sent.
570 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet3_));
571 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
572 nullptr);
573 CheckPacketHasSingleStreamFrame(packet3_);
574 EXPECT_TRUE(creator_->IsFecProtected());
575
576 // GetFecTimeout returns finite timeout only for first packet in group.
577 EXPECT_EQ(QuicTime::Delta::Infinite(),
578 generator_.GetFecTimeout(/*sequence_number=*/3u));
579
580 // Calling OnFecTimeout should cause the FEC packet to be emitted.
581 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet4_));
582 generator_.OnFecTimeout();
583 CheckPacketIsFec(packet4_, /*fec_group=*/1u);
584 EXPECT_FALSE(creator_->IsFecProtected());
585
586 // Subsequent data is protected under the next FEC group. Send enough data to
587 // create 2 more packets: one full and one partial.
588 {
589 InSequence dummy;
590 EXPECT_CALL(delegate_, OnSerializedPacket(_))
591 .WillOnce(SaveArg<0>(&packet5_));
592 EXPECT_CALL(delegate_, OnSerializedPacket(_))
593 .WillOnce(SaveArg<0>(&packet6_));
594 }
595 data_len = kDefaultMaxPacketSize + 1u;
596 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
597 MUST_FEC_PROTECT, nullptr);
598 EXPECT_EQ(data_len, consumed.bytes_consumed);
599 EXPECT_TRUE(consumed.fin_consumed);
600 CheckPacketHasSingleStreamFrame(packet5_);
601 CheckPacketHasSingleStreamFrame(packet6_);
602 EXPECT_TRUE(creator_->IsFecProtected());
603
604 // GetFecTimeout returns finite timeout for first packet in the new group.
605 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(kMinFecTimeoutMs),
606 generator_.GetFecTimeout(/*sequence_number=*/5u));
607 EXPECT_EQ(QuicTime::Delta::Infinite(),
608 generator_.GetFecTimeout(/*sequence_number=*/6u));
609
610 // Calling OnFecTimeout should cause the FEC packet to be emitted.
611 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet7_));
612 generator_.OnFecTimeout();
613 CheckPacketIsFec(packet7_, /*fec_group=*/5u);
614 EXPECT_FALSE(creator_->IsFecProtected());
615
616 // Send more data with MAY_FEC_PROTECT. No FEC protection, so GetFecTimeout
617 // returns infinite.
618 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet8_));
619 consumed = generator_.ConsumeData(9, CreateData(1u), 0, true, MAY_FEC_PROTECT,
620 nullptr);
621 CheckPacketHasSingleStreamFrame(packet8_);
622 EXPECT_FALSE(creator_->IsFecProtected());
623 EXPECT_EQ(QuicTime::Delta::Infinite(),
624 generator_.GetFecTimeout(/*sequence_number=*/8u));
540 } 625 }
541 626
542 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) { 627 TEST_F(QuicPacketGeneratorTest, ConsumeData_FramesPreviouslyQueued) {
543 // Set the packet size be enough for two stream frames with 0 stream offset, 628 // Set the packet size be enough for two stream frames with 0 stream offset,
544 // but not enough for a stream frame of 0 offset and one with non-zero offset. 629 // but not enough for a stream frame of 0 offset and one with non-zero offset.
545 size_t length = 630 size_t length =
546 NullEncrypter().GetCiphertextSize(0) + 631 NullEncrypter().GetCiphertextSize(0) +
547 GetPacketHeaderSize(creator_->connection_id_length(), 632 GetPacketHeaderSize(creator_->connection_id_length(), true,
548 true,
549 creator_->next_sequence_number_length(), 633 creator_->next_sequence_number_length(),
550 NOT_IN_FEC_GROUP) + 634 NOT_IN_FEC_GROUP) +
551 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger 635 // Add an extra 3 bytes for the payload and 1 byte so BytesFree is larger
552 // than the GetMinStreamFrameSize. 636 // than the GetMinStreamFrameSize.
553 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 + 637 QuicFramer::GetMinStreamFrameSize(1, 0, false, NOT_IN_FEC_GROUP) + 3 +
554 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1; 638 QuicFramer::GetMinStreamFrameSize(1, 0, true, NOT_IN_FEC_GROUP) + 1;
555 creator_->set_max_packet_length(length); 639 creator_->set_max_packet_length(length);
556 delegate_.SetCanWriteAnything(); 640 delegate_.SetCanWriteAnything();
557 { 641 {
558 InSequence dummy; 642 InSequence dummy;
(...skipping 20 matching lines...) Expand all
579 EXPECT_EQ(3u, consumed.bytes_consumed); 663 EXPECT_EQ(3u, consumed.bytes_consumed);
580 EXPECT_TRUE(consumed.fin_consumed); 664 EXPECT_TRUE(consumed.fin_consumed);
581 EXPECT_FALSE(generator_.HasQueuedFrames()); 665 EXPECT_FALSE(generator_.HasQueuedFrames());
582 666
583 PacketContents contents; 667 PacketContents contents;
584 contents.num_stream_frames = 1; 668 contents.num_stream_frames = 1;
585 CheckPacketContains(contents, packet_); 669 CheckPacketContains(contents, packet_);
586 CheckPacketContains(contents, packet2_); 670 CheckPacketContains(contents, packet2_);
587 } 671 }
588 672
673 TEST_F(QuicPacketGeneratorTest, NoFecPacketSentWhenBatchEnds) {
674 delegate_.SetCanWriteAnything();
675 creator_->set_max_packets_per_fec_group(6);
676
677 generator_.StartBatchOperations();
678
679 generator_.ConsumeData(3, MakeIOVector("foo"), 2, true, MUST_FEC_PROTECT,
680 nullptr);
681 QuicConsumedData consumed = generator_.ConsumeData(
682 5, MakeIOVector("quux"), 7, false, MUST_FEC_PROTECT, nullptr);
683 EXPECT_EQ(4u, consumed.bytes_consumed);
684 EXPECT_FALSE(consumed.fin_consumed);
685 EXPECT_TRUE(generator_.HasQueuedFrames());
686
687 // Now both frames will be flushed out, but FEC packet is not yet sent.
688 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
689 generator_.FinishBatchOperations();
690 EXPECT_FALSE(generator_.HasQueuedFrames());
691
692 PacketContents contents;
693 contents.num_stream_frames = 2u;
694 contents.fec_group = 1u;
695 CheckPacketContains(contents, packet_);
696
697 // Forcing FEC timeout causes FEC packet to be emitted.
698 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet2_));
699 generator_.OnFecTimeout();
700 CheckPacketIsFec(packet2_, /*fec_group=*/1u);
701 }
702
589 TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) { 703 TEST_F(QuicPacketGeneratorTest, FecTimeoutOnRttChange) {
590 EXPECT_EQ(QuicTime::Delta::Zero(), generator_.fec_timeout()); 704 EXPECT_EQ(QuicTime::Delta::Zero(),
705 QuicPacketGeneratorPeer::GetFecTimeout(&generator_));
591 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300)); 706 generator_.OnRttChange(QuicTime::Delta::FromMilliseconds(300));
592 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150), generator_.fec_timeout()); 707 EXPECT_EQ(QuicTime::Delta::FromMilliseconds(150),
708 QuicPacketGeneratorPeer::GetFecTimeout(&generator_));
593 } 709 }
594 710
595 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) { 711 TEST_F(QuicPacketGeneratorTest, FecGroupSizeOnCongestionWindowChange) {
596 delegate_.SetCanWriteAnything(); 712 delegate_.SetCanWriteAnything();
597 creator_->set_max_packets_per_fec_group(50); 713 creator_->set_max_packets_per_fec_group(50);
598 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); 714 EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
599 EXPECT_FALSE(creator_->IsFecGroupOpen()); 715 EXPECT_FALSE(creator_->IsFecGroupOpen());
600 716
601 // On reduced cwnd. 717 // On reduced cwnd.
602 generator_.OnCongestionWindowChange(7); 718 generator_.OnCongestionWindowChange(7);
603 EXPECT_EQ(3u, creator_->max_packets_per_fec_group()); 719 EXPECT_EQ(3u, creator_->max_packets_per_fec_group());
604 720
605 // On increased cwnd. 721 // On increased cwnd.
606 generator_.OnCongestionWindowChange(100); 722 generator_.OnCongestionWindowChange(100);
607 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); 723 EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
608 724
609 // On collapsed cwnd. 725 // On collapsed cwnd.
610 generator_.OnCongestionWindowChange(1); 726 generator_.OnCongestionWindowChange(1);
611 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); 727 EXPECT_EQ(2u, creator_->max_packets_per_fec_group());
612 } 728 }
613 729
614 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) { 730 TEST_F(QuicPacketGeneratorTest, FecGroupSizeChangeWithOpenGroup) {
615 delegate_.SetCanWriteAnything(); 731 delegate_.SetCanWriteAnything();
616 // TODO(jri): This starting of batch mode should not be required when
617 // FEC sending is separated from batching operations.
618 generator_.StartBatchOperations(); 732 generator_.StartBatchOperations();
619 creator_->set_max_packets_per_fec_group(50); 733 creator_->set_max_packets_per_fec_group(50);
620 EXPECT_EQ(50u, creator_->max_packets_per_fec_group()); 734 EXPECT_EQ(50u, creator_->max_packets_per_fec_group());
621 EXPECT_FALSE(creator_->IsFecGroupOpen()); 735 EXPECT_FALSE(creator_->IsFecGroupOpen());
622 736
623 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 737 // Send enough data to create 4 packets with MUST_FEC_PROTECT flag. 3 packets
624 // 3 packets are sent, one is queued in the creator. 738 // are sent, one is queued in the creator.
625 { 739 {
626 InSequence dummy; 740 InSequence dummy;
627 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 741 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
628 SaveArg<0>(&packet_)); 742 SaveArg<0>(&packet_));
629 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 743 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
630 SaveArg<0>(&packet2_)); 744 SaveArg<0>(&packet2_));
631 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 745 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
632 SaveArg<0>(&packet3_)); 746 SaveArg<0>(&packet3_));
633 } 747 }
634 size_t data_len = 3 * kDefaultMaxPacketSize + 1; 748 size_t data_len = 3 * kDefaultMaxPacketSize + 1;
635 QuicConsumedData consumed = generator_.ConsumeData( 749 QuicConsumedData consumed = generator_.ConsumeData(
636 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr); 750 7, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr);
637 EXPECT_EQ(data_len, consumed.bytes_consumed); 751 EXPECT_EQ(data_len, consumed.bytes_consumed);
638 EXPECT_TRUE(creator_->IsFecGroupOpen()); 752 EXPECT_TRUE(creator_->IsFecGroupOpen());
639 753
640 // Change FEC groupsize. 754 // Change FEC groupsize.
641 generator_.OnCongestionWindowChange(2); 755 generator_.OnCongestionWindowChange(2);
642 EXPECT_EQ(2u, creator_->max_packets_per_fec_group()); 756 EXPECT_EQ(2u, creator_->max_packets_per_fec_group());
643 757
644 // Send enough data to trigger one unprotected data packet, 758 // Send enough data to trigger one unprotected data packet, causing the FEC
645 // causing the FEC packet to also be sent. 759 // packet to also be sent.
646 { 760 {
647 InSequence dummy; 761 InSequence dummy;
648 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 762 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
649 SaveArg<0>(&packet4_)); 763 SaveArg<0>(&packet4_));
650 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 764 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
651 SaveArg<0>(&packet5_)); 765 SaveArg<0>(&packet5_));
652 } 766 }
653 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0, 767 consumed = generator_.ConsumeData(7, CreateData(kDefaultMaxPacketSize), 0,
654 true, MAY_FEC_PROTECT, nullptr); 768 true, MAY_FEC_PROTECT, nullptr);
655 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed); 769 EXPECT_EQ(kDefaultMaxPacketSize, consumed.bytes_consumed);
(...skipping 24 matching lines...) Expand all
680 { 794 {
681 InSequence dummy; 795 InSequence dummy;
682 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 796 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
683 SaveArg<0>(&packet2_)); 797 SaveArg<0>(&packet2_));
684 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 798 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
685 SaveArg<0>(&packet3_)); 799 SaveArg<0>(&packet3_));
686 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 800 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
687 SaveArg<0>(&packet4_)); 801 SaveArg<0>(&packet4_));
688 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 802 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
689 SaveArg<0>(&packet5_)); 803 SaveArg<0>(&packet5_));
690 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
691 SaveArg<0>(&packet6_));
692 } 804 }
693 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag. 805 // Send enough data to create 3 packets with MUST_FEC_PROTECT flag.
694 size_t data_len = 2 * kDefaultMaxPacketSize + 100; 806 size_t data_len = 2 * kDefaultMaxPacketSize + 100;
695 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true, 807 consumed = generator_.ConsumeData(7, CreateData(data_len), 0, true,
696 MUST_FEC_PROTECT, nullptr); 808 MUST_FEC_PROTECT, nullptr);
697 EXPECT_EQ(data_len, consumed.bytes_consumed); 809 EXPECT_EQ(data_len, consumed.bytes_consumed);
698 EXPECT_FALSE(generator_.HasQueuedFrames()); 810 EXPECT_FALSE(generator_.HasQueuedFrames());
699 811
700 // Verify that two FEC packets were sent. 812 // Verify that packets sent were 3 data and 1 FEC.
701 CheckPacketHasSingleStreamFrame(packet2_); 813 CheckPacketHasSingleStreamFrame(packet2_);
702 CheckPacketHasSingleStreamFrame(packet3_); 814 CheckPacketHasSingleStreamFrame(packet3_);
703 CheckPacketIsFec(packet4_, /*fec_group=*/2u); 815 CheckPacketIsFec(packet4_, /*fec_group=*/2u);
704 CheckPacketHasSingleStreamFrame(packet5_); 816 CheckPacketHasSingleStreamFrame(packet5_);
705 CheckPacketIsFec(packet6_, /*fec_group=*/5u); // Sent at the end of stream. 817
818 // Calling OnFecTimeout should emit the pending FEC packet.
819 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet6_));
820 generator_.OnFecTimeout();
821 CheckPacketIsFec(packet6_, /*fec_group=*/5u);
706 822
707 // Send one unprotected data packet. 823 // Send one unprotected data packet.
708 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 824 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
709 SaveArg<0>(&packet7_)); 825 SaveArg<0>(&packet7_));
710 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT, 826 consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, MAY_FEC_PROTECT,
711 nullptr); 827 nullptr);
712 EXPECT_EQ(1u, consumed.bytes_consumed); 828 EXPECT_EQ(1u, consumed.bytes_consumed);
713 EXPECT_FALSE(generator_.HasQueuedFrames()); 829 EXPECT_FALSE(generator_.HasQueuedFrames());
714 EXPECT_FALSE(creator_->IsFecProtected()); 830 EXPECT_FALSE(creator_->IsFecProtected());
715 // Verify that one unprotected data packet was sent. 831 // Verify that one unprotected data packet was sent.
(...skipping 27 matching lines...) Expand all
743 EXPECT_TRUE(creator_->IsFecProtected()); 859 EXPECT_TRUE(creator_->IsFecProtected());
744 EXPECT_TRUE(creator_->HasPendingFrames()); 860 EXPECT_TRUE(creator_->HasPendingFrames());
745 } 861 }
746 862
747 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) { 863 TEST_F(QuicPacketGeneratorTest, SwitchFecOnWithPendingFramesInGenerator) {
748 // Enable FEC. 864 // Enable FEC.
749 creator_->set_max_packets_per_fec_group(2); 865 creator_->set_max_packets_per_fec_group(2);
750 866
751 // Queue control frames in generator. 867 // Queue control frames in generator.
752 delegate_.SetCanNotWrite(); 868 delegate_.SetCanNotWrite();
753 generator_.SetShouldSendAck(true, true); 869 generator_.SetShouldSendAck(true);
754 delegate_.SetCanWriteAnything(); 870 delegate_.SetCanWriteAnything();
755 generator_.StartBatchOperations(); 871 generator_.StartBatchOperations();
756 872
757 // Set up frames to write into the creator when control frames are written. 873 // Set up frames to write into the creator when control frames are written.
758 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); 874 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
759 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
760 Return(CreateFeedbackFrame()));
761 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce( 875 EXPECT_CALL(delegate_, CreateStopWaitingFrame()).WillOnce(
762 Return(CreateStopWaitingFrame())); 876 Return(CreateStopWaitingFrame()));
763 877
764 // Generator should have queued control frames, and creator should be empty. 878 // Generator should have queued control frames, and creator should be empty.
765 EXPECT_TRUE(generator_.HasQueuedFrames()); 879 EXPECT_TRUE(generator_.HasQueuedFrames());
766 EXPECT_FALSE(creator_->HasPendingFrames()); 880 EXPECT_FALSE(creator_->HasPendingFrames());
767 EXPECT_FALSE(creator_->IsFecProtected()); 881 EXPECT_FALSE(creator_->IsFecProtected());
768 882
769 // Queue protected data for sending. Should cause queued frames to be flushed. 883 // Queue protected data for sending. Should cause queued frames to be flushed.
770 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 884 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
771 SaveArg<0>(&packet_)); 885 SaveArg<0>(&packet_));
772 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true, 886 QuicConsumedData consumed = generator_.ConsumeData(7, CreateData(1u), 0, true,
773 MUST_FEC_PROTECT, nullptr); 887 MUST_FEC_PROTECT, nullptr);
774 EXPECT_EQ(1u, consumed.bytes_consumed); 888 EXPECT_EQ(1u, consumed.bytes_consumed);
775 PacketContents contents; 889 PacketContents contents;
776 contents.num_ack_frames = 1; 890 contents.num_ack_frames = 1;
777 contents.num_feedback_frames = 1;
778 contents.num_stop_waiting_frames = 1; 891 contents.num_stop_waiting_frames = 1;
779 CheckPacketContains(contents, packet_); 892 CheckPacketContains(contents, packet_);
780 893
781 // FEC protection should be on in creator. 894 // FEC protection should be on in creator.
782 EXPECT_TRUE(creator_->IsFecProtected()); 895 EXPECT_TRUE(creator_->IsFecProtected());
783 } 896 }
784 897
785 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) { 898 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentFramesProtected) {
786 delegate_.SetCanWriteAnything(); 899 delegate_.SetCanWriteAnything();
787 900
(...skipping 25 matching lines...) Expand all
813 EXPECT_TRUE(creator_->IsFecProtected()); 926 EXPECT_TRUE(creator_->IsFecProtected());
814 } 927 }
815 928
816 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) { 929 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffWithSubsequentPacketsProtected) {
817 delegate_.SetCanWriteAnything(); 930 delegate_.SetCanWriteAnything();
818 931
819 // Enable FEC. 932 // Enable FEC.
820 creator_->set_max_packets_per_fec_group(2); 933 creator_->set_max_packets_per_fec_group(2);
821 EXPECT_FALSE(creator_->IsFecProtected()); 934 EXPECT_FALSE(creator_->IsFecProtected());
822 935
823 generator_.StartBatchOperations();
824 // Send first packet, FEC protected. 936 // Send first packet, FEC protected.
825 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); 937 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
826 // Write enough data to cause a packet to be emitted. 938 QuicConsumedData consumed = generator_.ConsumeData(5, CreateData(1u), 0, true,
827 size_t data_len = kDefaultMaxPacketSize; 939 MUST_FEC_PROTECT, nullptr);
828 QuicConsumedData consumed = generator_.ConsumeData( 940 EXPECT_EQ(1u, consumed.bytes_consumed);
829 5, CreateData(data_len), 0, true, MUST_FEC_PROTECT, nullptr);
830 EXPECT_EQ(data_len, consumed.bytes_consumed);
831 PacketContents contents; 941 PacketContents contents;
832 contents.num_stream_frames = 1u; 942 contents.num_stream_frames = 1u;
833 contents.fec_group = 1u; 943 contents.fec_group = 1u;
834 CheckPacketContains(contents, packet_); 944 CheckPacketContains(contents, packet_);
835 945
836 // FEC should still be on in creator. 946 // FEC should still be on in creator.
837 EXPECT_TRUE(creator_->IsFecProtected()); 947 EXPECT_TRUE(creator_->IsFecProtected());
838 948
839 // Send enough unprotected data to cause second packet to be sent, which gets 949 // Send unprotected data to cause second packet to be sent, which gets
840 // protected because it happens to fall within an open FEC group. Data packet 950 // protected because it happens to fall within an open FEC group. Data packet
841 // will be followed by FEC packet. 951 // will be followed by FEC packet.
842 { 952 {
843 InSequence dummy; 953 InSequence dummy;
844 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 954 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
845 SaveArg<0>(&packet2_)); 955 SaveArg<0>(&packet2_));
846 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 956 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
847 SaveArg<0>(&packet3_)); 957 SaveArg<0>(&packet3_));
848 } 958 }
849 consumed = generator_.ConsumeData(5, CreateData(data_len), 0, true, 959 consumed = generator_.ConsumeData(5, CreateData(1u), 0, true, MAY_FEC_PROTECT,
850 MAY_FEC_PROTECT, nullptr); 960 nullptr);
851 EXPECT_EQ(data_len, consumed.bytes_consumed); 961 EXPECT_EQ(1u, consumed.bytes_consumed);
852 contents.num_stream_frames = 2u; 962 contents.num_stream_frames = 1u;
853 CheckPacketContains(contents, packet2_); 963 CheckPacketContains(contents, packet2_);
854 CheckPacketIsFec(packet3_, /*fec_group=*/1u); 964 CheckPacketIsFec(packet3_, /*fec_group=*/1u);
855 965
856 // FEC protection should be off in creator. 966 // FEC protection should be off in creator.
857 EXPECT_FALSE(creator_->IsFecProtected()); 967 EXPECT_FALSE(creator_->IsFecProtected());
858 } 968 }
859 969
860 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) { 970 TEST_F(QuicPacketGeneratorTest, SwitchFecOnOffThenOnWithCreatorProtectionOn) {
861 delegate_.SetCanWriteAnything(); 971 delegate_.SetCanWriteAnything();
862 generator_.StartBatchOperations(); 972 generator_.StartBatchOperations();
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
900 CheckPacketContains(contents, packet2_); 1010 CheckPacketContains(contents, packet2_);
901 CheckPacketIsFec(packet3_, /*fec_group=*/1u); 1011 CheckPacketIsFec(packet3_, /*fec_group=*/1u);
902 1012
903 // FEC protection should remain on in creator. 1013 // FEC protection should remain on in creator.
904 EXPECT_TRUE(creator_->IsFecProtected()); 1014 EXPECT_TRUE(creator_->IsFecProtected());
905 } 1015 }
906 1016
907 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) { 1017 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations) {
908 delegate_.SetCanNotWrite(); 1018 delegate_.SetCanNotWrite();
909 1019
910 generator_.SetShouldSendAck(true, false); 1020 generator_.SetShouldSendAck(false);
911 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); 1021 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
912 EXPECT_TRUE(generator_.HasQueuedFrames()); 1022 EXPECT_TRUE(generator_.HasQueuedFrames());
913 1023
914 delegate_.SetCanWriteAnything(); 1024 delegate_.SetCanWriteAnything();
915 1025
916 generator_.StartBatchOperations(); 1026 generator_.StartBatchOperations();
917 1027
918 // When the first write operation is invoked, the ack and feedback 1028 // When the first write operation is invoked, the ack frame will be returned.
919 // frames will be returned.
920 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); 1029 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
921 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
922 Return(CreateFeedbackFrame()));
923 1030
924 // Send some data and a control frame 1031 // Send some data and a control frame
925 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT, 1032 generator_.ConsumeData(3, MakeIOVector("quux"), 7, false, MAY_FEC_PROTECT,
926 nullptr); 1033 nullptr);
927 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); 1034 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
928 1035
929 // All five frames will be flushed out in a single packet. 1036 // All five frames will be flushed out in a single packet.
930 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_)); 1037 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(SaveArg<0>(&packet_));
931 generator_.FinishBatchOperations(); 1038 generator_.FinishBatchOperations();
932 EXPECT_FALSE(generator_.HasQueuedFrames()); 1039 EXPECT_FALSE(generator_.HasQueuedFrames());
933 1040
934 PacketContents contents; 1041 PacketContents contents;
935 contents.num_ack_frames = 1; 1042 contents.num_ack_frames = 1;
936 contents.num_goaway_frames = 1; 1043 contents.num_goaway_frames = 1;
937 contents.num_feedback_frames = 1;
938 contents.num_rst_stream_frames = 1; 1044 contents.num_rst_stream_frames = 1;
939 contents.num_stream_frames = 1; 1045 contents.num_stream_frames = 1;
940 CheckPacketContains(contents, packet_); 1046 CheckPacketContains(contents, packet_);
941 } 1047 }
942 1048
943 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) { 1049 TEST_F(QuicPacketGeneratorTest, NotWritableThenBatchOperations2) {
944 delegate_.SetCanNotWrite(); 1050 delegate_.SetCanNotWrite();
945 1051
946 generator_.SetShouldSendAck(true, false); 1052 generator_.SetShouldSendAck(false);
947 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame())); 1053 generator_.AddControlFrame(QuicFrame(CreateRstStreamFrame()));
948 EXPECT_TRUE(generator_.HasQueuedFrames()); 1054 EXPECT_TRUE(generator_.HasQueuedFrames());
949 1055
950 delegate_.SetCanWriteAnything(); 1056 delegate_.SetCanWriteAnything();
951 1057
952 generator_.StartBatchOperations(); 1058 generator_.StartBatchOperations();
953 1059
954 // When the first write operation is invoked, the ack and feedback 1060 // When the first write operation is invoked, the ack frame will be returned.
955 // frames will be returned.
956 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame())); 1061 EXPECT_CALL(delegate_, CreateAckFrame()).WillOnce(Return(CreateAckFrame()));
957 EXPECT_CALL(delegate_, CreateFeedbackFrame()).WillOnce(
958 Return(CreateFeedbackFrame()));
959 1062
960 { 1063 {
961 InSequence dummy; 1064 InSequence dummy;
962 // All five frames will be flushed out in a single packet 1065 // All five frames will be flushed out in a single packet
963 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 1066 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
964 SaveArg<0>(&packet_)); 1067 SaveArg<0>(&packet_));
965 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce( 1068 EXPECT_CALL(delegate_, OnSerializedPacket(_)).WillOnce(
966 SaveArg<0>(&packet2_)); 1069 SaveArg<0>(&packet2_));
967 } 1070 }
968 1071
969 // Send enough data to exceed one packet 1072 // Send enough data to exceed one packet
970 size_t data_len = kDefaultMaxPacketSize + 100; 1073 size_t data_len = kDefaultMaxPacketSize + 100;
971 QuicConsumedData consumed = generator_.ConsumeData( 1074 QuicConsumedData consumed = generator_.ConsumeData(
972 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr); 1075 3, CreateData(data_len), 0, true, MAY_FEC_PROTECT, nullptr);
973 EXPECT_EQ(data_len, consumed.bytes_consumed); 1076 EXPECT_EQ(data_len, consumed.bytes_consumed);
974 EXPECT_TRUE(consumed.fin_consumed); 1077 EXPECT_TRUE(consumed.fin_consumed);
975 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame())); 1078 generator_.AddControlFrame(QuicFrame(CreateGoAwayFrame()));
976 1079
977 generator_.FinishBatchOperations(); 1080 generator_.FinishBatchOperations();
978 EXPECT_FALSE(generator_.HasQueuedFrames()); 1081 EXPECT_FALSE(generator_.HasQueuedFrames());
979 1082
980 // The first packet should have the queued data and part of the stream data. 1083 // The first packet should have the queued data and part of the stream data.
981 PacketContents contents; 1084 PacketContents contents;
982 contents.num_ack_frames = 1; 1085 contents.num_ack_frames = 1;
983 contents.num_feedback_frames = 1;
984 contents.num_rst_stream_frames = 1; 1086 contents.num_rst_stream_frames = 1;
985 contents.num_stream_frames = 1; 1087 contents.num_stream_frames = 1;
986 CheckPacketContains(contents, packet_); 1088 CheckPacketContains(contents, packet_);
987 1089
988 // The second should have the remainder of the stream data. 1090 // The second should have the remainder of the stream data.
989 PacketContents contents2; 1091 PacketContents contents2;
990 contents2.num_goaway_frames = 1; 1092 contents2.num_goaway_frames = 1;
991 contents2.num_stream_frames = 1; 1093 contents2.num_stream_frames = 1;
992 CheckPacketContains(contents2, packet2_); 1094 CheckPacketContains(contents2, packet2_);
993 } 1095 }
(...skipping 16 matching lines...) Expand all
1010 generator_.SetConnectionIdLength(7); 1112 generator_.SetConnectionIdLength(7);
1011 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); 1113 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
1012 generator_.SetConnectionIdLength(8); 1114 generator_.SetConnectionIdLength(8);
1013 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); 1115 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
1014 generator_.SetConnectionIdLength(9); 1116 generator_.SetConnectionIdLength(9);
1015 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length()); 1117 EXPECT_EQ(PACKET_8BYTE_CONNECTION_ID, creator_->connection_id_length());
1016 } 1118 }
1017 1119
1018 } // namespace test 1120 } // namespace test
1019 } // namespace net 1121 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_generator.cc ('k') | net/quic/quic_protocol.h » ('j') | shell/BUILD.gn » ('J')

Powered by Google App Engine
This is Rietveld 408576698