Index: net/tools/quic/test_tools/quic_test_utils.cc |
diff --git a/net/tools/quic/test_tools/quic_test_utils.cc b/net/tools/quic/test_tools/quic_test_utils.cc |
index 255fbc0a3c12ac141385365230e56ab8dded92a1..5b0f56c0dc1876662cf87960dabd89891ffaabd1 100644 |
--- a/net/tools/quic/test_tools/quic_test_utils.cc |
+++ b/net/tools/quic/test_tools/quic_test_utils.cc |
@@ -18,12 +18,25 @@ namespace net { |
namespace tools { |
namespace test { |
+namespace { |
+class NiceMockPacketWriterFactory |
+ : public QuicConnection::PacketWriterFactory { |
+ public: |
+ virtual ~NiceMockPacketWriterFactory() {} |
+ |
+ virtual QuicPacketWriter* Create( |
+ QuicConnection* /*connection*/) const override { |
+ return new testing::NiceMock<MockPacketWriter>(); |
+ } |
+}; |
+} // namespace |
+ |
MockConnection::MockConnection(bool is_server) |
: QuicConnection(kTestConnectionId, |
IPEndPoint(net::test::Loopback4(), kTestPort), |
new testing::NiceMock<MockHelper>(), |
- new testing::NiceMock<MockPacketWriter>(), |
- true /* owns_writer */, |
+ NiceMockPacketWriterFactory(), |
+ /* owns_writer= */ true, |
is_server, QuicSupportedVersions()), |
helper_(helper()) { |
} |
@@ -32,8 +45,8 @@ MockConnection::MockConnection(IPEndPoint address, |
bool is_server) |
: QuicConnection(kTestConnectionId, address, |
new testing::NiceMock<MockHelper>(), |
- new testing::NiceMock<MockPacketWriter>(), |
- true /* owns_writer */, |
+ NiceMockPacketWriterFactory(), |
+ /* owns_writer= */ true, |
is_server, QuicSupportedVersions()), |
helper_(helper()) { |
} |
@@ -43,8 +56,8 @@ MockConnection::MockConnection(QuicConnectionId connection_id, |
: QuicConnection(connection_id, |
IPEndPoint(net::test::Loopback4(), kTestPort), |
new testing::NiceMock<MockHelper>(), |
- new testing::NiceMock<MockPacketWriter>(), |
- true /* owns_writer */, |
+ NiceMockPacketWriterFactory(), |
+ /* owns_writer= */ true, |
is_server, QuicSupportedVersions()), |
helper_(helper()) { |
} |
@@ -54,8 +67,8 @@ MockConnection::MockConnection(bool is_server, |
: QuicConnection(kTestConnectionId, |
IPEndPoint(net::test::Loopback4(), kTestPort), |
new testing::NiceMock<MockHelper>(), |
- new testing::NiceMock<MockPacketWriter>(), |
- true /* owns_writer */, |
+ NiceMockPacketWriterFactory(), |
+ /* owns_writer= */ true, |
is_server, QuicSupportedVersions()), |
helper_(helper()) { |
} |
@@ -112,6 +125,54 @@ MockAckNotifierDelegate::MockAckNotifierDelegate() { |
MockAckNotifierDelegate::~MockAckNotifierDelegate() { |
} |
+TestWriterFactory::TestWriterFactory() : current_writer_(NULL) {} |
+TestWriterFactory::~TestWriterFactory() {} |
+ |
+QuicPacketWriter* TestWriterFactory::Create(QuicPacketWriter* writer, |
+ QuicConnection* connection) { |
+ return new PerConnectionPacketWriter(this, writer, connection); |
+} |
+ |
+void TestWriterFactory::OnPacketSent(WriteResult result) { |
+ if (current_writer_ != NULL) { |
+ current_writer_->connection()->OnPacketSent(result); |
+ current_writer_ = NULL; |
+ } |
+} |
+ |
+void TestWriterFactory::Unregister(PerConnectionPacketWriter* writer) { |
+ if (current_writer_ == writer) { |
+ current_writer_ = NULL; |
+ } |
+} |
+ |
+TestWriterFactory::PerConnectionPacketWriter::PerConnectionPacketWriter( |
+ TestWriterFactory* factory, |
+ QuicPacketWriter* writer, |
+ QuicConnection* connection) |
+ : QuicPerConnectionPacketWriter(writer, connection), |
+ factory_(factory) { |
+} |
+ |
+TestWriterFactory::PerConnectionPacketWriter::~PerConnectionPacketWriter() { |
+ factory_->Unregister(this); |
+} |
+ |
+WriteResult TestWriterFactory::PerConnectionPacketWriter::WritePacket( |
+ const char* buffer, |
+ size_t buf_len, |
+ const IPAddressNumber& self_address, |
+ const IPEndPoint& peer_address) { |
+ // A DCHECK(factory_current_writer_ == NULL) would be wrong here -- this class |
+ // may be used in a setting where connection()->OnPacketSent() is called in a |
+ // different way, so TestWriterFactory::OnPacketSent might never be called. |
+ factory_->current_writer_ = this; |
+ return QuicPerConnectionPacketWriter::WritePacket(buffer, |
+ buf_len, |
+ self_address, |
+ peer_address); |
+} |
+ |
} // namespace test |
} // namespace tools |
} // namespace net |