Index: jingle/glue/pseudotcp_adapter_unittest.cc |
diff --git a/jingle/glue/pseudotcp_adapter_unittest.cc b/jingle/glue/pseudotcp_adapter_unittest.cc |
index 977c0ac61d6602ecc4777334fd8a96d6298b24f9..14bc0d2f68b9de87312d46b5b832689d75856714 100644 |
--- a/jingle/glue/pseudotcp_adapter_unittest.cc |
+++ b/jingle/glue/pseudotcp_adapter_unittest.cc |
@@ -307,6 +307,35 @@ TEST_F(P2PTransportImplTest, TestLossyChannel) { |
tester->CheckResults(); |
} |
+class DeleteOnConnected { |
+ public: |
+ DeleteOnConnected(MessageLoop* message_loop, |
+ scoped_ptr<PseudoTcpAdapter>* adapter) |
+ : message_loop_(message_loop), adapter_(adapter) {} |
+ void OnConnected(int error) { |
+ adapter_->reset(); |
+ message_loop_->PostTask(FROM_HERE, new MessageLoop::QuitTask()); |
+ } |
+ MessageLoop* message_loop_; |
+ scoped_ptr<PseudoTcpAdapter>* adapter_; |
+}; |
+ |
+TEST_F(P2PTransportImplTest, TestDeleteOnConnected) { |
+ // This test verifies that deleting the adapter mid-callback doesn't lead |
+ // to deleted structures being touched as the stack unrolls, so the failure |
+ // mode is a crash rather than a normal test failure. |
+ TestCompletionCallback client_connect_cb; |
+ DeleteOnConnected host_delete(&message_loop_, &host_pseudotcp_); |
+ net::CompletionCallbackImpl<DeleteOnConnected> |
+ host_connect_cb(&host_delete, &DeleteOnConnected::OnConnected); |
+ |
+ host_pseudotcp_->Connect(&host_connect_cb); |
+ client_pseudotcp_->Connect(&client_connect_cb); |
+ message_loop_.Run(); |
+ |
+ ASSERT_EQ(NULL, host_pseudotcp_.get()); |
+} |
+ |
} // namespace |
} // namespace jingle_glue |