| 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 body_("hello world") { | 51 body_("hello world") { |
| 52 BalsaHeaders request_headers; | 52 BalsaHeaders request_headers; |
| 53 request_headers.SetRequestFirstlineFromStringPieces( | 53 request_headers.SetRequestFirstlineFromStringPieces( |
| 54 "POST", "https://www.google.com/", "HTTP/1.1"); | 54 "POST", "https://www.google.com/", "HTTP/1.1"); |
| 55 request_headers.ReplaceOrAppendHeader("content-length", "11"); | 55 request_headers.ReplaceOrAppendHeader("content-length", "11"); |
| 56 | 56 |
| 57 headers_string_ = SpdyUtils::SerializeRequestHeaders(request_headers); | 57 headers_string_ = SpdyUtils::SerializeRequestHeaders(request_headers); |
| 58 stream_.reset(new QuicSpdyServerStream(3, &session_)); | 58 stream_.reset(new QuicSpdyServerStream(3, &session_)); |
| 59 } | 59 } |
| 60 | 60 |
| 61 QuicConsumedData ValidateHeaders(StringPiece headers) { | 61 QuicConsumedData ValidateHeaders(const struct iovec* iov) { |
| 62 StringPiece headers = |
| 63 StringPiece(static_cast<const char*>(iov[0].iov_base), iov[0].iov_len); |
| 62 headers_string_ = SpdyUtils::SerializeResponseHeaders( | 64 headers_string_ = SpdyUtils::SerializeResponseHeaders( |
| 63 response_headers_); | 65 response_headers_); |
| 64 QuicSpdyDecompressor decompressor; | 66 QuicSpdyDecompressor decompressor; |
| 65 TestDecompressorVisitor visitor; | 67 TestDecompressorVisitor visitor; |
| 66 | 68 |
| 67 // First the header id, then the compressed data. | 69 // First the header id, then the compressed data. |
| 68 EXPECT_EQ(1, headers[0]); | 70 EXPECT_EQ(1, headers[0]); |
| 69 EXPECT_EQ(0, headers[1]); | 71 EXPECT_EQ(0, headers[1]); |
| 70 EXPECT_EQ(0, headers[2]); | 72 EXPECT_EQ(0, headers[2]); |
| 71 EXPECT_EQ(0, headers[3]); | 73 EXPECT_EQ(0, headers[3]); |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 } | 114 } |
| 113 | 115 |
| 114 BalsaHeaders response_headers_; | 116 BalsaHeaders response_headers_; |
| 115 EpollServer eps_; | 117 EpollServer eps_; |
| 116 StrictMock<MockSession> session_; | 118 StrictMock<MockSession> session_; |
| 117 scoped_ptr<QuicReliableServerStream> stream_; | 119 scoped_ptr<QuicReliableServerStream> stream_; |
| 118 string headers_string_; | 120 string headers_string_; |
| 119 string body_; | 121 string body_; |
| 120 }; | 122 }; |
| 121 | 123 |
| 122 QuicConsumedData ConsumeAllData(QuicStreamId id, StringPiece data, | 124 QuicConsumedData ConsumeAllData(QuicStreamId id, const struct iovec* iov, |
| 123 QuicStreamOffset offset, bool fin) { | 125 int count, QuicStreamOffset offset, bool fin) { |
| 124 return QuicConsumedData(data.size(), fin); | 126 ssize_t consumed_length = 0; |
| 127 for (int i = 0; i < count; ++i) { |
| 128 consumed_length += iov[i].iov_len; |
| 129 } |
| 130 return QuicConsumedData(consumed_length, fin); |
| 125 } | 131 } |
| 126 | 132 |
| 127 TEST_F(QuicReliableServerStreamTest, TestFraming) { | 133 TEST_F(QuicReliableServerStreamTest, TestFraming) { |
| 128 EXPECT_CALL(session_, WriteData(_, _, _, _)).Times(AnyNumber()). | 134 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). |
| 129 WillRepeatedly(Invoke(ConsumeAllData)); | 135 WillRepeatedly(Invoke(ConsumeAllData)); |
| 130 | 136 |
| 131 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 137 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
| 132 headers_string_.c_str(), headers_string_.size())); | 138 headers_string_.c_str(), headers_string_.size())); |
| 133 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); | 139 EXPECT_EQ(body_.size(), stream_->ProcessData(body_.c_str(), body_.size())); |
| 134 EXPECT_EQ(11u, stream_->headers().content_length()); | 140 EXPECT_EQ(11u, stream_->headers().content_length()); |
| 135 EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); | 141 EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); |
| 136 EXPECT_EQ("POST", stream_->headers().request_method()); | 142 EXPECT_EQ("POST", stream_->headers().request_method()); |
| 137 EXPECT_EQ(body_, stream_->body()); | 143 EXPECT_EQ(body_, stream_->body()); |
| 138 } | 144 } |
| 139 | 145 |
| 140 TEST_F(QuicReliableServerStreamTest, TestFramingOnePacket) { | 146 TEST_F(QuicReliableServerStreamTest, TestFramingOnePacket) { |
| 141 EXPECT_CALL(session_, WriteData(_, _, _, _)).Times(AnyNumber()). | 147 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(AnyNumber()). |
| 142 WillRepeatedly(Invoke(ConsumeAllData)); | 148 WillRepeatedly(Invoke(ConsumeAllData)); |
| 143 | 149 |
| 144 string message = headers_string_ + body_; | 150 string message = headers_string_ + body_; |
| 145 | 151 |
| 146 EXPECT_EQ(message.size(), stream_->ProcessData( | 152 EXPECT_EQ(message.size(), stream_->ProcessData( |
| 147 message.c_str(), message.size())); | 153 message.c_str(), message.size())); |
| 148 EXPECT_EQ(11u, stream_->headers().content_length()); | 154 EXPECT_EQ(11u, stream_->headers().content_length()); |
| 149 EXPECT_EQ("https://www.google.com/", | 155 EXPECT_EQ("https://www.google.com/", |
| 150 stream_->headers().request_uri()); | 156 stream_->headers().request_uri()); |
| 151 EXPECT_EQ("POST", stream_->headers().request_method()); | 157 EXPECT_EQ("POST", stream_->headers().request_method()); |
| 152 EXPECT_EQ(body_, stream_->body()); | 158 EXPECT_EQ(body_, stream_->body()); |
| 153 } | 159 } |
| 154 | 160 |
| 155 TEST_F(QuicReliableServerStreamTest, TestFramingExtraData) { | 161 TEST_F(QuicReliableServerStreamTest, TestFramingExtraData) { |
| 156 string large_body = "hello world!!!!!!"; | 162 string large_body = "hello world!!!!!!"; |
| 157 | 163 |
| 158 // We'll automatically write out an error (headers + body) | 164 // We'll automatically write out an error (headers + body) |
| 159 EXPECT_CALL(session_, WriteData(_, _, _, _)).Times(2). | 165 EXPECT_CALL(session_, WritevData(_, _, _, _, _)).Times(2). |
| 160 WillRepeatedly(Invoke(ConsumeAllData)); | 166 WillRepeatedly(Invoke(ConsumeAllData)); |
| 161 | 167 |
| 162 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( | 168 EXPECT_EQ(headers_string_.size(), stream_->ProcessData( |
| 163 headers_string_.c_str(), headers_string_.size())); | 169 headers_string_.c_str(), headers_string_.size())); |
| 164 // Content length is still 11. This will register as an error and we won't | 170 // Content length is still 11. This will register as an error and we won't |
| 165 // accept the bytes. | 171 // accept the bytes. |
| 166 stream_->ProcessData(large_body.c_str(), large_body.size()); | 172 stream_->ProcessData(large_body.c_str(), large_body.size()); |
| 167 stream_->TerminateFromPeer(true); | 173 stream_->TerminateFromPeer(true); |
| 168 EXPECT_EQ(11u, stream_->headers().content_length()); | 174 EXPECT_EQ(11u, stream_->headers().content_length()); |
| 169 EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); | 175 EXPECT_EQ("https://www.google.com/", stream_->headers().request_uri()); |
| 170 EXPECT_EQ("POST", stream_->headers().request_method()); | 176 EXPECT_EQ("POST", stream_->headers().request_method()); |
| 171 } | 177 } |
| 172 | 178 |
| 173 TEST_F(QuicReliableServerStreamTest, TestSendResponse) { | 179 TEST_F(QuicReliableServerStreamTest, TestSendResponse) { |
| 174 BalsaHeaders* request_headers = | 180 BalsaHeaders* request_headers = |
| 175 QuicReliableServerStreamPeer::GetMutableHeaders(stream_.get()); | 181 QuicReliableServerStreamPeer::GetMutableHeaders(stream_.get()); |
| 176 request_headers->SetRequestFirstlineFromStringPieces( | 182 request_headers->SetRequestFirstlineFromStringPieces( |
| 177 "GET", | 183 "GET", |
| 178 "https://www.google.com/foo", | 184 "https://www.google.com/foo", |
| 179 "HTTP/1.1"); | 185 "HTTP/1.1"); |
| 180 | 186 |
| 181 response_headers_.SetResponseFirstlineFromStringPieces( | 187 response_headers_.SetResponseFirstlineFromStringPieces( |
| 182 "HTTP/1.1", "200", "OK"); | 188 "HTTP/1.1", "200", "OK"); |
| 183 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 189 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
| 184 | 190 |
| 185 InSequence s; | 191 InSequence s; |
| 186 EXPECT_CALL(session_, WriteData(_, _, _, _)).Times(1) | 192 EXPECT_CALL(session_, WritevData(_, _, 1, _, _)).Times(1) |
| 187 .WillOnce(WithArgs<1>(Invoke( | 193 .WillOnce(WithArgs<1>(Invoke( |
| 188 this, &QuicReliableServerStreamTest::ValidateHeaders))); | 194 this, &QuicReliableServerStreamTest::ValidateHeaders))); |
| 189 StringPiece kBody = "Yum"; | 195 |
| 190 EXPECT_CALL(session_, WriteData(_, kBody, _, _)).Times(1). | 196 EXPECT_CALL(session_, WritevData(_, _, 1, _, _)).Times(1). |
| 191 WillOnce(Return(QuicConsumedData(3, true))); | 197 WillOnce(Return(QuicConsumedData(3, true))); |
| 192 | 198 |
| 193 stream_->SendResponse(); | 199 stream_->SendResponse(); |
| 194 EXPECT_TRUE(stream_->read_side_closed()); | 200 EXPECT_TRUE(stream_->read_side_closed()); |
| 195 EXPECT_TRUE(stream_->write_side_closed()); | 201 EXPECT_TRUE(stream_->write_side_closed()); |
| 196 } | 202 } |
| 197 | 203 |
| 198 TEST_F(QuicReliableServerStreamTest, TestSendErrorResponse) { | 204 TEST_F(QuicReliableServerStreamTest, TestSendErrorResponse) { |
| 199 response_headers_.SetResponseFirstlineFromStringPieces( | 205 response_headers_.SetResponseFirstlineFromStringPieces( |
| 200 "HTTP/1.1", "500", "Server Error"); | 206 "HTTP/1.1", "500", "Server Error"); |
| 201 response_headers_.ReplaceOrAppendHeader("content-length", "3"); | 207 response_headers_.ReplaceOrAppendHeader("content-length", "3"); |
| 202 | 208 |
| 203 InSequence s; | 209 InSequence s; |
| 204 EXPECT_CALL(session_, WriteData(_, _, _, _)).Times(1) | 210 EXPECT_CALL(session_, WritevData(_, _, 1, _, _)).Times(1) |
| 205 .WillOnce(WithArgs<1>(Invoke( | 211 .WillOnce(WithArgs<1>(Invoke( |
| 206 this, &QuicReliableServerStreamTest::ValidateHeaders))); | 212 this, &QuicReliableServerStreamTest::ValidateHeaders))); |
| 207 StringPiece kBody = "bad"; | 213 |
| 208 EXPECT_CALL(session_, WriteData(_, kBody, _, _)).Times(1). | 214 EXPECT_CALL(session_, WritevData(_, _, 1, _, _)).Times(1). |
| 209 WillOnce(Return(QuicConsumedData(3, true))); | 215 WillOnce(Return(QuicConsumedData(3, true))); |
| 210 | 216 |
| 211 stream_->SendErrorResponse(); | 217 stream_->SendErrorResponse(); |
| 212 EXPECT_TRUE(stream_->read_side_closed()); | 218 EXPECT_TRUE(stream_->read_side_closed()); |
| 213 EXPECT_TRUE(stream_->write_side_closed()); | 219 EXPECT_TRUE(stream_->write_side_closed()); |
| 214 } | 220 } |
| 215 | 221 |
| 216 } // namespace | 222 } // namespace |
| 217 } // namespace test | 223 } // namespace test |
| 218 } // namespace tools | 224 } // namespace tools |
| 219 } // namespace net | 225 } // namespace net |
| OLD | NEW |