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/stl_util.h" | 10 #include "base/stl_util.h" |
10 #include "net/base/net_errors.h" | 11 #include "net/base/net_errors.h" |
11 #include "net/quic/congestion_control/loss_detection_interface.h" | 12 #include "net/quic/congestion_control/loss_detection_interface.h" |
12 #include "net/quic/congestion_control/send_algorithm_interface.h" | 13 #include "net/quic/congestion_control/send_algorithm_interface.h" |
13 #include "net/quic/crypto/null_encrypter.h" | 14 #include "net/quic/crypto/null_encrypter.h" |
14 #include "net/quic/crypto/quic_decrypter.h" | 15 #include "net/quic/crypto/quic_decrypter.h" |
15 #include "net/quic/crypto/quic_encrypter.h" | 16 #include "net/quic/crypto/quic_encrypter.h" |
16 #include "net/quic/quic_ack_notifier.h" | 17 #include "net/quic/quic_ack_notifier.h" |
17 #include "net/quic/quic_flags.h" | 18 #include "net/quic/quic_flags.h" |
18 #include "net/quic/quic_protocol.h" | 19 #include "net/quic/quic_protocol.h" |
(...skipping 1553 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1572 SendAckPacketToPeer(); // Packet 7 | 1573 SendAckPacketToPeer(); // Packet 7 |
1573 EXPECT_EQ(7u, least_unacked()); | 1574 EXPECT_EQ(7u, least_unacked()); |
1574 | 1575 |
1575 // But if we send more data it should. | 1576 // But if we send more data it should. |
1576 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 8 | 1577 SendStreamDataToPeer(1, "eep", 6, !kFin, &last_packet); // Packet 8 |
1577 EXPECT_EQ(8u, last_packet); | 1578 EXPECT_EQ(8u, last_packet); |
1578 SendAckPacketToPeer(); // Packet 9 | 1579 SendAckPacketToPeer(); // Packet 9 |
1579 EXPECT_EQ(7u, least_unacked()); | 1580 EXPECT_EQ(7u, least_unacked()); |
1580 } | 1581 } |
1581 | 1582 |
1582 // If FLAGS_quic_record_send_time_before_write is disabled, QuicConnection | 1583 // QuicConnection should record the the packet sent-time prior to sending the |
1583 // should record the packet sen-tdime after the packet is sent. | 1584 // packet. |
1584 TEST_P(QuicConnectionTest, RecordSentTimeAfterPacketSent) { | 1585 TEST_P(QuicConnectionTest, RecordSentTimeBeforePacketSent) { |
1585 ValueRestore<bool> old_flag(&FLAGS_quic_record_send_time_before_write, false); | |
1586 // We're using a MockClock for the tests, so we have complete control over the | 1586 // We're using a MockClock for the tests, so we have complete control over the |
1587 // time. | 1587 // time. |
1588 // Our recorded timestamp for the last packet sent time will be passed in to | 1588 // Our recorded timestamp for the last packet sent time will be passed in to |
1589 // the send_algorithm. Make sure that it is set to the correct value. | |
1590 QuicTime actual_recorded_send_time = QuicTime::Zero(); | |
1591 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | |
1592 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true))); | |
1593 | |
1594 // First send without any pause and check the result. | |
1595 QuicTime expected_recorded_send_time = clock_.Now(); | |
1596 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | |
1597 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time) | |
1598 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue() | |
1599 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue(); | |
1600 | |
1601 // Now pause during the write, and check the results. | |
1602 actual_recorded_send_time = QuicTime::Zero(); | |
1603 const QuicTime::Delta kWritePauseTimeDelta = | |
1604 QuicTime::Delta::FromMilliseconds(5000); | |
1605 SetWritePauseTimeDelta(kWritePauseTimeDelta); | |
1606 expected_recorded_send_time = clock_.Now().Add(kWritePauseTimeDelta); | |
1607 | |
1608 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | |
1609 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true))); | |
1610 connection_.SendStreamDataWithString(2, "baz", 0, !kFin, nullptr); | |
1611 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time) | |
1612 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue() | |
1613 << ". Actual time = " << actual_recorded_send_time.ToDebuggingValue(); | |
1614 } | |
1615 | |
1616 // If FLAGS_quic_record_send_time_before_write is enabled, QuicConnection should | |
1617 // record the the packet sent-time prior to sending the packet. | |
1618 TEST_P(QuicConnectionTest, RecordSentTimeBeforePacketSent) { | |
1619 ValueRestore<bool> old_flag(&FLAGS_quic_record_send_time_before_write, true); | |
1620 // We're using a MockClock for the tests, so we have complete control over the | |
1621 // time. | |
1622 // Our recorded timestamp for the last packet sent time will be passed in to | |
1623 // the send_algorithm. Make sure that it is set to the correct value. | 1589 // the send_algorithm. Make sure that it is set to the correct value. |
1624 QuicTime actual_recorded_send_time = QuicTime::Zero(); | 1590 QuicTime actual_recorded_send_time = QuicTime::Zero(); |
1625 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) | 1591 EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, _, _)) |
1626 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true))); | 1592 .WillOnce(DoAll(SaveArg<0>(&actual_recorded_send_time), Return(true))); |
1627 | 1593 |
1628 // First send without any pause and check the result. | 1594 // First send without any pause and check the result. |
1629 QuicTime expected_recorded_send_time = clock_.Now(); | 1595 QuicTime expected_recorded_send_time = clock_.Now(); |
1630 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); | 1596 connection_.SendStreamDataWithString(1, "foo", 0, !kFin, nullptr); |
1631 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time) | 1597 EXPECT_EQ(expected_recorded_send_time, actual_recorded_send_time) |
1632 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue() | 1598 << "Expected time = " << expected_recorded_send_time.ToDebuggingValue() |
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2523 // Don't send missing packet 1. | 2489 // Don't send missing packet 1. |
2524 ProcessFecPacket(2, 1, true, !kEntropyFlag, nullptr); | 2490 ProcessFecPacket(2, 1, true, !kEntropyFlag, nullptr); |
2525 // Entropy flag should be false, so entropy should be 0. | 2491 // Entropy flag should be false, so entropy should be 0. |
2526 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); | 2492 EXPECT_EQ(0u, QuicConnectionPeer::ReceivedEntropyHash(&connection_, 2)); |
2527 } | 2493 } |
2528 | 2494 |
2529 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) { | 2495 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingSeqNumLengths) { |
2530 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2496 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2531 | 2497 |
2532 // Set up a debug visitor to the connection. | 2498 // Set up a debug visitor to the connection. |
2533 FecQuicConnectionDebugVisitor* fec_visitor = | 2499 scoped_ptr<FecQuicConnectionDebugVisitor> fec_visitor( |
2534 new FecQuicConnectionDebugVisitor(); | 2500 new FecQuicConnectionDebugVisitor()); |
2535 connection_.set_debug_visitor(fec_visitor); | 2501 connection_.set_debug_visitor(fec_visitor.get()); |
2536 | 2502 |
2537 QuicPacketSequenceNumber fec_packet = 0; | 2503 QuicPacketSequenceNumber fec_packet = 0; |
2538 QuicSequenceNumberLength lengths[] = {PACKET_6BYTE_SEQUENCE_NUMBER, | 2504 QuicSequenceNumberLength lengths[] = {PACKET_6BYTE_SEQUENCE_NUMBER, |
2539 PACKET_4BYTE_SEQUENCE_NUMBER, | 2505 PACKET_4BYTE_SEQUENCE_NUMBER, |
2540 PACKET_2BYTE_SEQUENCE_NUMBER, | 2506 PACKET_2BYTE_SEQUENCE_NUMBER, |
2541 PACKET_1BYTE_SEQUENCE_NUMBER}; | 2507 PACKET_1BYTE_SEQUENCE_NUMBER}; |
2542 // For each sequence number length size, revive a packet and check sequence | 2508 // For each sequence number length size, revive a packet and check sequence |
2543 // number length in the revived packet. | 2509 // number length in the revived packet. |
2544 for (size_t i = 0; i < arraysize(lengths); ++i) { | 2510 for (size_t i = 0; i < arraysize(lengths); ++i) { |
2545 // Set sequence_number_length_ (for data and FEC packets). | 2511 // Set sequence_number_length_ (for data and FEC packets). |
2546 sequence_number_length_ = lengths[i]; | 2512 sequence_number_length_ = lengths[i]; |
2547 fec_packet += 2; | 2513 fec_packet += 2; |
2548 // Don't send missing packet, but send fec packet right after it. | 2514 // Don't send missing packet, but send fec packet right after it. |
2549 ProcessFecPacket(fec_packet, fec_packet - 1, true, !kEntropyFlag, nullptr); | 2515 ProcessFecPacket(fec_packet, fec_packet - 1, true, !kEntropyFlag, nullptr); |
2550 // Sequence number length in the revived header should be the same as | 2516 // Sequence number length in the revived header should be the same as |
2551 // in the original data/fec packet headers. | 2517 // in the original data/fec packet headers. |
2552 EXPECT_EQ(sequence_number_length_, fec_visitor->revived_header(). | 2518 EXPECT_EQ(sequence_number_length_, fec_visitor->revived_header(). |
2553 public_header.sequence_number_length); | 2519 public_header.sequence_number_length); |
2554 } | 2520 } |
2555 } | 2521 } |
2556 | 2522 |
2557 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) { | 2523 TEST_P(QuicConnectionTest, ReviveMissingPacketWithVaryingConnectionIdLengths) { |
2558 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); | 2524 EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
2559 | 2525 |
2560 // Set up a debug visitor to the connection. | 2526 // Set up a debug visitor to the connection. |
2561 FecQuicConnectionDebugVisitor* fec_visitor = | 2527 scoped_ptr<FecQuicConnectionDebugVisitor> fec_visitor( |
2562 new FecQuicConnectionDebugVisitor(); | 2528 new FecQuicConnectionDebugVisitor()); |
2563 connection_.set_debug_visitor(fec_visitor); | 2529 connection_.set_debug_visitor(fec_visitor.get()); |
2564 | 2530 |
2565 QuicPacketSequenceNumber fec_packet = 0; | 2531 QuicPacketSequenceNumber fec_packet = 0; |
2566 QuicConnectionIdLength lengths[] = {PACKET_8BYTE_CONNECTION_ID, | 2532 QuicConnectionIdLength lengths[] = {PACKET_8BYTE_CONNECTION_ID, |
2567 PACKET_4BYTE_CONNECTION_ID, | 2533 PACKET_4BYTE_CONNECTION_ID, |
2568 PACKET_1BYTE_CONNECTION_ID, | 2534 PACKET_1BYTE_CONNECTION_ID, |
2569 PACKET_0BYTE_CONNECTION_ID}; | 2535 PACKET_0BYTE_CONNECTION_ID}; |
2570 // For each connection id length size, revive a packet and check connection | 2536 // For each connection id length size, revive a packet and check connection |
2571 // id length in the revived packet. | 2537 // id length in the revived packet. |
2572 for (size_t i = 0; i < arraysize(lengths); ++i) { | 2538 for (size_t i = 0; i < arraysize(lengths); ++i) { |
2573 // Set connection id length (for data and FEC packets). | 2539 // Set connection id length (for data and FEC packets). |
(...skipping 1787 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4361 MOCK_METHOD1(OnVersionNegotiationPacket, | 4327 MOCK_METHOD1(OnVersionNegotiationPacket, |
4362 void(const QuicVersionNegotiationPacket&)); | 4328 void(const QuicVersionNegotiationPacket&)); |
4363 | 4329 |
4364 MOCK_METHOD2(OnRevivedPacket, | 4330 MOCK_METHOD2(OnRevivedPacket, |
4365 void(const QuicPacketHeader&, StringPiece payload)); | 4331 void(const QuicPacketHeader&, StringPiece payload)); |
4366 }; | 4332 }; |
4367 | 4333 |
4368 TEST_P(QuicConnectionTest, OnPacketHeaderDebugVisitor) { | 4334 TEST_P(QuicConnectionTest, OnPacketHeaderDebugVisitor) { |
4369 QuicPacketHeader header; | 4335 QuicPacketHeader header; |
4370 | 4336 |
4371 MockQuicConnectionDebugVisitor* debug_visitor = | 4337 scoped_ptr<MockQuicConnectionDebugVisitor> debug_visitor( |
4372 new MockQuicConnectionDebugVisitor(); | 4338 new MockQuicConnectionDebugVisitor()); |
4373 connection_.set_debug_visitor(debug_visitor); | 4339 connection_.set_debug_visitor(debug_visitor.get()); |
4374 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); | 4340 EXPECT_CALL(*debug_visitor, OnPacketHeader(Ref(header))).Times(1); |
4375 connection_.OnPacketHeader(header); | 4341 connection_.OnPacketHeader(header); |
4376 } | 4342 } |
4377 | 4343 |
4378 TEST_P(QuicConnectionTest, Pacing) { | 4344 TEST_P(QuicConnectionTest, Pacing) { |
4379 TestConnection server(connection_id_, IPEndPoint(), helper_.get(), | 4345 TestConnection server(connection_id_, IPEndPoint(), helper_.get(), |
4380 factory_, /* is_server= */ true, version()); | 4346 factory_, /* is_server= */ true, version()); |
4381 TestConnection client(connection_id_, IPEndPoint(), helper_.get(), | 4347 TestConnection client(connection_id_, IPEndPoint(), helper_.get(), |
4382 factory_, /* is_server= */ false, version()); | 4348 factory_, /* is_server= */ false, version()); |
4383 EXPECT_FALSE(client.sent_packet_manager().using_pacing()); | 4349 EXPECT_FALSE(client.sent_packet_manager().using_pacing()); |
(...skipping 29 matching lines...) Expand all Loading... |
4413 // Regression test for b/18594622 | 4379 // Regression test for b/18594622 |
4414 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); | 4380 scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
4415 EXPECT_DFATAL( | 4381 EXPECT_DFATAL( |
4416 connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), | 4382 connection_.SendStreamDataWithString(3, "", 0, !kFin, delegate.get()), |
4417 "Attempt to send empty stream frame"); | 4383 "Attempt to send empty stream frame"); |
4418 } | 4384 } |
4419 | 4385 |
4420 } // namespace | 4386 } // namespace |
4421 } // namespace test | 4387 } // namespace test |
4422 } // namespace net | 4388 } // namespace net |
OLD | NEW |