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

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

Issue 103973007: Land Recent QUIC Changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix for android compile error 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_framer.cc » ('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::WriteData; 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 EXPECT_EQ(kDataLen, stream_->WriteData(kData1, false).bytes_consumed);
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_->WriteData(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_->WriteData(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_->WriteData(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_->WriteData(StringPiece(), true);
184 ASSERT_EQ(1u, write_blocked_list_->NumBlockedStreams());
185 }
186
187 TEST_F(ReliableQuicStreamTest, WriteData) {
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 // The return will be kDataLen, because the last byte gets buffered.
198 EXPECT_EQ(kDataLen, stream_->WriteData(kData1, false).bytes_consumed);
199 EXPECT_TRUE(write_blocked_list_->HasWriteBlockedStreams());
200
201 // Queue a bytes_consumed write.
202 EXPECT_EQ(kDataLen, stream_->WriteData(kData2, false).bytes_consumed);
203
204 // Make sure we get the tail of the first write followed by the bytes_consumed
205 InSequence s;
206 EXPECT_CALL(*session_, WritevData(_, _, 1, _, _, _)).
207 WillOnce(Return(QuicConsumedData(1, false)));
208 EXPECT_CALL(*session_, WritevData(_, _, 1, _, _, _)).
209 WillOnce(Return(QuicConsumedData(kDataLen - 2, false)));
210 stream_->OnCanWrite();
211
212 // And finally the end of the bytes_consumed.
213 EXPECT_CALL(*session_, WritevData(_, _, 1, _, _, _)).
214 WillOnce(Return(QuicConsumedData(2, true)));
215 stream_->OnCanWrite();
216 }
217
218 TEST_F(ReliableQuicStreamTest, ConnectionCloseAfterStreamClose) {
219 Initialize(kShouldProcessData);
220
221 stream_->CloseReadSide();
222 stream_->CloseWriteSide();
223 EXPECT_EQ(QUIC_STREAM_NO_ERROR, stream_->stream_error());
224 EXPECT_EQ(QUIC_NO_ERROR, stream_->connection_error());
225 stream_->OnConnectionClosed(QUIC_INTERNAL_ERROR, false);
226 EXPECT_EQ(QUIC_STREAM_NO_ERROR, stream_->stream_error());
227 EXPECT_EQ(QUIC_NO_ERROR, stream_->connection_error());
228 }
229
230 TEST_F(ReliableQuicStreamTest, ProcessHeaders) {
231 Initialize(kShouldProcessData); 120 Initialize(kShouldProcessData);
232 121
233 string compressed_headers = compressor_->CompressHeadersWithPriority( 122 string compressed_headers = compressor_->CompressHeadersWithPriority(
234 kHighestPriority, headers_); 123 kHighestPriority, headers_);
235 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers)); 124 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
236 125
237 stream_->OnStreamFrame(frame); 126 stream_->OnStreamFrame(frame);
238 EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_), stream_->data()); 127 EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_), stream_->data());
239 EXPECT_EQ(static_cast<QuicPriority>(kHighestPriority), 128 EXPECT_EQ(static_cast<QuicPriority>(kHighestPriority),
240 stream_->EffectivePriority()); 129 stream_->EffectivePriority());
241 } 130 }
242 131
243 TEST_F(ReliableQuicStreamTest, ProcessHeadersWithInvalidHeaderId) { 132 TEST_F(QuicDataStreamTest, ProcessHeadersWithInvalidHeaderId) {
244 Initialize(kShouldProcessData); 133 Initialize(kShouldProcessData);
245 134
246 string compressed_headers = compressor_->CompressHeadersWithPriority( 135 string compressed_headers = compressor_->CompressHeadersWithPriority(
247 kHighestPriority, headers_); 136 kHighestPriority, headers_);
248 compressed_headers[4] = '\xFF'; // Illegal header id. 137 compressed_headers[4] = '\xFF'; // Illegal header id.
249 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers)); 138 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
250 139
251 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID)); 140 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID));
252 stream_->OnStreamFrame(frame); 141 stream_->OnStreamFrame(frame);
253 } 142 }
254 143
255 TEST_F(ReliableQuicStreamTest, ProcessHeadersWithInvalidPriority) { 144 TEST_F(QuicDataStreamTest, ProcessHeadersWithInvalidPriority) {
256 Initialize(kShouldProcessData); 145 Initialize(kShouldProcessData);
257 146
258 string compressed_headers = compressor_->CompressHeadersWithPriority( 147 string compressed_headers = compressor_->CompressHeadersWithPriority(
259 kHighestPriority, headers_); 148 kHighestPriority, headers_);
260 compressed_headers[0] = '\xFF'; // Illegal priority. 149 compressed_headers[0] = '\xFF'; // Illegal priority.
261 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers)); 150 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(compressed_headers));
262 151
263 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_PRIORITY)); 152 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_PRIORITY));
264 stream_->OnStreamFrame(frame); 153 stream_->OnStreamFrame(frame);
265 } 154 }
266 155
267 TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBody) { 156 TEST_F(QuicDataStreamTest, ProcessHeadersAndBody) {
268 Initialize(kShouldProcessData); 157 Initialize(kShouldProcessData);
269 158
270 string compressed_headers = compressor_->CompressHeadersWithPriority( 159 string compressed_headers = compressor_->CompressHeadersWithPriority(
271 kHighestPriority, headers_); 160 kHighestPriority, headers_);
272 string body = "this is the body"; 161 string body = "this is the body";
273 string data = compressed_headers + body; 162 string data = compressed_headers + body;
274 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data)); 163 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
275 164
276 stream_->OnStreamFrame(frame); 165 stream_->OnStreamFrame(frame);
277 EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body, 166 EXPECT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body,
278 stream_->data()); 167 stream_->data());
279 } 168 }
280 169
281 TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyFragments) { 170 TEST_F(QuicDataStreamTest, ProcessHeadersAndBodyFragments) {
282 Initialize(kShouldProcessData); 171 Initialize(kShouldProcessData);
283 172
284 string compressed_headers = compressor_->CompressHeadersWithPriority( 173 string compressed_headers = compressor_->CompressHeadersWithPriority(
285 kLowestPriority, headers_); 174 kLowestPriority, headers_);
286 string body = "this is the body"; 175 string body = "this is the body";
287 string data = compressed_headers + body; 176 string data = compressed_headers + body;
288 177
289 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) {
290 Initialize(kShouldProcessData); 179 Initialize(kShouldProcessData);
291 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
312 kStreamId, false, split_point, MakeIOVector(fragment2)); 201 kStreamId, false, split_point, MakeIOVector(fragment2));
313 stream_->OnStreamFrame(frame2); 202 stream_->OnStreamFrame(frame2);
314 203
315 ASSERT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body, 204 ASSERT_EQ(SpdyUtils::SerializeUncompressedHeaders(headers_) + body,
316 stream_->data()) << "split_point: " << split_point; 205 stream_->data()) << "split_point: " << split_point;
317 } 206 }
318 EXPECT_EQ(static_cast<QuicPriority>(kLowestPriority), 207 EXPECT_EQ(static_cast<QuicPriority>(kLowestPriority),
319 stream_->EffectivePriority()); 208 stream_->EffectivePriority());
320 } 209 }
321 210
322 TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyReadv) { 211 TEST_F(QuicDataStreamTest, ProcessHeadersAndBodyReadv) {
323 Initialize(!kShouldProcessData); 212 Initialize(!kShouldProcessData);
324 213
325 string compressed_headers = compressor_->CompressHeadersWithPriority( 214 string compressed_headers = compressor_->CompressHeadersWithPriority(
326 kHighestPriority, headers_); 215 kHighestPriority, headers_);
327 string body = "this is the body"; 216 string body = "this is the body";
328 string data = compressed_headers + body; 217 string data = compressed_headers + body;
329 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data)); 218 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
330 string uncompressed_headers = 219 string uncompressed_headers =
331 SpdyUtils::SerializeUncompressedHeaders(headers_); 220 SpdyUtils::SerializeUncompressedHeaders(headers_);
332 string uncompressed_data = uncompressed_headers + body; 221 string uncompressed_data = uncompressed_headers + body;
333 222
334 stream_->OnStreamFrame(frame); 223 stream_->OnStreamFrame(frame);
335 EXPECT_EQ(uncompressed_headers, stream_->data()); 224 EXPECT_EQ(uncompressed_headers, stream_->data());
336 225
337 char buffer[2048]; 226 char buffer[2048];
338 ASSERT_LT(data.length(), arraysize(buffer)); 227 ASSERT_LT(data.length(), arraysize(buffer));
339 struct iovec vec; 228 struct iovec vec;
340 vec.iov_base = buffer; 229 vec.iov_base = buffer;
341 vec.iov_len = arraysize(buffer); 230 vec.iov_len = arraysize(buffer);
342 231
343 size_t bytes_read = stream_->Readv(&vec, 1); 232 size_t bytes_read = stream_->Readv(&vec, 1);
344 EXPECT_EQ(uncompressed_headers.length(), bytes_read); 233 EXPECT_EQ(uncompressed_headers.length(), bytes_read);
345 EXPECT_EQ(uncompressed_headers, string(buffer, bytes_read)); 234 EXPECT_EQ(uncompressed_headers, string(buffer, bytes_read));
346 235
347 bytes_read = stream_->Readv(&vec, 1); 236 bytes_read = stream_->Readv(&vec, 1);
348 EXPECT_EQ(body.length(), bytes_read); 237 EXPECT_EQ(body.length(), bytes_read);
349 EXPECT_EQ(body, string(buffer, bytes_read)); 238 EXPECT_EQ(body, string(buffer, bytes_read));
350 } 239 }
351 240
352 TEST_F(ReliableQuicStreamTest, ProcessHeadersAndBodyIncrementalReadv) { 241 TEST_F(QuicDataStreamTest, ProcessHeadersAndBodyIncrementalReadv) {
353 Initialize(!kShouldProcessData); 242 Initialize(!kShouldProcessData);
354 243
355 string compressed_headers = compressor_->CompressHeadersWithPriority( 244 string compressed_headers = compressor_->CompressHeadersWithPriority(
356 kHighestPriority, headers_); 245 kHighestPriority, headers_);
357 string body = "this is the body"; 246 string body = "this is the body";
358 string data = compressed_headers + body; 247 string data = compressed_headers + body;
359 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data)); 248 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
360 string uncompressed_headers = 249 string uncompressed_headers =
361 SpdyUtils::SerializeUncompressedHeaders(headers_); 250 SpdyUtils::SerializeUncompressedHeaders(headers_);
362 string uncompressed_data = uncompressed_headers + body; 251 string uncompressed_data = uncompressed_headers + body;
363 252
364 stream_->OnStreamFrame(frame); 253 stream_->OnStreamFrame(frame);
365 EXPECT_EQ(uncompressed_headers, stream_->data()); 254 EXPECT_EQ(uncompressed_headers, stream_->data());
366 255
367 char buffer[1]; 256 char buffer[1];
368 struct iovec vec; 257 struct iovec vec;
369 vec.iov_base = buffer; 258 vec.iov_base = buffer;
370 vec.iov_len = arraysize(buffer); 259 vec.iov_len = arraysize(buffer);
371 for (size_t i = 0; i < uncompressed_data.length(); ++i) { 260 for (size_t i = 0; i < uncompressed_data.length(); ++i) {
372 size_t bytes_read = stream_->Readv(&vec, 1); 261 size_t bytes_read = stream_->Readv(&vec, 1);
373 ASSERT_EQ(1u, bytes_read); 262 ASSERT_EQ(1u, bytes_read);
374 EXPECT_EQ(uncompressed_data.data()[i], buffer[0]); 263 EXPECT_EQ(uncompressed_data.data()[i], buffer[0]);
375 } 264 }
376 } 265 }
377 266
378 TEST_F(ReliableQuicStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) { 267 TEST_F(QuicDataStreamTest, ProcessHeadersUsingReadvWithMultipleIovecs) {
379 Initialize(!kShouldProcessData); 268 Initialize(!kShouldProcessData);
380 269
381 string compressed_headers = compressor_->CompressHeadersWithPriority( 270 string compressed_headers = compressor_->CompressHeadersWithPriority(
382 kHighestPriority, headers_); 271 kHighestPriority, headers_);
383 string body = "this is the body"; 272 string body = "this is the body";
384 string data = compressed_headers + body; 273 string data = compressed_headers + body;
385 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data)); 274 QuicStreamFrame frame(kStreamId, false, 0, MakeIOVector(data));
386 string uncompressed_headers = 275 string uncompressed_headers =
387 SpdyUtils::SerializeUncompressedHeaders(headers_); 276 SpdyUtils::SerializeUncompressedHeaders(headers_);
388 string uncompressed_data = uncompressed_headers + body; 277 string uncompressed_data = uncompressed_headers + body;
389 278
390 stream_->OnStreamFrame(frame); 279 stream_->OnStreamFrame(frame);
391 EXPECT_EQ(uncompressed_headers, stream_->data()); 280 EXPECT_EQ(uncompressed_headers, stream_->data());
392 281
393 char buffer1[1]; 282 char buffer1[1];
394 char buffer2[1]; 283 char buffer2[1];
395 struct iovec vec[2]; 284 struct iovec vec[2];
396 vec[0].iov_base = buffer1; 285 vec[0].iov_base = buffer1;
397 vec[0].iov_len = arraysize(buffer1); 286 vec[0].iov_len = arraysize(buffer1);
398 vec[1].iov_base = buffer2; 287 vec[1].iov_base = buffer2;
399 vec[1].iov_len = arraysize(buffer2); 288 vec[1].iov_len = arraysize(buffer2);
400 for (size_t i = 0; i < uncompressed_data.length(); i += 2) { 289 for (size_t i = 0; i < uncompressed_data.length(); i += 2) {
401 size_t bytes_read = stream_->Readv(vec, 2); 290 size_t bytes_read = stream_->Readv(vec, 2);
402 ASSERT_EQ(2u, bytes_read) << i; 291 ASSERT_EQ(2u, bytes_read) << i;
403 ASSERT_EQ(uncompressed_data.data()[i], buffer1[0]) << i; 292 ASSERT_EQ(uncompressed_data.data()[i], buffer1[0]) << i;
404 ASSERT_EQ(uncompressed_data.data()[i + 1], buffer2[0]) << i; 293 ASSERT_EQ(uncompressed_data.data()[i + 1], buffer2[0]) << i;
405 } 294 }
406 } 295 }
407 296
408 TEST_F(ReliableQuicStreamTest, ProcessCorruptHeadersEarly) { 297 TEST_F(QuicDataStreamTest, ProcessCorruptHeadersEarly) {
409 Initialize(kShouldProcessData); 298 Initialize(kShouldProcessData);
410 299
411 string compressed_headers1 = compressor_->CompressHeadersWithPriority( 300 string compressed_headers1 = compressor_->CompressHeadersWithPriority(
412 kHighestPriority, headers_); 301 kHighestPriority, headers_);
413 QuicStreamFrame frame1( 302 QuicStreamFrame frame1(
414 stream_->id(), false, 0, MakeIOVector(compressed_headers1)); 303 stream_->id(), false, 0, MakeIOVector(compressed_headers1));
415 string decompressed_headers1 = 304 string decompressed_headers1 =
416 SpdyUtils::SerializeUncompressedHeaders(headers_); 305 SpdyUtils::SerializeUncompressedHeaders(headers_);
417 306
418 headers_["content-type"] = "text/plain"; 307 headers_["content-type"] = "text/plain";
(...skipping 21 matching lines...) Expand all
440 329
441 // Verify that the decompressor is available, and inform stream2 330 // Verify that the decompressor is available, and inform stream2
442 // that it can now decompress the buffered compressed data. Since 331 // that it can now decompress the buffered compressed data. Since
443 // the compressed data is corrupt, the stream will shutdown the session. 332 // the compressed data is corrupt, the stream will shutdown the session.
444 EXPECT_EQ(2u, session_->decompressor()->current_header_id()); 333 EXPECT_EQ(2u, session_->decompressor()->current_header_id());
445 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_DECOMPRESSION_FAILURE)); 334 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_DECOMPRESSION_FAILURE));
446 stream2_->OnDecompressorAvailable(); 335 stream2_->OnDecompressorAvailable();
447 EXPECT_EQ("", stream2_->data()); 336 EXPECT_EQ("", stream2_->data());
448 } 337 }
449 338
450 TEST_F(ReliableQuicStreamTest, ProcessPartialHeadersEarly) { 339 TEST_F(QuicDataStreamTest, ProcessPartialHeadersEarly) {
451 Initialize(kShouldProcessData); 340 Initialize(kShouldProcessData);
452 341
453 string compressed_headers1 = compressor_->CompressHeadersWithPriority( 342 string compressed_headers1 = compressor_->CompressHeadersWithPriority(
454 kHighestPriority, headers_); 343 kHighestPriority, headers_);
455 QuicStreamFrame frame1( 344 QuicStreamFrame frame1(
456 stream_->id(), false, 0, MakeIOVector(compressed_headers1)); 345 stream_->id(), false, 0, MakeIOVector(compressed_headers1));
457 string decompressed_headers1 = 346 string decompressed_headers1 =
458 SpdyUtils::SerializeUncompressedHeaders(headers_); 347 SpdyUtils::SerializeUncompressedHeaders(headers_);
459 348
460 headers_["content-type"] = "text/plain"; 349 headers_["content-type"] = "text/plain";
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
493 string remaining_compressed_headers = 382 string remaining_compressed_headers =
494 compressed_headers2.substr(partial_compressed_headers.length()); 383 compressed_headers2.substr(partial_compressed_headers.length());
495 384
496 QuicStreamFrame frame3(stream2_->id(), false, 385 QuicStreamFrame frame3(stream2_->id(), false,
497 partial_compressed_headers.length(), 386 partial_compressed_headers.length(),
498 MakeIOVector(remaining_compressed_headers)); 387 MakeIOVector(remaining_compressed_headers));
499 stream2_->OnStreamFrame(frame3); 388 stream2_->OnStreamFrame(frame3);
500 EXPECT_EQ(decompressed_headers2, stream2_->data()); 389 EXPECT_EQ(decompressed_headers2, stream2_->data());
501 } 390 }
502 391
503 TEST_F(ReliableQuicStreamTest, ProcessHeadersEarly) { 392 TEST_F(QuicDataStreamTest, ProcessHeadersEarly) {
504 Initialize(kShouldProcessData); 393 Initialize(kShouldProcessData);
505 394
506 string compressed_headers1 = compressor_->CompressHeadersWithPriority( 395 string compressed_headers1 = compressor_->CompressHeadersWithPriority(
507 kHighestPriority, headers_); 396 kHighestPriority, headers_);
508 QuicStreamFrame frame1( 397 QuicStreamFrame frame1(
509 stream_->id(), false, 0, MakeIOVector(compressed_headers1)); 398 stream_->id(), false, 0, MakeIOVector(compressed_headers1));
510 string decompressed_headers1 = 399 string decompressed_headers1 =
511 SpdyUtils::SerializeUncompressedHeaders(headers_); 400 SpdyUtils::SerializeUncompressedHeaders(headers_);
512 401
513 headers_["content-type"] = "text/plain"; 402 headers_["content-type"] = "text/plain";
(...skipping 17 matching lines...) Expand all
531 stream_->OnStreamFrame(frame1); 420 stream_->OnStreamFrame(frame1);
532 EXPECT_EQ(decompressed_headers1, stream_->data()); 421 EXPECT_EQ(decompressed_headers1, stream_->data());
533 422
534 // Verify that the decompressor is available, and inform stream2 423 // Verify that the decompressor is available, and inform stream2
535 // that it can now decompress the buffered compressed data. 424 // that it can now decompress the buffered compressed data.
536 EXPECT_EQ(2u, session_->decompressor()->current_header_id()); 425 EXPECT_EQ(2u, session_->decompressor()->current_header_id());
537 stream2_->OnDecompressorAvailable(); 426 stream2_->OnDecompressorAvailable();
538 EXPECT_EQ(decompressed_headers2, stream2_->data()); 427 EXPECT_EQ(decompressed_headers2, stream2_->data());
539 } 428 }
540 429
541 TEST_F(ReliableQuicStreamTest, ProcessHeadersDelay) { 430 TEST_F(QuicDataStreamTest, ProcessHeadersDelay) {
542 Initialize(!kShouldProcessData); 431 Initialize(!kShouldProcessData);
543 432
544 string compressed_headers = compressor_->CompressHeadersWithPriority( 433 string compressed_headers = compressor_->CompressHeadersWithPriority(
545 kHighestPriority, headers_); 434 kHighestPriority, headers_);
546 QuicStreamFrame frame1( 435 QuicStreamFrame frame1(
547 stream_->id(), false, 0, MakeIOVector(compressed_headers)); 436 stream_->id(), false, 0, MakeIOVector(compressed_headers));
548 string decompressed_headers = 437 string decompressed_headers =
549 SpdyUtils::SerializeUncompressedHeaders(headers_); 438 SpdyUtils::SerializeUncompressedHeaders(headers_);
550 439
551 // Send the headers to the stream and verify they were decompressed. 440 // Send the headers to the stream and verify they were decompressed.
552 stream_->OnStreamFrame(frame1); 441 stream_->OnStreamFrame(frame1);
553 EXPECT_EQ(2u, session_->decompressor()->current_header_id()); 442 EXPECT_EQ(2u, session_->decompressor()->current_header_id());
554 443
555 // Verify that we are now able to handle the body data, 444 // Verify that we are now able to handle the body data,
556 // even though the stream has not processed the headers. 445 // even though the stream has not processed the headers.
557 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID)) 446 EXPECT_CALL(*connection_, SendConnectionClose(QUIC_INVALID_HEADER_ID))
558 .Times(0); 447 .Times(0);
559 QuicStreamFrame frame2(stream_->id(), false, compressed_headers.length(), 448 QuicStreamFrame frame2(stream_->id(), false, compressed_headers.length(),
560 MakeIOVector("body data")); 449 MakeIOVector("body data"));
561 stream_->OnStreamFrame(frame2); 450 stream_->OnStreamFrame(frame2);
562 } 451 }
563 452
564 } // namespace 453 } // namespace
565 } // namespace test 454 } // namespace test
566 } // namespace net 455 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_data_stream.cc ('k') | net/quic/quic_framer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698