OLD | NEW |
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/quic_chromium_client_stream.h" | 5 #include "net/quic/quic_chromium_client_stream.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/run_loop.h" | 9 #include "base/run_loop.h" |
10 #include "base/strings/string_number_conversions.h" | 10 #include "base/strings/string_number_conversions.h" |
(...skipping 21 matching lines...) Expand all Loading... |
32 namespace { | 32 namespace { |
33 | 33 |
34 const QuicStreamId kTestStreamId = 5u; | 34 const QuicStreamId kTestStreamId = 5u; |
35 | 35 |
36 class MockDelegate : public QuicChromiumClientStream::Delegate { | 36 class MockDelegate : public QuicChromiumClientStream::Delegate { |
37 public: | 37 public: |
38 MockDelegate() {} | 38 MockDelegate() {} |
39 | 39 |
40 MOCK_METHOD0(OnSendData, int()); | 40 MOCK_METHOD0(OnSendData, int()); |
41 MOCK_METHOD2(OnSendDataComplete, int(int, bool*)); | 41 MOCK_METHOD2(OnSendDataComplete, int(int, bool*)); |
42 MOCK_METHOD2(OnHeadersAvailable, | 42 void OnHeadersAvailable(const SpdyHeaderBlock& headers, |
| 43 size_t frame_len) override { |
| 44 headers_ = headers.Clone(); |
| 45 OnHeadersAvailableMock(headers, frame_len); |
| 46 } |
| 47 MOCK_METHOD2(OnHeadersAvailableMock, |
43 void(const SpdyHeaderBlock& headers, size_t frame_len)); | 48 void(const SpdyHeaderBlock& headers, size_t frame_len)); |
44 MOCK_METHOD2(OnDataReceived, int(const char*, int)); | 49 MOCK_METHOD2(OnDataReceived, int(const char*, int)); |
45 MOCK_METHOD0(OnDataAvailable, void()); | 50 MOCK_METHOD0(OnDataAvailable, void()); |
46 MOCK_METHOD0(OnClose, void()); | 51 MOCK_METHOD0(OnClose, void()); |
47 MOCK_METHOD1(OnError, void(int)); | 52 MOCK_METHOD1(OnError, void(int)); |
48 MOCK_METHOD0(HasSendHeadersComplete, bool()); | 53 MOCK_METHOD0(HasSendHeadersComplete, bool()); |
49 | 54 |
| 55 SpdyHeaderBlock headers_; |
| 56 |
50 private: | 57 private: |
51 DISALLOW_COPY_AND_ASSIGN(MockDelegate); | 58 DISALLOW_COPY_AND_ASSIGN(MockDelegate); |
52 }; | 59 }; |
53 | 60 |
54 class MockQuicClientSessionBase : public QuicClientSessionBase { | 61 class MockQuicClientSessionBase : public QuicClientSessionBase { |
55 public: | 62 public: |
56 explicit MockQuicClientSessionBase(QuicConnection* connection, | 63 explicit MockQuicClientSessionBase(QuicConnection* connection, |
57 QuicClientPushPromiseIndex* index); | 64 QuicClientPushPromiseIndex* index); |
58 ~MockQuicClientSessionBase() override; | 65 ~MockQuicClientSessionBase() override; |
59 | 66 |
(...skipping 25 matching lines...) Expand all Loading... |
85 void(QuicStreamId stream_id, SpdyPriority priority)); | 92 void(QuicStreamId stream_id, SpdyPriority priority)); |
86 MOCK_METHOD3(OnStreamHeadersComplete, | 93 MOCK_METHOD3(OnStreamHeadersComplete, |
87 void(QuicStreamId stream_id, bool fin, size_t frame_len)); | 94 void(QuicStreamId stream_id, bool fin, size_t frame_len)); |
88 MOCK_METHOD2(OnPromiseHeaders, | 95 MOCK_METHOD2(OnPromiseHeaders, |
89 void(QuicStreamId stream_id, StringPiece headers_data)); | 96 void(QuicStreamId stream_id, StringPiece headers_data)); |
90 MOCK_METHOD3(OnPromiseHeadersComplete, | 97 MOCK_METHOD3(OnPromiseHeadersComplete, |
91 void(QuicStreamId stream_id, | 98 void(QuicStreamId stream_id, |
92 QuicStreamId promised_stream_id, | 99 QuicStreamId promised_stream_id, |
93 size_t frame_len)); | 100 size_t frame_len)); |
94 MOCK_METHOD0(IsCryptoHandshakeConfirmed, bool()); | 101 MOCK_METHOD0(IsCryptoHandshakeConfirmed, bool()); |
95 MOCK_METHOD5(WriteHeaders, | 102 // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be |
| 103 // mocked directly. |
| 104 size_t WriteHeaders( |
| 105 QuicStreamId id, |
| 106 SpdyHeaderBlock headers, |
| 107 bool fin, |
| 108 SpdyPriority priority, |
| 109 QuicAckListenerInterface* ack_notifier_delegate) override { |
| 110 return WriteHeadersMock(id, headers, fin, priority, ack_notifier_delegate); |
| 111 } |
| 112 MOCK_METHOD5(WriteHeadersMock, |
96 size_t(QuicStreamId id, | 113 size_t(QuicStreamId id, |
97 SpdyHeaderBlock headers, | 114 const SpdyHeaderBlock& headers, |
98 bool fin, | 115 bool fin, |
99 SpdyPriority priority, | 116 SpdyPriority priority, |
100 QuicAckListenerInterface* ack_notifier_delegate)); | 117 QuicAckListenerInterface* ack_notifier_delegate)); |
101 MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta)); | 118 MOCK_METHOD1(OnHeadersHeadOfLineBlocking, void(QuicTime::Delta delta)); |
102 | 119 |
103 using QuicSession::ActivateStream; | 120 using QuicSession::ActivateStream; |
104 | 121 |
105 // Returns a QuicConsumedData that indicates all of |data| (and |fin| if set) | 122 // Returns a QuicConsumedData that indicates all of |data| (and |fin| if set) |
106 // has been consumed. | 123 // has been consumed. |
107 static QuicConsumedData ConsumeAllData( | 124 static QuicConsumedData ConsumeAllData( |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
211 | 228 |
212 TEST_P(QuicChromiumClientStreamTest, OnFinRead) { | 229 TEST_P(QuicChromiumClientStreamTest, OnFinRead) { |
213 InitializeHeaders(); | 230 InitializeHeaders(); |
214 std::string uncompressed_headers = | 231 std::string uncompressed_headers = |
215 SpdyUtils::SerializeUncompressedHeaders(headers_); | 232 SpdyUtils::SerializeUncompressedHeaders(headers_); |
216 QuicStreamOffset offset = 0; | 233 QuicStreamOffset offset = 0; |
217 stream_->OnStreamHeaders(uncompressed_headers); | 234 stream_->OnStreamHeaders(uncompressed_headers); |
218 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); | 235 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); |
219 | 236 |
220 EXPECT_CALL(delegate_, | 237 EXPECT_CALL(delegate_, |
221 OnHeadersAvailable(headers_, uncompressed_headers.length())); | 238 OnHeadersAvailableMock(_, uncompressed_headers.length())); |
222 base::RunLoop().RunUntilIdle(); | 239 base::RunLoop().RunUntilIdle(); |
| 240 EXPECT_EQ(headers_, delegate_.headers_); |
223 EXPECT_TRUE(stream_->decompressed_headers().empty()); | 241 EXPECT_TRUE(stream_->decompressed_headers().empty()); |
224 | 242 |
225 QuicStreamFrame frame2(kTestStreamId, true, offset, StringPiece()); | 243 QuicStreamFrame frame2(kTestStreamId, true, offset, StringPiece()); |
226 EXPECT_CALL(delegate_, OnClose()); | 244 EXPECT_CALL(delegate_, OnClose()); |
227 stream_->OnStreamFrame(frame2); | 245 stream_->OnStreamFrame(frame2); |
228 } | 246 } |
229 | 247 |
230 TEST_P(QuicChromiumClientStreamTest, OnDataAvailableBeforeHeaders) { | 248 TEST_P(QuicChromiumClientStreamTest, OnDataAvailableBeforeHeaders) { |
231 EXPECT_CALL(delegate_, OnClose()); | 249 EXPECT_CALL(delegate_, OnClose()); |
232 | 250 |
233 EXPECT_CALL(delegate_, OnDataAvailable()).Times(0); | 251 EXPECT_CALL(delegate_, OnDataAvailable()).Times(0); |
234 stream_->OnDataAvailable(); | 252 stream_->OnDataAvailable(); |
235 } | 253 } |
236 | 254 |
237 TEST_P(QuicChromiumClientStreamTest, OnDataAvailable) { | 255 TEST_P(QuicChromiumClientStreamTest, OnDataAvailable) { |
238 InitializeHeaders(); | 256 InitializeHeaders(); |
239 std::string uncompressed_headers = | 257 std::string uncompressed_headers = |
240 SpdyUtils::SerializeUncompressedHeaders(headers_); | 258 SpdyUtils::SerializeUncompressedHeaders(headers_); |
241 stream_->OnStreamHeaders(uncompressed_headers); | 259 stream_->OnStreamHeaders(uncompressed_headers); |
242 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); | 260 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); |
243 | 261 |
244 EXPECT_CALL(delegate_, | 262 EXPECT_CALL(delegate_, |
245 OnHeadersAvailable(headers_, uncompressed_headers.length())); | 263 OnHeadersAvailableMock(_, uncompressed_headers.length())); |
246 base::RunLoop().RunUntilIdle(); | 264 base::RunLoop().RunUntilIdle(); |
| 265 EXPECT_EQ(headers_, delegate_.headers_); |
247 EXPECT_TRUE(stream_->decompressed_headers().empty()); | 266 EXPECT_TRUE(stream_->decompressed_headers().empty()); |
248 | 267 |
249 const char data[] = "hello world!"; | 268 const char data[] = "hello world!"; |
250 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 269 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
251 /*offset=*/0, data)); | 270 /*offset=*/0, data)); |
252 | 271 |
253 EXPECT_CALL(delegate_, OnDataAvailable()) | 272 EXPECT_CALL(delegate_, OnDataAvailable()) |
254 .WillOnce(testing::Invoke( | 273 .WillOnce(testing::Invoke( |
255 CreateFunctor(&QuicChromiumClientStreamTest::ReadData, | 274 CreateFunctor(&QuicChromiumClientStreamTest::ReadData, |
256 base::Unretained(this), | 275 base::Unretained(this), |
(...skipping 17 matching lines...) Expand all Loading... |
274 } | 293 } |
275 | 294 |
276 TEST_P(QuicChromiumClientStreamTest, OnDataAvailableWithError) { | 295 TEST_P(QuicChromiumClientStreamTest, OnDataAvailableWithError) { |
277 InitializeHeaders(); | 296 InitializeHeaders(); |
278 std::string uncompressed_headers = | 297 std::string uncompressed_headers = |
279 SpdyUtils::SerializeUncompressedHeaders(headers_); | 298 SpdyUtils::SerializeUncompressedHeaders(headers_); |
280 stream_->OnStreamHeaders(uncompressed_headers); | 299 stream_->OnStreamHeaders(uncompressed_headers); |
281 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); | 300 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); |
282 | 301 |
283 EXPECT_CALL(delegate_, | 302 EXPECT_CALL(delegate_, |
284 OnHeadersAvailable(headers_, uncompressed_headers.length())); | 303 OnHeadersAvailableMock(_, uncompressed_headers.length())); |
285 base::RunLoop().RunUntilIdle(); | 304 base::RunLoop().RunUntilIdle(); |
| 305 EXPECT_EQ(headers_, delegate_.headers_); |
286 EXPECT_TRUE(stream_->decompressed_headers().empty()); | 306 EXPECT_TRUE(stream_->decompressed_headers().empty()); |
287 | 307 |
288 const char data[] = "hello world!"; | 308 const char data[] = "hello world!"; |
289 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 309 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
290 /*offset=*/0, data)); | 310 /*offset=*/0, data)); |
291 EXPECT_CALL(delegate_, OnDataAvailable()) | 311 EXPECT_CALL(delegate_, OnDataAvailable()) |
292 .WillOnce(testing::Invoke(CreateFunctor( | 312 .WillOnce(testing::Invoke(CreateFunctor( |
293 &QuicChromiumClientStream::Reset, | 313 &QuicChromiumClientStream::Reset, |
294 base::Unretained(stream_), QUIC_STREAM_CANCELLED))); | 314 base::Unretained(stream_), QUIC_STREAM_CANCELLED))); |
295 base::RunLoop().RunUntilIdle(); | 315 base::RunLoop().RunUntilIdle(); |
296 | 316 |
297 EXPECT_CALL(delegate_, OnClose()); | 317 EXPECT_CALL(delegate_, OnClose()); |
298 } | 318 } |
299 | 319 |
300 TEST_P(QuicChromiumClientStreamTest, OnError) { | 320 TEST_P(QuicChromiumClientStreamTest, OnError) { |
301 EXPECT_CALL(delegate_, OnError(ERR_INTERNET_DISCONNECTED)); | 321 EXPECT_CALL(delegate_, OnError(ERR_INTERNET_DISCONNECTED)); |
302 | 322 |
303 stream_->OnError(ERR_INTERNET_DISCONNECTED); | 323 stream_->OnError(ERR_INTERNET_DISCONNECTED); |
304 EXPECT_FALSE(stream_->GetDelegate()); | 324 EXPECT_FALSE(stream_->GetDelegate()); |
305 } | 325 } |
306 | 326 |
307 TEST_P(QuicChromiumClientStreamTest, OnTrailers) { | 327 TEST_P(QuicChromiumClientStreamTest, OnTrailers) { |
308 InitializeHeaders(); | 328 InitializeHeaders(); |
309 std::string uncompressed_headers = | 329 std::string uncompressed_headers = |
310 SpdyUtils::SerializeUncompressedHeaders(headers_); | 330 SpdyUtils::SerializeUncompressedHeaders(headers_); |
311 stream_->OnStreamHeaders(uncompressed_headers); | 331 stream_->OnStreamHeaders(uncompressed_headers); |
312 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); | 332 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); |
313 | 333 |
314 EXPECT_CALL(delegate_, | 334 EXPECT_CALL(delegate_, |
315 OnHeadersAvailable(headers_, uncompressed_headers.length())); | 335 OnHeadersAvailableMock(_, uncompressed_headers.length())); |
316 base::RunLoop().RunUntilIdle(); | 336 base::RunLoop().RunUntilIdle(); |
| 337 EXPECT_EQ(headers_, delegate_.headers_); |
317 EXPECT_TRUE(stream_->decompressed_headers().empty()); | 338 EXPECT_TRUE(stream_->decompressed_headers().empty()); |
318 | 339 |
319 const char data[] = "hello world!"; | 340 const char data[] = "hello world!"; |
320 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 341 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
321 /*offset=*/0, data)); | 342 /*offset=*/0, data)); |
322 | 343 |
323 EXPECT_CALL(delegate_, OnDataAvailable()) | 344 EXPECT_CALL(delegate_, OnDataAvailable()) |
324 .WillOnce(testing::Invoke(CreateFunctor( | 345 .WillOnce(testing::Invoke(CreateFunctor( |
325 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), | 346 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), |
326 StringPiece(data, arraysize(data) - 1)))); | 347 StringPiece(data, arraysize(data) - 1)))); |
327 | 348 |
328 SpdyHeaderBlock trailers; | 349 SpdyHeaderBlock trailers; |
329 trailers["bar"] = "foo"; | 350 trailers["bar"] = "foo"; |
330 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(data)); | 351 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(data)); |
331 std::string uncompressed_trailers = | 352 std::string uncompressed_trailers = |
332 SpdyUtils::SerializeUncompressedHeaders(trailers); | 353 SpdyUtils::SerializeUncompressedHeaders(trailers); |
333 | 354 |
334 stream_->OnStreamHeaders(uncompressed_trailers); | 355 stream_->OnStreamHeaders(uncompressed_trailers); |
335 stream_->OnStreamHeadersComplete(true, uncompressed_trailers.length()); | 356 stream_->OnStreamHeadersComplete(true, uncompressed_trailers.length()); |
336 | 357 |
337 SpdyHeaderBlock actual_trailers; | |
338 | |
339 base::RunLoop run_loop; | 358 base::RunLoop run_loop; |
340 EXPECT_CALL(delegate_, OnHeadersAvailable(_, uncompressed_trailers.length())) | 359 EXPECT_CALL(delegate_, |
341 .WillOnce(testing::DoAll( | 360 OnHeadersAvailableMock(_, uncompressed_trailers.length())) |
342 testing::SaveArg<0>(&actual_trailers), | 361 .WillOnce(testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
343 testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); }))); | |
344 | 362 |
345 run_loop.Run(); | 363 run_loop.Run(); |
346 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. | 364 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. |
347 trailers.erase(kFinalOffsetHeaderKey); | 365 trailers.erase(kFinalOffsetHeaderKey); |
348 EXPECT_EQ(trailers, actual_trailers); | 366 EXPECT_EQ(trailers, delegate_.headers_); |
349 base::RunLoop().RunUntilIdle(); | 367 base::RunLoop().RunUntilIdle(); |
350 EXPECT_CALL(delegate_, OnClose()); | 368 EXPECT_CALL(delegate_, OnClose()); |
351 } | 369 } |
352 | 370 |
353 // Tests that trailers are marked as consumed only before delegate is to be | 371 // Tests that trailers are marked as consumed only before delegate is to be |
354 // immediately notified about trailers. | 372 // immediately notified about trailers. |
355 TEST_P(QuicChromiumClientStreamTest, MarkTrailersConsumedWhenNotifyDelegate) { | 373 TEST_P(QuicChromiumClientStreamTest, MarkTrailersConsumedWhenNotifyDelegate) { |
356 InitializeHeaders(); | 374 InitializeHeaders(); |
357 std::string uncompressed_headers = | 375 std::string uncompressed_headers = |
358 SpdyUtils::SerializeUncompressedHeaders(headers_); | 376 SpdyUtils::SerializeUncompressedHeaders(headers_); |
359 stream_->OnStreamHeaders(uncompressed_headers); | 377 stream_->OnStreamHeaders(uncompressed_headers); |
360 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); | 378 stream_->OnStreamHeadersComplete(false, uncompressed_headers.length()); |
361 | 379 |
362 EXPECT_CALL(delegate_, | 380 EXPECT_CALL(delegate_, |
363 OnHeadersAvailable(headers_, uncompressed_headers.length())); | 381 OnHeadersAvailableMock(_, uncompressed_headers.length())); |
364 base::RunLoop().RunUntilIdle(); | 382 base::RunLoop().RunUntilIdle(); |
| 383 EXPECT_EQ(headers_, delegate_.headers_); |
365 EXPECT_TRUE(stream_->decompressed_headers().empty()); | 384 EXPECT_TRUE(stream_->decompressed_headers().empty()); |
366 | 385 |
367 const char data[] = "hello world!"; | 386 const char data[] = "hello world!"; |
368 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 387 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
369 /*offset=*/0, data)); | 388 /*offset=*/0, data)); |
370 | 389 |
371 base::RunLoop run_loop; | 390 base::RunLoop run_loop; |
372 EXPECT_CALL(delegate_, OnDataAvailable()) | 391 EXPECT_CALL(delegate_, OnDataAvailable()) |
373 .Times(1) | 392 .Times(1) |
374 .WillOnce(testing::DoAll( | 393 .WillOnce(testing::DoAll( |
(...skipping 28 matching lines...) Expand all Loading... |
403 .WillOnce(testing::DoAll( | 422 .WillOnce(testing::DoAll( |
404 testing::Invoke(CreateFunctor(&QuicChromiumClientStreamTest::ReadData, | 423 testing::Invoke(CreateFunctor(&QuicChromiumClientStreamTest::ReadData, |
405 base::Unretained(this), StringPiece())), | 424 base::Unretained(this), StringPiece())), |
406 testing::InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); }))); | 425 testing::InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); }))); |
407 run_loop2.Run(); | 426 run_loop2.Run(); |
408 // Make sure that the stream is not closed, even though ReadData returns 0. | 427 // Make sure that the stream is not closed, even though ReadData returns 0. |
409 EXPECT_FALSE(stream_->IsDoneReading()); | 428 EXPECT_FALSE(stream_->IsDoneReading()); |
410 | 429 |
411 // The OnHeadersAvailable call should follow. | 430 // The OnHeadersAvailable call should follow. |
412 base::RunLoop run_loop3; | 431 base::RunLoop run_loop3; |
413 SpdyHeaderBlock actual_trailers; | |
414 EXPECT_CALL(delegate_, | 432 EXPECT_CALL(delegate_, |
415 OnHeadersAvailable(_, uncompressed_trailers.length())) | 433 OnHeadersAvailableMock(_, uncompressed_trailers.length())) |
416 .WillOnce(testing::DoAll( | 434 .WillOnce( |
417 testing::SaveArg<0>(&actual_trailers), | 435 testing::InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); })); |
418 testing::InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }))); | |
419 | 436 |
420 run_loop3.Run(); | 437 run_loop3.Run(); |
421 // Make sure the stream is properly closed since trailers and data are all | 438 // Make sure the stream is properly closed since trailers and data are all |
422 // consumed. | 439 // consumed. |
423 EXPECT_TRUE(stream_->IsDoneReading()); | 440 EXPECT_TRUE(stream_->IsDoneReading()); |
424 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. | 441 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. |
425 trailers.erase(kFinalOffsetHeaderKey); | 442 trailers.erase(kFinalOffsetHeaderKey); |
426 EXPECT_EQ(trailers, actual_trailers); | 443 EXPECT_EQ(trailers, delegate_.headers_); |
427 | 444 |
428 base::RunLoop().RunUntilIdle(); | 445 base::RunLoop().RunUntilIdle(); |
429 EXPECT_CALL(delegate_, OnClose()); | 446 EXPECT_CALL(delegate_, OnClose()); |
430 } | 447 } |
431 | 448 |
432 TEST_P(QuicChromiumClientStreamTest, WriteStreamData) { | 449 TEST_P(QuicChromiumClientStreamTest, WriteStreamData) { |
433 EXPECT_CALL(delegate_, OnClose()); | 450 EXPECT_CALL(delegate_, OnClose()); |
434 | 451 |
435 const char kData1[] = "hello world"; | 452 const char kData1[] = "hello world"; |
436 const size_t kDataLen = arraysize(kData1); | 453 const size_t kDataLen = arraysize(kData1); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
521 session_.ActivateStream(stream); | 538 session_.ActivateStream(stream); |
522 | 539 |
523 InitializeHeaders(); | 540 InitializeHeaders(); |
524 std::string uncompressed_headers = | 541 std::string uncompressed_headers = |
525 SpdyUtils::SerializeUncompressedHeaders(headers_); | 542 SpdyUtils::SerializeUncompressedHeaders(headers_); |
526 stream->OnStreamHeaders(uncompressed_headers); | 543 stream->OnStreamHeaders(uncompressed_headers); |
527 stream->OnStreamHeadersComplete(false, uncompressed_headers.length()); | 544 stream->OnStreamHeadersComplete(false, uncompressed_headers.length()); |
528 EXPECT_TRUE(stream->decompressed_headers().empty()); | 545 EXPECT_TRUE(stream->decompressed_headers().empty()); |
529 | 546 |
530 EXPECT_CALL(delegate_, | 547 EXPECT_CALL(delegate_, |
531 OnHeadersAvailable(headers_, uncompressed_headers.length())); | 548 OnHeadersAvailableMock(_, uncompressed_headers.length())); |
532 stream->SetDelegate(&delegate_); | 549 stream->SetDelegate(&delegate_); |
533 base::RunLoop().RunUntilIdle(); | 550 base::RunLoop().RunUntilIdle(); |
| 551 EXPECT_EQ(headers_, delegate_.headers_); |
534 | 552 |
535 // Times(2) because OnClose will be called for stream and stream_. | 553 // Times(2) because OnClose will be called for stream and stream_. |
536 EXPECT_CALL(delegate_, OnClose()).Times(2); | 554 EXPECT_CALL(delegate_, OnClose()).Times(2); |
537 } | 555 } |
538 | 556 |
539 } // namespace | 557 } // namespace |
540 } // namespace test | 558 } // namespace test |
541 } // namespace net | 559 } // namespace net |
OLD | NEW |