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 |