Chromium Code Reviews| Index: webrtc/p2p/base/p2ptransportchannel_unittest.cc |
| diff --git a/webrtc/p2p/base/p2ptransportchannel_unittest.cc b/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
| index 4217d0254892960be8f94c29b06fc26b6f5fd9e3..96b2af9cce1c38ce98c8de58b83de9702a599a71 100644 |
| --- a/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
| +++ b/webrtc/p2p/base/p2ptransportchannel_unittest.cc |
| @@ -1721,19 +1721,19 @@ TEST_F(P2PTransportChannelMultihomedTest, TestDrain) { |
| DestroyChannels(); |
| } |
| -class P2PTransportChannelPingOrderTest : public testing::Test, |
| - public sigslot::has_slots<> { |
| +class P2PTransportChannelSingleEndpointTest : public testing::Test, |
|
pthatcher1
2015/06/09 23:58:03
Let's just call it P2PTransportChannelTest
guoweis_webrtc
2015/06/10 18:12:41
P2PTransportChannelTest exists already.
|
| + public sigslot::has_slots<> { |
| public: |
| - P2PTransportChannelPingOrderTest() : |
| - pss_(new rtc::PhysicalSocketServer), |
| - vss_(new rtc::VirtualSocketServer(pss_.get())), |
| - ss_scope_(vss_.get()) { |
| - } |
| + P2PTransportChannelSingleEndpointTest() |
| + : pss_(new rtc::PhysicalSocketServer), |
| + vss_(new rtc::VirtualSocketServer(pss_.get())), |
| + ss_scope_(vss_.get()) {} |
| protected: |
| void PrepareChannel(cricket::P2PTransportChannel* ch) { |
| ch->SignalRequestSignaling.connect( |
| - this, &P2PTransportChannelPingOrderTest::OnChannelRequestSignaling); |
| + this, |
| + &P2PTransportChannelSingleEndpointTest::OnChannelRequestSignaling); |
| ch->SetIceProtocolType(cricket::ICEPROTO_RFC5245); |
| ch->SetIceRole(cricket::ICEROLE_CONTROLLING); |
| ch->SetIceCredentials(kIceUfrag[0], kIcePwd[0]); |
| @@ -1786,7 +1786,7 @@ class P2PTransportChannelPingOrderTest : public testing::Test, |
| rtc::SocketServerScope ss_scope_; |
| }; |
| -TEST_F(P2PTransportChannelPingOrderTest, TestTriggeredChecks) { |
| +TEST_F(P2PTransportChannelSingleEndpointTest, TestTriggeredChecks) { |
| cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
| cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); |
| PrepareChannel(&ch); |
| @@ -1807,7 +1807,7 @@ TEST_F(P2PTransportChannelPingOrderTest, TestTriggeredChecks) { |
| EXPECT_LT(ping1, ping2); |
| } |
| -TEST_F(P2PTransportChannelPingOrderTest, |
| +TEST_F(P2PTransportChannelSingleEndpointTest, |
| TestNoTriggeredChecksWithoutIncomingPing) { |
| cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
| cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); |
| @@ -1828,7 +1828,8 @@ TEST_F(P2PTransportChannelPingOrderTest, |
| EXPECT_LT(ping2, ping1); |
| } |
| -TEST_F(P2PTransportChannelPingOrderTest, TestNoTriggeredChecksWhenWritable) { |
| +TEST_F(P2PTransportChannelSingleEndpointTest, |
| + TestNoTriggeredChecksWhenWritable) { |
| cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
| cricket::P2PTransportChannel ch("trigger checks", 1, nullptr, &pa); |
| PrepareChannel(&ch); |
| @@ -1861,3 +1862,53 @@ TEST_F(P2PTransportChannelPingOrderTest, TestNoTriggeredChecksWhenWritable) { |
| EXPECT_LT(ping2, ping1); |
| } |
| } |
| + |
| +TEST_F(P2PTransportChannelSingleEndpointTest, ConnectionResurrection) { |
| + cricket::FakePortAllocator pa(rtc::Thread::Current(), nullptr); |
| + cricket::P2PTransportChannel ch("connection resurrection", 1, nullptr, &pa); |
| + PrepareChannel(&ch); |
| + ch.Connect(); |
| + |
| + // Create conn1 and keep track of original candidate priority. |
| + ch.OnCandidate(CreateCandidate("1.1.1.1", 1, 1)); |
| + cricket::Connection* conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
| + ASSERT_TRUE(conn1 != nullptr); |
| + uint32 remote_priority = conn1->remote_candidate().priority(); |
| + |
| + // Create a higher priority candidate and make the connection |
| + // readable/writable. This will prune conn1. |
| + ch.OnCandidate(CreateCandidate("2.2.2.2", 2, 2)); |
| + cricket::Connection* conn2 = WaitForConnectionTo(&ch, "2.2.2.2", 2); |
| + ASSERT_TRUE(conn2 != nullptr); |
| + conn2->ReceivedPing(); |
| + conn2->ReceivedPingResponse(); |
| + |
| + // Wait for conn1 being destroyed. |
| + EXPECT_TRUE_WAIT(GetConnectionTo(&ch, "1.1.1.1", 1) == nullptr, 3000); |
| + cricket::Port* port = static_cast<cricket::Port*>(ch.ports()[0]); |
|
pthatcher1
2015/06/09 23:58:03
Can you make this its own function?
guoweis_webrtc
2015/06/10 18:12:41
Done.
|
| + |
| + // Create a minimal STUN message with prflx priority. |
| + cricket::IceMessage request; |
| + request.SetType(cricket::STUN_BINDING_REQUEST); |
| + request.AddAttribute(new cricket::StunByteStringAttribute( |
| + cricket::STUN_ATTR_USERNAME, kIceUfrag[1])); |
| + uint32 prflx_priority = cricket::ICE_TYPE_PREFERENCE_PRFLX << 24 | |
| + (conn1->remote_candidate().priority() & 0x00FFFFFF); |
|
pthatcher1
2015/06/09 23:58:03
Can you make this its own method?
guoweis_webrtc
2015/06/10 18:12:41
Done.
|
| + request.AddAttribute(new cricket::StunUInt32Attribute( |
| + cricket::STUN_ATTR_PRIORITY, prflx_priority)); |
| + EXPECT_NE(prflx_priority, remote_priority); |
| + |
| + // conn1 should be resurrected with original priority. |
| + port->SignalUnknownAddress(port, rtc::SocketAddress("1.1.1.1", 1), |
| + cricket::PROTO_UDP, &request, kIceUfrag[1], false); |
| + conn1 = WaitForConnectionTo(&ch, "1.1.1.1", 1); |
| + ASSERT_TRUE(conn1 != nullptr); |
| + EXPECT_EQ(conn1->remote_candidate().priority(), remote_priority); |
| + |
| + // conn3, a real prflx connection, should have prflx priority. |
| + port->SignalUnknownAddress(port, rtc::SocketAddress("3.3.3.3", 1), |
| + cricket::PROTO_UDP, &request, kIceUfrag[1], false); |
| + cricket::Connection* conn3 = WaitForConnectionTo(&ch, "3.3.3.3", 1); |
| + ASSERT_TRUE(conn3 != nullptr); |
| + EXPECT_EQ(conn3->remote_candidate().priority(), prflx_priority); |
| +} |