xref: /aosp_15_r20/external/cronet/net/server/http_connection_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2014 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "net/server/http_connection.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include <string>
8*6777b538SAndroid Build Coastguard Worker #include <string_view>
9*6777b538SAndroid Build Coastguard Worker 
10*6777b538SAndroid Build Coastguard Worker #include "base/memory/ref_counted.h"
11*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker namespace net {
14*6777b538SAndroid Build Coastguard Worker namespace {
15*6777b538SAndroid Build Coastguard Worker 
GetTestString(int size)16*6777b538SAndroid Build Coastguard Worker std::string GetTestString(int size) {
17*6777b538SAndroid Build Coastguard Worker   std::string test_string;
18*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < size; ++i) {
19*6777b538SAndroid Build Coastguard Worker     test_string.push_back('A' + (i % 26));
20*6777b538SAndroid Build Coastguard Worker   }
21*6777b538SAndroid Build Coastguard Worker   return test_string;
22*6777b538SAndroid Build Coastguard Worker }
23*6777b538SAndroid Build Coastguard Worker 
TEST(HttpConnectionTest,ReadIOBuffer_SetCapacity)24*6777b538SAndroid Build Coastguard Worker TEST(HttpConnectionTest, ReadIOBuffer_SetCapacity) {
25*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HttpConnection::ReadIOBuffer> buffer =
26*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<HttpConnection::ReadIOBuffer>();
27*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0,
28*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
29*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0,
30*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
31*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->GetSize());
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker   const int kNewCapacity = HttpConnection::ReadIOBuffer::kInitialBufSize + 128;
34*6777b538SAndroid Build Coastguard Worker   buffer->SetCapacity(kNewCapacity);
35*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNewCapacity, buffer->GetCapacity());
36*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNewCapacity, buffer->RemainingCapacity());
37*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->GetSize());
38*6777b538SAndroid Build Coastguard Worker }
39*6777b538SAndroid Build Coastguard Worker 
TEST(HttpConnectionTest,ReadIOBuffer_SetCapacity_WithData)40*6777b538SAndroid Build Coastguard Worker TEST(HttpConnectionTest, ReadIOBuffer_SetCapacity_WithData) {
41*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HttpConnection::ReadIOBuffer> buffer =
42*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<HttpConnection::ReadIOBuffer>();
43*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0,
44*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
45*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0,
46*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
47*6777b538SAndroid Build Coastguard Worker 
48*6777b538SAndroid Build Coastguard Worker   // Write arbitrary data up to kInitialBufSize.
49*6777b538SAndroid Build Coastguard Worker   const std::string kReadData(
50*6777b538SAndroid Build Coastguard Worker       GetTestString(HttpConnection::ReadIOBuffer::kInitialBufSize));
51*6777b538SAndroid Build Coastguard Worker   memcpy(buffer->data(), kReadData.data(), kReadData.size());
52*6777b538SAndroid Build Coastguard Worker   buffer->DidRead(kReadData.size());
53*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0,
54*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
55*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize -
56*6777b538SAndroid Build Coastguard Worker                 static_cast<int>(kReadData.size()),
57*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
58*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kReadData.size()), buffer->GetSize());
59*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadData,
60*6777b538SAndroid Build Coastguard Worker             std::string_view(buffer->StartOfBuffer(), buffer->GetSize()));
61*6777b538SAndroid Build Coastguard Worker 
62*6777b538SAndroid Build Coastguard Worker   // Check if read data in the buffer is same after SetCapacity().
63*6777b538SAndroid Build Coastguard Worker   const int kNewCapacity = HttpConnection::ReadIOBuffer::kInitialBufSize + 128;
64*6777b538SAndroid Build Coastguard Worker   buffer->SetCapacity(kNewCapacity);
65*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNewCapacity, buffer->GetCapacity());
66*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kNewCapacity - static_cast<int>(kReadData.size()),
67*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
68*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kReadData.size()), buffer->GetSize());
69*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadData,
70*6777b538SAndroid Build Coastguard Worker             std::string_view(buffer->StartOfBuffer(), buffer->GetSize()));
71*6777b538SAndroid Build Coastguard Worker }
72*6777b538SAndroid Build Coastguard Worker 
TEST(HttpConnectionTest,ReadIOBuffer_IncreaseCapacity)73*6777b538SAndroid Build Coastguard Worker TEST(HttpConnectionTest, ReadIOBuffer_IncreaseCapacity) {
74*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HttpConnection::ReadIOBuffer> buffer =
75*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<HttpConnection::ReadIOBuffer>();
76*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->IncreaseCapacity());
77*6777b538SAndroid Build Coastguard Worker   const int kExpectedInitialBufSize =
78*6777b538SAndroid Build Coastguard Worker       HttpConnection::ReadIOBuffer::kInitialBufSize *
79*6777b538SAndroid Build Coastguard Worker       HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor;
80*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kExpectedInitialBufSize, buffer->GetCapacity());
81*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kExpectedInitialBufSize, buffer->RemainingCapacity());
82*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->GetSize());
83*6777b538SAndroid Build Coastguard Worker 
84*6777b538SAndroid Build Coastguard Worker   // Increase capacity until it fails.
85*6777b538SAndroid Build Coastguard Worker   while (buffer->IncreaseCapacity());
86*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->IncreaseCapacity());
87*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize + 0,
88*6777b538SAndroid Build Coastguard Worker             buffer->max_buffer_size());
89*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize + 0,
90*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
91*6777b538SAndroid Build Coastguard Worker 
92*6777b538SAndroid Build Coastguard Worker   // Enlarge capacity limit.
93*6777b538SAndroid Build Coastguard Worker   buffer->set_max_buffer_size(buffer->max_buffer_size() * 2);
94*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->IncreaseCapacity());
95*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize *
96*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor,
97*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
98*6777b538SAndroid Build Coastguard Worker 
99*6777b538SAndroid Build Coastguard Worker   // Shrink capacity limit. It doesn't change capacity itself.
100*6777b538SAndroid Build Coastguard Worker   buffer->set_max_buffer_size(
101*6777b538SAndroid Build Coastguard Worker       HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize / 2);
102*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->IncreaseCapacity());
103*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize *
104*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor,
105*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
106*6777b538SAndroid Build Coastguard Worker }
107*6777b538SAndroid Build Coastguard Worker 
TEST(HttpConnectionTest,ReadIOBuffer_IncreaseCapacity_WithData)108*6777b538SAndroid Build Coastguard Worker TEST(HttpConnectionTest, ReadIOBuffer_IncreaseCapacity_WithData) {
109*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HttpConnection::ReadIOBuffer> buffer =
110*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<HttpConnection::ReadIOBuffer>();
111*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->IncreaseCapacity());
112*6777b538SAndroid Build Coastguard Worker   const int kExpectedInitialBufSize =
113*6777b538SAndroid Build Coastguard Worker       HttpConnection::ReadIOBuffer::kInitialBufSize *
114*6777b538SAndroid Build Coastguard Worker       HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor;
115*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kExpectedInitialBufSize, buffer->GetCapacity());
116*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kExpectedInitialBufSize, buffer->RemainingCapacity());
117*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->GetSize());
118*6777b538SAndroid Build Coastguard Worker 
119*6777b538SAndroid Build Coastguard Worker   // Write arbitrary data up to kExpectedInitialBufSize.
120*6777b538SAndroid Build Coastguard Worker   std::string kReadData(GetTestString(kExpectedInitialBufSize));
121*6777b538SAndroid Build Coastguard Worker   memcpy(buffer->data(), kReadData.data(), kReadData.size());
122*6777b538SAndroid Build Coastguard Worker   buffer->DidRead(kReadData.size());
123*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kExpectedInitialBufSize, buffer->GetCapacity());
124*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kExpectedInitialBufSize - static_cast<int>(kReadData.size()),
125*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
126*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kReadData.size()), buffer->GetSize());
127*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadData,
128*6777b538SAndroid Build Coastguard Worker             std::string_view(buffer->StartOfBuffer(), buffer->GetSize()));
129*6777b538SAndroid Build Coastguard Worker 
130*6777b538SAndroid Build Coastguard Worker   // Increase capacity until it fails and check if read data in the buffer is
131*6777b538SAndroid Build Coastguard Worker   // same.
132*6777b538SAndroid Build Coastguard Worker   while (buffer->IncreaseCapacity());
133*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->IncreaseCapacity());
134*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize + 0,
135*6777b538SAndroid Build Coastguard Worker             buffer->max_buffer_size());
136*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize + 0,
137*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
138*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kDefaultMaxBufferSize -
139*6777b538SAndroid Build Coastguard Worker                 static_cast<int>(kReadData.size()),
140*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
141*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kReadData.size()), buffer->GetSize());
142*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadData,
143*6777b538SAndroid Build Coastguard Worker             std::string_view(buffer->StartOfBuffer(), buffer->GetSize()));
144*6777b538SAndroid Build Coastguard Worker }
145*6777b538SAndroid Build Coastguard Worker 
TEST(HttpConnectionTest,ReadIOBuffer_DidRead_DidConsume)146*6777b538SAndroid Build Coastguard Worker TEST(HttpConnectionTest, ReadIOBuffer_DidRead_DidConsume) {
147*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HttpConnection::ReadIOBuffer> buffer =
148*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<HttpConnection::ReadIOBuffer>();
149*6777b538SAndroid Build Coastguard Worker   const char* start_of_buffer = buffer->StartOfBuffer();
150*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start_of_buffer, buffer->data());
151*6777b538SAndroid Build Coastguard Worker 
152*6777b538SAndroid Build Coastguard Worker   // Read data.
153*6777b538SAndroid Build Coastguard Worker   const int kReadLength = 128;
154*6777b538SAndroid Build Coastguard Worker   const std::string kReadData(GetTestString(kReadLength));
155*6777b538SAndroid Build Coastguard Worker   memcpy(buffer->data(), kReadData.data(), kReadLength);
156*6777b538SAndroid Build Coastguard Worker   buffer->DidRead(kReadLength);
157*6777b538SAndroid Build Coastguard Worker   // No change in total capacity.
158*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize + 0,
159*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
160*6777b538SAndroid Build Coastguard Worker   // Change in unused capacity because of read data.
161*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize - kReadLength,
162*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
163*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadLength, buffer->GetSize());
164*6777b538SAndroid Build Coastguard Worker   // No change in start pointers of read data.
165*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start_of_buffer, buffer->StartOfBuffer());
166*6777b538SAndroid Build Coastguard Worker   // Change in start pointer of unused buffer.
167*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start_of_buffer + kReadLength, buffer->data());
168*6777b538SAndroid Build Coastguard Worker   // Test read data.
169*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadData, std::string(buffer->StartOfBuffer(), buffer->GetSize()));
170*6777b538SAndroid Build Coastguard Worker 
171*6777b538SAndroid Build Coastguard Worker   // Consume data partially.
172*6777b538SAndroid Build Coastguard Worker   const int kConsumedLength = 32;
173*6777b538SAndroid Build Coastguard Worker   ASSERT_LT(kConsumedLength, kReadLength);
174*6777b538SAndroid Build Coastguard Worker   buffer->DidConsume(kConsumedLength);
175*6777b538SAndroid Build Coastguard Worker   // Capacity reduced because read data was too small comparing to capacity.
176*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize /
177*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor,
178*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
179*6777b538SAndroid Build Coastguard Worker   // Change in unused capacity because of read data.
180*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize /
181*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor -
182*6777b538SAndroid Build Coastguard Worker                 kReadLength + kConsumedLength,
183*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
184*6777b538SAndroid Build Coastguard Worker   // Change in read size.
185*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadLength - kConsumedLength, buffer->GetSize());
186*6777b538SAndroid Build Coastguard Worker   // Start data could be changed even when capacity is reduced.
187*6777b538SAndroid Build Coastguard Worker   start_of_buffer = buffer->StartOfBuffer();
188*6777b538SAndroid Build Coastguard Worker   // Change in start pointer of unused buffer.
189*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start_of_buffer + kReadLength - kConsumedLength, buffer->data());
190*6777b538SAndroid Build Coastguard Worker   // Change in read data.
191*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadData.substr(kConsumedLength),
192*6777b538SAndroid Build Coastguard Worker             std::string(buffer->StartOfBuffer(), buffer->GetSize()));
193*6777b538SAndroid Build Coastguard Worker 
194*6777b538SAndroid Build Coastguard Worker   // Read more data.
195*6777b538SAndroid Build Coastguard Worker   const int kReadLength2 = 64;
196*6777b538SAndroid Build Coastguard Worker   buffer->DidRead(kReadLength2);
197*6777b538SAndroid Build Coastguard Worker   // No change in total capacity.
198*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize /
199*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor,
200*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
201*6777b538SAndroid Build Coastguard Worker   // Change in unused capacity because of read data.
202*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize /
203*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor -
204*6777b538SAndroid Build Coastguard Worker                 kReadLength + kConsumedLength - kReadLength2,
205*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
206*6777b538SAndroid Build Coastguard Worker   // Change in read size
207*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kReadLength - kConsumedLength + kReadLength2, buffer->GetSize());
208*6777b538SAndroid Build Coastguard Worker   // No change in start pointer of read part.
209*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start_of_buffer, buffer->StartOfBuffer());
210*6777b538SAndroid Build Coastguard Worker   // Change in start pointer of unused buffer.
211*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start_of_buffer + kReadLength - kConsumedLength + kReadLength2,
212*6777b538SAndroid Build Coastguard Worker             buffer->data());
213*6777b538SAndroid Build Coastguard Worker 
214*6777b538SAndroid Build Coastguard Worker   // Consume data fully.
215*6777b538SAndroid Build Coastguard Worker   buffer->DidConsume(kReadLength - kConsumedLength + kReadLength2);
216*6777b538SAndroid Build Coastguard Worker   // Capacity reduced again because read data was too small.
217*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize /
218*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor /
219*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor,
220*6777b538SAndroid Build Coastguard Worker             buffer->GetCapacity());
221*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::ReadIOBuffer::kInitialBufSize /
222*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor /
223*6777b538SAndroid Build Coastguard Worker                 HttpConnection::ReadIOBuffer::kCapacityIncreaseFactor,
224*6777b538SAndroid Build Coastguard Worker             buffer->RemainingCapacity());
225*6777b538SAndroid Build Coastguard Worker   // All reverts to initial because no data is left.
226*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->GetSize());
227*6777b538SAndroid Build Coastguard Worker   // Start data could be changed even when capacity is reduced.
228*6777b538SAndroid Build Coastguard Worker   start_of_buffer = buffer->StartOfBuffer();
229*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(start_of_buffer, buffer->data());
230*6777b538SAndroid Build Coastguard Worker }
231*6777b538SAndroid Build Coastguard Worker 
TEST(HttpConnectionTest,QueuedWriteIOBuffer_Append_DidConsume)232*6777b538SAndroid Build Coastguard Worker TEST(HttpConnectionTest, QueuedWriteIOBuffer_Append_DidConsume) {
233*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HttpConnection::QueuedWriteIOBuffer> buffer =
234*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<HttpConnection::QueuedWriteIOBuffer>();
235*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->IsEmpty());
236*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->GetSizeToWrite());
237*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->total_size());
238*6777b538SAndroid Build Coastguard Worker 
239*6777b538SAndroid Build Coastguard Worker   const std::string kData("data to write");
240*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->Append(kData));
241*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->IsEmpty());
242*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.size()), buffer->GetSizeToWrite());
243*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.size()), buffer->total_size());
244*6777b538SAndroid Build Coastguard Worker   // First data to write is same to kData.
245*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kData, std::string_view(buffer->data(), buffer->GetSizeToWrite()));
246*6777b538SAndroid Build Coastguard Worker 
247*6777b538SAndroid Build Coastguard Worker   const std::string kData2("more data to write");
248*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->Append(kData2));
249*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->IsEmpty());
250*6777b538SAndroid Build Coastguard Worker   // No change in size to write.
251*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.size()), buffer->GetSizeToWrite());
252*6777b538SAndroid Build Coastguard Worker   // Change in total size.
253*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.size() + kData2.size()),
254*6777b538SAndroid Build Coastguard Worker             buffer->total_size());
255*6777b538SAndroid Build Coastguard Worker   // First data to write has not been changed. Same to kData.
256*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kData, std::string_view(buffer->data(), buffer->GetSizeToWrite()));
257*6777b538SAndroid Build Coastguard Worker 
258*6777b538SAndroid Build Coastguard Worker   // Consume data partially.
259*6777b538SAndroid Build Coastguard Worker   const int kConsumedLength = kData.length() - 1;
260*6777b538SAndroid Build Coastguard Worker   buffer->DidConsume(kConsumedLength);
261*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->IsEmpty());
262*6777b538SAndroid Build Coastguard Worker   // Change in size to write.
263*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.size()) - kConsumedLength,
264*6777b538SAndroid Build Coastguard Worker             buffer->GetSizeToWrite());
265*6777b538SAndroid Build Coastguard Worker   // Change in total size.
266*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData.size() + kData2.size()) - kConsumedLength,
267*6777b538SAndroid Build Coastguard Worker             buffer->total_size());
268*6777b538SAndroid Build Coastguard Worker   // First data to write has shrinked.
269*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kData.substr(kConsumedLength),
270*6777b538SAndroid Build Coastguard Worker             std::string_view(buffer->data(), buffer->GetSizeToWrite()));
271*6777b538SAndroid Build Coastguard Worker 
272*6777b538SAndroid Build Coastguard Worker   // Consume first data fully.
273*6777b538SAndroid Build Coastguard Worker   buffer->DidConsume(kData.size() - kConsumedLength);
274*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->IsEmpty());
275*6777b538SAndroid Build Coastguard Worker   // Now, size to write is size of data added second.
276*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData2.size()), buffer->GetSizeToWrite());
277*6777b538SAndroid Build Coastguard Worker   // Change in total size.
278*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(static_cast<int>(kData2.size()), buffer->total_size());
279*6777b538SAndroid Build Coastguard Worker   // First data to write has changed to kData2.
280*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kData2, std::string_view(buffer->data(), buffer->GetSizeToWrite()));
281*6777b538SAndroid Build Coastguard Worker 
282*6777b538SAndroid Build Coastguard Worker   // Consume second data fully.
283*6777b538SAndroid Build Coastguard Worker   buffer->DidConsume(kData2.size());
284*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->IsEmpty());
285*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->GetSizeToWrite());
286*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(0, buffer->total_size());
287*6777b538SAndroid Build Coastguard Worker }
288*6777b538SAndroid Build Coastguard Worker 
TEST(HttpConnectionTest,QueuedWriteIOBuffer_TotalSizeLimit)289*6777b538SAndroid Build Coastguard Worker TEST(HttpConnectionTest, QueuedWriteIOBuffer_TotalSizeLimit) {
290*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HttpConnection::QueuedWriteIOBuffer> buffer =
291*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<HttpConnection::QueuedWriteIOBuffer>();
292*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(HttpConnection::QueuedWriteIOBuffer::kDefaultMaxBufferSize + 0,
293*6777b538SAndroid Build Coastguard Worker             buffer->max_buffer_size());
294*6777b538SAndroid Build Coastguard Worker 
295*6777b538SAndroid Build Coastguard Worker   // Set total size limit very small.
296*6777b538SAndroid Build Coastguard Worker   buffer->set_max_buffer_size(10);
297*6777b538SAndroid Build Coastguard Worker 
298*6777b538SAndroid Build Coastguard Worker   const int kDataLength = 4;
299*6777b538SAndroid Build Coastguard Worker   const std::string kData(kDataLength, 'd');
300*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->Append(kData));
301*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDataLength, buffer->total_size());
302*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->Append(kData));
303*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDataLength * 2, buffer->total_size());
304*6777b538SAndroid Build Coastguard Worker 
305*6777b538SAndroid Build Coastguard Worker   // Cannot append more data because it exceeds the limit.
306*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->Append(kData));
307*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDataLength * 2, buffer->total_size());
308*6777b538SAndroid Build Coastguard Worker 
309*6777b538SAndroid Build Coastguard Worker   // Consume data partially.
310*6777b538SAndroid Build Coastguard Worker   const int kConsumedLength = 2;
311*6777b538SAndroid Build Coastguard Worker   buffer->DidConsume(kConsumedLength);
312*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDataLength * 2 - kConsumedLength, buffer->total_size());
313*6777b538SAndroid Build Coastguard Worker 
314*6777b538SAndroid Build Coastguard Worker   // Can add more data.
315*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->Append(kData));
316*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDataLength * 3 - kConsumedLength, buffer->total_size());
317*6777b538SAndroid Build Coastguard Worker 
318*6777b538SAndroid Build Coastguard Worker   // Cannot append more data because it exceeds the limit.
319*6777b538SAndroid Build Coastguard Worker   EXPECT_FALSE(buffer->Append(kData));
320*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDataLength * 3 - kConsumedLength, buffer->total_size());
321*6777b538SAndroid Build Coastguard Worker 
322*6777b538SAndroid Build Coastguard Worker   // Enlarge limit.
323*6777b538SAndroid Build Coastguard Worker   buffer->set_max_buffer_size(20);
324*6777b538SAndroid Build Coastguard Worker   // Can add more data.
325*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->Append(kData));
326*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ(kDataLength * 4 - kConsumedLength, buffer->total_size());
327*6777b538SAndroid Build Coastguard Worker }
328*6777b538SAndroid Build Coastguard Worker 
TEST(HttpConnectionTest,QueuedWriteIOBuffer_DataPointerStability)329*6777b538SAndroid Build Coastguard Worker TEST(HttpConnectionTest, QueuedWriteIOBuffer_DataPointerStability) {
330*6777b538SAndroid Build Coastguard Worker   // This is a regression test that makes sure that QueuedWriteIOBuffer deals
331*6777b538SAndroid Build Coastguard Worker   // with base::queue's semantics differences vs. std::queue right, and still
332*6777b538SAndroid Build Coastguard Worker   // makes sure our data() pointers are stable.
333*6777b538SAndroid Build Coastguard Worker   scoped_refptr<HttpConnection::QueuedWriteIOBuffer> buffer =
334*6777b538SAndroid Build Coastguard Worker       base::MakeRefCounted<HttpConnection::QueuedWriteIOBuffer>();
335*6777b538SAndroid Build Coastguard Worker 
336*6777b538SAndroid Build Coastguard Worker   // We append a short string to make it fit within any short string
337*6777b538SAndroid Build Coastguard Worker   // optimization, so that if the underlying queue moves the std::string,
338*6777b538SAndroid Build Coastguard Worker   // the data should change.
339*6777b538SAndroid Build Coastguard Worker   buffer->Append("abcdefgh");
340*6777b538SAndroid Build Coastguard Worker 
341*6777b538SAndroid Build Coastguard Worker   // Read part of it, to make sure this handles the case of data() pointing
342*6777b538SAndroid Build Coastguard Worker   // to something other than start of string right.
343*6777b538SAndroid Build Coastguard Worker   buffer->DidConsume(3);
344*6777b538SAndroid Build Coastguard Worker   const char* old_data = buffer->data();
345*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("defgh", std::string_view(buffer->data(), 5));
346*6777b538SAndroid Build Coastguard Worker 
347*6777b538SAndroid Build Coastguard Worker   // Now append a whole bunch of other things to make the underlying queue
348*6777b538SAndroid Build Coastguard Worker   // grow, and likely need to move stuff around in memory.
349*6777b538SAndroid Build Coastguard Worker   for (int i = 0; i < 256; ++i)
350*6777b538SAndroid Build Coastguard Worker     buffer->Append("some other string data");
351*6777b538SAndroid Build Coastguard Worker 
352*6777b538SAndroid Build Coastguard Worker   // data() should still be right.
353*6777b538SAndroid Build Coastguard Worker   EXPECT_EQ("defgh", std::string_view(buffer->data(), 5));
354*6777b538SAndroid Build Coastguard Worker 
355*6777b538SAndroid Build Coastguard Worker   // ... it should also be bitwise the same, since the IOBuffer can get passed
356*6777b538SAndroid Build Coastguard Worker   // to async calls and then have Append's come in.
357*6777b538SAndroid Build Coastguard Worker   EXPECT_TRUE(buffer->data() == old_data);
358*6777b538SAndroid Build Coastguard Worker }
359*6777b538SAndroid Build Coastguard Worker 
360*6777b538SAndroid Build Coastguard Worker }  // namespace
361*6777b538SAndroid Build Coastguard Worker }  // namespace net
362