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/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/stl_util.h" | 10 #include "base/stl_util.h" |
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 } | 304 } |
305 | 305 |
306 const vector<QuicStopWaitingFrame>& stop_waiting_frames() const { | 306 const vector<QuicStopWaitingFrame>& stop_waiting_frames() const { |
307 return framer_.stop_waiting_frames(); | 307 return framer_.stop_waiting_frames(); |
308 } | 308 } |
309 | 309 |
310 const vector<QuicConnectionCloseFrame>& connection_close_frames() const { | 310 const vector<QuicConnectionCloseFrame>& connection_close_frames() const { |
311 return framer_.connection_close_frames(); | 311 return framer_.connection_close_frames(); |
312 } | 312 } |
313 | 313 |
| 314 const vector<QuicRstStreamFrame>& rst_stream_frames() const { |
| 315 return framer_.rst_stream_frames(); |
| 316 } |
| 317 |
314 const vector<QuicStreamFrame>& stream_frames() const { | 318 const vector<QuicStreamFrame>& stream_frames() const { |
315 return framer_.stream_frames(); | 319 return framer_.stream_frames(); |
316 } | 320 } |
317 | 321 |
318 const vector<QuicPingFrame>& ping_frames() const { | 322 const vector<QuicPingFrame>& ping_frames() const { |
319 return framer_.ping_frames(); | 323 return framer_.ping_frames(); |
320 } | 324 } |
321 | 325 |
322 size_t last_packet_size() { | 326 size_t last_packet_size() { |
323 return last_packet_size_; | 327 return last_packet_size_; |
(...skipping 1871 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2195 lost_packets.insert(2); | 2199 lost_packets.insert(2); |
2196 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) | 2200 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
2197 .WillOnce(Return(lost_packets)); | 2201 .WillOnce(Return(lost_packets)); |
2198 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 2202 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
2199 EXPECT_CALL(*send_algorithm_, | 2203 EXPECT_CALL(*send_algorithm_, |
2200 OnPacketSent(_, _, _, second_packet_size - kQuicVersionSize, _)). | 2204 OnPacketSent(_, _, _, second_packet_size - kQuicVersionSize, _)). |
2201 Times(1); | 2205 Times(1); |
2202 ProcessAckPacket(&nack_two); | 2206 ProcessAckPacket(&nack_two); |
2203 } | 2207 } |
2204 | 2208 |
| 2209 TEST_P(QuicConnectionTest, DoNotSendQueuedPacketForResetStream) { |
| 2210 ValueRestore<bool> old_flag(&FLAGS_quic_do_not_retransmit_for_reset_streams, |
| 2211 true); |
| 2212 |
| 2213 // Block the connection to queue the packet. |
| 2214 BlockOnNextWrite(); |
| 2215 |
| 2216 QuicStreamId stream_id = 2; |
| 2217 connection_.SendStreamDataWithString(stream_id, "foo", 0, !kFin, nullptr); |
| 2218 |
| 2219 // Now that there is a queued packet, reset the stream. |
| 2220 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
| 2221 |
| 2222 // Unblock the connection and verify that only the RST_STREAM is sent. |
| 2223 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2224 writer_->SetWritable(); |
| 2225 connection_.OnCanWrite(); |
| 2226 EXPECT_EQ(1u, writer_->frame_count()); |
| 2227 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2228 } |
| 2229 |
| 2230 TEST_P(QuicConnectionTest, DoNotRetransmitForResetStreamOnNack) { |
| 2231 ValueRestore<bool> old_flag(&FLAGS_quic_do_not_retransmit_for_reset_streams, |
| 2232 true); |
| 2233 |
| 2234 QuicStreamId stream_id = 2; |
| 2235 QuicPacketSequenceNumber last_packet; |
| 2236 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); |
| 2237 SendStreamDataToPeer(stream_id, "foos", 3, !kFin, &last_packet); |
| 2238 SendStreamDataToPeer(stream_id, "fooos", 7, !kFin, &last_packet); |
| 2239 |
| 2240 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2241 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
| 2242 |
| 2243 // Lose a packet and ensure it does not trigger retransmission. |
| 2244 QuicAckFrame nack_two = InitAckFrame(last_packet); |
| 2245 NackPacket(last_packet - 1, &nack_two); |
| 2246 SequenceNumberSet lost_packets; |
| 2247 lost_packets.insert(last_packet - 1); |
| 2248 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2249 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 2250 .WillOnce(Return(lost_packets)); |
| 2251 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
| 2252 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 2253 ProcessAckPacket(&nack_two); |
| 2254 } |
| 2255 |
| 2256 TEST_P(QuicConnectionTest, DoNotRetransmitForResetStreamOnRTO) { |
| 2257 ValueRestore<bool> old_flag(&FLAGS_quic_do_not_retransmit_for_reset_streams, |
| 2258 true); |
| 2259 |
| 2260 QuicStreamId stream_id = 2; |
| 2261 QuicPacketSequenceNumber last_packet; |
| 2262 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); |
| 2263 |
| 2264 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2265 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
| 2266 |
| 2267 // Fire the RTO and verify that the RST_STREAM is resent, not stream data. |
| 2268 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2269 clock_.AdvanceTime(DefaultRetransmissionTime()); |
| 2270 connection_.GetRetransmissionAlarm()->Fire(); |
| 2271 EXPECT_EQ(1u, writer_->frame_count()); |
| 2272 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2273 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); |
| 2274 } |
| 2275 |
| 2276 TEST_P(QuicConnectionTest, DoNotSendPendingRetransmissionForResetStream) { |
| 2277 ValueRestore<bool> old_flag(&FLAGS_quic_do_not_retransmit_for_reset_streams, |
| 2278 true); |
| 2279 |
| 2280 QuicStreamId stream_id = 2; |
| 2281 QuicPacketSequenceNumber last_packet; |
| 2282 SendStreamDataToPeer(stream_id, "foo", 0, !kFin, &last_packet); |
| 2283 SendStreamDataToPeer(stream_id, "foos", 3, !kFin, &last_packet); |
| 2284 BlockOnNextWrite(); |
| 2285 connection_.SendStreamDataWithString(stream_id, "fooos", 7, !kFin, nullptr); |
| 2286 |
| 2287 // Lose a packet which will trigger a pending retransmission. |
| 2288 QuicAckFrame ack = InitAckFrame(last_packet); |
| 2289 NackPacket(last_packet - 1, &ack); |
| 2290 SequenceNumberSet lost_packets; |
| 2291 lost_packets.insert(last_packet - 1); |
| 2292 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2293 EXPECT_CALL(*loss_algorithm_, DetectLostPackets(_, _, _, _)) |
| 2294 .WillOnce(Return(lost_packets)); |
| 2295 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
| 2296 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| 2297 ProcessAckPacket(&ack); |
| 2298 |
| 2299 connection_.SendRstStream(stream_id, QUIC_STREAM_NO_ERROR, 14); |
| 2300 |
| 2301 // Unblock the connection and verify that the RST_STREAM is sent but not the |
| 2302 // second data packet nor a retransmit. |
| 2303 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 2304 writer_->SetWritable(); |
| 2305 connection_.OnCanWrite(); |
| 2306 EXPECT_EQ(1u, writer_->frame_count()); |
| 2307 EXPECT_EQ(1u, writer_->rst_stream_frames().size()); |
| 2308 EXPECT_EQ(stream_id, writer_->rst_stream_frames().front().stream_id); |
| 2309 } |
| 2310 |
2205 TEST_P(QuicConnectionTest, DiscardRetransmit) { | 2311 TEST_P(QuicConnectionTest, DiscardRetransmit) { |
2206 QuicPacketSequenceNumber last_packet; | 2312 QuicPacketSequenceNumber last_packet; |
2207 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 | 2313 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 |
2208 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 | 2314 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 |
2209 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 | 2315 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 |
2210 | 2316 |
2211 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2317 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2212 | 2318 |
2213 // Instigate a loss with an ack. | 2319 // Instigate a loss with an ack. |
2214 QuicAckFrame nack_two = InitAckFrame(3); | 2320 QuicAckFrame nack_two = InitAckFrame(3); |
(...skipping 2136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4351 // Regression test for b/18594622 | 4457 // Regression test for b/18594622 |
4352 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); | 4458 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
4353 EXPECT_DFATAL( | 4459 EXPECT_DFATAL( |
4354 connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), | 4460 connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), |
4355 "Attempt to send empty stream frame"); | 4461 "Attempt to send empty stream frame"); |
4356 } | 4462 } |
4357 | 4463 |
4358 } // namespace | 4464 } // namespace |
4359 } // namespace test | 4465 } // namespace test |
4360 } // namespace net | 4466 } // namespace net |
OLD | NEW |