blob: 5c1bff363518aa425ee3dd96f8a3decd829d493b [file] [log] [blame]
QUICHE teama6ef0a62019-03-07 20:34:33 -05001// Copyright (c) 2017 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "net/third_party/quiche/src/quic/core/quic_stream_send_buffer.h"
6
vasilvv872e7a32019-03-12 16:42:44 -07007#include <string>
8
QUICHE teama6ef0a62019-03-07 20:34:33 -05009#include "net/third_party/quiche/src/quic/core/quic_data_writer.h"
10#include "net/third_party/quiche/src/quic/core/quic_simple_buffer_allocator.h"
11#include "net/third_party/quiche/src/quic/core/quic_utils.h"
12#include "net/third_party/quiche/src/quic/platform/api/quic_expect_bug.h"
13#include "net/third_party/quiche/src/quic/platform/api/quic_flags.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050014#include "net/third_party/quiche/src/quic/platform/api/quic_test.h"
wub553a9662019-03-28 20:13:23 -070015#include "net/third_party/quiche/src/quic/platform/api/quic_test_mem_slice_vector.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050016#include "net/third_party/quiche/src/quic/test_tools/quic_stream_send_buffer_peer.h"
17#include "net/third_party/quiche/src/quic/test_tools/quic_test_utils.h"
dmcardlecf0bfcf2019-12-13 08:08:21 -080018#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"
QUICHE teama6ef0a62019-03-07 20:34:33 -050019
20namespace quic {
21namespace test {
22namespace {
23
dmcardlecf0bfcf2019-12-13 08:08:21 -080024struct iovec MakeIovec(quiche::QuicheStringPiece data) {
QUICHE teama6ef0a62019-03-07 20:34:33 -050025 struct iovec iov = {const_cast<char*>(data.data()),
26 static_cast<size_t>(data.size())};
27 return iov;
28}
29
30class QuicStreamSendBufferTest : public QuicTest {
31 public:
32 QuicStreamSendBufferTest() : send_buffer_(&allocator_) {
33 EXPECT_EQ(0u, send_buffer_.size());
34 EXPECT_EQ(0u, send_buffer_.stream_bytes_written());
35 EXPECT_EQ(0u, send_buffer_.stream_bytes_outstanding());
vasilvvc48c8712019-03-11 13:38:16 -070036 std::string data1(1536, 'a');
37 std::string data2 = std::string(256, 'b') + std::string(256, 'c');
QUICHE teama6ef0a62019-03-07 20:34:33 -050038 struct iovec iov[2];
dmcardlecf0bfcf2019-12-13 08:08:21 -080039 iov[0] = MakeIovec(quiche::QuicheStringPiece(data1));
40 iov[1] = MakeIovec(quiche::QuicheStringPiece(data2));
QUICHE teama6ef0a62019-03-07 20:34:33 -050041
42 QuicMemSlice slice1(&allocator_, 1024);
43 memset(const_cast<char*>(slice1.data()), 'c', 1024);
44 QuicMemSlice slice2(&allocator_, 768);
45 memset(const_cast<char*>(slice2.data()), 'd', 768);
46
47 // Index starts from not pointing to any slice.
48 EXPECT_EQ(nullptr,
49 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_));
50
51 // Save all data.
wub49855982019-05-01 14:16:26 -070052 SetQuicFlag(FLAGS_quic_send_buffer_max_data_slice_size, 1024);
QUICHE teama6ef0a62019-03-07 20:34:33 -050053 send_buffer_.SaveStreamData(iov, 2, 0, 2048);
54 send_buffer_.SaveMemSlice(std::move(slice1));
55 EXPECT_TRUE(slice1.empty());
56 send_buffer_.SaveMemSlice(std::move(slice2));
57 EXPECT_TRUE(slice2.empty());
58
59 EXPECT_EQ(4u, send_buffer_.size());
60 // At this point, the whole buffer looks like:
61 // | a * 1536 |b * 256| c * 1280 | d * 768 |
62 // | slice1 | slice2 | slice3 | slice4 |
63 }
64
65 void WriteAllData() {
66 // Write all data.
67 char buf[4000];
QUICHE team173c48f2019-11-19 16:34:44 -080068 QuicDataWriter writer(4000, buf, quiche::HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -050069 send_buffer_.WriteStreamData(0, 3840u, &writer);
70
71 send_buffer_.OnStreamDataConsumed(3840u);
72 EXPECT_EQ(3840u, send_buffer_.stream_bytes_written());
73 EXPECT_EQ(3840u, send_buffer_.stream_bytes_outstanding());
74 }
75
76 SimpleBufferAllocator allocator_;
77 QuicStreamSendBuffer send_buffer_;
78};
79
80TEST_F(QuicStreamSendBufferTest, CopyDataToBuffer) {
81 char buf[4000];
QUICHE team173c48f2019-11-19 16:34:44 -080082 QuicDataWriter writer(4000, buf, quiche::HOST_BYTE_ORDER);
vasilvvc48c8712019-03-11 13:38:16 -070083 std::string copy1(1024, 'a');
84 std::string copy2 =
85 std::string(512, 'a') + std::string(256, 'b') + std::string(256, 'c');
86 std::string copy3(1024, 'c');
87 std::string copy4(768, 'd');
QUICHE teama6ef0a62019-03-07 20:34:33 -050088
89 ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer));
dmcardlecf0bfcf2019-12-13 08:08:21 -080090 EXPECT_EQ(copy1, quiche::QuicheStringPiece(buf, 1024));
QUICHE teama6ef0a62019-03-07 20:34:33 -050091 ASSERT_TRUE(send_buffer_.WriteStreamData(1024, 1024, &writer));
dmcardlecf0bfcf2019-12-13 08:08:21 -080092 EXPECT_EQ(copy2, quiche::QuicheStringPiece(buf + 1024, 1024));
QUICHE teama6ef0a62019-03-07 20:34:33 -050093 ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 1024, &writer));
dmcardlecf0bfcf2019-12-13 08:08:21 -080094 EXPECT_EQ(copy3, quiche::QuicheStringPiece(buf + 2048, 1024));
QUICHE teama6ef0a62019-03-07 20:34:33 -050095 ASSERT_TRUE(send_buffer_.WriteStreamData(3072, 768, &writer));
dmcardlecf0bfcf2019-12-13 08:08:21 -080096 EXPECT_EQ(copy4, quiche::QuicheStringPiece(buf + 3072, 768));
QUICHE teama6ef0a62019-03-07 20:34:33 -050097
98 // Test data piece across boundries.
QUICHE team173c48f2019-11-19 16:34:44 -080099 QuicDataWriter writer2(4000, buf, quiche::HOST_BYTE_ORDER);
vasilvvc48c8712019-03-11 13:38:16 -0700100 std::string copy5 =
101 std::string(536, 'a') + std::string(256, 'b') + std::string(232, 'c');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500102 ASSERT_TRUE(send_buffer_.WriteStreamData(1000, 1024, &writer2));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800103 EXPECT_EQ(copy5, quiche::QuicheStringPiece(buf, 1024));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500104 ASSERT_TRUE(send_buffer_.WriteStreamData(2500, 1024, &writer2));
vasilvvc48c8712019-03-11 13:38:16 -0700105 std::string copy6 = std::string(572, 'c') + std::string(452, 'd');
dmcardlecf0bfcf2019-12-13 08:08:21 -0800106 EXPECT_EQ(copy6, quiche::QuicheStringPiece(buf + 1024, 1024));
QUICHE teama6ef0a62019-03-07 20:34:33 -0500107
108 // Invalid data copy.
QUICHE team173c48f2019-11-19 16:34:44 -0800109 QuicDataWriter writer3(4000, buf, quiche::HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500110 EXPECT_FALSE(send_buffer_.WriteStreamData(3000, 1024, &writer3));
111 EXPECT_QUIC_BUG(send_buffer_.WriteStreamData(0, 4000, &writer3),
112 "Writer fails to write.");
113
114 send_buffer_.OnStreamDataConsumed(3840);
115 EXPECT_EQ(3840u, send_buffer_.stream_bytes_written());
116 EXPECT_EQ(3840u, send_buffer_.stream_bytes_outstanding());
117}
118
renjietanga66e4152019-11-11 13:23:33 -0800119// Regression test for b/143491027.
120TEST_F(QuicStreamSendBufferTest,
121 WriteStreamDataContainsBothRetransmissionAndNewData) {
122 std::string copy1(1024, 'a');
123 std::string copy2 =
124 std::string(512, 'a') + std::string(256, 'b') + std::string(256, 'c');
125 std::string copy3 = std::string(1024, 'c') + std::string(100, 'd');
126 char buf[6000];
QUICHE team173c48f2019-11-19 16:34:44 -0800127 QuicDataWriter writer(6000, buf, quiche::HOST_BYTE_ORDER);
renjietanga66e4152019-11-11 13:23:33 -0800128 // Write more than one slice.
129 EXPECT_EQ(0, QuicStreamSendBufferPeer::write_index(&send_buffer_));
130 ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800131 EXPECT_EQ(copy1, quiche::QuicheStringPiece(buf, 1024));
renjietanga66e4152019-11-11 13:23:33 -0800132 EXPECT_EQ(1, QuicStreamSendBufferPeer::write_index(&send_buffer_));
133
134 // Retransmit the first frame and also send new data.
135 ASSERT_TRUE(send_buffer_.WriteStreamData(0, 2048, &writer));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800136 EXPECT_EQ(copy1 + copy2, quiche::QuicheStringPiece(buf + 1024, 2048));
renjietanga66e4152019-11-11 13:23:33 -0800137
138 // Write new data.
139 if (!GetQuicRestartFlag(quic_coalesce_stream_frames_2)) {
140 EXPECT_EQ(1, QuicStreamSendBufferPeer::write_index(&send_buffer_));
rchb87ddb12019-11-14 12:26:05 -0800141 EXPECT_QUIC_DEBUG_DEATH(send_buffer_.WriteStreamData(2048, 50, &writer),
142 "Tried to write data out of sequence.");
renjietanga66e4152019-11-11 13:23:33 -0800143 } else {
144 EXPECT_EQ(2, QuicStreamSendBufferPeer::write_index(&send_buffer_));
145 ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 50, &writer));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800146 EXPECT_EQ(std::string(50, 'c'),
147 quiche::QuicheStringPiece(buf + 1024 + 2048, 50));
renjietanga66e4152019-11-11 13:23:33 -0800148 EXPECT_EQ(2, QuicStreamSendBufferPeer::write_index(&send_buffer_));
149 ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 1124, &writer));
dmcardlecf0bfcf2019-12-13 08:08:21 -0800150 EXPECT_EQ(copy3, quiche::QuicheStringPiece(buf + 1024 + 2048 + 50, 1124));
renjietanga66e4152019-11-11 13:23:33 -0800151 EXPECT_EQ(3, QuicStreamSendBufferPeer::write_index(&send_buffer_));
152 }
153}
154
QUICHE teama6ef0a62019-03-07 20:34:33 -0500155TEST_F(QuicStreamSendBufferTest, RemoveStreamFrame) {
156 WriteAllData();
157
158 QuicByteCount newly_acked_length;
159 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(1024, 1024, &newly_acked_length));
160 EXPECT_EQ(1024u, newly_acked_length);
161 EXPECT_EQ(4u, send_buffer_.size());
162
163 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2048, 1024, &newly_acked_length));
164 EXPECT_EQ(1024u, newly_acked_length);
165 EXPECT_EQ(4u, send_buffer_.size());
166
167 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 1024, &newly_acked_length));
168 EXPECT_EQ(1024u, newly_acked_length);
169
170 // Send buffer is cleaned up in order.
171 EXPECT_EQ(1u, send_buffer_.size());
172 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(3072, 768, &newly_acked_length));
173 EXPECT_EQ(768u, newly_acked_length);
174 EXPECT_EQ(0u, send_buffer_.size());
175}
176
177TEST_F(QuicStreamSendBufferTest, RemoveStreamFrameAcrossBoundries) {
178 WriteAllData();
179
180 QuicByteCount newly_acked_length;
181 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2024, 576, &newly_acked_length));
182 EXPECT_EQ(576u, newly_acked_length);
183 EXPECT_EQ(4u, send_buffer_.size());
184
185 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 1000, &newly_acked_length));
186 EXPECT_EQ(1000u, newly_acked_length);
187 EXPECT_EQ(4u, send_buffer_.size());
188
189 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(1000, 1024, &newly_acked_length));
190 EXPECT_EQ(1024u, newly_acked_length);
191 // Send buffer is cleaned up in order.
192 EXPECT_EQ(2u, send_buffer_.size());
193
194 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2600, 1024, &newly_acked_length));
195 EXPECT_EQ(1024u, newly_acked_length);
196 EXPECT_EQ(1u, send_buffer_.size());
197
198 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(3624, 216, &newly_acked_length));
199 EXPECT_EQ(216u, newly_acked_length);
200 EXPECT_EQ(0u, send_buffer_.size());
201}
202
203TEST_F(QuicStreamSendBufferTest, AckStreamDataMultipleTimes) {
204 WriteAllData();
205 QuicByteCount newly_acked_length;
206 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(100, 1500, &newly_acked_length));
207 EXPECT_EQ(1500u, newly_acked_length);
208 EXPECT_EQ(4u, send_buffer_.size());
209
210 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2000, 500, &newly_acked_length));
211 EXPECT_EQ(500u, newly_acked_length);
212 EXPECT_EQ(4u, send_buffer_.size());
213
214 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 2600, &newly_acked_length));
215 EXPECT_EQ(600u, newly_acked_length);
216 // Send buffer is cleaned up in order.
217 EXPECT_EQ(2u, send_buffer_.size());
218
219 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2200, 1640, &newly_acked_length));
220 EXPECT_EQ(1240u, newly_acked_length);
221 EXPECT_EQ(0u, send_buffer_.size());
222
223 EXPECT_FALSE(send_buffer_.OnStreamDataAcked(4000, 100, &newly_acked_length));
224}
225
226TEST_F(QuicStreamSendBufferTest, AckStreamDataOutOfOrder) {
227 WriteAllData();
228 QuicByteCount newly_acked_length;
229 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(500, 1000, &newly_acked_length));
230 EXPECT_EQ(1000u, newly_acked_length);
231 EXPECT_EQ(4u, send_buffer_.size());
232 EXPECT_EQ(3840u, QuicStreamSendBufferPeer::TotalLength(&send_buffer_));
233
234 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(1200, 1000, &newly_acked_length));
235 EXPECT_EQ(700u, newly_acked_length);
236 EXPECT_EQ(4u, send_buffer_.size());
237 // Slice 2 gets fully acked.
238 EXPECT_EQ(2816u, QuicStreamSendBufferPeer::TotalLength(&send_buffer_));
239
240 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2000, 1840, &newly_acked_length));
241 EXPECT_EQ(1640u, newly_acked_length);
242 EXPECT_EQ(4u, send_buffer_.size());
243 // Slices 3 and 4 get fully acked.
244 EXPECT_EQ(1024u, QuicStreamSendBufferPeer::TotalLength(&send_buffer_));
245
246 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 1000, &newly_acked_length));
247 EXPECT_EQ(500u, newly_acked_length);
248 EXPECT_EQ(0u, send_buffer_.size());
249 EXPECT_EQ(0u, QuicStreamSendBufferPeer::TotalLength(&send_buffer_));
250}
251
252TEST_F(QuicStreamSendBufferTest, PendingRetransmission) {
253 WriteAllData();
254 EXPECT_TRUE(send_buffer_.IsStreamDataOutstanding(0, 3840));
255 EXPECT_FALSE(send_buffer_.HasPendingRetransmission());
256 // Lost data [0, 1200).
257 send_buffer_.OnStreamDataLost(0, 1200);
258 // Lost data [1500, 2000).
259 send_buffer_.OnStreamDataLost(1500, 500);
260 EXPECT_TRUE(send_buffer_.HasPendingRetransmission());
261
262 EXPECT_EQ(StreamPendingRetransmission(0, 1200),
263 send_buffer_.NextPendingRetransmission());
264 // Retransmit data [0, 500).
265 send_buffer_.OnStreamDataRetransmitted(0, 500);
266 EXPECT_TRUE(send_buffer_.IsStreamDataOutstanding(0, 500));
267 EXPECT_EQ(StreamPendingRetransmission(500, 700),
268 send_buffer_.NextPendingRetransmission());
269 // Ack data [500, 1200).
270 QuicByteCount newly_acked_length = 0;
271 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(500, 700, &newly_acked_length));
272 EXPECT_FALSE(send_buffer_.IsStreamDataOutstanding(500, 700));
273 EXPECT_TRUE(send_buffer_.HasPendingRetransmission());
274 EXPECT_EQ(StreamPendingRetransmission(1500, 500),
275 send_buffer_.NextPendingRetransmission());
276 // Retransmit data [1500, 2000).
277 send_buffer_.OnStreamDataRetransmitted(1500, 500);
278 EXPECT_FALSE(send_buffer_.HasPendingRetransmission());
279
280 // Lost [200, 800).
281 send_buffer_.OnStreamDataLost(200, 600);
282 EXPECT_TRUE(send_buffer_.HasPendingRetransmission());
283 // Verify [200, 500) is considered as lost, as [500, 800) has been acked.
284 EXPECT_EQ(StreamPendingRetransmission(200, 300),
285 send_buffer_.NextPendingRetransmission());
286
287 // Verify 0 length data is not outstanding.
288 EXPECT_FALSE(send_buffer_.IsStreamDataOutstanding(100, 0));
289 // Verify partially acked data is outstanding.
290 EXPECT_TRUE(send_buffer_.IsStreamDataOutstanding(400, 800));
291}
292
293TEST_F(QuicStreamSendBufferTest, CurrentWriteIndex) {
294 char buf[4000];
QUICHE team173c48f2019-11-19 16:34:44 -0800295 QuicDataWriter writer(4000, buf, quiche::HOST_BYTE_ORDER);
QUICHE teama6ef0a62019-03-07 20:34:33 -0500296 // With data buffered, index points to the 1st slice of data.
297 EXPECT_EQ(0u,
298 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
299 ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer));
300 // Wrote all data on 1st slice, index points to next slice.
301 EXPECT_EQ(1024u,
302 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
303 ASSERT_TRUE(send_buffer_.WriteStreamData(1024, 512, &writer));
304 // Last write didn't finish a whole slice. Index remains.
305 EXPECT_EQ(1024u,
306 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
307 send_buffer_.OnStreamDataConsumed(1024);
308
309 // If data in 1st slice gets ACK'ed, it shouldn't change the indexed slice
310 QuicByteCount newly_acked_length;
311 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 1024, &newly_acked_length));
312 EXPECT_EQ(1024u,
313 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
314
315 ASSERT_TRUE(
316 send_buffer_.WriteStreamData(1024 + 512, 3840 - 1024 - 512, &writer));
317 // After writing all buffered data, index become invalid again.
318 EXPECT_EQ(nullptr,
319 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_));
320 QuicMemSlice slice(&allocator_, 60);
321 memset(const_cast<char*>(slice.data()), 'e', 60);
322 send_buffer_.SaveMemSlice(std::move(slice));
323 // With new data, index points to the new data.
324 EXPECT_EQ(3840u,
325 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
326}
327
wub553a9662019-03-28 20:13:23 -0700328TEST_F(QuicStreamSendBufferTest, SaveMemSliceSpan) {
329 SimpleBufferAllocator allocator;
330 QuicStreamSendBuffer send_buffer(&allocator);
331
332 char data[1024];
333 std::vector<std::pair<char*, size_t>> buffers;
334 for (size_t i = 0; i < 10; ++i) {
335 buffers.push_back(std::make_pair(data, 1024));
336 }
337 QuicTestMemSliceVector vector(buffers);
338
339 EXPECT_EQ(10 * 1024u, send_buffer.SaveMemSliceSpan(vector.span()));
340 EXPECT_EQ(10u, send_buffer.size());
341}
342
343TEST_F(QuicStreamSendBufferTest, SaveEmptyMemSliceSpan) {
344 SimpleBufferAllocator allocator;
345 QuicStreamSendBuffer send_buffer(&allocator);
346
347 char data[1024];
348 std::vector<std::pair<char*, size_t>> buffers;
349 for (size_t i = 0; i < 10; ++i) {
350 buffers.push_back(std::make_pair(data, 1024));
351 }
352 buffers.push_back(std::make_pair(nullptr, 0));
353 QuicTestMemSliceVector vector(buffers);
354
355 EXPECT_EQ(10 * 1024u, send_buffer.SaveMemSliceSpan(vector.span()));
356 // Verify the empty slice does not get saved.
357 EXPECT_EQ(10u, send_buffer.size());
358}
359
QUICHE teama6ef0a62019-03-07 20:34:33 -0500360} // namespace
361} // namespace test
362} // namespace quic