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

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

Issue 100173005: Break out the basic reliable QUIC stream functionality from the (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_data_stream.cc ('k') | net/quic/quic_reliable_client_stream.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "net/quic/reliable_quic_stream.h" 5 #include "net/quic/quic_data_stream.h"
6 6
7 #include "net/quic/quic_ack_notifier.h" 7 #include "net/quic/quic_ack_notifier.h"
8 #include "net/quic/quic_connection.h" 8 #include "net/quic/quic_connection.h"
9 #include "net/quic/quic_spdy_compressor.h" 9 #include "net/quic/quic_spdy_compressor.h"
10 #include "net/quic/quic_spdy_decompressor.h" 10 #include "net/quic/quic_spdy_decompressor.h"
11 #include "net/quic/quic_utils.h" 11 #include "net/quic/quic_utils.h"
12 #include "net/quic/spdy_utils.h" 12 #include "net/quic/spdy_utils.h"
13 #include "net/quic/test_tools/quic_session_peer.h" 13 #include "net/quic/test_tools/quic_session_peer.h"
14 #include "net/quic/test_tools/quic_test_utils.h" 14 #include "net/quic/test_tools/quic_test_utils.h"
15 #include "testing/gmock/include/gmock/gmock.h" 15 #include "testing/gmock/include/gmock/gmock.h"
16 16
17 using base::StringPiece; 17 using base::StringPiece;
18 using std::min; 18 using std::min;
19 using testing::_; 19 using testing::_;
20 using testing::InSequence; 20 using testing::InSequence;
21 using testing::Return; 21 using testing::Return;
22 using testing::SaveArg; 22 using testing::SaveArg;
23 using testing::StrEq; 23 using testing::StrEq;
24 using testing::StrictMock; 24 using testing::StrictMock;
25 25
26 namespace net { 26 namespace net {
27 namespace test { 27 namespace test {
28 namespace { 28 namespace {
29 29
30 const char kData1[] = "FooAndBar";
31 const char kData2[] = "EepAndBaz";
32 const size_t kDataLen = 9;
33 const QuicGuid kGuid = 42; 30 const QuicGuid kGuid = 42;
34 const QuicGuid kStreamId = 3; 31 const QuicGuid kStreamId = 3;
35 const bool kIsServer = true; 32 const bool kIsServer = true;
36 const bool kShouldProcessData = true; 33 const bool kShouldProcessData = true;
37 34
38 class TestStream : public ReliableQuicStream { 35 class TestStream : public QuicDataStream {
39 public: 36 public:
40 TestStream(QuicStreamId id, 37 TestStream(QuicStreamId id,
41 QuicSession* session, 38 QuicSession* session,
42 bool should_process_data) 39 bool should_process_data)
43 : ReliableQuicStream(id, session), 40 : QuicDataStream(id, session),
44 should_process_data_(should_process_data) {} 41 should_process_data_(should_process_data) {}
45 42
46 virtual uint32 ProcessData(const char* data, uint32 data_len) OVERRIDE { 43 virtual uint32 ProcessData(const char* data, uint32 data_len) OVERRIDE {
47 EXPECT_NE(0u, data_len); 44 EXPECT_NE(0u, data_len);
48 DVLOG(1) << "ProcessData data_len: " << data_len; 45 DVLOG(1) << "ProcessData data_len: " << data_len;
49 data_ += string(data, data_len); 46 data_ += string(data, data_len);
50 return should_process_data_ ? data_len : 0; 47 return should_process_data_ ? data_len : 0;
51 } 48 }
52 49
53 using ReliableQuicStream::WriteOrBufferData; 50 using ReliableQuicStream::WriteOrBufferData;
54 using ReliableQuicStream::CloseReadSide; 51 using ReliableQuicStream::CloseReadSide;
55 using ReliableQuicStream::CloseWriteSide; 52 using ReliableQuicStream::CloseWriteSide;
56 53
57 const string& data() const { return data_; } 54 const string& data() const { return data_; }
58 55
59 private: 56 private:
60 bool should_process_data_; 57 bool should_process_data_;
61 string data_; 58 string data_;
62 }; 59 };
63 60
64 class ReliableQuicStreamTest : public ::testing::TestWithParam<bool> { 61 class QuicDataStreamTest : public ::testing::TestWithParam<bool> {
65 public: 62 public:
66 ReliableQuicStreamTest() { 63 QuicDataStreamTest() {
67 headers_[":host"] = "www.google.com"; 64 headers_[":host"] = "www.google.com";
68 headers_[":path"] = "/index.hml"; 65 headers_[":path"] = "/index.hml";
69 headers_[":scheme"] = "https"; 66 headers_[":scheme"] = "https";
70 headers_["cookie"] = 67 headers_["cookie"] =
71 "__utma=208381060.1228362404.1372200928.1372200928.1372200928.1; " 68 "__utma=208381060.1228362404.1372200928.1372200928.1372200928.1; "
72 "__utmc=160408618; " 69 "__utmc=160408618; "
73 "GX=DQAAAOEAAACWJYdewdE9rIrW6qw3PtVi2-d729qaa-74KqOsM1NVQblK4VhX" 70 "GX=DQAAAOEAAACWJYdewdE9rIrW6qw3PtVi2-d729qaa-74KqOsM1NVQblK4VhX"
74 "hoALMsy6HOdDad2Sz0flUByv7etmo3mLMidGrBoljqO9hSVA40SLqpG_iuKKSHX" 71 "hoALMsy6HOdDad2Sz0flUByv7etmo3mLMidGrBoljqO9hSVA40SLqpG_iuKKSHX"
75 "RW3Np4bq0F0SDGDNsW0DSmTS9ufMRrlpARJDS7qAI6M3bghqJp4eABKZiRqebHT" 72 "RW3Np4bq0F0SDGDNsW0DSmTS9ufMRrlpARJDS7qAI6M3bghqJp4eABKZiRqebHT"
76 "pMU-RXvTI5D5oCF1vYxYofH_l1Kviuiy3oQ1kS1enqWgbhJ2t61_SNdv-1XJIS0" 73 "pMU-RXvTI5D5oCF1vYxYofH_l1Kviuiy3oQ1kS1enqWgbhJ2t61_SNdv-1XJIS0"
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 MockConnection* connection_; 109 MockConnection* connection_;
113 scoped_ptr<MockSession> session_; 110 scoped_ptr<MockSession> session_;
114 scoped_ptr<TestStream> stream_; 111 scoped_ptr<TestStream> stream_;
115 scoped_ptr<TestStream> stream2_; 112 scoped_ptr<TestStream> stream2_;
116 scoped_ptr<QuicSpdyCompressor> compressor_; 113 scoped_ptr<QuicSpdyCompressor> compressor_;
117 scoped_ptr<QuicSpdyDecompressor> decompressor_; 114 scoped_ptr<QuicSpdyDecompressor> decompressor_;
118 SpdyHeaderBlock headers_; 115 SpdyHeaderBlock headers_;
119 WriteBlockedList<QuicStreamId>* write_blocked_list_; 116 WriteBlockedList<QuicStreamId>* write_blocked_list_;
120 }; 117 };
121 118
122 TEST_F(ReliableQuicStreamTest, WriteAllData) { 119 TEST_F(QuicDataStreamTest, ProcessHeaders) {
123 Initialize(kShouldProcessData);
124
125 connection_->options()->max_packet_length =
126 1 + QuicPacketCreator::StreamFramePacketOverhead(
127 connection_->version(), PACKET_8BYTE_GUID, !kIncludeVersion,
128 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
129 EXPECT_CALL(*session_, WritevData(kStreamId, _, 1, _, _, _)).WillOnce(
130 Return(QuicConsumedData(kDataLen, true)));
131 stream_->WriteOrBufferData(kData1, false);
132 EXPECT_FALSE(write_blocked_list_->HasWriteBlockedStreams());
133 }
134
135 // TODO(rtenneti): Death tests crash on OS_ANDROID.
136 #if GTEST_HAS_DEATH_TEST && !defined(NDEBUG) && !defined(OS_ANDROID)
137 TEST_F(ReliableQuicStreamTest, NoBlockingIfNoDataOrFin) {
138 Initialize(kShouldProcessData);
139
140 // Write no data and no fin. If we consume nothing we should not be write
141 // blocked.
142 EXPECT_DEBUG_DEATH({
143 EXPECT_CALL(*session_, WritevData(kStreamId, _, 1, _, _, _)).WillOnce(
144 Return(QuicConsumedData(0, false)));
145 stream_->WriteOrBufferData(StringPiece(), false);
146 EXPECT_FALSE(write_blocked_list_->HasWriteBlockedStreams());
147 }, "");
148 }
149 #endif // GTEST_HAS_DEATH_TEST && !defined(NDEBUG) && !defined(OS_ANDROID)
150
151 TEST_F(ReliableQuicStreamTest, BlockIfOnlySomeDataConsumed) {
152 Initialize(kShouldProcessData);
153
154 // Write some data and no fin. If we consume some but not all of the data,
155 // we should be write blocked a not all the data was consumed.
156 EXPECT_CALL(*session_, WritevData(kStreamId, _, 1, _, _, _)).WillOnce(
157 Return(QuicConsumedData(1, false)));
158 stream_->WriteOrBufferData(StringPiece(kData1, 2), false);
159 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
160 }
161
162
163 TEST_F(ReliableQuicStreamTest, BlockIfFinNotConsumedWithData) {
164 Initialize(kShouldProcessData);
165
166 // Write some data and no fin. If we consume all the data but not the fin,
167 // we should be write blocked because the fin was not consumed.
168 // (This should never actually happen as the fin should be sent out with the
169 // last data)
170 EXPECT_CALL(*session_, WritevData(kStreamId, _, 1, _, _, _)).WillOnce(
171 Return(QuicConsumedData(2, false)));
172 stream_->WriteOrBufferData(StringPiece(kData1, 2), true);
173 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
174 }
175
176 TEST_F(ReliableQuicStreamTest, BlockIfSoloFinNotConsumed) {
177 Initialize(kShouldProcessData);
178
179 // Write no data and a fin. If we consume nothing we should be write blocked,
180 // as the fin was not consumed.
181 EXPECT_CALL(*session_, WritevData(kStreamId, _, 1, _, _, _)).WillOnce(
182 Return(QuicConsumedData(0, false)));
183 stream_->WriteOrBufferData(StringPiece(), true);
184 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
185 }
186
187 TEST_F(ReliableQuicStreamTest, WriteOrBufferData) {
188 Initialize(kShouldProcessData);
189
190 EXPECT_FALSE(write_blocked_list_->HasWriteBlockedStreams());
191 connection_->options()->max_packet_length =
192 1 + QuicPacketCreator::StreamFramePacketOverhead(
193 connection_->version(), PACKET_8BYTE_GUID, !kIncludeVersion,
194 PACKET_6BYTE_SEQUENCE_NUMBER, NOT_IN_FEC_GROUP);
195 EXPECT_CALL(*session_, WritevData(_, _, 1, _, _, _)).WillOnce(
196 Return(QuicConsumedData(kDataLen - 1, false)));
197 stream_->WriteOrBufferData(kData1, false);
198 EXPECT_TRUE(write_blocked_list_->HasWriteBlockedStreams());
199
200 // Queue a bytes_consumed write.
201 stream_->WriteOrBufferData(kData2, false);
202
203 // Make sure we get the tail of the first write followed by the bytes_consumed
204 InSequence s;
205 EXPECT_CALL(*session_, WritevData(_, _, 1, _, _, _)).
206 WillOnce(Return(QuicConsumedData(1, false)));
207 EXPECT_CALL(*session_, WritevData(_, _, 1, _, _, _)).
208 WillOnce(Return(QuicConsumedData(kDataLen - 2, false)));
209 stream_->OnCanWrite();
210
211 // And finally the end of the bytes_consumed.
212 EXPECT_CALL(*session_, WritevData(_, _, 1, _, _, _)).
213 WillOnce(Return(QuicConsumedData(2, true)));
214 stream_->OnCanWrite();
215 }
216
217 TEST_F(ReliableQuicStreamTest, ConnectionCloseAfterStreamClose) {
218 Initialize(kShouldProcessData);
219
220 stream_->CloseReadSide();
221 stream_->CloseWriteSide();
222 EXPECT_EQ(QUIC_STREAM_NO_ERROR, stream_->stream_error());
223 EXPECT_EQ(QUIC_NO_ERROR, stream_->connection_error());
224 stream_->OnConnectionClosed(QUIC_INTERNAL_ERROR, false);
225 EXPECT_EQ(QUIC_STREAM_NO_ERROR, stream_->stream_error());
226 EXPECT_EQ(QUIC_NO_ERROR, stream_->connection_error());
227 }
228
229 TEST_F(ReliableQuicStreamTest, ProcessHeaders) {
230 Initialize(kShouldProcessData); 120 Initialize(kShouldProcessData);
231 121
232 string compressed_headers = compressor_->CompressHeadersWithPriority( 122 string compressed_headers = compressor_->CompressHeadersWithPriority(
233 kHighestPriority, headers_); 123 kHighestPriority, headers_);
234 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers)); 124 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
235 125
236 stream_->OnStreamFrame(frame); 126 stream_->OnStreamFrame(frame);
237 EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_), stream_->data()); 127 EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_), stream_->data());
238 EXPECT_EQ(static_cast<QuicPriority>(kHighestPriority), 128 EXPECT_EQ(static_cast<QuicPriority>(kHighestPriority),
239 stream_->EffectivePriority()); 129 stream_->EffectivePriority());
240 } 130 }
241 131
242 TEST_F(ReliableQuicStreamTest, ProcessHeadersWithInvalidHeaderId) { 132 TEST_F(QuicDataStreamTest, ProcessHeadersWithInvalidHeaderId) {
243 Initialize(kShouldProcessData); 133 Initialize(kShouldProcessData);
244 134
245 string compressed_headers = compressor_->CompressHeadersWithPriority( 135 string compressed_headers = compressor_->CompressHeadersWithPriority(
246 kHighestPriority, headers_); 136 kHighestPriority, headers_);
247 compressed_headers[4] = '\xFF'; // Illegal header id. 137 compressed_headers[4] = '\xFF'; // Illegal header id.
248 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers)); 138 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
249 139
250 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID)); 140 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID));
251 stream_->OnStreamFrame(frame); 141 stream_->OnStreamFrame(frame);
252 } 142 }
253 143
254 TEST_F(ReliableQuicStreamTest, ProcessHeadersWithInvalidPriority) { 144 TEST_F(QuicDataStreamTest, ProcessHeadersWithInvalidPriority) {
255 Initialize(kShouldProcessData); 145 Initialize(kShouldProcessData);
256 146
257 string compressed_headers = compressor_->CompressHeadersWithPriority( 147 string compressed_headers = compressor_->CompressHeadersWithPriority(
258 kHighestPriority, headers_); 148 kHighestPriority, headers_);
259 compressed_headers[0] = '\xFF'; // Illegal priority. 149 compressed_headers[0] = '\xFF'; // Illegal priority.
260 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers)); 150 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
261 151
262 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_PRIORITY)); 152 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_PRIORITY));
263 stream_->OnStreamFrame(frame); 153 stream_->OnStreamFrame(frame);
264 } 154 }
265 155
266 TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBody) { 156 TEST_F(QuicDataStreamTest, ProcessHeadersAndBody) {
267 Initialize(kShouldProcessData); 157 Initialize(kShouldProcessData);
268 158
269 string compressed_headers = compressor_->CompressHeadersWithPriority( 159 string compressed_headers = compressor_->CompressHeadersWithPriority(
270 kHighestPriority, headers_); 160 kHighestPriority, headers_);
271 string body = "this is the body"; 161 string body = "this is the body";
272 string data = compressed_headers + body; 162 string data = compressed_headers + body;
273 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data)); 163 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
274 164
275 stream_->OnStreamFrame(frame); 165 stream_->OnStreamFrame(frame);
276 EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body, 166 EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body,
277 stream_->data()); 167 stream_->data());
278 } 168 }
279 169
280 TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyFragments) { 170 TEST_F(QuicDataStreamTest, ProcessHeadersAndBodyFragments) {
281 Initialize(kShouldProcessData); 171 Initialize(kShouldProcessData);
282 172
283 string compressed_headers = compressor_->CompressHeadersWithPriority( 173 string compressed_headers = compressor_->CompressHeadersWithPriority(
284 kLowestPriority, headers_); 174 kLowestPriority, headers_);
285 string body = "this is the body"; 175 string body = "this is the body";
286 string data = compressed_headers + body; 176 string data = compressed_headers + body;
287 177
288 for (size_t fragment_size = 1; fragment_size < data.size(); ++fragment_size) { 178 for (size_t fragment_size = 1; fragment_size < data.size(); ++fragment_size) {
289 Initialize(kShouldProcessData); 179 Initialize(kShouldProcessData);
290 for (size_t offset = 0; offset < data.size(); offset += fragment_size) { 180 for (size_t offset = 0; offset < data.size(); offset += fragment_size) {
(...skipping 20 matching lines...) Expand all
311 kStreamId, false, split_point, MakeIOVector(fragment2)); 201 kStreamId, false, split_point, MakeIOVector(fragment2));
312 stream_->OnStreamFrame(frame2); 202 stream_->OnStreamFrame(frame2);
313 203
314 ASSERT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body, 204 ASSERT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body,
315 stream_->data()) << "split_point: " << split_point; 205 stream_->data()) << "split_point: " << split_point;
316 } 206 }
317 EXPECT_EQ(static_cast<QuicPriority>(kLowestPriority), 207 EXPECT_EQ(static_cast<QuicPriority>(kLowestPriority),
318 stream_->EffectivePriority()); 208 stream_->EffectivePriority());
319 } 209 }
320 210
321 TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyReadv) { 211 TEST_F(QuicDataStreamTest, ProcessHeadersAndBodyReadv) {
322 Initialize(!kShouldProcessData); 212 Initialize(!kShouldProcessData);
323 213
324 string compressed_headers = compressor_->CompressHeadersWithPriority( 214 string compressed_headers = compressor_->CompressHeadersWithPriority(
325 kHighestPriority, headers_); 215 kHighestPriority, headers_);
326 string body = "this is the body"; 216 string body = "this is the body";
327 string data = compressed_headers + body; 217 string data = compressed_headers + body;
328 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data)); 218 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
329 string uncompressed_headers = 219 string uncompressed_headers =
330 SpdyUtils::SerializeUncompressedHeaders(headers_); 220 SpdyUtils::SerializeUncompressedHeaders(headers_);
331 string uncompressed_data = uncompressed_headers + body; 221 string uncompressed_data = uncompressed_headers + body;
332 222
333 stream_->OnStreamFrame(frame); 223 stream_->OnStreamFrame(frame);
334 EXPECT_EQ(uncompressed_headers, stream_->data()); 224 EXPECT_EQ(uncompressed_headers, stream_->data());
335 225
336 char buffer[2048]; 226 char buffer[2048];
337 ASSERT_LT(data.length(), arraysize(buffer)); 227 ASSERT_LT(data.length(), arraysize(buffer));
338 struct iovec vec; 228 struct iovec vec;
339 vec.iov_base = buffer; 229 vec.iov_base = buffer;
340 vec.iov_len = arraysize(buffer); 230 vec.iov_len = arraysize(buffer);
341 231
342 size_t bytes_read = stream_->Readv(&vec, 1); 232 size_t bytes_read = stream_->Readv(&vec, 1);
343 EXPECT_EQ(uncompressed_headers.length(), bytes_read); 233 EXPECT_EQ(uncompressed_headers.length(), bytes_read);
344 EXPECT_EQ(uncompressed_headers, string(buffer, bytes_read)); 234 EXPECT_EQ(uncompressed_headers, string(buffer, bytes_read));
345 235
346 bytes_read = stream_->Readv(&vec, 1); 236 bytes_read = stream_->Readv(&vec, 1);
347 EXPECT_EQ(body.length(), bytes_read); 237 EXPECT_EQ(body.length(), bytes_read);
348 EXPECT_EQ(body, string(buffer, bytes_read)); 238 EXPECT_EQ(body, string(buffer, bytes_read));
349 } 239 }
350 240
351 TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyIncrementalReadv) { 241 TEST_F(QuicDataStreamTest, ProcessHeadersAndBodyIncrementalReadv) {
352 Initialize(!kShouldProcessData); 242 Initialize(!kShouldProcessData);
353 243
354 string compressed_headers = compressor_->CompressHeadersWithPriority( 244 string compressed_headers = compressor_->CompressHeadersWithPriority(
355 kHighestPriority, headers_); 245 kHighestPriority, headers_);
356 string body = "this is the body"; 246 string body = "this is the body";
357 string data = compressed_headers + body; 247 string data = compressed_headers + body;
358 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data)); 248 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
359 string uncompressed_headers = 249 string uncompressed_headers =
360 SpdyUtils::SerializeUncompressedHeaders(headers_); 250 SpdyUtils::SerializeUncompressedHeaders(headers_);
361 string uncompressed_data = uncompressed_headers + body; 251 string uncompressed_data = uncompressed_headers + body;
362 252
363 stream_->OnStreamFrame(frame); 253 stream_->OnStreamFrame(frame);
364 EXPECT_EQ(uncompressed_headers, stream_->data()); 254 EXPECT_EQ(uncompressed_headers, stream_->data());
365 255
366 char buffer[1]; 256 char buffer[1];
367 struct iovec vec; 257 struct iovec vec;
368 vec.iov_base = buffer; 258 vec.iov_base = buffer;
369 vec.iov_len = arraysize(buffer); 259 vec.iov_len = arraysize(buffer);
370 for (size_t i = 0; i < uncompressed_data.length(); ++i) { 260 for (size_t i = 0; i < uncompressed_data.length(); ++i) {
371 size_t bytes_read = stream_->Readv(&vec, 1); 261 size_t bytes_read = stream_->Readv(&vec, 1);
372 ASSERT_EQ(1u, bytes_read); 262 ASSERT_EQ(1u, bytes_read);
373 EXPECT_EQ(uncompressed_data.data()[i], buffer[0]); 263 EXPECT_EQ(uncompressed_data.data()[i], buffer[0]);
374 } 264 }
375 } 265 }
376 266
377 TEST_F(ReliableQuicStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) { 267 TEST_F(QuicDataStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) {
378 Initialize(!kShouldProcessData); 268 Initialize(!kShouldProcessData);
379 269
380 string compressed_headers = compressor_->CompressHeadersWithPriority( 270 string compressed_headers = compressor_->CompressHeadersWithPriority(
381 kHighestPriority, headers_); 271 kHighestPriority, headers_);
382 string body = "this is the body"; 272 string body = "this is the body";
383 string data = compressed_headers + body; 273 string data = compressed_headers + body;
384 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data)); 274 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
385 string uncompressed_headers = 275 string uncompressed_headers =
386 SpdyUtils::SerializeUncompressedHeaders(headers_); 276 SpdyUtils::SerializeUncompressedHeaders(headers_);
387 string uncompressed_data = uncompressed_headers + body; 277 string uncompressed_data = uncompressed_headers + body;
388 278
389 stream_->OnStreamFrame(frame); 279 stream_->OnStreamFrame(frame);
390 EXPECT_EQ(uncompressed_headers, stream_->data()); 280 EXPECT_EQ(uncompressed_headers, stream_->data());
391 281
392 char buffer1[1]; 282 char buffer1[1];
393 char buffer2[1]; 283 char buffer2[1];
394 struct iovec vec[2]; 284 struct iovec vec[2];
395 vec[0].iov_base = buffer1; 285 vec[0].iov_base = buffer1;
396 vec[0].iov_len = arraysize(buffer1); 286 vec[0].iov_len = arraysize(buffer1);
397 vec[1].iov_base = buffer2; 287 vec[1].iov_base = buffer2;
398 vec[1].iov_len = arraysize(buffer2); 288 vec[1].iov_len = arraysize(buffer2);
399 for (size_t i = 0; i < uncompressed_data.length(); i += 2) { 289 for (size_t i = 0; i < uncompressed_data.length(); i += 2) {
400 size_t bytes_read = stream_->Readv(vec, 2); 290 size_t bytes_read = stream_->Readv(vec, 2);
401 ASSERT_EQ(2u, bytes_read) << i; 291 ASSERT_EQ(2u, bytes_read) << i;
402 ASSERT_EQ(uncompressed_data.data()[i], buffer1[0]) << i; 292 ASSERT_EQ(uncompressed_data.data()[i], buffer1[0]) << i;
403 ASSERT_EQ(uncompressed_data.data()[i + 1], buffer2[0]) << i; 293 ASSERT_EQ(uncompressed_data.data()[i + 1], buffer2[0]) << i;
404 } 294 }
405 } 295 }
406 296
407 TEST_F(ReliableQuicStreamTest, ProcessCorruptHeadersEarly) { 297 TEST_F(QuicDataStreamTest, ProcessCorruptHeadersEarly) {
408 Initialize(kShouldProcessData); 298 Initialize(kShouldProcessData);
409 299
410 string compressed_headers1 = compressor_->CompressHeadersWithPriority( 300 string compressed_headers1 = compressor_->CompressHeadersWithPriority(
411 kHighestPriority, headers_); 301 kHighestPriority, headers_);
412 QuicStreamFrame frame1( 302 QuicStreamFrame frame1(
413 stream_->id(), false, 0, MakeIOVector(compressed_headers1)); 303 stream_->id(), false, 0, MakeIOVector(compressed_headers1));
414 string decompressed_headers1 = 304 string decompressed_headers1 =
415 SpdyUtils::SerializeUncompressedHeaders(headers_); 305 SpdyUtils::SerializeUncompressedHeaders(headers_);
416 306
417 headers_["content-type"] = "text/plain"; 307 headers_["content-type"] = "text/plain";
(...skipping 21 matching lines...) Expand all
439 329
440 // Verify that the decompressor is available, and inform stream2 330 // Verify that the decompressor is available, and inform stream2
441 // that it can now decompress the buffered compressed data. Since 331 // that it can now decompress the buffered compressed data. Since
442 // the compressed data is corrupt, the stream will shutdown the session. 332 // the compressed data is corrupt, the stream will shutdown the session.
443 EXPECT_EQ(2u, session_->decompressor()->current_header_id()); 333 EXPECT_EQ(2u, session_->decompressor()->current_header_id());
444 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_DECOMPRESSION_FAILURE)); 334 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_DECOMPRESSION_FAILURE));
445 stream2_->OnDecompressorAvailable(); 335 stream2_->OnDecompressorAvailable();
446 EXPECT_EQ("", stream2_->data()); 336 EXPECT_EQ("", stream2_->data());
447 } 337 }
448 338
449 TEST_F(ReliableQuicStreamTest, ProcessPartialHeadersEarly) { 339 TEST_F(QuicDataStreamTest, ProcessPartialHeadersEarly) {
450 Initialize(kShouldProcessData); 340 Initialize(kShouldProcessData);
451 341
452 string compressed_headers1 = compressor_->CompressHeadersWithPriority( 342 string compressed_headers1 = compressor_->CompressHeadersWithPriority(
453 kHighestPriority, headers_); 343 kHighestPriority, headers_);
454 QuicStreamFrame frame1( 344 QuicStreamFrame frame1(
455 stream_->id(), false, 0, MakeIOVector(compressed_headers1)); 345 stream_->id(), false, 0, MakeIOVector(compressed_headers1));
456 string decompressed_headers1 = 346 string decompressed_headers1 =
457 SpdyUtils::SerializeUncompressedHeaders(headers_); 347 SpdyUtils::SerializeUncompressedHeaders(headers_);
458 348
459 headers_["content-type"] = "text/plain"; 349 headers_["content-type"] = "text/plain";
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 string remaining_compressed_headers = 382 string remaining_compressed_headers =
493 compressed_headers2.substr(partial_compressed_headers.length()); 383 compressed_headers2.substr(partial_compressed_headers.length());
494 384
495 QuicStreamFrame frame3(stream2_->id(), false, 385 QuicStreamFrame frame3(stream2_->id(), false,
496 partial_compressed_headers.length(), 386 partial_compressed_headers.length(),
497 MakeIOVector(remaining_compressed_headers)); 387 MakeIOVector(remaining_compressed_headers));
498 stream2_->OnStreamFrame(frame3); 388 stream2_->OnStreamFrame(frame3);
499 EXPECT_EQ(decompressed_headers2, stream2_->data()); 389 EXPECT_EQ(decompressed_headers2, stream2_->data());
500 } 390 }
501 391
502 TEST_F(ReliableQuicStreamTest, ProcessHeadersEarly) { 392 TEST_F(QuicDataStreamTest, ProcessHeadersEarly) {
503 Initialize(kShouldProcessData); 393 Initialize(kShouldProcessData);
504 394
505 string compressed_headers1 = compressor_->CompressHeadersWithPriority( 395 string compressed_headers1 = compressor_->CompressHeadersWithPriority(
506 kHighestPriority, headers_); 396 kHighestPriority, headers_);
507 QuicStreamFrame frame1( 397 QuicStreamFrame frame1(
508 stream_->id(), false, 0, MakeIOVector(compressed_headers1)); 398 stream_->id(), false, 0, MakeIOVector(compressed_headers1));
509 string decompressed_headers1 = 399 string decompressed_headers1 =
510 SpdyUtils::SerializeUncompressedHeaders(headers_); 400 SpdyUtils::SerializeUncompressedHeaders(headers_);
511 401
512 headers_["content-type"] = "text/plain"; 402 headers_["content-type"] = "text/plain";
(...skipping 17 matching lines...) Expand all
530 stream_->OnStreamFrame(frame1); 420 stream_->OnStreamFrame(frame1);
531 EXPECT_EQ(decompressed_headers1, stream_->data()); 421 EXPECT_EQ(decompressed_headers1, stream_->data());
532 422
533 // Verify that the decompressor is available, and inform stream2 423 // Verify that the decompressor is available, and inform stream2
534 // that it can now decompress the buffered compressed data. 424 // that it can now decompress the buffered compressed data.
535 EXPECT_EQ(2u, session_->decompressor()->current_header_id()); 425 EXPECT_EQ(2u, session_->decompressor()->current_header_id());
536 stream2_->OnDecompressorAvailable(); 426 stream2_->OnDecompressorAvailable();
537 EXPECT_EQ(decompressed_headers2, stream2_->data()); 427 EXPECT_EQ(decompressed_headers2, stream2_->data());
538 } 428 }
539 429
540 TEST_F(ReliableQuicStreamTest, ProcessHeadersDelay) { 430 TEST_F(QuicDataStreamTest, ProcessHeadersDelay) {
541 Initialize(!kShouldProcessData); 431 Initialize(!kShouldProcessData);
542 432
543 string compressed_headers = compressor_->CompressHeadersWithPriority( 433 string compressed_headers = compressor_->CompressHeadersWithPriority(
544 kHighestPriority, headers_); 434 kHighestPriority, headers_);
545 QuicStreamFrame frame1( 435 QuicStreamFrame frame1(
546 stream_->id(), false, 0, MakeIOVector(compressed_headers)); 436 stream_->id(), false, 0, MakeIOVector(compressed_headers));
547 string decompressed_headers = 437 string decompressed_headers =
548 SpdyUtils::SerializeUncompressedHeaders(headers_); 438 SpdyUtils::SerializeUncompressedHeaders(headers_);
549 439
550 // Send the headers to the stream and verify they were decompressed. 440 // Send the headers to the stream and verify they were decompressed.
551 stream_->OnStreamFrame(frame1); 441 stream_->OnStreamFrame(frame1);
552 EXPECT_EQ(2u, session_->decompressor()->current_header_id()); 442 EXPECT_EQ(2u, session_->decompressor()->current_header_id());
553 443
554 // Verify that we are now able to handle the body data, 444 // Verify that we are now able to handle the body data,
555 // even though the stream has not processed the headers. 445 // even though the stream has not processed the headers.
556 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID)) 446 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID))
557 .Times(0); 447 .Times(0);
558 QuicStreamFrame frame2(stream_->id(), false, compressed_headers.length(), 448 QuicStreamFrame frame2(stream_->id(), false, compressed_headers.length(),
559 MakeIOVector("body data")); 449 MakeIOVector("body data"));
560 stream_->OnStreamFrame(frame2); 450 stream_->OnStreamFrame(frame2);
561 } 451 }
562 452
563 } // namespace 453 } // namespace
564 } // namespace test 454 } // namespace test
565 } // namespace net 455 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_data_stream.cc ('k') | net/quic/quic_reliable_client_stream.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698