| 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 |