Index: net/quic/test_tools/quic_test_utils.cc |
diff --git a/net/quic/test_tools/quic_test_utils.cc b/net/quic/test_tools/quic_test_utils.cc |
index c781b23c5e939b50c0f824a1d07a9b83edb9c208..df2e00725c9384eb3ebe96eb00a29982f2a4d6ec 100644 |
--- a/net/quic/test_tools/quic_test_utils.cc |
+++ b/net/quic/test_tools/quic_test_utils.cc |
@@ -4,6 +4,7 @@ |
#include "net/quic/test_tools/quic_test_utils.h" |
+#include "base/memory/singleton.h" |
#include "base/sha1.h" |
#include "base/stl_util.h" |
#include "base/strings/string_number_conversions.h" |
@@ -221,12 +222,34 @@ void MockHelper::AdvanceTime(QuicTime::Delta delta) { |
clock_.AdvanceTime(delta); |
} |
+namespace { |
+class NiceMockPacketWriterFactory |
+ : public QuicConnection::PacketWriterFactory { |
+ public: |
+ virtual ~NiceMockPacketWriterFactory() {} |
+ |
+ static NiceMockPacketWriterFactory* GetInstance() { |
+ return Singleton<NiceMockPacketWriterFactory>::get(); |
+ } |
+ |
+ virtual QuicPacketWriter* Create( |
+ QuicConnection* /*connection*/) const override { |
+ return new testing::NiceMock<MockPacketWriter>(); |
+ } |
+ |
+ private: |
+ friend struct DefaultSingletonTraits<NiceMockPacketWriterFactory>; |
+ NiceMockPacketWriterFactory() {} |
+ DISALLOW_COPY_AND_ASSIGN(NiceMockPacketWriterFactory); |
+}; |
+} // namespace |
+ |
MockConnection::MockConnection(bool is_server) |
: QuicConnection(kTestConnectionId, |
IPEndPoint(TestPeerIPAddress(), kTestPort), |
new testing::NiceMock<MockHelper>(), |
- new testing::NiceMock<MockPacketWriter>(), |
- true /* owns_writer */, |
+ *NiceMockPacketWriterFactory::GetInstance(), |
+ /* owns_writer= */ true, |
is_server, QuicSupportedVersions()), |
helper_(helper()) { |
} |
@@ -235,8 +258,8 @@ MockConnection::MockConnection(IPEndPoint address, |
bool is_server) |
: QuicConnection(kTestConnectionId, address, |
new testing::NiceMock<MockHelper>(), |
- new testing::NiceMock<MockPacketWriter>(), |
- true /* owns_writer */, |
+ *NiceMockPacketWriterFactory::GetInstance(), |
+ /* owns_writer= */ true, |
is_server, QuicSupportedVersions()), |
helper_(helper()) { |
} |
@@ -246,8 +269,8 @@ MockConnection::MockConnection(QuicConnectionId connection_id, |
: QuicConnection(connection_id, |
IPEndPoint(TestPeerIPAddress(), kTestPort), |
new testing::NiceMock<MockHelper>(), |
- new testing::NiceMock<MockPacketWriter>(), |
- true /* owns_writer */, |
+ *NiceMockPacketWriterFactory::GetInstance(), |
+ /* owns_writer= */ true, |
is_server, QuicSupportedVersions()), |
helper_(helper()) { |
} |
@@ -257,8 +280,8 @@ MockConnection::MockConnection(bool is_server, |
: QuicConnection(kTestConnectionId, |
IPEndPoint(TestPeerIPAddress(), kTestPort), |
new testing::NiceMock<MockHelper>(), |
- new testing::NiceMock<MockPacketWriter>(), |
- true /* owns_writer */, |
+ *NiceMockPacketWriterFactory::GetInstance(), |
+ /* owns_writer= */ true, |
is_server, supported_versions), |
helper_(helper()) { |
} |
@@ -606,5 +629,53 @@ QuicVersionVector SupportedVersions(QuicVersion version) { |
return versions; |
} |
+TestWriterFactory::TestWriterFactory() : current_writer_(NULL) {} |
+TestWriterFactory::~TestWriterFactory() {} |
+ |
+QuicPacketWriter* TestWriterFactory::Create(QuicServerPacketWriter* 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, |
+ QuicServerPacketWriter* 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 net |