blob: 57e2bd1802acc0c185f4bf9e610aee464694b43e [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"
18
19namespace quic {
20namespace test {
21namespace {
22
23struct iovec MakeIovec(QuicStringPiece data) {
24 struct iovec iov = {const_cast<char*>(data.data()),
25 static_cast<size_t>(data.size())};
26 return iov;
27}
28
29class QuicStreamSendBufferTest : public QuicTest {
30 public:
31 QuicStreamSendBufferTest() : send_buffer_(&allocator_) {
32 EXPECT_EQ(0u, send_buffer_.size());
33 EXPECT_EQ(0u, send_buffer_.stream_bytes_written());
34 EXPECT_EQ(0u, send_buffer_.stream_bytes_outstanding());
vasilvvc48c8712019-03-11 13:38:16 -070035 std::string data1(1536, 'a');
36 std::string data2 = std::string(256, 'b') + std::string(256, 'c');
QUICHE teama6ef0a62019-03-07 20:34:33 -050037 struct iovec iov[2];
38 iov[0] = MakeIovec(QuicStringPiece(data1));
39 iov[1] = MakeIovec(QuicStringPiece(data2));
40
41 QuicMemSlice slice1(&allocator_, 1024);
42 memset(const_cast<char*>(slice1.data()), 'c', 1024);
43 QuicMemSlice slice2(&allocator_, 768);
44 memset(const_cast<char*>(slice2.data()), 'd', 768);
45
46 // Index starts from not pointing to any slice.
47 EXPECT_EQ(nullptr,
48 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_));
49
50 // Save all data.
51 SetQuicFlag(&FLAGS_quic_send_buffer_max_data_slice_size, 1024);
52 send_buffer_.SaveStreamData(iov, 2, 0, 2048);
53 send_buffer_.SaveMemSlice(std::move(slice1));
54 EXPECT_TRUE(slice1.empty());
55 send_buffer_.SaveMemSlice(std::move(slice2));
56 EXPECT_TRUE(slice2.empty());
57
58 EXPECT_EQ(4u, send_buffer_.size());
59 // At this point, the whole buffer looks like:
60 // | a * 1536 |b * 256| c * 1280 | d * 768 |
61 // | slice1 | slice2 | slice3 | slice4 |
62 }
63
64 void WriteAllData() {
65 // Write all data.
66 char buf[4000];
67 QuicDataWriter writer(4000, buf, HOST_BYTE_ORDER);
68 send_buffer_.WriteStreamData(0, 3840u, &writer);
69
70 send_buffer_.OnStreamDataConsumed(3840u);
71 EXPECT_EQ(3840u, send_buffer_.stream_bytes_written());
72 EXPECT_EQ(3840u, send_buffer_.stream_bytes_outstanding());
73 }
74
75 SimpleBufferAllocator allocator_;
76 QuicStreamSendBuffer send_buffer_;
77};
78
79TEST_F(QuicStreamSendBufferTest, CopyDataToBuffer) {
80 char buf[4000];
81 QuicDataWriter writer(4000, buf, HOST_BYTE_ORDER);
vasilvvc48c8712019-03-11 13:38:16 -070082 std::string copy1(1024, 'a');
83 std::string copy2 =
84 std::string(512, 'a') + std::string(256, 'b') + std::string(256, 'c');
85 std::string copy3(1024, 'c');
86 std::string copy4(768, 'd');
QUICHE teama6ef0a62019-03-07 20:34:33 -050087
88 ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer));
89 EXPECT_EQ(copy1, QuicStringPiece(buf, 1024));
90 ASSERT_TRUE(send_buffer_.WriteStreamData(1024, 1024, &writer));
91 EXPECT_EQ(copy2, QuicStringPiece(buf + 1024, 1024));
92 ASSERT_TRUE(send_buffer_.WriteStreamData(2048, 1024, &writer));
93 EXPECT_EQ(copy3, QuicStringPiece(buf + 2048, 1024));
94 ASSERT_TRUE(send_buffer_.WriteStreamData(3072, 768, &writer));
95 EXPECT_EQ(copy4, QuicStringPiece(buf + 3072, 768));
96
97 // Test data piece across boundries.
98 QuicDataWriter writer2(4000, buf, HOST_BYTE_ORDER);
vasilvvc48c8712019-03-11 13:38:16 -070099 std::string copy5 =
100 std::string(536, 'a') + std::string(256, 'b') + std::string(232, 'c');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500101 ASSERT_TRUE(send_buffer_.WriteStreamData(1000, 1024, &writer2));
102 EXPECT_EQ(copy5, QuicStringPiece(buf, 1024));
103 ASSERT_TRUE(send_buffer_.WriteStreamData(2500, 1024, &writer2));
vasilvvc48c8712019-03-11 13:38:16 -0700104 std::string copy6 = std::string(572, 'c') + std::string(452, 'd');
QUICHE teama6ef0a62019-03-07 20:34:33 -0500105 EXPECT_EQ(copy6, QuicStringPiece(buf + 1024, 1024));
106
107 // Invalid data copy.
108 QuicDataWriter writer3(4000, buf, HOST_BYTE_ORDER);
109 EXPECT_FALSE(send_buffer_.WriteStreamData(3000, 1024, &writer3));
110 EXPECT_QUIC_BUG(send_buffer_.WriteStreamData(0, 4000, &writer3),
111 "Writer fails to write.");
112
113 send_buffer_.OnStreamDataConsumed(3840);
114 EXPECT_EQ(3840u, send_buffer_.stream_bytes_written());
115 EXPECT_EQ(3840u, send_buffer_.stream_bytes_outstanding());
116}
117
118TEST_F(QuicStreamSendBufferTest, RemoveStreamFrame) {
119 WriteAllData();
120
121 QuicByteCount newly_acked_length;
122 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(1024, 1024, &newly_acked_length));
123 EXPECT_EQ(1024u, newly_acked_length);
124 EXPECT_EQ(4u, send_buffer_.size());
125
126 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2048, 1024, &newly_acked_length));
127 EXPECT_EQ(1024u, newly_acked_length);
128 EXPECT_EQ(4u, send_buffer_.size());
129
130 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 1024, &newly_acked_length));
131 EXPECT_EQ(1024u, newly_acked_length);
132
133 // Send buffer is cleaned up in order.
134 EXPECT_EQ(1u, send_buffer_.size());
135 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(3072, 768, &newly_acked_length));
136 EXPECT_EQ(768u, newly_acked_length);
137 EXPECT_EQ(0u, send_buffer_.size());
138}
139
140TEST_F(QuicStreamSendBufferTest, RemoveStreamFrameAcrossBoundries) {
141 WriteAllData();
142
143 QuicByteCount newly_acked_length;
144 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2024, 576, &newly_acked_length));
145 EXPECT_EQ(576u, newly_acked_length);
146 EXPECT_EQ(4u, send_buffer_.size());
147
148 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 1000, &newly_acked_length));
149 EXPECT_EQ(1000u, newly_acked_length);
150 EXPECT_EQ(4u, send_buffer_.size());
151
152 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(1000, 1024, &newly_acked_length));
153 EXPECT_EQ(1024u, newly_acked_length);
154 // Send buffer is cleaned up in order.
155 EXPECT_EQ(2u, send_buffer_.size());
156
157 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2600, 1024, &newly_acked_length));
158 EXPECT_EQ(1024u, newly_acked_length);
159 EXPECT_EQ(1u, send_buffer_.size());
160
161 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(3624, 216, &newly_acked_length));
162 EXPECT_EQ(216u, newly_acked_length);
163 EXPECT_EQ(0u, send_buffer_.size());
164}
165
166TEST_F(QuicStreamSendBufferTest, AckStreamDataMultipleTimes) {
167 WriteAllData();
168 QuicByteCount newly_acked_length;
169 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(100, 1500, &newly_acked_length));
170 EXPECT_EQ(1500u, newly_acked_length);
171 EXPECT_EQ(4u, send_buffer_.size());
172
173 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2000, 500, &newly_acked_length));
174 EXPECT_EQ(500u, newly_acked_length);
175 EXPECT_EQ(4u, send_buffer_.size());
176
177 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 2600, &newly_acked_length));
178 EXPECT_EQ(600u, newly_acked_length);
179 // Send buffer is cleaned up in order.
180 EXPECT_EQ(2u, send_buffer_.size());
181
182 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2200, 1640, &newly_acked_length));
183 EXPECT_EQ(1240u, newly_acked_length);
184 EXPECT_EQ(0u, send_buffer_.size());
185
186 EXPECT_FALSE(send_buffer_.OnStreamDataAcked(4000, 100, &newly_acked_length));
187}
188
189TEST_F(QuicStreamSendBufferTest, AckStreamDataOutOfOrder) {
190 WriteAllData();
191 QuicByteCount newly_acked_length;
192 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(500, 1000, &newly_acked_length));
193 EXPECT_EQ(1000u, newly_acked_length);
194 EXPECT_EQ(4u, send_buffer_.size());
195 EXPECT_EQ(3840u, QuicStreamSendBufferPeer::TotalLength(&send_buffer_));
196
197 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(1200, 1000, &newly_acked_length));
198 EXPECT_EQ(700u, newly_acked_length);
199 EXPECT_EQ(4u, send_buffer_.size());
200 // Slice 2 gets fully acked.
201 EXPECT_EQ(2816u, QuicStreamSendBufferPeer::TotalLength(&send_buffer_));
202
203 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(2000, 1840, &newly_acked_length));
204 EXPECT_EQ(1640u, newly_acked_length);
205 EXPECT_EQ(4u, send_buffer_.size());
206 // Slices 3 and 4 get fully acked.
207 EXPECT_EQ(1024u, QuicStreamSendBufferPeer::TotalLength(&send_buffer_));
208
209 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 1000, &newly_acked_length));
210 EXPECT_EQ(500u, newly_acked_length);
211 EXPECT_EQ(0u, send_buffer_.size());
212 EXPECT_EQ(0u, QuicStreamSendBufferPeer::TotalLength(&send_buffer_));
213}
214
215TEST_F(QuicStreamSendBufferTest, PendingRetransmission) {
216 WriteAllData();
217 EXPECT_TRUE(send_buffer_.IsStreamDataOutstanding(0, 3840));
218 EXPECT_FALSE(send_buffer_.HasPendingRetransmission());
219 // Lost data [0, 1200).
220 send_buffer_.OnStreamDataLost(0, 1200);
221 // Lost data [1500, 2000).
222 send_buffer_.OnStreamDataLost(1500, 500);
223 EXPECT_TRUE(send_buffer_.HasPendingRetransmission());
224
225 EXPECT_EQ(StreamPendingRetransmission(0, 1200),
226 send_buffer_.NextPendingRetransmission());
227 // Retransmit data [0, 500).
228 send_buffer_.OnStreamDataRetransmitted(0, 500);
229 EXPECT_TRUE(send_buffer_.IsStreamDataOutstanding(0, 500));
230 EXPECT_EQ(StreamPendingRetransmission(500, 700),
231 send_buffer_.NextPendingRetransmission());
232 // Ack data [500, 1200).
233 QuicByteCount newly_acked_length = 0;
234 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(500, 700, &newly_acked_length));
235 EXPECT_FALSE(send_buffer_.IsStreamDataOutstanding(500, 700));
236 EXPECT_TRUE(send_buffer_.HasPendingRetransmission());
237 EXPECT_EQ(StreamPendingRetransmission(1500, 500),
238 send_buffer_.NextPendingRetransmission());
239 // Retransmit data [1500, 2000).
240 send_buffer_.OnStreamDataRetransmitted(1500, 500);
241 EXPECT_FALSE(send_buffer_.HasPendingRetransmission());
242
243 // Lost [200, 800).
244 send_buffer_.OnStreamDataLost(200, 600);
245 EXPECT_TRUE(send_buffer_.HasPendingRetransmission());
246 // Verify [200, 500) is considered as lost, as [500, 800) has been acked.
247 EXPECT_EQ(StreamPendingRetransmission(200, 300),
248 send_buffer_.NextPendingRetransmission());
249
250 // Verify 0 length data is not outstanding.
251 EXPECT_FALSE(send_buffer_.IsStreamDataOutstanding(100, 0));
252 // Verify partially acked data is outstanding.
253 EXPECT_TRUE(send_buffer_.IsStreamDataOutstanding(400, 800));
254}
255
256TEST_F(QuicStreamSendBufferTest, CurrentWriteIndex) {
257 char buf[4000];
258 QuicDataWriter writer(4000, buf, HOST_BYTE_ORDER);
259 // With data buffered, index points to the 1st slice of data.
260 EXPECT_EQ(0u,
261 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
262 ASSERT_TRUE(send_buffer_.WriteStreamData(0, 1024, &writer));
263 // Wrote all data on 1st slice, index points to next slice.
264 EXPECT_EQ(1024u,
265 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
266 ASSERT_TRUE(send_buffer_.WriteStreamData(1024, 512, &writer));
267 // Last write didn't finish a whole slice. Index remains.
268 EXPECT_EQ(1024u,
269 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
270 send_buffer_.OnStreamDataConsumed(1024);
271
272 // If data in 1st slice gets ACK'ed, it shouldn't change the indexed slice
273 QuicByteCount newly_acked_length;
274 EXPECT_TRUE(send_buffer_.OnStreamDataAcked(0, 1024, &newly_acked_length));
275 EXPECT_EQ(1024u,
276 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
277
278 ASSERT_TRUE(
279 send_buffer_.WriteStreamData(1024 + 512, 3840 - 1024 - 512, &writer));
280 // After writing all buffered data, index become invalid again.
281 EXPECT_EQ(nullptr,
282 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_));
283 QuicMemSlice slice(&allocator_, 60);
284 memset(const_cast<char*>(slice.data()), 'e', 60);
285 send_buffer_.SaveMemSlice(std::move(slice));
286 // With new data, index points to the new data.
287 EXPECT_EQ(3840u,
288 QuicStreamSendBufferPeer::CurrentWriteSlice(&send_buffer_)->offset);
289}
290
wub553a9662019-03-28 20:13:23 -0700291TEST_F(QuicStreamSendBufferTest, SaveMemSliceSpan) {
292 SimpleBufferAllocator allocator;
293 QuicStreamSendBuffer send_buffer(&allocator);
294
295 char data[1024];
296 std::vector<std::pair<char*, size_t>> buffers;
297 for (size_t i = 0; i < 10; ++i) {
298 buffers.push_back(std::make_pair(data, 1024));
299 }
300 QuicTestMemSliceVector vector(buffers);
301
302 EXPECT_EQ(10 * 1024u, send_buffer.SaveMemSliceSpan(vector.span()));
303 EXPECT_EQ(10u, send_buffer.size());
304}
305
306TEST_F(QuicStreamSendBufferTest, SaveEmptyMemSliceSpan) {
307 SimpleBufferAllocator allocator;
308 QuicStreamSendBuffer send_buffer(&allocator);
309
310 char data[1024];
311 std::vector<std::pair<char*, size_t>> buffers;
312 for (size_t i = 0; i < 10; ++i) {
313 buffers.push_back(std::make_pair(data, 1024));
314 }
315 buffers.push_back(std::make_pair(nullptr, 0));
316 QuicTestMemSliceVector vector(buffers);
317
318 EXPECT_EQ(10 * 1024u, send_buffer.SaveMemSliceSpan(vector.span()));
319 // Verify the empty slice does not get saved.
320 EXPECT_EQ(10u, send_buffer.size());
321}
322
QUICHE teama6ef0a62019-03-07 20:34:33 -0500323} // namespace
324} // namespace test
325} // namespace quic