Index: net/quic/quic_connection_test.cc |
diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc |
index b5cd7501dd22fbdac734893bd5eac3eae45e0fa4..6ad02c7fa35b4bbb3972459c0c9b95ae6778b6f2 100644 |
--- a/net/quic/quic_connection_test.cc |
+++ b/net/quic/quic_connection_test.cc |
@@ -274,6 +274,7 @@ class TestPacketWriter : public QuicPacketWriter { |
TestPacketWriter() |
: last_packet_size_(0), |
write_blocked_(false), |
+ block_next_write_(false), |
is_write_blocked_data_buffered_(false), |
is_server_(true), |
final_bytes_of_last_packet_(0), |
@@ -282,7 +283,7 @@ class TestPacketWriter : public QuicPacketWriter { |
packets_write_attempts_(0) { |
} |
- // QuicPacketWriter |
+ // QuicPacketWriter interface |
virtual WriteResult WritePacket( |
const char* buffer, size_t buf_len, |
const IPAddressNumber& self_address, |
@@ -304,6 +305,10 @@ class TestPacketWriter : public QuicPacketWriter { |
visitor_.Reset(); |
framer.set_visitor(&visitor_); |
EXPECT_TRUE(framer.ProcessPacket(packet)); |
+ if (block_next_write_) { |
+ write_blocked_ = true; |
+ block_next_write_ = false; |
+ } |
if (IsWriteBlocked()) { |
return WriteResult(WRITE_STATUS_BLOCKED, -1); |
} |
@@ -319,7 +324,7 @@ class TestPacketWriter : public QuicPacketWriter { |
virtual void SetWritable() OVERRIDE { write_blocked_ = false; } |
- void SetWriteBlocked() { write_blocked_ = true; } |
+ void BlockNextWrite() { block_next_write_ = true; } |
// Resets the visitor's state by clearing out the headers and frames. |
void Reset() { |
@@ -375,6 +380,7 @@ class TestPacketWriter : public QuicPacketWriter { |
FramerVisitorCapturingFrames visitor_; |
size_t last_packet_size_; |
bool write_blocked_; |
+ bool block_next_write_; |
bool is_write_blocked_data_buffered_; |
bool is_server_; |
uint32 final_bytes_of_last_packet_; |
@@ -824,6 +830,17 @@ class QuicConnectionTest : public ::testing::TestWithParam<bool> { |
} |
} |
+ void TriggerConnectionClose() { |
+ // Send an erroneous packet to close the connection. |
+ EXPECT_CALL(visitor_, |
+ OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false)); |
+ // Call ProcessDataPacket rather than ProcessPacket, as we should not get a |
+ // packet call to the visitor. |
+ ProcessDataPacket(6000, 0, !kEntropyFlag); |
+ EXPECT_FALSE( |
+ QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL); |
+ } |
+ |
QuicGuid guid_; |
QuicFramer framer_; |
QuicPacketCreator creator_; |
@@ -944,10 +961,13 @@ TEST_F(QuicConnectionTest, PacketsOutOfOrderWithAdditionsAndLeastAwaiting) { |
} |
TEST_F(QuicConnectionTest, RejectPacketTooFarOut) { |
+ EXPECT_CALL(visitor_, |
+ OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false)); |
// Call ProcessDataPacket rather than ProcessPacket, as we should not get a |
// packet call to the visitor. |
- EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false)); |
ProcessDataPacket(6000, 0, !kEntropyFlag); |
+ EXPECT_FALSE( |
+ QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL); |
} |
TEST_F(QuicConnectionTest, TruncatedAck) { |
@@ -1321,7 +1341,7 @@ TEST_F(QuicConnectionTest, FECQueueing) { |
connection_.options()->max_packets_per_fec_group = 2; |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
const string payload(payload_length, 'a'); |
connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL); |
EXPECT_FALSE(creator_.ShouldSendFec(true)); |
@@ -1591,7 +1611,7 @@ TEST_F(QuicConnectionTest, FramePackingSendvQueued) { |
// Try to send two stream frames in 1 packet by using writev. |
EXPECT_CALL(*send_algorithm_, OnPacketSent(_, _, _, NOT_RETRANSMISSION, _)); |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
char data[] = "ABCD"; |
IOVector data_iov; |
data_iov.AppendNoCoalesce(data, 2); |
@@ -1601,11 +1621,6 @@ TEST_F(QuicConnectionTest, FramePackingSendvQueued) { |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
EXPECT_TRUE(connection_.HasQueuedData()); |
- // Attempt to send all packets, but since we're actually still |
- // blocked, they should all remain queued. |
- EXPECT_FALSE(connection_.OnCanWrite()); |
- EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
- |
// Unblock the writes and actually send. |
writer_->SetWritable(); |
EXPECT_TRUE(connection_.OnCanWrite()); |
@@ -1715,7 +1730,7 @@ TEST_F(QuicConnectionTest, DiscardRetransmit) { |
NackPacket(2, &nack_two); |
// The first nack should trigger a fast retransmission, but we'll be |
// write blocked, so the packet will be queued. |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |
EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)); |
@@ -1765,7 +1780,7 @@ TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) { |
} |
// Block the congestion window and ensure they're queued. |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
clock_.AdvanceTime(DefaultRetransmissionTime()); |
// Only one packet should be retransmitted. |
EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true)); |
@@ -1784,9 +1799,9 @@ TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) { |
} |
TEST_F(QuicConnectionTest, WriteBlockedThenSent) { |
- writer_->SetWriteBlocked(); |
- |
+ writer_->BlockNextWrite(); |
writer_->set_is_write_blocked_data_buffered(true); |
+ |
connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
@@ -1797,7 +1812,7 @@ TEST_F(QuicConnectionTest, WriteBlockedThenSent) { |
TEST_F(QuicConnectionTest, WriteBlockedAckedThenSent) { |
EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_)); |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
writer_->set_is_write_blocked_data_buffered(true); |
connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
@@ -1818,7 +1833,7 @@ TEST_F(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) { |
connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
writer_->set_is_write_blocked_data_buffered(true); |
// Simulate the retransmission alarm firing. |
@@ -1836,16 +1851,21 @@ TEST_F(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) { |
EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet()); |
} |
-TEST_F(QuicConnectionTest, ResumptionAlarmThenWriteBlocked) { |
- // Set the send and resumption alarm, then block the connection. |
+TEST_F(QuicConnectionTest, ResumptionAlarmWhenWriteBlocked) { |
+ // Block the connection. |
+ writer_->BlockNextWrite(); |
+ connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL); |
+ EXPECT_EQ(1u, writer_->packets_write_attempts()); |
+ EXPECT_TRUE(writer_->IsWriteBlocked()); |
+ |
+ // Set the send and resumption alarms. Fire the alarms and ensure they don't |
+ // attempt to write. |
connection_.GetResumeWritesAlarm()->Set(clock_.ApproximateNow()); |
connection_.GetSendAlarm()->Set(clock_.ApproximateNow()); |
- QuicConnectionPeer::SetIsWriteBlocked(&connection_, true); |
- |
- // Fire the alarms and ensure the connection is still write blocked. |
connection_.GetResumeWritesAlarm()->Fire(); |
connection_.GetSendAlarm()->Fire(); |
- EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_)); |
+ EXPECT_TRUE(writer_->IsWriteBlocked()); |
+ EXPECT_EQ(1u, writer_->packets_write_attempts()); |
} |
TEST_F(QuicConnectionTest, LimitPacketsPerNack) { |
@@ -2240,7 +2260,7 @@ TEST_F(QuicConnectionTest, RetransmissionCountCalculation) { |
} |
TEST_F(QuicConnectionTest, SetRTOAfterWritingToSocket) { |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
// Make sure that RTO is not started when the packet is queued. |
EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet()); |
@@ -2291,15 +2311,10 @@ TEST_F(QuicConnectionTest, DelayRTOWithAckReceipt) { |
TEST_F(QuicConnectionTest, TestQueued) { |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
- // Attempt to send all packets, but since we're actually still |
- // blocked, they should all remain queued. |
- EXPECT_FALSE(connection_.OnCanWrite()); |
- EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
- |
// Unblock the writes and actually send. |
writer_->SetWritable(); |
EXPECT_TRUE(connection_.OnCanWrite()); |
@@ -2451,7 +2466,7 @@ TEST_F(QuicConnectionTest, SendSchedulerForce) { |
TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) { |
QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag); |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
EXPECT_CALL(*send_algorithm_, |
TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce( |
testing::Return(QuicTime::Delta::Zero())); |
@@ -2926,11 +2941,10 @@ TEST_F(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) { |
framer_.set_version(QuicVersionMax()); |
connection_.set_is_server(true); |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
EXPECT_EQ(0u, writer_->last_packet_size()); |
EXPECT_TRUE(connection_.HasQueuedData()); |
- EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_)); |
writer_->SetWritable(); |
connection_.OnCanWrite(); |
@@ -2971,12 +2985,11 @@ TEST_F(QuicConnectionTest, |
framer_.set_version(QuicVersionMax()); |
connection_.set_is_server(true); |
- writer_->SetWriteBlocked(); |
+ writer_->BlockNextWrite(); |
writer_->set_is_write_blocked_data_buffered(true); |
connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted); |
EXPECT_EQ(0u, writer_->last_packet_size()); |
EXPECT_FALSE(connection_.HasQueuedData()); |
- EXPECT_TRUE(QuicConnectionPeer::IsWriteBlocked(&connection_)); |
} |
TEST_F(QuicConnectionTest, ClientHandlesVersionNegotiation) { |
@@ -3206,41 +3219,32 @@ TEST_F(QuicConnectionTest, SelectMutualVersion) { |
EXPECT_FALSE(connection_.SelectMutualVersion(unsupported_version)); |
} |
-TEST_F(QuicConnectionTest, ConnectionCloseWhenNotWriteBlocked) { |
- writer_->SetWritable(); // Already default. |
+TEST_F(QuicConnectionTest, ConnectionCloseWhenWritable) { |
+ EXPECT_FALSE(writer_->IsWriteBlocked()); |
- // Send a packet (but write will not block). |
+ // Send a packet. |
connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
EXPECT_EQ(1u, writer_->packets_write_attempts()); |
- // Send an erroneous packet to close the connection. |
- EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false)); |
- ProcessDataPacket(6000, 0, !kEntropyFlag); |
+ TriggerConnectionClose(); |
EXPECT_EQ(2u, writer_->packets_write_attempts()); |
} |
-TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) { |
- EXPECT_EQ(0u, connection_.NumQueuedPackets()); |
- writer_->SetWriteBlocked(); |
+TEST_F(QuicConnectionTest, ConnectionCloseGettingWriteBlocked) { |
+ writer_->BlockNextWrite(); |
+ TriggerConnectionClose(); |
+ EXPECT_EQ(1u, writer_->packets_write_attempts()); |
+ EXPECT_TRUE(writer_->IsWriteBlocked()); |
+} |
- // Send a packet to so that write will really block. |
+TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) { |
+ writer_->BlockNextWrite(); |
connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL); |
EXPECT_EQ(1u, connection_.NumQueuedPackets()); |
EXPECT_EQ(1u, writer_->packets_write_attempts()); |
- |
- // Send an erroneous packet to close the connection. |
- EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false)); |
- ProcessDataPacket(6000, 0, !kEntropyFlag); |
- EXPECT_EQ(1u, writer_->packets_write_attempts()); |
-} |
- |
-TEST_F(QuicConnectionTest, ConnectionCloseWhenNothingPending) { |
- writer_->SetWriteBlocked(); |
- |
- // Send an erroneous packet to close the connection. |
- EXPECT_CALL(visitor_, OnConnectionClosed(QUIC_INVALID_PACKET_HEADER, false)); |
- ProcessDataPacket(6000, 0, !kEntropyFlag); |
+ EXPECT_TRUE(writer_->IsWriteBlocked()); |
+ TriggerConnectionClose(); |
EXPECT_EQ(1u, writer_->packets_write_attempts()); |
} |
@@ -3249,7 +3253,7 @@ TEST_F(QuicConnectionTest, AckNotifierTriggerCallback) { |
// Create a delegate which we expect to be called. |
scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
- EXPECT_CALL(*delegate, OnAckNotification()).Times(1);; |
+ EXPECT_CALL(*delegate, OnAckNotification()).Times(1); |
// Send some data, which will register the delegate to be notified. |
connection_.SendStreamDataWithString(1, "foo", 0, !kFin, delegate.get()); |
@@ -3327,7 +3331,7 @@ TEST_F(QuicConnectionTest, AckNotifierCallbackAfterFECRecovery) { |
// Create a delegate which we expect to be called. |
scoped_refptr<MockAckNotifierDelegate> delegate(new MockAckNotifierDelegate); |
- EXPECT_CALL(*delegate, OnAckNotification()).Times(1);; |
+ EXPECT_CALL(*delegate, OnAckNotification()).Times(1); |
// Expect ACKs for 1 packet. |
EXPECT_CALL(*send_algorithm_, UpdateRtt(_)); |