| 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/core/quic_connection.h" | 5 #include "net/quic/core/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 691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 702 creator_(QuicConnectionPeer::GetPacketCreator(&connection_)), | 702 creator_(QuicConnectionPeer::GetPacketCreator(&connection_)), |
| 703 generator_(QuicConnectionPeer::GetPacketGenerator(&connection_)), | 703 generator_(QuicConnectionPeer::GetPacketGenerator(&connection_)), |
| 704 manager_(QuicConnectionPeer::GetSentPacketManager(&connection_, | 704 manager_(QuicConnectionPeer::GetSentPacketManager(&connection_, |
| 705 kDefaultPathId)), | 705 kDefaultPathId)), |
| 706 frame1_(1, false, 0, StringPiece(data1)), | 706 frame1_(1, false, 0, StringPiece(data1)), |
| 707 frame2_(1, false, 3, StringPiece(data2)), | 707 frame2_(1, false, 3, StringPiece(data2)), |
| 708 packet_number_length_(PACKET_6BYTE_PACKET_NUMBER), | 708 packet_number_length_(PACKET_6BYTE_PACKET_NUMBER), |
| 709 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { | 709 connection_id_length_(PACKET_8BYTE_CONNECTION_ID) { |
| 710 connection_.set_defer_send_in_response_to_packets(GetParam().ack_response == | 710 connection_.set_defer_send_in_response_to_packets(GetParam().ack_response == |
| 711 AckResponse::kDefer); | 711 AckResponse::kDefer); |
| 712 FLAGS_quic_always_log_bugs_for_tests = true; | |
| 713 connection_.set_visitor(&visitor_); | 712 connection_.set_visitor(&visitor_); |
| 714 connection_.SetSendAlgorithm(kDefaultPathId, send_algorithm_); | 713 connection_.SetSendAlgorithm(kDefaultPathId, send_algorithm_); |
| 715 connection_.SetLossAlgorithm(kDefaultPathId, loss_algorithm_.get()); | 714 connection_.SetLossAlgorithm(kDefaultPathId, loss_algorithm_.get()); |
| 716 framer_.set_received_entropy_calculator(&entropy_calculator_); | 715 framer_.set_received_entropy_calculator(&entropy_calculator_); |
| 717 peer_framer_.set_received_entropy_calculator(&peer_entropy_calculator_); | 716 peer_framer_.set_received_entropy_calculator(&peer_entropy_calculator_); |
| 718 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) | 717 EXPECT_CALL(*send_algorithm_, TimeUntilSend(_, _)) |
| 719 .WillRepeatedly(Return(QuicTime::Delta::Zero())); | 718 .WillRepeatedly(Return(QuicTime::Delta::Zero())); |
| 720 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 719 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| 721 .Times(AnyNumber()); | 720 .Times(AnyNumber()); |
| 722 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) | 721 EXPECT_CALL(*send_algorithm_, RetransmissionDelay()) |
| (...skipping 644 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1367 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == | 1366 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == |
| 1368 nullptr); | 1367 nullptr); |
| 1369 } | 1368 } |
| 1370 | 1369 |
| 1371 TEST_P(QuicConnectionTest, RejectUnencryptedStreamData) { | 1370 TEST_P(QuicConnectionTest, RejectUnencryptedStreamData) { |
| 1372 // Process an unencrypted packet from the non-crypto stream. | 1371 // Process an unencrypted packet from the non-crypto stream. |
| 1373 frame1_.stream_id = 3; | 1372 frame1_.stream_id = 3; |
| 1374 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 1373 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
| 1375 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA, _, | 1374 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_UNENCRYPTED_STREAM_DATA, _, |
| 1376 ConnectionCloseSource::FROM_SELF)); | 1375 ConnectionCloseSource::FROM_SELF)); |
| 1377 EXPECT_DFATAL(ProcessDataPacket(kDefaultPathId, 1, !kEntropyFlag), ""); | 1376 EXPECT_QUIC_BUG(ProcessDataPacket(kDefaultPathId, 1, !kEntropyFlag), ""); |
| 1378 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == | 1377 EXPECT_FALSE(QuicConnectionPeer::GetConnectionClosePacket(&connection_) == |
| 1379 nullptr); | 1378 nullptr); |
| 1380 const vector<QuicConnectionCloseFrame>& connection_close_frames = | 1379 const vector<QuicConnectionCloseFrame>& connection_close_frames = |
| 1381 writer_->connection_close_frames(); | 1380 writer_->connection_close_frames(); |
| 1382 EXPECT_EQ(1u, connection_close_frames.size()); | 1381 EXPECT_EQ(1u, connection_close_frames.size()); |
| 1383 EXPECT_EQ(QUIC_UNENCRYPTED_STREAM_DATA, | 1382 EXPECT_EQ(QUIC_UNENCRYPTED_STREAM_DATA, |
| 1384 connection_close_frames[0].error_code); | 1383 connection_close_frames[0].error_code); |
| 1385 } | 1384 } |
| 1386 | 1385 |
| 1387 TEST_P(QuicConnectionTest, TruncatedAck) { | 1386 TEST_P(QuicConnectionTest, TruncatedAck) { |
| (...skipping 3387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4775 // Ensure that this has caused the ACK alarm to be set. | 4774 // Ensure that this has caused the ACK alarm to be set. |
| 4776 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); | 4775 QuicAlarm* ack_alarm = QuicConnectionPeer::GetAckAlarm(&connection_); |
| 4777 EXPECT_TRUE(ack_alarm->IsSet()); | 4776 EXPECT_TRUE(ack_alarm->IsSet()); |
| 4778 } | 4777 } |
| 4779 | 4778 |
| 4780 TEST_P(QuicConnectionTest, NoDataNoFin) { | 4779 TEST_P(QuicConnectionTest, NoDataNoFin) { |
| 4781 // Make sure that a call to SendStreamWithData, with no data and no FIN, does | 4780 // Make sure that a call to SendStreamWithData, with no data and no FIN, does |
| 4782 // not result in a QuicAckNotifier being used-after-free (fail under ASAN). | 4781 // not result in a QuicAckNotifier being used-after-free (fail under ASAN). |
| 4783 // Regression test for b/18594622 | 4782 // Regression test for b/18594622 |
| 4784 scoped_refptr<MockAckListener> listener(new MockAckListener); | 4783 scoped_refptr<MockAckListener> listener(new MockAckListener); |
| 4785 EXPECT_DFATAL( | 4784 EXPECT_QUIC_BUG( |
| 4786 connection_.SendStreamDataWithString(3, "", 0, !kFin, listener.get()), | 4785 connection_.SendStreamDataWithString(3, "", 0, !kFin, listener.get()), |
| 4787 "Attempt to send empty stream frame"); | 4786 "Attempt to send empty stream frame"); |
| 4788 } | 4787 } |
| 4789 | 4788 |
| 4790 TEST_P(QuicConnectionTest, DoNotSendGoAwayTwice) { | 4789 TEST_P(QuicConnectionTest, DoNotSendGoAwayTwice) { |
| 4791 EXPECT_FALSE(connection_.goaway_sent()); | 4790 EXPECT_FALSE(connection_.goaway_sent()); |
| 4792 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 4791 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 4793 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); | 4792 connection_.SendGoAway(QUIC_PEER_GOING_AWAY, kHeadersStreamId, "Going Away."); |
| 4794 EXPECT_TRUE(connection_.goaway_sent()); | 4793 EXPECT_TRUE(connection_.goaway_sent()); |
| 4795 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); | 4794 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(0); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4834 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); | 4833 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)).Times(1); |
| 4835 connection_.SendPing(); | 4834 connection_.SendPing(); |
| 4836 EXPECT_FALSE(connection_.HasQueuedData()); | 4835 EXPECT_FALSE(connection_.HasQueuedData()); |
| 4837 } | 4836 } |
| 4838 | 4837 |
| 4839 TEST_P(QuicConnectionTest, SendingUnencryptedStreamDataFails) { | 4838 TEST_P(QuicConnectionTest, SendingUnencryptedStreamDataFails) { |
| 4840 FLAGS_quic_never_write_unencrypted_data = true; | 4839 FLAGS_quic_never_write_unencrypted_data = true; |
| 4841 EXPECT_CALL(visitor_, | 4840 EXPECT_CALL(visitor_, |
| 4842 OnConnectionClosed(QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, | 4841 OnConnectionClosed(QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, |
| 4843 _, ConnectionCloseSource::FROM_SELF)); | 4842 _, ConnectionCloseSource::FROM_SELF)); |
| 4844 EXPECT_DFATAL(connection_.SendStreamDataWithString(3, "", 0, kFin, nullptr), | 4843 EXPECT_QUIC_BUG(connection_.SendStreamDataWithString(3, "", 0, kFin, nullptr), |
| 4845 "Cannot send stream data without encryption."); | 4844 "Cannot send stream data without encryption."); |
| 4846 EXPECT_FALSE(connection_.connected()); | 4845 EXPECT_FALSE(connection_.connected()); |
| 4847 } | 4846 } |
| 4848 | 4847 |
| 4849 TEST_P(QuicConnectionTest, EnableMultipathNegotiation) { | 4848 TEST_P(QuicConnectionTest, EnableMultipathNegotiation) { |
| 4850 // Test multipath negotiation during crypto handshake. Multipath is enabled | 4849 // Test multipath negotiation during crypto handshake. Multipath is enabled |
| 4851 // when both endpoints enable multipath. | 4850 // when both endpoints enable multipath. |
| 4852 ValueRestore<bool> old_flag(&FLAGS_quic_enable_multipath, true); | 4851 ValueRestore<bool> old_flag(&FLAGS_quic_enable_multipath, true); |
| 4853 EXPECT_TRUE(connection_.connected()); | 4852 EXPECT_TRUE(connection_.connected()); |
| 4854 EXPECT_FALSE(QuicConnectionPeer::IsMultipathEnabled(&connection_)); | 4853 EXPECT_FALSE(QuicConnectionPeer::IsMultipathEnabled(&connection_)); |
| 4855 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); | 4854 EXPECT_CALL(*send_algorithm_, SetFromConfig(_, _)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 4881 | 4880 |
| 4882 TEST_P(QuicConnectionTest, BadMultipathFlag) { | 4881 TEST_P(QuicConnectionTest, BadMultipathFlag) { |
| 4883 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_BAD_MULTIPATH_FLAG, _, | 4882 EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_BAD_MULTIPATH_FLAG, _, |
| 4884 ConnectionCloseSource::FROM_SELF)); | 4883 ConnectionCloseSource::FROM_SELF)); |
| 4885 | 4884 |
| 4886 // Receieve a packet with multipath flag on when multipath is not enabled. | 4885 // Receieve a packet with multipath flag on when multipath is not enabled. |
| 4887 EXPECT_TRUE(connection_.connected()); | 4886 EXPECT_TRUE(connection_.connected()); |
| 4888 EXPECT_FALSE(QuicConnectionPeer::IsMultipathEnabled(&connection_)); | 4887 EXPECT_FALSE(QuicConnectionPeer::IsMultipathEnabled(&connection_)); |
| 4889 peer_creator_.SetCurrentPath(/*path_id=*/1u, 1u, 10u); | 4888 peer_creator_.SetCurrentPath(/*path_id=*/1u, 1u, 10u); |
| 4890 QuicStreamFrame stream_frame(1u, false, 0u, StringPiece()); | 4889 QuicStreamFrame stream_frame(1u, false, 0u, StringPiece()); |
| 4891 EXPECT_DFATAL( | 4890 EXPECT_QUIC_BUG( |
| 4892 ProcessFramePacket(QuicFrame(&stream_frame)), | 4891 ProcessFramePacket(QuicFrame(&stream_frame)), |
| 4893 "Received a packet with multipath flag but multipath is not enabled."); | 4892 "Received a packet with multipath flag but multipath is not enabled."); |
| 4894 EXPECT_FALSE(connection_.connected()); | 4893 EXPECT_FALSE(connection_.connected()); |
| 4895 } | 4894 } |
| 4896 | 4895 |
| 4897 TEST_P(QuicConnectionTest, OnPathDegrading) { | 4896 TEST_P(QuicConnectionTest, OnPathDegrading) { |
| 4898 QuicByteCount packet_size; | 4897 QuicByteCount packet_size; |
| 4899 const size_t kMinTimeoutsBeforePathDegrading = 2; | 4898 const size_t kMinTimeoutsBeforePathDegrading = 2; |
| 4900 | 4899 |
| 4901 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 4900 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5034 EXPECT_CALL(*send_algorithm_, OnApplicationLimited(_)).Times(0); | 5033 EXPECT_CALL(*send_algorithm_, OnApplicationLimited(_)).Times(0); |
| 5035 EXPECT_CALL(visitor_, WillingAndAbleToWrite()).WillRepeatedly(Return(true)); | 5034 EXPECT_CALL(visitor_, WillingAndAbleToWrite()).WillRepeatedly(Return(true)); |
| 5036 BlockOnNextWrite(); | 5035 BlockOnNextWrite(); |
| 5037 | 5036 |
| 5038 connection_.SendStreamData3(); | 5037 connection_.SendStreamData3(); |
| 5039 } | 5038 } |
| 5040 | 5039 |
| 5041 } // namespace | 5040 } // namespace |
| 5042 } // namespace test | 5041 } // namespace test |
| 5043 } // namespace net | 5042 } // namespace net |
| OLD | NEW |