| 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 26 matching lines...) Expand all  Loading... | 
| 37 namespace { | 37 namespace { | 
| 38 | 38 | 
| 39 const QuicStreamId kTestStreamId = 5u; | 39 const QuicStreamId kTestStreamId = 5u; | 
| 40 | 40 | 
| 41 class MockDelegate : public QuicChromiumClientStream::Delegate { | 41 class MockDelegate : public QuicChromiumClientStream::Delegate { | 
| 42  public: | 42  public: | 
| 43   MockDelegate() {} | 43   MockDelegate() {} | 
| 44 | 44 | 
| 45   MOCK_METHOD0(OnSendData, int()); | 45   MOCK_METHOD0(OnSendData, int()); | 
| 46   MOCK_METHOD2(OnSendDataComplete, int(int, bool*)); | 46   MOCK_METHOD2(OnSendDataComplete, int(int, bool*)); | 
| 47   void OnInitialHeadersAvailable(const SpdyHeaderBlock& headers, |  | 
| 48                                  size_t frame_len) override { |  | 
| 49     headers_ = headers.Clone(); |  | 
| 50     OnInitialHeadersAvailableMock(headers, frame_len); |  | 
| 51   } |  | 
| 52   MOCK_METHOD2(OnInitialHeadersAvailableMock, |  | 
| 53                void(const SpdyHeaderBlock& headers, size_t frame_len)); |  | 
| 54   void OnTrailingHeadersAvailable(const SpdyHeaderBlock& headers, | 47   void OnTrailingHeadersAvailable(const SpdyHeaderBlock& headers, | 
| 55                                   size_t frame_len) override { | 48                                   size_t frame_len) override { | 
| 56     trailers_ = headers.Clone(); | 49     trailers_ = headers.Clone(); | 
| 57     OnTrailingHeadersAvailableMock(headers, frame_len); | 50     OnTrailingHeadersAvailableMock(headers, frame_len); | 
| 58   } | 51   } | 
| 59   MOCK_METHOD2(OnTrailingHeadersAvailableMock, | 52   MOCK_METHOD2(OnTrailingHeadersAvailableMock, | 
| 60                void(const SpdyHeaderBlock& headers, size_t frame_len)); | 53                void(const SpdyHeaderBlock& headers, size_t frame_len)); | 
| 61   MOCK_METHOD0(OnDataAvailable, void()); | 54   MOCK_METHOD0(OnDataAvailable, void()); | 
| 62   MOCK_METHOD0(OnClose, void()); | 55   MOCK_METHOD0(OnClose, void()); | 
| 63   MOCK_METHOD1(OnError, void(int)); | 56   MOCK_METHOD1(OnError, void(int)); | 
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 246   } | 239   } | 
| 247 | 240 | 
| 248   QuicHeaderList ProcessTrailers(const SpdyHeaderBlock& headers) { | 241   QuicHeaderList ProcessTrailers(const SpdyHeaderBlock& headers) { | 
| 249     QuicHeaderList h = AsHeaderList(headers); | 242     QuicHeaderList h = AsHeaderList(headers); | 
| 250     stream_->OnStreamHeaderList(true, h.uncompressed_header_bytes(), h); | 243     stream_->OnStreamHeaderList(true, h.uncompressed_header_bytes(), h); | 
| 251     return h; | 244     return h; | 
| 252   } | 245   } | 
| 253 | 246 | 
| 254   QuicHeaderList ProcessHeadersFull(const SpdyHeaderBlock& headers) { | 247   QuicHeaderList ProcessHeadersFull(const SpdyHeaderBlock& headers) { | 
| 255     QuicHeaderList h = ProcessHeaders(headers); | 248     QuicHeaderList h = ProcessHeaders(headers); | 
| 256     EXPECT_CALL(delegate_, OnInitialHeadersAvailableMock( | 249     TestCompletionCallback callback; | 
| 257                                _, h.uncompressed_header_bytes())); | 250     EXPECT_EQ( | 
| 258     base::RunLoop().RunUntilIdle(); | 251         static_cast<int>(h.uncompressed_header_bytes()), | 
|  | 252         handle_->ReadInitialHeaders(&delegate_.headers_, callback.callback())); | 
| 259     EXPECT_EQ(headers, delegate_.headers_); | 253     EXPECT_EQ(headers, delegate_.headers_); | 
| 260     EXPECT_TRUE(stream_->header_list().empty()); | 254     EXPECT_TRUE(stream_->header_list().empty()); | 
| 261     return h; | 255     return h; | 
| 262   } | 256   } | 
| 263 | 257 | 
| 264   QuicStreamId GetNthClientInitiatedStreamId(int n) { | 258   QuicStreamId GetNthClientInitiatedStreamId(int n) { | 
| 265     return QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, n); | 259     return QuicSpdySessionPeer::GetNthClientInitiatedStreamId(session_, n); | 
| 266   } | 260   } | 
| 267 | 261 | 
| 268   QuicStreamId GetNthServerInitiatedStreamId(int n) { | 262   QuicStreamId GetNthServerInitiatedStreamId(int n) { | 
| (...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 724 | 718 | 
| 725   InitializeHeaders(); | 719   InitializeHeaders(); | 
| 726 | 720 | 
| 727   // Receive the headers before the delegate is set. | 721   // Receive the headers before the delegate is set. | 
| 728   QuicHeaderList header_list = AsHeaderList(headers_); | 722   QuicHeaderList header_list = AsHeaderList(headers_); | 
| 729   stream2->OnStreamHeaderList(true, header_list.uncompressed_header_bytes(), | 723   stream2->OnStreamHeaderList(true, header_list.uncompressed_header_bytes(), | 
| 730                               header_list); | 724                               header_list); | 
| 731   EXPECT_TRUE(delegate2_.headers_.empty()); | 725   EXPECT_TRUE(delegate2_.headers_.empty()); | 
| 732 | 726 | 
| 733   // Now set the delegate and verify that the headers are delivered. | 727   // Now set the delegate and verify that the headers are delivered. | 
| 734   EXPECT_CALL(delegate2_, OnInitialHeadersAvailableMock( |  | 
| 735                               _, header_list.uncompressed_header_bytes())); |  | 
| 736   handle2_ = stream2->CreateHandle(&delegate2_); | 728   handle2_ = stream2->CreateHandle(&delegate2_); | 
| 737   base::RunLoop().RunUntilIdle(); | 729   TestCompletionCallback callback; | 
|  | 730   EXPECT_EQ( | 
|  | 731       static_cast<int>(header_list.uncompressed_header_bytes()), | 
|  | 732       handle2_->ReadInitialHeaders(&delegate2_.headers_, callback.callback())); | 
| 738   EXPECT_EQ(headers_, delegate2_.headers_); | 733   EXPECT_EQ(headers_, delegate2_.headers_); | 
| 739 | 734 | 
| 740   // Both delegates should be notified that theirs streams are closed. | 735   // Both delegates should be notified that theirs streams are closed. | 
| 741   EXPECT_CALL(delegate2_, OnClose()); | 736   EXPECT_CALL(delegate2_, OnClose()); | 
| 742   EXPECT_CALL(delegate_, OnClose()); | 737   EXPECT_CALL(delegate_, OnClose()); | 
| 743 } | 738 } | 
| 744 | 739 | 
| 745 TEST_P(QuicChromiumClientStreamTest, HeadersAndDataBeforeDelegate) { | 740 TEST_P(QuicChromiumClientStreamTest, HeadersAndDataBeforeDelegate) { | 
| 746   // We don't use stream_ because we want an incoming server push | 741   // We don't use stream_ because we want an incoming server push | 
| 747   // stream. | 742   // stream. | 
| 748   QuicStreamId stream_id = GetNthServerInitiatedStreamId(0); | 743   QuicStreamId stream_id = GetNthServerInitiatedStreamId(0); | 
| 749   QuicChromiumClientStream* stream2 = | 744   QuicChromiumClientStream* stream2 = | 
| 750       new QuicChromiumClientStream(stream_id, &session_, NetLogWithSource()); | 745       new QuicChromiumClientStream(stream_id, &session_, NetLogWithSource()); | 
| 751   session_.ActivateStream(base::WrapUnique(stream2)); | 746   session_.ActivateStream(base::WrapUnique(stream2)); | 
| 752 | 747 | 
| 753   InitializeHeaders(); | 748   InitializeHeaders(); | 
| 754 | 749 | 
| 755   // Receive the headers and data before the delegate is set. | 750   // Receive the headers and data before the delegate is set. | 
| 756   QuicHeaderList header_list = AsHeaderList(headers_); | 751   QuicHeaderList header_list = AsHeaderList(headers_); | 
| 757   stream2->OnStreamHeaderList(false, header_list.uncompressed_header_bytes(), | 752   stream2->OnStreamHeaderList(false, header_list.uncompressed_header_bytes(), | 
| 758                               header_list); | 753                               header_list); | 
| 759   EXPECT_TRUE(delegate2_.headers_.empty()); | 754   EXPECT_TRUE(delegate2_.headers_.empty()); | 
| 760   const char data[] = "hello world!"; | 755   const char data[] = "hello world!"; | 
| 761   stream2->OnStreamFrame(QuicStreamFrame(stream_id, /*fin=*/false, | 756   stream2->OnStreamFrame(QuicStreamFrame(stream_id, /*fin=*/false, | 
| 762                                          /*offset=*/0, data)); | 757                                          /*offset=*/0, data)); | 
| 763 | 758 | 
| 764   // Now set the delegate and verify that the headers are delivered, but | 759   // Now set the delegate and verify that the headers are delivered, but | 
| 765   // not the data, which needs to be read explicitly. | 760   // not the data, which needs to be read explicitly. | 
| 766   EXPECT_CALL(delegate2_, OnInitialHeadersAvailableMock( |  | 
| 767                               _, header_list.uncompressed_header_bytes())); |  | 
| 768   handle2_ = stream2->CreateHandle(&delegate2_); | 761   handle2_ = stream2->CreateHandle(&delegate2_); | 
| 769   base::RunLoop().RunUntilIdle(); | 762   TestCompletionCallback callback; | 
|  | 763   EXPECT_EQ( | 
|  | 764       static_cast<int>(header_list.uncompressed_header_bytes()), | 
|  | 765       handle2_->ReadInitialHeaders(&delegate2_.headers_, callback.callback())); | 
| 770   EXPECT_EQ(headers_, delegate2_.headers_); | 766   EXPECT_EQ(headers_, delegate2_.headers_); | 
| 771   base::RunLoop().RunUntilIdle(); | 767   base::RunLoop().RunUntilIdle(); | 
| 772 | 768 | 
| 773   // Now explicitly read the data. | 769   // Now explicitly read the data. | 
| 774   int data_len = arraysize(data) - 1; | 770   int data_len = arraysize(data) - 1; | 
| 775   scoped_refptr<IOBuffer> buffer(new IOBuffer(data_len + 1)); | 771   scoped_refptr<IOBuffer> buffer(new IOBuffer(data_len + 1)); | 
| 776   ASSERT_EQ(data_len, stream2->Read(buffer.get(), data_len + 1)); | 772   ASSERT_EQ(data_len, stream2->Read(buffer.get(), data_len + 1)); | 
| 777   EXPECT_EQ(QuicStringPiece(data), QuicStringPiece(buffer->data(), data_len)); | 773   EXPECT_EQ(QuicStringPiece(data), QuicStringPiece(buffer->data(), data_len)); | 
| 778 | 774 | 
| 779   // Both delegates should be notified that theirs streams are closed. | 775   // Both delegates should be notified that theirs streams are closed. | 
| 780   EXPECT_CALL(delegate2_, OnClose()); | 776   EXPECT_CALL(delegate2_, OnClose()); | 
| 781   EXPECT_CALL(delegate_, OnClose()); | 777   EXPECT_CALL(delegate_, OnClose()); | 
| 782 } | 778 } | 
| 783 | 779 | 
| 784 }  // namespace | 780 }  // namespace | 
| 785 }  // namespace test | 781 }  // namespace test | 
| 786 }  // namespace net | 782 }  // namespace net | 
| OLD | NEW | 
|---|