| 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/tools/quic/quic_reliable_server_stream.h" | 5 #include "net/tools/quic/quic_reliable_server_stream.h" |
| 6 | 6 |
| 7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
| 8 #include "net/quic/quic_spdy_compressor.h" | 8 #include "net/quic/quic_spdy_compressor.h" |
| 9 #include "net/quic/quic_utils.h" | 9 #include "net/quic/quic_utils.h" |
| 10 #include "net/quic/test_tools/quic_test_utils.h" | 10 #include "net/quic/test_tools/quic_test_utils.h" |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 115 } | 115 } |
| 116 | 116 |
| 117 BalsaHeaders response_headers_; | 117 BalsaHeaders response_headers_; |
| 118 EpollServer eps_; | 118 EpollServer eps_; |
| 119 StrictMock<MockSession> session_; | 119 StrictMock<MockSession> session_; |
| 120 scoped_ptr<QuicReliableServerStream> stream_; | 120 scoped_ptr<QuicReliableServerStream> stream_; |
| 121 string headers_string_; | 121 string headers_string_; |
| 122 string body_; | 122 string body_; |
| 123 }; | 123 }; |
| 124 | 124 |
| 125 QuicConsumedData ConsumeAllData(QuicStreamId id, | 125 QuicConsumedData ConsumeAllData( |
| 126 const struct iovec* iov, | 126 QuicStreamId id, |
| 127 int iov_count, | 127 const struct iovec* iov, |
| 128 QuicStreamOffset offset, | 128 int iov_count, |
| 129 bool fin) { | 129 QuicStreamOffset offset, |
| 130 bool fin, |
| 131 QuicAckNotifier::DelegateInterface* /*ack_notifier_delegate*/) { |
| 130 ssize_t consumed_length = 0; | 132 ssize_t consumed_length = 0; |
| 131 for (int i = 0; i < iov_count; ++i) { | 133 for (int i = 0; i < iov_count; ++i) { |
| 132 consumed_length += iov[i].iov_len; | 134 consumed_length += iov[i].iov_len; |
| 133 } | 135 } |
| 134 return QuicConsumedData(consumed_length, fin); | 136 return QuicConsumedData(consumed_length, fin); |
| 135 } | 137 } |
| 136 | 138 |
| 137 TEST_F(QuicReliableServerStreamTest, TestFraming) { | 139 TEST_F(QuicReliableServerStreamTest, TestFraming) { |
| 138 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). | 140 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
| 139 WillRepeatedly(Invoke(ConsumeAllData)); | 141 WillRepeatedly(Invoke(ConsumeAllData)); |
| 140 | 142 |
| 141 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 143 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
| 142 headers_string_.c_str(), headers_string_.size())); | 144 headers_string_.c_str(), headers_string_.size())); |
| 143 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); | 145 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); |
| 144 EXPECT_EQ(11u, stream_->headers().content_length()); | 146 EXPECT_EQ(11u, stream_->headers().content_length()); |
| 145 EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); | 147 EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); |
| 146 EXPECT_EQ("POST", stream_->headers().request_method()); | 148 EXPECT_EQ("POST", stream_->headers().request_method()); |
| 147 EXPECT_EQ(body_, stream_->body()); | 149 EXPECT_EQ(body_, stream_->body()); |
| 148 } | 150 } |
| 149 | 151 |
| 150 TEST_F(QuicReliableServerStreamTest, TestFramingOnePacket) { | 152 TEST_F(QuicReliableServerStreamTest, TestFramingOnePacket) { |
| 151 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). | 153 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
| 152 WillRepeatedly(Invoke(ConsumeAllData)); | 154 WillRepeatedly(Invoke(ConsumeAllData)); |
| 153 | 155 |
| 154 string message = headers_string_ + body_; | 156 string message = headers_string_ + body_; |
| 155 | 157 |
| 156 EXPECT_EQ(message.size(), stream_->ProcessData( | 158 EXPECT_EQ(message.size(), stream_->ProcessData( |
| 157 message.c_str(), message.size())); | 159 message.c_str(), message.size())); |
| 158 EXPECT_EQ(11u, stream_->headers().content_length()); | 160 EXPECT_EQ(11u, stream_->headers().content_length()); |
| 159 EXPECT_EQ("https://www.google.com/", | 161 EXPECT_EQ("https://www.google.com/", |
| 160 stream_->headers().request_uri()); | 162 stream_->headers().request_uri()); |
| 161 EXPECT_EQ("POST", stream_->headers().request_method()); | 163 EXPECT_EQ("POST", stream_->headers().request_method()); |
| 162 EXPECT_EQ(body_, stream_->body()); | 164 EXPECT_EQ(body_, stream_->body()); |
| 163 } | 165 } |
| 164 | 166 |
| 165 TEST_F(QuicReliableServerStreamTest, TestFramingExtraData) { | 167 TEST_F(QuicReliableServerStreamTest, TestFramingExtraData) { |
| 166 string large_body = "hello world!!!!!!"; | 168 string large_body = "hello world!!!!!!"; |
| 167 | 169 |
| 168 // We'll automatically write out an error (headers + body) | 170 // We'll automatically write out an error (headers + body) |
| 169 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(2). | 171 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(2). |
| 170 WillRepeatedly(Invoke(ConsumeAllData)); | 172 WillRepeatedly(Invoke(ConsumeAllData)); |
| 171 | 173 |
| 172 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 174 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
| 173 headers_string_.c_str(), headers_string_.size())); | 175 headers_string_.c_str(), headers_string_.size())); |
| 174 // Content length is still 11. This will register as an error and we won't | 176 // Content length is still 11. This will register as an error and we won't |
| 175 // accept the bytes. | 177 // accept the bytes. |
| 176 stream_->ProcessData(large_body.c_str(), large_body.size()); | 178 stream_->ProcessData(large_body.c_str(), large_body.size()); |
| 177 stream_->TerminateFromPeer(true); | 179 stream_->TerminateFromPeer(true); |
| 178 EXPECT_EQ(11u, stream_->headers().content_length()); | 180 EXPECT_EQ(11u, stream_->headers().content_length()); |
| 179 EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); | 181 EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); |
| 180 EXPECT_EQ("POST", stream_->headers().request_method()); | 182 EXPECT_EQ("POST", stream_->headers().request_method()); |
| 181 } | 183 } |
| 182 | 184 |
| 183 TEST_F(QuicReliableServerStreamTest, TestSendResponse) { | 185 TEST_F(QuicReliableServerStreamTest, TestSendResponse) { |
| 184 BalsaHeaders* request_headers = | 186 BalsaHeaders* request_headers = |
| 185 QuicReliableServerStreamPeer::GetMutableHeaders(stream_.get()); | 187 QuicReliableServerStreamPeer::GetMutableHeaders(stream_.get()); |
| 186 request_headers->SetRequestFirstlineFromStringPieces( | 188 request_headers->SetRequestFirstlineFromStringPieces( |
| 187 "GET", | 189 "GET", |
| 188 "https://www.google.com/foo", | 190 "https://www.google.com/foo", |
| 189 "HTTP/1.1"); | 191 "HTTP/1.1"); |
| 190 | 192 |
| 191 response_headers_.SetResponseFirstlineFromStringPieces( | 193 response_headers_.SetResponseFirstlineFromStringPieces( |
| 192 "HTTP/1.1", "200", "OK"); | 194 "HTTP/1.1", "200", "OK"); |
| 193 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 195 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
| 194 | 196 |
| 195 InSequence s; | 197 InSequence s; |
| 196 EXPECT_CALL(session_, WritevData(_, _, 1, _, _)).Times(1) | 198 EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1) |
| 197 .WillOnce(WithArgs<1>(Invoke( | 199 .WillOnce(WithArgs<1>(Invoke( |
| 198 this, &QuicReliableServerStreamTest::ValidateHeaders))); | 200 this, &QuicReliableServerStreamTest::ValidateHeaders))); |
| 199 | 201 |
| 200 EXPECT_CALL(session_, WritevData(_, _, 1, _, _)).Times(1). | 202 EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1). |
| 201 WillOnce(Return(QuicConsumedData(3, true))); | 203 WillOnce(Return(QuicConsumedData(3, true))); |
| 202 | 204 |
| 203 stream_->SendResponse(); | 205 stream_->SendResponse(); |
| 204 EXPECT_TRUE(stream_->read_side_closed()); | 206 EXPECT_TRUE(stream_->read_side_closed()); |
| 205 EXPECT_TRUE(stream_->write_side_closed()); | 207 EXPECT_TRUE(stream_->write_side_closed()); |
| 206 } | 208 } |
| 207 | 209 |
| 208 TEST_F(QuicReliableServerStreamTest, TestSendErrorResponse) { | 210 TEST_F(QuicReliableServerStreamTest, TestSendErrorResponse) { |
| 209 response_headers_.SetResponseFirstlineFromStringPieces( | 211 response_headers_.SetResponseFirstlineFromStringPieces( |
| 210 "HTTP/1.1", "500", "Server Error"); | 212 "HTTP/1.1", "500", "Server Error"); |
| 211 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 213 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
| 212 | 214 |
| 213 InSequence s; | 215 InSequence s; |
| 214 EXPECT_CALL(session_, WritevData(_, _, 1, _, _)).Times(1) | 216 EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1) |
| 215 .WillOnce(WithArgs<1>(Invoke( | 217 .WillOnce(WithArgs<1>(Invoke( |
| 216 this, &QuicReliableServerStreamTest::ValidateHeaders))); | 218 this, &QuicReliableServerStreamTest::ValidateHeaders))); |
| 217 | 219 |
| 218 EXPECT_CALL(session_, WritevData(_, _, 1, _, _)).Times(1). | 220 EXPECT_CALL(session_, WritevData(_, _, 1, _, _, _)).Times(1). |
| 219 WillOnce(Return(QuicConsumedData(3, true))); | 221 WillOnce(Return(QuicConsumedData(3, true))); |
| 220 | 222 |
| 221 stream_->SendErrorResponse(); | 223 stream_->SendErrorResponse(); |
| 222 EXPECT_TRUE(stream_->read_side_closed()); | 224 EXPECT_TRUE(stream_->read_side_closed()); |
| 223 EXPECT_TRUE(stream_->write_side_closed()); | 225 EXPECT_TRUE(stream_->write_side_closed()); |
| 224 } | 226 } |
| 225 | 227 |
| 226 } // namespace | 228 } // namespace |
| 227 } // namespace test | 229 } // namespace test |
| 228 } // namespace tools | 230 } // namespace tools |
| 229 } // namespace net | 231 } // namespace net |
| OLD | NEW |