| OLD | NEW |
| 1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2013 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_spdy_server_stream.h" | 5 #include "net/tools/quic/quic_spdy_server_stream.h" |
| 6 | 6 |
| 7 #include "base/strings/string_number_conversions.h" | 7 #include "base/strings/string_number_conversions.h" |
| 8 #include "base/strings/string_piece.h" | 8 #include "base/strings/string_piece.h" |
| 9 #include "net/quic/quic_connection.h" | 9 #include "net/quic/quic_connection.h" |
| 10 #include "net/quic/quic_protocol.h" | 10 #include "net/quic/quic_protocol.h" |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 139 scoped_ptr<QuicSpdyServerStreamPeer> stream_; | 139 scoped_ptr<QuicSpdyServerStreamPeer> stream_; |
| 140 string headers_string_; | 140 string headers_string_; |
| 141 string body_; | 141 string body_; |
| 142 }; | 142 }; |
| 143 | 143 |
| 144 QuicConsumedData ConsumeAllData( | 144 QuicConsumedData ConsumeAllData( |
| 145 QuicStreamId id, | 145 QuicStreamId id, |
| 146 const IOVector& data, | 146 const IOVector& data, |
| 147 QuicStreamOffset offset, | 147 QuicStreamOffset offset, |
| 148 bool fin, | 148 bool fin, |
| 149 FecProtection /*fec_protection_*/, |
| 149 QuicAckNotifier::DelegateInterface* /*ack_notifier_delegate*/) { | 150 QuicAckNotifier::DelegateInterface* /*ack_notifier_delegate*/) { |
| 150 return QuicConsumedData(data.TotalBufferSize(), fin); | 151 return QuicConsumedData(data.TotalBufferSize(), fin); |
| 151 } | 152 } |
| 152 | 153 |
| 153 INSTANTIATE_TEST_CASE_P(Tests, QuicSpdyServerStreamTest, | 154 INSTANTIATE_TEST_CASE_P(Tests, QuicSpdyServerStreamTest, |
| 154 ::testing::ValuesIn(QuicSupportedVersions())); | 155 ::testing::ValuesIn(QuicSupportedVersions())); |
| 155 | 156 |
| 156 TEST_P(QuicSpdyServerStreamTest, TestFraming) { | 157 TEST_P(QuicSpdyServerStreamTest, TestFraming) { |
| 157 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). | 158 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
| 158 WillRepeatedly(Invoke(ConsumeAllData)); | 159 WillRepeatedly(Invoke(ConsumeAllData)); |
| 159 | 160 |
| 160 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 161 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
| 161 headers_string_.c_str(), headers_string_.size())); | 162 headers_string_.c_str(), headers_string_.size())); |
| 162 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); | 163 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); |
| 163 EXPECT_EQ(11u, StreamHeaders().content_length()); | 164 EXPECT_EQ(11u, StreamHeaders().content_length()); |
| 164 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 165 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
| 165 EXPECT_EQ("POST", StreamHeaders().request_method()); | 166 EXPECT_EQ("POST", StreamHeaders().request_method()); |
| 166 EXPECT_EQ(body_, StreamBody()); | 167 EXPECT_EQ(body_, StreamBody()); |
| 167 } | 168 } |
| 168 | 169 |
| 169 TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { | 170 TEST_P(QuicSpdyServerStreamTest, TestFramingOnePacket) { |
| 170 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). | 171 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
| 171 WillRepeatedly(Invoke(ConsumeAllData)); | 172 WillRepeatedly(Invoke(ConsumeAllData)); |
| 172 | 173 |
| 173 string message = headers_string_ + body_; | 174 string message = headers_string_ + body_; |
| 174 | 175 |
| 175 EXPECT_EQ(message.size(), stream_->ProcessData( | 176 EXPECT_EQ(message.size(), stream_->ProcessData( |
| 176 message.c_str(), message.size())); | 177 message.c_str(), message.size())); |
| 177 EXPECT_EQ(11u, StreamHeaders().content_length()); | 178 EXPECT_EQ(11u, StreamHeaders().content_length()); |
| 178 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 179 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
| 179 EXPECT_EQ("POST", StreamHeaders().request_method()); | 180 EXPECT_EQ("POST", StreamHeaders().request_method()); |
| 180 EXPECT_EQ(body_, StreamBody()); | 181 EXPECT_EQ(body_, StreamBody()); |
| 181 } | 182 } |
| 182 | 183 |
| 183 TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { | 184 TEST_P(QuicSpdyServerStreamTest, TestFramingExtraData) { |
| 184 string large_body = "hello world!!!!!!"; | 185 string large_body = "hello world!!!!!!"; |
| 185 | 186 |
| 186 // We'll automatically write out an error (headers + body) | 187 // We'll automatically write out an error (headers + body) |
| 187 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). | 188 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(AnyNumber()). |
| 188 WillRepeatedly(Invoke(ConsumeAllData)); | 189 WillRepeatedly(Invoke(ConsumeAllData)); |
| 189 | 190 |
| 190 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 191 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
| 191 headers_string_.c_str(), headers_string_.size())); | 192 headers_string_.c_str(), headers_string_.size())); |
| 192 // Content length is still 11. This will register as an error and we won't | 193 // Content length is still 11. This will register as an error and we won't |
| 193 // accept the bytes. | 194 // accept the bytes. |
| 194 stream_->ProcessData(large_body.c_str(), large_body.size()); | 195 stream_->ProcessData(large_body.c_str(), large_body.size()); |
| 195 EXPECT_EQ(11u, StreamHeaders().content_length()); | 196 EXPECT_EQ(11u, StreamHeaders().content_length()); |
| 196 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); | 197 EXPECT_EQ("https://www.google.com/", StreamHeaders().request_uri()); |
| 197 EXPECT_EQ("POST", StreamHeaders().request_method()); | 198 EXPECT_EQ("POST", StreamHeaders().request_method()); |
| 198 } | 199 } |
| 199 | 200 |
| 200 TEST_P(QuicSpdyServerStreamTest, TestSendResponse) { | 201 TEST_P(QuicSpdyServerStreamTest, TestSendResponse) { |
| 201 BalsaHeaders* request_headers = stream_->mutable_headers(); | 202 BalsaHeaders* request_headers = stream_->mutable_headers(); |
| 202 request_headers->SetRequestFirstlineFromStringPieces( | 203 request_headers->SetRequestFirstlineFromStringPieces( |
| 203 "GET", | 204 "GET", |
| 204 "https://www.google.com/foo", | 205 "https://www.google.com/foo", |
| 205 "HTTP/1.1"); | 206 "HTTP/1.1"); |
| 206 | 207 |
| 207 response_headers_.SetResponseFirstlineFromStringPieces( | 208 response_headers_.SetResponseFirstlineFromStringPieces( |
| 208 "HTTP/1.1", "200", "OK"); | 209 "HTTP/1.1", "200", "OK"); |
| 209 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 210 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
| 210 | 211 |
| 211 InSequence s; | 212 InSequence s; |
| 212 EXPECT_CALL(session_, | 213 EXPECT_CALL(session_, |
| 213 WritevData(kHeadersStreamId, _, 0, false, NULL)); | 214 WritevData(kHeadersStreamId, _, 0, false, _, NULL)); |
| 214 | 215 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(1). |
| 215 | |
| 216 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). | |
| 217 WillOnce(Return(QuicConsumedData(3, true))); | 216 WillOnce(Return(QuicConsumedData(3, true))); |
| 218 | 217 |
| 219 QuicSpdyServerStreamPeer::SendResponse(stream_.get()); | 218 QuicSpdyServerStreamPeer::SendResponse(stream_.get()); |
| 220 EXPECT_TRUE(stream_->read_side_closed()); | 219 EXPECT_TRUE(stream_->read_side_closed()); |
| 221 EXPECT_TRUE(stream_->write_side_closed()); | 220 EXPECT_TRUE(stream_->write_side_closed()); |
| 222 } | 221 } |
| 223 | 222 |
| 224 TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { | 223 TEST_P(QuicSpdyServerStreamTest, TestSendErrorResponse) { |
| 225 response_headers_.SetResponseFirstlineFromStringPieces( | 224 response_headers_.SetResponseFirstlineFromStringPieces( |
| 226 "HTTP/1.1", "500", "Server Error"); | 225 "HTTP/1.1", "500", "Server Error"); |
| 227 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 226 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
| 228 | 227 |
| 229 InSequence s; | 228 InSequence s; |
| 230 EXPECT_CALL(session_, | 229 EXPECT_CALL(session_, |
| 231 WritevData(kHeadersStreamId, _, 0, false, NULL)); | 230 WritevData(kHeadersStreamId, _, 0, false, _, NULL)); |
| 232 | 231 EXPECT_CALL(session_, WritevData(_, _, _, _, _, _)).Times(1). |
| 233 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(1). | |
| 234 WillOnce(Return(QuicConsumedData(3, true))); | 232 WillOnce(Return(QuicConsumedData(3, true))); |
| 235 | 233 |
| 236 QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); | 234 QuicSpdyServerStreamPeer::SendErrorResponse(stream_.get()); |
| 237 EXPECT_TRUE(stream_->read_side_closed()); | 235 EXPECT_TRUE(stream_->read_side_closed()); |
| 238 EXPECT_TRUE(stream_->write_side_closed()); | 236 EXPECT_TRUE(stream_->write_side_closed()); |
| 239 } | 237 } |
| 240 | 238 |
| 241 TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { | 239 TEST_P(QuicSpdyServerStreamTest, InvalidHeadersWithFin) { |
| 242 char arr[] = { | 240 char arr[] = { |
| 243 0x3a, 0x68, 0x6f, 0x73, // :hos | 241 0x3a, 0x68, 0x6f, 0x73, // :hos |
| (...skipping 21 matching lines...) Expand all Loading... |
| 265 StringPiece data(arr, arraysize(arr)); | 263 StringPiece data(arr, arraysize(arr)); |
| 266 QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); | 264 QuicStreamFrame frame(stream_->id(), true, 0, MakeIOVector(data)); |
| 267 // Verify that we don't crash when we get a invalid headers in stream frame. | 265 // Verify that we don't crash when we get a invalid headers in stream frame. |
| 268 stream_->OnStreamFrame(frame); | 266 stream_->OnStreamFrame(frame); |
| 269 } | 267 } |
| 270 | 268 |
| 271 } // namespace | 269 } // namespace |
| 272 } // namespace test | 270 } // namespace test |
| 273 } // namespace tools | 271 } // namespace tools |
| 274 } // namespace net | 272 } // namespace net |
| OLD | NEW |