| 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 <errno.h> | 7 #include <errno.h> |
| 8 #include <memory> | 8 #include <memory> |
| 9 #include <ostream> | 9 #include <ostream> |
| 10 #include <utility> | 10 #include <utility> |
| (...skipping 2131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2142 | 2142 |
| 2143 // Unblock the connection and verify that the RST_STREAM is sent and the | 2143 // Unblock the connection and verify that the RST_STREAM is sent and the |
| 2144 // second data packet or a retransmit is sent. | 2144 // second data packet or a retransmit is sent. |
| 2145 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(2)); | 2145 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(AtLeast(2)); |
| 2146 writer_->SetWritable(); | 2146 writer_->SetWritable(); |
| 2147 connection_.OnCanWrite(); | 2147 connection_.OnCanWrite(); |
| 2148 EXPECT_EQ(1u, writer_->frame_count()); | 2148 EXPECT_EQ(1u, writer_->frame_count()); |
| 2149 EXPECT_EQ(0u, writer_->rst_stream_frames().size()); | 2149 EXPECT_EQ(0u, writer_->rst_stream_frames().size()); |
| 2150 } | 2150 } |
| 2151 | 2151 |
| 2152 TEST_P(QuicConnectionTest, DiscardRetransmit) { | 2152 TEST_P(QuicConnectionTest, RetransmitAckedPacket) { |
| 2153 FLAGS_quic_always_write_queued_retransmissions = false; | |
| 2154 QuicPacketNumber last_packet; | 2153 QuicPacketNumber last_packet; |
| 2155 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 | 2154 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 |
| 2156 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 | 2155 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 |
| 2157 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 | |
| 2158 | |
| 2159 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | |
| 2160 | |
| 2161 // Instigate a loss with an ack. | |
| 2162 QuicAckFrame nack_two = InitAckFrame(3); | |
| 2163 NackPacket(2, &nack_two); | |
| 2164 // The first nack should trigger a fast retransmission, but we'll be | |
| 2165 // write blocked, so the packet will be queued. | |
| 2166 BlockOnNextWrite(); | |
| 2167 | |
| 2168 SendAlgorithmInterface::CongestionVector lost_packets; | |
| 2169 lost_packets.push_back(std::make_pair(2, kMaxPacketSize)); | |
| 2170 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)) | |
| 2171 .WillOnce(SetArgPointee<4>(lost_packets)); | |
| 2172 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | |
| 2173 ProcessAckPacket(&nack_two); | |
| 2174 EXPECT_EQ(1u, connection_.NumQueuedPackets()); | |
| 2175 | |
| 2176 // Now, ack the previous transmission. | |
| 2177 EXPECT_CALL(*loss_algorithm_, DetectLosses(_, _, _, _, _)); | |
| 2178 QuicAckFrame ack_all = InitAckFrame(3); | |
| 2179 ProcessAckPacket(&ack_all); | |
| 2180 | |
| 2181 // Unblock the socket and attempt to send the queued packets. However, | |
| 2182 // since the previous transmission has been acked, we will not | |
| 2183 // send the retransmission. | |
| 2184 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | |
| 2185 | |
| 2186 writer_->SetWritable(); | |
| 2187 connection_.OnCanWrite(); | |
| 2188 | |
| 2189 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | |
| 2190 } | |
| 2191 | |
| 2192 TEST_P(QuicConnectionTest, RetransmitAckedPacket) { | |
| 2193 FLAGS_quic_always_write_queued_retransmissions = true; | |
| 2194 QuicPacketNumber last_packet; | |
| 2195 SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet); // Packet 1 | |
| 2196 SendStreamDataToPeer(1, "foos", 3, !kFin, &last_packet); // Packet 2 | |
| 2197 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 | 2156 SendStreamDataToPeer(1, "fooos", 7, !kFin, &last_packet); // Packet 3 |
| 2198 | 2157 |
| 2199 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2158 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2200 | 2159 |
| 2201 // Instigate a loss with an ack. | 2160 // Instigate a loss with an ack. |
| 2202 QuicAckFrame nack_two = InitAckFrame(3); | 2161 QuicAckFrame nack_two = InitAckFrame(3); |
| 2203 NackPacket(2, &nack_two); | 2162 NackPacket(2, &nack_two); |
| 2204 // The first nack should trigger a fast retransmission, but we'll be | 2163 // The first nack should trigger a fast retransmission, but we'll be |
| 2205 // write blocked, so the packet will be queued. | 2164 // write blocked, so the packet will be queued. |
| 2206 BlockOnNextWrite(); | 2165 BlockOnNextWrite(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2220 | 2179 |
| 2221 // Unblock the socket and attempt to send the queued packets. We will always | 2180 // Unblock the socket and attempt to send the queued packets. We will always |
| 2222 // send the retransmission. | 2181 // send the retransmission. |
| 2223 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 4, _, _)).Times(1); | 2182 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, 4, _, _)).Times(1); |
| 2224 | 2183 |
| 2225 writer_->SetWritable(); | 2184 writer_->SetWritable(); |
| 2226 connection_.OnCanWrite(); | 2185 connection_.OnCanWrite(); |
| 2227 | 2186 |
| 2228 EXPECT_EQ(0u, connection_.NumQueuedPackets()); | 2187 EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
| 2229 // We do not store retransmittable frames of this retransmission. | 2188 // We do not store retransmittable frames of this retransmission. |
| 2230 EXPECT_FALSE(connection_.sent_packet_manager().HasRetransmittableFrames( | 2189 EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, |
| 2231 kDefaultPathId, 4)); | 2190 kDefaultPathId, 4)); |
| 2232 } | 2191 } |
| 2233 | 2192 |
| 2234 TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) { | 2193 TEST_P(QuicConnectionTest, RetransmitNackedLargestObserved) { |
| 2235 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2194 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 2236 QuicPacketNumber largest_observed; | 2195 QuicPacketNumber largest_observed; |
| 2237 QuicByteCount packet_size; | 2196 QuicByteCount packet_size; |
| 2238 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 2197 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 2239 .WillOnce(DoAll(SaveArg<2>(&largest_observed), SaveArg<3>(&packet_size), | 2198 .WillOnce(DoAll(SaveArg<2>(&largest_observed), SaveArg<3>(&packet_size), |
| 2240 Return(true))); | 2199 Return(true))); |
| 2241 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 2200 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2324 // Ack the sent packet before the callback returns, which happens in | 2283 // Ack the sent packet before the callback returns, which happens in |
| 2325 // rare circumstances with write blocked sockets. | 2284 // rare circumstances with write blocked sockets. |
| 2326 QuicAckFrame ack = InitAckFrame(1); | 2285 QuicAckFrame ack = InitAckFrame(1); |
| 2327 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); | 2286 EXPECT_CALL(*send_algorithm_, OnCongestionEvent(true, _, _, _)); |
| 2328 ProcessAckPacket(&ack); | 2287 ProcessAckPacket(&ack); |
| 2329 | 2288 |
| 2330 writer_->SetWritable(); | 2289 writer_->SetWritable(); |
| 2331 connection_.OnCanWrite(); | 2290 connection_.OnCanWrite(); |
| 2332 // There is now a pending packet, but with no retransmittable frames. | 2291 // There is now a pending packet, but with no retransmittable frames. |
| 2333 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); | 2292 EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
| 2334 EXPECT_FALSE(connection_.sent_packet_manager().HasRetransmittableFrames( | 2293 EXPECT_FALSE(QuicConnectionPeer::HasRetransmittableFrames(&connection_, |
| 2335 ack.path_id, 2)); | 2294 ack.path_id, 2)); |
| 2336 } | 2295 } |
| 2337 | 2296 |
| 2338 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { | 2297 TEST_P(QuicConnectionTest, AlarmsWhenWriteBlocked) { |
| 2339 // Block the connection. | 2298 // Block the connection. |
| 2340 BlockOnNextWrite(); | 2299 BlockOnNextWrite(); |
| 2341 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); | 2300 connection_.SendStreamDataWithString(3, "foo", 0, !kFin, nullptr); |
| 2342 EXPECT_EQ(1u, writer_->packets_write_attempts()); | 2301 EXPECT_EQ(1u, writer_->packets_write_attempts()); |
| 2343 EXPECT_TRUE(writer_->IsWriteBlocked()); | 2302 EXPECT_TRUE(writer_->IsWriteBlocked()); |
| 2344 | 2303 |
| 2345 // Set the send and resumption alarms. Fire the alarms and ensure they don't | 2304 // Set the send and resumption alarms. Fire the alarms and ensure they don't |
| (...skipping 2635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4981 frame1_.data_length = data->length(); | 4940 frame1_.data_length = data->length(); |
| 4982 | 4941 |
| 4983 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_MAYBE_CORRUPTED_MEMORY, _, | 4942 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_MAYBE_CORRUPTED_MEMORY, _, |
| 4984 ConnectionCloseSource::FROM_SELF)); | 4943 ConnectionCloseSource::FROM_SELF)); |
| 4985 ProcessFramePacket(QuicFrame(&frame1_)); | 4944 ProcessFramePacket(QuicFrame(&frame1_)); |
| 4986 } | 4945 } |
| 4987 | 4946 |
| 4988 } // namespace | 4947 } // namespace |
| 4989 } // namespace test | 4948 } // namespace test |
| 4990 } // namespace net | 4949 } // namespace net |
| OLD | NEW |