| 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/chromium/quic_chromium_client_stream.h" | 5 #include "net/quic/chromium/quic_chromium_client_stream.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/memory/ptr_util.h" | 9 #include "base/memory/ptr_util.h" |
| 10 #include "base/run_loop.h" | 10 #include "base/run_loop.h" |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 83 QuicIOVector data, | 83 QuicIOVector data, |
| 84 QuicStreamOffset offset, | 84 QuicStreamOffset offset, |
| 85 bool fin, | 85 bool fin, |
| 86 QuicReferenceCountedPointer<QuicAckListenerInterface>)); | 86 QuicReferenceCountedPointer<QuicAckListenerInterface>)); |
| 87 MOCK_METHOD3(SendRstStream, | 87 MOCK_METHOD3(SendRstStream, |
| 88 void(QuicStreamId stream_id, | 88 void(QuicStreamId stream_id, |
| 89 QuicRstStreamErrorCode error, | 89 QuicRstStreamErrorCode error, |
| 90 QuicStreamOffset bytes_written)); | 90 QuicStreamOffset bytes_written)); |
| 91 | 91 |
| 92 MOCK_METHOD2(OnStreamHeaders, | 92 MOCK_METHOD2(OnStreamHeaders, |
| 93 void(QuicStreamId stream_id, base::StringPiece headers_data)); | 93 void(QuicStreamId stream_id, QuicStringPiece headers_data)); |
| 94 MOCK_METHOD2(OnStreamHeadersPriority, | 94 MOCK_METHOD2(OnStreamHeadersPriority, |
| 95 void(QuicStreamId stream_id, SpdyPriority priority)); | 95 void(QuicStreamId stream_id, SpdyPriority priority)); |
| 96 MOCK_METHOD3(OnStreamHeadersComplete, | 96 MOCK_METHOD3(OnStreamHeadersComplete, |
| 97 void(QuicStreamId stream_id, bool fin, size_t frame_len)); | 97 void(QuicStreamId stream_id, bool fin, size_t frame_len)); |
| 98 MOCK_METHOD2(OnPromiseHeaders, | 98 MOCK_METHOD2(OnPromiseHeaders, |
| 99 void(QuicStreamId stream_id, StringPiece headers_data)); | 99 void(QuicStreamId stream_id, QuicStringPiece headers_data)); |
| 100 MOCK_METHOD3(OnPromiseHeadersComplete, | 100 MOCK_METHOD3(OnPromiseHeadersComplete, |
| 101 void(QuicStreamId stream_id, | 101 void(QuicStreamId stream_id, |
| 102 QuicStreamId promised_stream_id, | 102 QuicStreamId promised_stream_id, |
| 103 size_t frame_len)); | 103 size_t frame_len)); |
| 104 MOCK_METHOD0(IsCryptoHandshakeConfirmed, bool()); | 104 MOCK_METHOD0(IsCryptoHandshakeConfirmed, bool()); |
| 105 // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be | 105 // Methods taking non-copyable types like SpdyHeaderBlock by value cannot be |
| 106 // mocked directly. | 106 // mocked directly. |
| 107 size_t WriteHeaders(QuicStreamId id, | 107 size_t WriteHeaders(QuicStreamId id, |
| 108 SpdyHeaderBlock headers, | 108 SpdyHeaderBlock headers, |
| 109 bool fin, | 109 bool fin, |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 203 "ARHKyW-koxuhMZHUnGBJAM1gJODe0cATO_KGoX4pbbFxxJ5IicRxOrWK_5rU3cdy6" | 203 "ARHKyW-koxuhMZHUnGBJAM1gJODe0cATO_KGoX4pbbFxxJ5IicRxOrWK_5rU3cdy6" |
| 204 "edlR9FsEdH6iujMcHkbE5l18ehJDwTWmBKBzVD87naobhMMrF6VvnDGxQVGp9Ir_b" | 204 "edlR9FsEdH6iujMcHkbE5l18ehJDwTWmBKBzVD87naobhMMrF6VvnDGxQVGp9Ir_b" |
| 205 "Rgj3RWUoPumQVCxtSOBdX0GlJOEcDTNCzQIm9BSfetog_eP_TfYubKudt5eMsXmN6" | 205 "Rgj3RWUoPumQVCxtSOBdX0GlJOEcDTNCzQIm9BSfetog_eP_TfYubKudt5eMsXmN6" |
| 206 "QnyXHeGeK2UINUzJ-D30AFcpqYgH9_1BvYSpi7fc7_ydBU8TaD8ZRxvtnzXqj0RfG" | 206 "QnyXHeGeK2UINUzJ-D30AFcpqYgH9_1BvYSpi7fc7_ydBU8TaD8ZRxvtnzXqj0RfG" |
| 207 "tuHghmv3aD-uzSYJ75XDdzKdizZ86IG6Fbn1XFhYZM-fbHhm3mVEXnyRW4ZuNOLFk" | 207 "tuHghmv3aD-uzSYJ75XDdzKdizZ86IG6Fbn1XFhYZM-fbHhm3mVEXnyRW4ZuNOLFk" |
| 208 "Fas6LMcVC6Q8QLlHYbXBpdNFuGbuZGUnav5C-2I_-46lL0NGg3GewxGKGHvHEfoyn" | 208 "Fas6LMcVC6Q8QLlHYbXBpdNFuGbuZGUnav5C-2I_-46lL0NGg3GewxGKGHvHEfoyn" |
| 209 "EFFlEYHsBQ98rXImL8ySDycdLEFvBPdtctPmWCfTxwmoSMLHU2SCVDhbqMWU5b0yr" | 209 "EFFlEYHsBQ98rXImL8ySDycdLEFvBPdtctPmWCfTxwmoSMLHU2SCVDhbqMWU5b0yr" |
| 210 "JBCScs_ejbKaqBDoB7ZGxTvqlrB__2ZmnHHjCr8RgMRtKNtIeuZAo "; | 210 "JBCScs_ejbKaqBDoB7ZGxTvqlrB__2ZmnHHjCr8RgMRtKNtIeuZAo "; |
| 211 } | 211 } |
| 212 | 212 |
| 213 void ReadData(StringPiece expected_data) { | 213 void ReadData(QuicStringPiece expected_data) { |
| 214 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected_data.length() + 1)); | 214 scoped_refptr<IOBuffer> buffer(new IOBuffer(expected_data.length() + 1)); |
| 215 EXPECT_EQ(static_cast<int>(expected_data.length()), | 215 EXPECT_EQ(static_cast<int>(expected_data.length()), |
| 216 stream_->Read(buffer.get(), expected_data.length() + 1)); | 216 stream_->Read(buffer.get(), expected_data.length() + 1)); |
| 217 EXPECT_EQ(expected_data, | 217 EXPECT_EQ(expected_data, |
| 218 StringPiece(buffer->data(), expected_data.length())); | 218 QuicStringPiece(buffer->data(), expected_data.length())); |
| 219 } | 219 } |
| 220 | 220 |
| 221 QuicHeaderList ProcessHeaders(const SpdyHeaderBlock& headers) { | 221 QuicHeaderList ProcessHeaders(const SpdyHeaderBlock& headers) { |
| 222 QuicHeaderList h = AsHeaderList(headers); | 222 QuicHeaderList h = AsHeaderList(headers); |
| 223 stream_->OnStreamHeaderList(false, h.uncompressed_header_bytes(), h); | 223 stream_->OnStreamHeaderList(false, h.uncompressed_header_bytes(), h); |
| 224 return h; | 224 return h; |
| 225 } | 225 } |
| 226 | 226 |
| 227 QuicHeaderList ProcessTrailers(const SpdyHeaderBlock& headers) { | 227 QuicHeaderList ProcessTrailers(const SpdyHeaderBlock& headers) { |
| 228 QuicHeaderList h = AsHeaderList(headers); | 228 QuicHeaderList h = AsHeaderList(headers); |
| (...skipping 22 matching lines...) Expand all Loading... |
| 251 }; | 251 }; |
| 252 | 252 |
| 253 INSTANTIATE_TEST_CASE_P(Version, | 253 INSTANTIATE_TEST_CASE_P(Version, |
| 254 QuicChromiumClientStreamTest, | 254 QuicChromiumClientStreamTest, |
| 255 ::testing::ValuesIn(AllSupportedVersions())); | 255 ::testing::ValuesIn(AllSupportedVersions())); |
| 256 | 256 |
| 257 TEST_P(QuicChromiumClientStreamTest, OnFinRead) { | 257 TEST_P(QuicChromiumClientStreamTest, OnFinRead) { |
| 258 InitializeHeaders(); | 258 InitializeHeaders(); |
| 259 QuicStreamOffset offset = 0; | 259 QuicStreamOffset offset = 0; |
| 260 ProcessHeadersFull(headers_); | 260 ProcessHeadersFull(headers_); |
| 261 QuicStreamFrame frame2(kTestStreamId, true, offset, StringPiece()); | 261 QuicStreamFrame frame2(kTestStreamId, true, offset, QuicStringPiece()); |
| 262 EXPECT_CALL(delegate_, OnClose()); | 262 EXPECT_CALL(delegate_, OnClose()); |
| 263 stream_->OnStreamFrame(frame2); | 263 stream_->OnStreamFrame(frame2); |
| 264 } | 264 } |
| 265 | 265 |
| 266 TEST_P(QuicChromiumClientStreamTest, OnDataAvailableBeforeHeaders) { | 266 TEST_P(QuicChromiumClientStreamTest, OnDataAvailableBeforeHeaders) { |
| 267 EXPECT_CALL(delegate_, OnClose()); | 267 EXPECT_CALL(delegate_, OnClose()); |
| 268 | 268 |
| 269 EXPECT_CALL(delegate_, OnDataAvailable()).Times(0); | 269 EXPECT_CALL(delegate_, OnDataAvailable()).Times(0); |
| 270 stream_->OnDataAvailable(); | 270 stream_->OnDataAvailable(); |
| 271 } | 271 } |
| 272 | 272 |
| 273 TEST_P(QuicChromiumClientStreamTest, OnDataAvailable) { | 273 TEST_P(QuicChromiumClientStreamTest, OnDataAvailable) { |
| 274 InitializeHeaders(); | 274 InitializeHeaders(); |
| 275 ProcessHeadersFull(headers_); | 275 ProcessHeadersFull(headers_); |
| 276 | 276 |
| 277 const char data[] = "hello world!"; | 277 const char data[] = "hello world!"; |
| 278 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 278 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
| 279 /*offset=*/0, data)); | 279 /*offset=*/0, data)); |
| 280 | 280 |
| 281 EXPECT_CALL(delegate_, OnDataAvailable()) | 281 EXPECT_CALL(delegate_, OnDataAvailable()) |
| 282 .WillOnce(testing::Invoke( | 282 .WillOnce(testing::Invoke(CreateFunctor( |
| 283 CreateFunctor(&QuicChromiumClientStreamTest::ReadData, | 283 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), |
| 284 base::Unretained(this), | 284 QuicStringPiece(data, arraysize(data) - 1)))); |
| 285 StringPiece(data, arraysize(data) - 1)))); | |
| 286 base::RunLoop().RunUntilIdle(); | 285 base::RunLoop().RunUntilIdle(); |
| 287 | 286 |
| 288 EXPECT_CALL(delegate_, OnClose()); | 287 EXPECT_CALL(delegate_, OnClose()); |
| 289 } | 288 } |
| 290 | 289 |
| 291 TEST_P(QuicChromiumClientStreamTest, ProcessHeadersWithError) { | 290 TEST_P(QuicChromiumClientStreamTest, ProcessHeadersWithError) { |
| 292 SpdyHeaderBlock bad_headers; | 291 SpdyHeaderBlock bad_headers; |
| 293 bad_headers["NAME"] = "..."; | 292 bad_headers["NAME"] = "..."; |
| 294 EXPECT_CALL(session_, | 293 EXPECT_CALL(session_, |
| 295 SendRstStream(kTestStreamId, QUIC_BAD_APPLICATION_PAYLOAD, 0)); | 294 SendRstStream(kTestStreamId, QUIC_BAD_APPLICATION_PAYLOAD, 0)); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 331 InitializeHeaders(); | 330 InitializeHeaders(); |
| 332 ProcessHeadersFull(headers_); | 331 ProcessHeadersFull(headers_); |
| 333 | 332 |
| 334 const char data[] = "hello world!"; | 333 const char data[] = "hello world!"; |
| 335 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 334 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
| 336 /*offset=*/0, data)); | 335 /*offset=*/0, data)); |
| 337 | 336 |
| 338 EXPECT_CALL(delegate_, OnDataAvailable()) | 337 EXPECT_CALL(delegate_, OnDataAvailable()) |
| 339 .WillOnce(testing::Invoke(CreateFunctor( | 338 .WillOnce(testing::Invoke(CreateFunctor( |
| 340 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), | 339 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), |
| 341 StringPiece(data, arraysize(data) - 1)))); | 340 QuicStringPiece(data, arraysize(data) - 1)))); |
| 342 | 341 |
| 343 SpdyHeaderBlock trailers; | 342 SpdyHeaderBlock trailers; |
| 344 trailers["bar"] = "foo"; | 343 trailers["bar"] = "foo"; |
| 345 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(data)); | 344 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(data)); |
| 346 | 345 |
| 347 auto t = ProcessTrailers(trailers); | 346 auto t = ProcessTrailers(trailers); |
| 348 base::RunLoop run_loop; | 347 base::RunLoop run_loop; |
| 349 EXPECT_CALL(delegate_, | 348 EXPECT_CALL(delegate_, |
| 350 OnHeadersAvailableMock(_, t.uncompressed_header_bytes())) | 349 OnHeadersAvailableMock(_, t.uncompressed_header_bytes())) |
| 351 .WillOnce(testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); | 350 .WillOnce(testing::InvokeWithoutArgs([&run_loop]() { run_loop.Quit(); })); |
| 352 | 351 |
| 353 run_loop.Run(); | 352 run_loop.Run(); |
| 354 | 353 |
| 355 // OnDataAvailable callback should follow trailers notification. | 354 // OnDataAvailable callback should follow trailers notification. |
| 356 base::RunLoop run_loop3; | 355 base::RunLoop run_loop3; |
| 357 EXPECT_CALL(delegate_, OnDataAvailable()) | 356 EXPECT_CALL(delegate_, OnDataAvailable()) |
| 358 .Times(1) | 357 .Times(1) |
| 359 .WillOnce(testing::DoAll( | 358 .WillOnce(testing::DoAll( |
| 360 testing::Invoke(CreateFunctor(&QuicChromiumClientStreamTest::ReadData, | 359 testing::Invoke(CreateFunctor(&QuicChromiumClientStreamTest::ReadData, |
| 361 base::Unretained(this), StringPiece())), | 360 base::Unretained(this), |
| 361 QuicStringPiece())), |
| 362 testing::InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }))); | 362 testing::InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }))); |
| 363 run_loop3.Run(); | 363 run_loop3.Run(); |
| 364 | 364 |
| 365 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. | 365 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. |
| 366 trailers.erase(kFinalOffsetHeaderKey); | 366 trailers.erase(kFinalOffsetHeaderKey); |
| 367 EXPECT_EQ(trailers, delegate_.headers_); | 367 EXPECT_EQ(trailers, delegate_.headers_); |
| 368 base::RunLoop().RunUntilIdle(); | 368 base::RunLoop().RunUntilIdle(); |
| 369 EXPECT_CALL(delegate_, OnClose()); | 369 EXPECT_CALL(delegate_, OnClose()); |
| 370 } | 370 } |
| 371 | 371 |
| 372 // Tests that trailers are marked as consumed only before delegate is to be | 372 // Tests that trailers are marked as consumed only before delegate is to be |
| 373 // immediately notified about trailers. | 373 // immediately notified about trailers. |
| 374 TEST_P(QuicChromiumClientStreamTest, MarkTrailersConsumedWhenNotifyDelegate) { | 374 TEST_P(QuicChromiumClientStreamTest, MarkTrailersConsumedWhenNotifyDelegate) { |
| 375 InitializeHeaders(); | 375 InitializeHeaders(); |
| 376 ProcessHeadersFull(headers_); | 376 ProcessHeadersFull(headers_); |
| 377 | 377 |
| 378 const char data[] = "hello world!"; | 378 const char data[] = "hello world!"; |
| 379 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 379 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
| 380 /*offset=*/0, data)); | 380 /*offset=*/0, data)); |
| 381 | 381 |
| 382 base::RunLoop run_loop; | 382 base::RunLoop run_loop; |
| 383 EXPECT_CALL(delegate_, OnDataAvailable()) | 383 EXPECT_CALL(delegate_, OnDataAvailable()) |
| 384 .Times(1) | 384 .Times(1) |
| 385 .WillOnce(testing::DoAll( | 385 .WillOnce(testing::DoAll( |
| 386 testing::Invoke(CreateFunctor( | 386 testing::Invoke(CreateFunctor( |
| 387 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), | 387 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), |
| 388 StringPiece(data, arraysize(data) - 1))), | 388 QuicStringPiece(data, arraysize(data) - 1))), |
| 389 testing::Invoke([&run_loop]() { run_loop.Quit(); }))); | 389 testing::Invoke([&run_loop]() { run_loop.Quit(); }))); |
| 390 | 390 |
| 391 // Wait for the read to complete. | 391 // Wait for the read to complete. |
| 392 run_loop.Run(); | 392 run_loop.Run(); |
| 393 | 393 |
| 394 // Read again, and it will be pending. | 394 // Read again, and it will be pending. |
| 395 scoped_refptr<IOBuffer> buffer(new IOBuffer(1)); | 395 scoped_refptr<IOBuffer> buffer(new IOBuffer(1)); |
| 396 EXPECT_THAT(stream_->Read(buffer.get(), 1), IsError(ERR_IO_PENDING)); | 396 EXPECT_THAT(stream_->Read(buffer.get(), 1), IsError(ERR_IO_PENDING)); |
| 397 | 397 |
| 398 SpdyHeaderBlock trailers; | 398 SpdyHeaderBlock trailers; |
| 399 trailers["bar"] = "foo"; | 399 trailers["bar"] = "foo"; |
| 400 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(data)); | 400 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(data)); |
| 401 QuicHeaderList t = ProcessTrailers(trailers); | 401 QuicHeaderList t = ProcessTrailers(trailers); |
| 402 EXPECT_FALSE(stream_->IsDoneReading()); | 402 EXPECT_FALSE(stream_->IsDoneReading()); |
| 403 | 403 |
| 404 base::RunLoop run_loop2; | 404 base::RunLoop run_loop2; |
| 405 EXPECT_CALL(delegate_, | 405 EXPECT_CALL(delegate_, |
| 406 OnHeadersAvailableMock(_, t.uncompressed_header_bytes())) | 406 OnHeadersAvailableMock(_, t.uncompressed_header_bytes())) |
| 407 .WillOnce( | 407 .WillOnce( |
| 408 testing::InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); | 408 testing::InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); |
| 409 | 409 |
| 410 run_loop2.Run(); | 410 run_loop2.Run(); |
| 411 | 411 |
| 412 // OnDataAvailable callback should follow trailers notification. | 412 // OnDataAvailable callback should follow trailers notification. |
| 413 base::RunLoop run_loop3; | 413 base::RunLoop run_loop3; |
| 414 EXPECT_CALL(delegate_, OnDataAvailable()) | 414 EXPECT_CALL(delegate_, OnDataAvailable()) |
| 415 .Times(1) | 415 .Times(1) |
| 416 .WillOnce(testing::DoAll( | 416 .WillOnce(testing::DoAll( |
| 417 testing::Invoke(CreateFunctor(&QuicChromiumClientStreamTest::ReadData, | 417 testing::Invoke(CreateFunctor(&QuicChromiumClientStreamTest::ReadData, |
| 418 base::Unretained(this), StringPiece())), | 418 base::Unretained(this), |
| 419 QuicStringPiece())), |
| 419 testing::InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }))); | 420 testing::InvokeWithoutArgs([&run_loop3]() { run_loop3.Quit(); }))); |
| 420 run_loop3.Run(); | 421 run_loop3.Run(); |
| 421 | 422 |
| 422 // Make sure the stream is properly closed since trailers and data are all | 423 // Make sure the stream is properly closed since trailers and data are all |
| 423 // consumed. | 424 // consumed. |
| 424 EXPECT_TRUE(stream_->IsDoneReading()); | 425 EXPECT_TRUE(stream_->IsDoneReading()); |
| 425 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. | 426 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. |
| 426 trailers.erase(kFinalOffsetHeaderKey); | 427 trailers.erase(kFinalOffsetHeaderKey); |
| 427 EXPECT_EQ(trailers, delegate_.headers_); | 428 EXPECT_EQ(trailers, delegate_.headers_); |
| 428 | 429 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 440 const char data[] = "hello world!"; | 441 const char data[] = "hello world!"; |
| 441 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, | 442 stream_->OnStreamFrame(QuicStreamFrame(kTestStreamId, /*fin=*/false, |
| 442 /*offset=*/0, data)); | 443 /*offset=*/0, data)); |
| 443 | 444 |
| 444 base::RunLoop run_loop; | 445 base::RunLoop run_loop; |
| 445 EXPECT_CALL(delegate_, OnDataAvailable()) | 446 EXPECT_CALL(delegate_, OnDataAvailable()) |
| 446 .Times(1) | 447 .Times(1) |
| 447 .WillOnce(testing::DoAll( | 448 .WillOnce(testing::DoAll( |
| 448 testing::Invoke(CreateFunctor( | 449 testing::Invoke(CreateFunctor( |
| 449 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), | 450 &QuicChromiumClientStreamTest::ReadData, base::Unretained(this), |
| 450 StringPiece(data, arraysize(data) - 1))), | 451 QuicStringPiece(data, arraysize(data) - 1))), |
| 451 testing::Invoke([&run_loop]() { run_loop.Quit(); }))); | 452 testing::Invoke([&run_loop]() { run_loop.Quit(); }))); |
| 452 | 453 |
| 453 // Wait for the read to complete. | 454 // Wait for the read to complete. |
| 454 run_loop.Run(); | 455 run_loop.Run(); |
| 455 | 456 |
| 456 // Deliver trailers. Delegate notification is posted asynchronously. | 457 // Deliver trailers. Delegate notification is posted asynchronously. |
| 457 SpdyHeaderBlock trailers; | 458 SpdyHeaderBlock trailers; |
| 458 trailers["bar"] = "foo"; | 459 trailers["bar"] = "foo"; |
| 459 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(data)); | 460 trailers[kFinalOffsetHeaderKey] = base::IntToString(strlen(data)); |
| 460 | 461 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 473 .WillOnce( | 474 .WillOnce( |
| 474 testing::InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); | 475 testing::InvokeWithoutArgs([&run_loop2]() { run_loop2.Quit(); })); |
| 475 | 476 |
| 476 run_loop2.Run(); | 477 run_loop2.Run(); |
| 477 | 478 |
| 478 base::RunLoop run_loop3; | 479 base::RunLoop run_loop3; |
| 479 // OnDataAvailable() should follow right after and Read() will return 0. | 480 // OnDataAvailable() should follow right after and Read() will return 0. |
| 480 EXPECT_CALL(delegate_, OnDataAvailable()) | 481 EXPECT_CALL(delegate_, OnDataAvailable()) |
| 481 .WillOnce(testing::DoAll( | 482 .WillOnce(testing::DoAll( |
| 482 testing::Invoke(CreateFunctor(&QuicChromiumClientStreamTest::ReadData, | 483 testing::Invoke(CreateFunctor(&QuicChromiumClientStreamTest::ReadData, |
| 483 base::Unretained(this), StringPiece())), | 484 base::Unretained(this), |
| 485 QuicStringPiece())), |
| 484 testing::Invoke([&run_loop3]() { run_loop3.Quit(); }))); | 486 testing::Invoke([&run_loop3]() { run_loop3.Quit(); }))); |
| 485 run_loop3.Run(); | 487 run_loop3.Run(); |
| 486 | 488 |
| 487 // Make sure the stream is properly closed since trailers and data are all | 489 // Make sure the stream is properly closed since trailers and data are all |
| 488 // consumed. | 490 // consumed. |
| 489 EXPECT_TRUE(stream_->IsDoneReading()); | 491 EXPECT_TRUE(stream_->IsDoneReading()); |
| 490 | 492 |
| 491 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. | 493 // Make sure kFinalOffsetHeaderKey is gone from the delivered actual trailers. |
| 492 trailers.erase(kFinalOffsetHeaderKey); | 494 trailers.erase(kFinalOffsetHeaderKey); |
| 493 EXPECT_EQ(trailers, delegate_.headers_); | 495 EXPECT_EQ(trailers, delegate_.headers_); |
| 494 | 496 |
| 495 base::RunLoop().RunUntilIdle(); | 497 base::RunLoop().RunUntilIdle(); |
| 496 EXPECT_CALL(delegate_, OnClose()); | 498 EXPECT_CALL(delegate_, OnClose()); |
| 497 } | 499 } |
| 498 | 500 |
| 499 TEST_P(QuicChromiumClientStreamTest, WriteStreamData) { | 501 TEST_P(QuicChromiumClientStreamTest, WriteStreamData) { |
| 500 EXPECT_CALL(delegate_, OnClose()); | 502 EXPECT_CALL(delegate_, OnClose()); |
| 501 | 503 |
| 502 const char kData1[] = "hello world"; | 504 const char kData1[] = "hello world"; |
| 503 const size_t kDataLen = arraysize(kData1); | 505 const size_t kDataLen = arraysize(kData1); |
| 504 | 506 |
| 505 // All data written. | 507 // All data written. |
| 506 EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) | 508 EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) |
| 507 .WillOnce(Return(QuicConsumedData(kDataLen, true))); | 509 .WillOnce(Return(QuicConsumedData(kDataLen, true))); |
| 508 TestCompletionCallback callback; | 510 TestCompletionCallback callback; |
| 509 EXPECT_EQ(OK, stream_->WriteStreamData(base::StringPiece(kData1, kDataLen), | 511 EXPECT_EQ(OK, stream_->WriteStreamData(QuicStringPiece(kData1, kDataLen), |
| 510 true, callback.callback())); | 512 true, callback.callback())); |
| 511 } | 513 } |
| 512 | 514 |
| 513 TEST_P(QuicChromiumClientStreamTest, WriteStreamDataAsync) { | 515 TEST_P(QuicChromiumClientStreamTest, WriteStreamDataAsync) { |
| 514 EXPECT_CALL(delegate_, HasSendHeadersComplete()).Times(AnyNumber()); | 516 EXPECT_CALL(delegate_, HasSendHeadersComplete()).Times(AnyNumber()); |
| 515 EXPECT_CALL(delegate_, OnClose()); | 517 EXPECT_CALL(delegate_, OnClose()); |
| 516 | 518 |
| 517 const char kData1[] = "hello world"; | 519 const char kData1[] = "hello world"; |
| 518 const size_t kDataLen = arraysize(kData1); | 520 const size_t kDataLen = arraysize(kData1); |
| 519 | 521 |
| 520 // No data written. | 522 // No data written. |
| 521 EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) | 523 EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) |
| 522 .WillOnce(Return(QuicConsumedData(0, false))); | 524 .WillOnce(Return(QuicConsumedData(0, false))); |
| 523 TestCompletionCallback callback; | 525 TestCompletionCallback callback; |
| 524 EXPECT_EQ(ERR_IO_PENDING, | 526 EXPECT_EQ(ERR_IO_PENDING, |
| 525 stream_->WriteStreamData(base::StringPiece(kData1, kDataLen), true, | 527 stream_->WriteStreamData(QuicStringPiece(kData1, kDataLen), true, |
| 526 callback.callback())); | 528 callback.callback())); |
| 527 ASSERT_FALSE(callback.have_result()); | 529 ASSERT_FALSE(callback.have_result()); |
| 528 | 530 |
| 529 // All data written. | 531 // All data written. |
| 530 EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) | 532 EXPECT_CALL(session_, WritevData(stream_, stream_->id(), _, _, _, _)) |
| 531 .WillOnce(Return(QuicConsumedData(kDataLen, true))); | 533 .WillOnce(Return(QuicConsumedData(kDataLen, true))); |
| 532 stream_->OnCanWrite(); | 534 stream_->OnCanWrite(); |
| 533 ASSERT_TRUE(callback.have_result()); | 535 ASSERT_TRUE(callback.have_result()); |
| 534 EXPECT_THAT(callback.WaitForResult(), IsOk()); | 536 EXPECT_THAT(callback.WaitForResult(), IsOk()); |
| 535 } | 537 } |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 591 stream->SetDelegate(&delegate_); | 593 stream->SetDelegate(&delegate_); |
| 592 ProcessHeadersFull(headers_); | 594 ProcessHeadersFull(headers_); |
| 593 | 595 |
| 594 // Times(2) because OnClose will be called for stream and stream_. | 596 // Times(2) because OnClose will be called for stream and stream_. |
| 595 EXPECT_CALL(delegate_, OnClose()).Times(2); | 597 EXPECT_CALL(delegate_, OnClose()).Times(2); |
| 596 } | 598 } |
| 597 | 599 |
| 598 } // namespace | 600 } // namespace |
| 599 } // namespace test | 601 } // namespace test |
| 600 } // namespace net | 602 } // namespace net |
| OLD | NEW |