| Index: net/quic/quic_connection_test.cc
 | 
| diff --git a/net/quic/quic_connection_test.cc b/net/quic/quic_connection_test.cc
 | 
| index e2b0fef2335c94745d453285f3a6b8a96b5c8bbf..48aedd6dcb521e50b7d0e46e7b20e4782b9e20b9 100644
 | 
| --- a/net/quic/quic_connection_test.cc
 | 
| +++ b/net/quic/quic_connection_test.cc
 | 
| @@ -31,6 +31,7 @@ using std::map;
 | 
|  using std::vector;
 | 
|  using testing::_;
 | 
|  using testing::AnyNumber;
 | 
| +using testing::AtLeast;
 | 
|  using testing::ContainerEq;
 | 
|  using testing::Contains;
 | 
|  using testing::DoAll;
 | 
| @@ -274,7 +275,7 @@ class TestPacketWriter : public QuicPacketWriter {
 | 
|    TestPacketWriter()
 | 
|        : last_packet_size_(0),
 | 
|          write_blocked_(false),
 | 
| -        block_next_write_(false),
 | 
| +        block_on_next_write_(false),
 | 
|          is_write_blocked_data_buffered_(false),
 | 
|          is_server_(true),
 | 
|          final_bytes_of_last_packet_(0),
 | 
| @@ -287,8 +288,7 @@ class TestPacketWriter : public QuicPacketWriter {
 | 
|    virtual WriteResult WritePacket(
 | 
|        const char* buffer, size_t buf_len,
 | 
|        const IPAddressNumber& self_address,
 | 
| -      const IPEndPoint& peer_address,
 | 
| -      QuicBlockedWriterInterface* blocked_writer) OVERRIDE {
 | 
| +      const IPEndPoint& peer_address) OVERRIDE {
 | 
|      QuicEncryptedPacket packet(buffer, buf_len);
 | 
|      ++packets_write_attempts_;
 | 
|  
 | 
| @@ -305,9 +305,9 @@ class TestPacketWriter : public QuicPacketWriter {
 | 
|      visitor_.Reset();
 | 
|      framer.set_visitor(&visitor_);
 | 
|      EXPECT_TRUE(framer.ProcessPacket(packet));
 | 
| -    if (block_next_write_) {
 | 
| +    if (block_on_next_write_) {
 | 
|        write_blocked_ = true;
 | 
| -      block_next_write_ = false;
 | 
| +      block_on_next_write_ = false;
 | 
|      }
 | 
|      if (IsWriteBlocked()) {
 | 
|        return WriteResult(WRITE_STATUS_BLOCKED, -1);
 | 
| @@ -324,7 +324,7 @@ class TestPacketWriter : public QuicPacketWriter {
 | 
|  
 | 
|    virtual void SetWritable() OVERRIDE { write_blocked_ = false; }
 | 
|  
 | 
| -  void BlockNextWrite() { block_next_write_ = true; }
 | 
| +  void BlockOnNextWrite() { block_on_next_write_ = true; }
 | 
|  
 | 
|    // Resets the visitor's state by clearing out the headers and frames.
 | 
|    void Reset() {
 | 
| @@ -380,7 +380,7 @@ class TestPacketWriter : public QuicPacketWriter {
 | 
|    FramerVisitorCapturingFrames visitor_;
 | 
|    size_t last_packet_size_;
 | 
|    bool write_blocked_;
 | 
| -  bool block_next_write_;
 | 
| +  bool block_on_next_write_;
 | 
|    bool is_write_blocked_data_buffered_;
 | 
|    bool is_server_;
 | 
|    uint32 final_bytes_of_last_packet_;
 | 
| @@ -472,7 +472,7 @@ class TestConnection : public QuicConnection {
 | 
|    }
 | 
|  
 | 
|    void set_version(QuicVersion version) {
 | 
| -    framer_.set_version(version);
 | 
| +    QuicConnectionPeer::GetFramer(this)->set_version(version);
 | 
|    }
 | 
|  
 | 
|    void set_is_server(bool is_server) {
 | 
| @@ -841,6 +841,11 @@ class QuicConnectionTest : public ::testing::TestWithParam<bool> {
 | 
|          QuicConnectionPeer::GetConnectionClosePacket(&connection_) == NULL);
 | 
|    }
 | 
|  
 | 
| +  void BlockOnNextWrite() {
 | 
| +    writer_->BlockOnNextWrite();
 | 
| +    EXPECT_CALL(visitor_, OnWriteBlocked()).Times(AtLeast(1));
 | 
| +  }
 | 
| +
 | 
|    QuicGuid guid_;
 | 
|    QuicFramer framer_;
 | 
|    QuicPacketCreator creator_;
 | 
| @@ -1104,8 +1109,9 @@ TEST_F(QuicConnectionTest, LeastUnackedLower) {
 | 
|    // This should be fine.
 | 
|    creator_.set_sequence_number(1);
 | 
|    QuicAckFrame frame2 = InitAckFrame(0, 1);
 | 
| -  // The scheduler will not process out of order acks.
 | 
| -  EXPECT_CALL(visitor_, OnCanWrite()).Times(0);
 | 
| +  // The scheduler will not process out of order acks, but all packet processing
 | 
| +  // causes the connection to try to write.
 | 
| +  EXPECT_CALL(visitor_, OnCanWrite()).Times(1);
 | 
|    ProcessAckPacket(&frame2);
 | 
|  
 | 
|    // Now claim it's one, but set the ordering so it was sent "after" the first
 | 
| @@ -1257,8 +1263,6 @@ TEST_F(QuicConnectionTest, SendingDifferentSequenceNumberLengthsUnackedDelta) {
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, BasicSending) {
 | 
|    EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
 | 
| -//  EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
 | 
| -//  EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _)).Times(6);
 | 
|    QuicPacketSequenceNumber last_packet;
 | 
|    SendStreamDataToPeer(1, "foo", 0, !kFin, &last_packet);  // Packet 1
 | 
|    EXPECT_EQ(1u, last_packet);
 | 
| @@ -1340,7 +1344,7 @@ TEST_F(QuicConnectionTest, FECQueueing) {
 | 
|    connection_.options()->max_packets_per_fec_group = 2;
 | 
|  
 | 
|    EXPECT_EQ(0u, connection_.NumQueuedPackets());
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    const string payload(payload_length, 'a');
 | 
|    connection_.SendStreamDataWithString(1, payload, 0, !kFin, NULL);
 | 
|    EXPECT_FALSE(creator_.ShouldSendFec(true));
 | 
| @@ -1610,7 +1614,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_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    char data[] = "ABCD";
 | 
|    IOVector data_iov;
 | 
|    data_iov.AppendNoCoalesce(data, 2);
 | 
| @@ -1729,10 +1733,9 @@ 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_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    EXPECT_CALL(*send_algorithm_, UpdateRtt(_));
 | 
|    EXPECT_CALL(*send_algorithm_, OnPacketAcked(_, _));
 | 
| -
 | 
|    ProcessAckPacket(&nack_two);
 | 
|    EXPECT_EQ(1u, connection_.NumQueuedPackets());
 | 
|  
 | 
| @@ -1779,7 +1782,7 @@ TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) {
 | 
|    }
 | 
|  
 | 
|    // Block the congestion window and ensure they're queued.
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    clock_.AdvanceTime(DefaultRetransmissionTime());
 | 
|    // Only one packet should be retransmitted.
 | 
|    EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(true));
 | 
| @@ -1798,9 +1801,8 @@ TEST_F(QuicConnectionTest, QueueAfterTwoRTOs) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, WriteBlockedThenSent) {
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    writer_->set_is_write_blocked_data_buffered(true);
 | 
| -
 | 
|    connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
 | 
|    EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
 | 
|  
 | 
| @@ -1811,8 +1813,7 @@ TEST_F(QuicConnectionTest, WriteBlockedThenSent) {
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, WriteBlockedAckedThenSent) {
 | 
|    EXPECT_CALL(visitor_, OnSuccessfulVersionNegotiation(_));
 | 
| -  writer_->BlockNextWrite();
 | 
| -
 | 
| +  BlockOnNextWrite();
 | 
|    writer_->set_is_write_blocked_data_buffered(true);
 | 
|    connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
 | 
|    EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
 | 
| @@ -1832,9 +1833,8 @@ TEST_F(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) {
 | 
|    connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
 | 
|    EXPECT_TRUE(connection_.GetRetransmissionAlarm()->IsSet());
 | 
|  
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    writer_->set_is_write_blocked_data_buffered(true);
 | 
| -
 | 
|    // Simulate the retransmission alarm firing.
 | 
|    EXPECT_CALL(*send_algorithm_, OnRetransmissionTimeout(_));
 | 
|    clock_.AdvanceTime(DefaultRetransmissionTime());
 | 
| @@ -1852,7 +1852,7 @@ TEST_F(QuicConnectionTest, RetransmitWriteBlockedAckedOriginalThenSent) {
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, ResumptionAlarmWhenWriteBlocked) {
 | 
|    // Block the connection.
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    connection_.SendStreamDataWithString(3, "foo", 0, !kFin, NULL);
 | 
|    EXPECT_EQ(1u, writer_->packets_write_attempts());
 | 
|    EXPECT_TRUE(writer_->IsWriteBlocked());
 | 
| @@ -2255,7 +2255,7 @@ TEST_F(QuicConnectionTest, RetransmissionCountCalculation) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, SetRTOAfterWritingToSocket) {
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
 | 
|    // Make sure that RTO is not started when the packet is queued.
 | 
|    EXPECT_FALSE(connection_.GetRetransmissionAlarm()->IsSet());
 | 
| @@ -2306,7 +2306,7 @@ TEST_F(QuicConnectionTest, DelayRTOWithAckReceipt) {
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, TestQueued) {
 | 
|    EXPECT_EQ(0u, connection_.NumQueuedPackets());
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
 | 
|    EXPECT_EQ(1u, connection_.NumQueuedPackets());
 | 
|  
 | 
| @@ -2461,7 +2461,7 @@ TEST_F(QuicConnectionTest, SendSchedulerForce) {
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, SendSchedulerEAGAIN) {
 | 
|    QuicPacket* packet = ConstructDataPacket(1, 0, !kEntropyFlag);
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    EXPECT_CALL(*send_algorithm_,
 | 
|                TimeUntilSend(_, NOT_RETRANSMISSION, _, _)).WillOnce(
 | 
|                    testing::Return(QuicTime::Delta::Zero()));
 | 
| @@ -2936,7 +2936,7 @@ TEST_F(QuicConnectionTest, ServerSendsVersionNegotiationPacketSocketBlocked) {
 | 
|  
 | 
|    framer_.set_version(QuicVersionMax());
 | 
|    connection_.set_is_server(true);
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
 | 
|    EXPECT_EQ(0u, writer_->last_packet_size());
 | 
|    EXPECT_TRUE(connection_.HasQueuedData());
 | 
| @@ -2980,7 +2980,7 @@ TEST_F(QuicConnectionTest,
 | 
|  
 | 
|    framer_.set_version(QuicVersionMax());
 | 
|    connection_.set_is_server(true);
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    writer_->set_is_write_blocked_data_buffered(true);
 | 
|    connection_.ProcessUdpPacket(IPEndPoint(), IPEndPoint(), *encrypted);
 | 
|    EXPECT_EQ(0u, writer_->last_packet_size());
 | 
| @@ -3258,14 +3258,14 @@ TEST_F(QuicConnectionTest, ConnectionCloseWhenWritable) {
 | 
|  }
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, ConnectionCloseGettingWriteBlocked) {
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    TriggerConnectionClose();
 | 
|    EXPECT_EQ(1u, writer_->packets_write_attempts());
 | 
|    EXPECT_TRUE(writer_->IsWriteBlocked());
 | 
|  }
 | 
|  
 | 
|  TEST_F(QuicConnectionTest, ConnectionCloseWhenWriteBlocked) {
 | 
| -  writer_->BlockNextWrite();
 | 
| +  BlockOnNextWrite();
 | 
|    connection_.SendStreamDataWithString(1, "foo", 0, !kFin, NULL);
 | 
|    EXPECT_EQ(1u, connection_.NumQueuedPackets());
 | 
|    EXPECT_EQ(1u, writer_->packets_write_attempts());
 | 
| 
 |