Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(384)

Side by Side Diff: webrtc/p2p/base/p2ptransportchannel_unittest.cc

Issue 2086203004: Allow receiving a packet on a TURN port from an unknown address. (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Fixing memory leak found by ASan bot. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | webrtc/p2p/base/testturnserver.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2009 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2009 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 } 285 }
286 286
287 rtc::FakeNetworkManager network_manager_; 287 rtc::FakeNetworkManager network_manager_;
288 std::unique_ptr<BasicPortAllocator> allocator_; 288 std::unique_ptr<BasicPortAllocator> allocator_;
289 ChannelData cd1_; 289 ChannelData cd1_;
290 ChannelData cd2_; 290 ChannelData cd2_;
291 IceRole role_; 291 IceRole role_;
292 uint64_t tiebreaker_; 292 uint64_t tiebreaker_;
293 bool role_conflict_; 293 bool role_conflict_;
294 bool save_candidates_; 294 bool save_candidates_;
295 std::vector<CandidatesData*> saved_candidates_; 295 std::vector<std::unique_ptr<CandidatesData>> saved_candidates_;
296 bool ready_to_send_ = false; 296 bool ready_to_send_ = false;
297 }; 297 };
298 298
299 ChannelData* GetChannelData(TransportChannel* channel) { 299 ChannelData* GetChannelData(TransportChannel* channel) {
300 if (ep1_.HasChannel(channel)) 300 if (ep1_.HasChannel(channel))
301 return ep1_.GetChannelData(channel); 301 return ep1_.GetChannelData(channel);
302 else 302 else
303 return ep2_.GetChannelData(channel); 303 return ep2_.GetChannelData(channel);
304 } 304 }
305 305
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
362 ep1_.cd1_.ch_.reset(); 362 ep1_.cd1_.ch_.reset();
363 ep2_.cd1_.ch_.reset(); 363 ep2_.cd1_.ch_.reset();
364 ep1_.cd2_.ch_.reset(); 364 ep1_.cd2_.ch_.reset();
365 ep2_.cd2_.ch_.reset(); 365 ep2_.cd2_.ch_.reset();
366 } 366 }
367 P2PTransportChannel* ep1_ch1() { return ep1_.cd1_.ch_.get(); } 367 P2PTransportChannel* ep1_ch1() { return ep1_.cd1_.ch_.get(); }
368 P2PTransportChannel* ep1_ch2() { return ep1_.cd2_.ch_.get(); } 368 P2PTransportChannel* ep1_ch2() { return ep1_.cd2_.ch_.get(); }
369 P2PTransportChannel* ep2_ch1() { return ep2_.cd1_.ch_.get(); } 369 P2PTransportChannel* ep2_ch1() { return ep2_.cd1_.ch_.get(); }
370 P2PTransportChannel* ep2_ch2() { return ep2_.cd2_.ch_.get(); } 370 P2PTransportChannel* ep2_ch2() { return ep2_.cd2_.ch_.get(); }
371 371
372 TestTurnServer* test_turn_server() { return &turn_server_; }
373
372 // Common results. 374 // Common results.
373 static const Result kLocalUdpToLocalUdp; 375 static const Result kLocalUdpToLocalUdp;
374 static const Result kLocalUdpToStunUdp; 376 static const Result kLocalUdpToStunUdp;
375 static const Result kLocalUdpToPrflxUdp; 377 static const Result kLocalUdpToPrflxUdp;
376 static const Result kPrflxUdpToLocalUdp; 378 static const Result kPrflxUdpToLocalUdp;
377 static const Result kStunUdpToLocalUdp; 379 static const Result kStunUdpToLocalUdp;
378 static const Result kStunUdpToStunUdp; 380 static const Result kStunUdpToStunUdp;
379 static const Result kPrflxUdpToStunUdp; 381 static const Result kPrflxUdpToStunUdp;
380 static const Result kLocalUdpToRelayUdp; 382 static const Result kLocalUdpToRelayUdp;
381 static const Result kPrflxUdpToRelayUdp; 383 static const Result kPrflxUdpToRelayUdp;
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
668 void OnReadyToSend(TransportChannel* ch) { 670 void OnReadyToSend(TransportChannel* ch) {
669 GetEndpoint(ch)->ready_to_send_ = true; 671 GetEndpoint(ch)->ready_to_send_ = true;
670 } 672 }
671 673
672 // We pass the candidates directly to the other side. 674 // We pass the candidates directly to the other side.
673 void OnCandidateGathered(TransportChannelImpl* ch, const Candidate& c) { 675 void OnCandidateGathered(TransportChannelImpl* ch, const Candidate& c) {
674 if (force_relay_ && c.type() != RELAY_PORT_TYPE) 676 if (force_relay_ && c.type() != RELAY_PORT_TYPE)
675 return; 677 return;
676 678
677 if (GetEndpoint(ch)->save_candidates_) { 679 if (GetEndpoint(ch)->save_candidates_) {
678 GetEndpoint(ch)->saved_candidates_.push_back(new CandidatesData(ch, c)); 680 GetEndpoint(ch)->saved_candidates_.push_back(
681 std::unique_ptr<CandidatesData>(new CandidatesData(ch, c)));
679 } else { 682 } else {
680 main_->Post(RTC_FROM_HERE, this, MSG_ADD_CANDIDATES, 683 main_->Post(RTC_FROM_HERE, this, MSG_ADD_CANDIDATES,
681 new CandidatesData(ch, c)); 684 new CandidatesData(ch, c));
682 } 685 }
683 } 686 }
684 687
685 void PauseCandidates(int endpoint) { 688 void PauseCandidates(int endpoint) {
686 GetEndpoint(endpoint)->save_candidates_ = true; 689 GetEndpoint(endpoint)->save_candidates_ = true;
687 } 690 }
688 691
(...skipping 16 matching lines...) Expand all
705 EXPECT_NE(candidate.address().port(), DISCARD_PORT); 708 EXPECT_NE(candidate.address().port(), DISCARD_PORT);
706 } else { 709 } else {
707 FAIL() << "Unknown tcptype: " << candidate.tcptype(); 710 FAIL() << "Unknown tcptype: " << candidate.tcptype();
708 } 711 }
709 } 712 }
710 } 713 }
711 } 714 }
712 715
713 void ResumeCandidates(int endpoint) { 716 void ResumeCandidates(int endpoint) {
714 Endpoint* ed = GetEndpoint(endpoint); 717 Endpoint* ed = GetEndpoint(endpoint);
715 std::vector<CandidatesData*>::iterator it = ed->saved_candidates_.begin(); 718 for (auto& candidate : ed->saved_candidates_) {
716 for (; it != ed->saved_candidates_.end(); ++it) { 719 main_->Post(RTC_FROM_HERE, this, MSG_ADD_CANDIDATES, candidate.release());
717 main_->Post(RTC_FROM_HERE, this, MSG_ADD_CANDIDATES, *it);
718 } 720 }
719 ed->saved_candidates_.clear(); 721 ed->saved_candidates_.clear();
720 ed->save_candidates_ = false; 722 ed->save_candidates_ = false;
721 } 723 }
722 724
723 void OnMessage(rtc::Message* msg) { 725 void OnMessage(rtc::Message* msg) {
724 switch (msg->message_id) { 726 switch (msg->message_id) {
725 case MSG_ADD_CANDIDATES: { 727 case MSG_ADD_CANDIDATES: {
726 std::unique_ptr<CandidatesData> data( 728 std::unique_ptr<CandidatesData> data(
727 static_cast<CandidatesData*>(msg->pdata)); 729 static_cast<CandidatesData*>(msg->pdata));
(...skipping 930 matching lines...) Expand 10 before | Expand all | Expand 10 after
1658 auto pooled_ports_2 = pooled_session_2->ReadyPorts(); 1660 auto pooled_ports_2 = pooled_session_2->ReadyPorts();
1659 EXPECT_NE(pooled_ports_1.end(), 1661 EXPECT_NE(pooled_ports_1.end(),
1660 std::find(pooled_ports_1.begin(), pooled_ports_1.end(), 1662 std::find(pooled_ports_1.begin(), pooled_ports_1.end(),
1661 ep1_ch1()->selected_connection()->port())); 1663 ep1_ch1()->selected_connection()->port()));
1662 EXPECT_NE(pooled_ports_2.end(), 1664 EXPECT_NE(pooled_ports_2.end(),
1663 std::find(pooled_ports_2.begin(), pooled_ports_2.end(), 1665 std::find(pooled_ports_2.begin(), pooled_ports_2.end(),
1664 ep2_ch1()->selected_connection()->port())); 1666 ep2_ch1()->selected_connection()->port()));
1665 } 1667 }
1666 1668
1667 // Test that when the "presume_writable_when_fully_relayed" flag is set to 1669 // Test that when the "presume_writable_when_fully_relayed" flag is set to
1668 // false and there's a TURN-TURN candidate pair, it's presume to be writable 1670 // true and there's a TURN-TURN candidate pair, it's presumed to be writable
1669 // as soon as it's created. 1671 // as soon as it's created.
1670 TEST_F(P2PTransportChannelTest, TurnToTurnPresumedWritable) { 1672 TEST_F(P2PTransportChannelTest, TurnToTurnPresumedWritable) {
1671 ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags, 1673 ConfigureEndpoints(OPEN, OPEN, kDefaultPortAllocatorFlags,
1672 kDefaultPortAllocatorFlags); 1674 kDefaultPortAllocatorFlags);
1673 // Only configure one channel so we can control when the remote candidate 1675 // Only configure one channel so we can control when the remote candidate
1674 // is added. 1676 // is added.
1675 GetEndpoint(0)->cd1_.ch_.reset( 1677 GetEndpoint(0)->cd1_.ch_.reset(
1676 CreateChannel(0, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceUfrag[0], 1678 CreateChannel(0, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceUfrag[0],
1677 kIcePwd[0], kIceUfrag[1], kIcePwd[1])); 1679 kIcePwd[0], kIceUfrag[1], kIcePwd[1]));
1678 IceConfig config; 1680 IceConfig config;
(...skipping 12 matching lines...) Expand all
1691 // "probably writable". 1693 // "probably writable".
1692 EXPECT_TRUE(ep1_ch1()->selected_connection() != nullptr); 1694 EXPECT_TRUE(ep1_ch1()->selected_connection() != nullptr);
1693 EXPECT_EQ(RELAY_PORT_TYPE, LocalCandidate(ep1_ch1())->type()); 1695 EXPECT_EQ(RELAY_PORT_TYPE, LocalCandidate(ep1_ch1())->type());
1694 EXPECT_EQ(RELAY_PORT_TYPE, RemoteCandidate(ep1_ch1())->type()); 1696 EXPECT_EQ(RELAY_PORT_TYPE, RemoteCandidate(ep1_ch1())->type());
1695 // Also expect that the channel instantly indicates that it's writable since 1697 // Also expect that the channel instantly indicates that it's writable since
1696 // it has a TURN-TURN pair. 1698 // it has a TURN-TURN pair.
1697 EXPECT_TRUE(ep1_ch1()->writable()); 1699 EXPECT_TRUE(ep1_ch1()->writable());
1698 EXPECT_TRUE(GetEndpoint(0)->ready_to_send_); 1700 EXPECT_TRUE(GetEndpoint(0)->ready_to_send_);
1699 } 1701 }
1700 1702
1703 // Test that a TURN/peer reflexive candidate pair is also presumed writable.
1704 TEST_F(P2PTransportChannelTest, TurnToPrflxPresumedWritable) {
1705 rtc::ScopedFakeClock fake_clock;
1706
1707 ConfigureEndpoints(NAT_SYMMETRIC, NAT_SYMMETRIC, kDefaultPortAllocatorFlags,
1708 kDefaultPortAllocatorFlags);
1709 // We want the remote TURN candidate to show up as prflx. To do this we need
1710 // to configure the server to accept packets from an address we haven't
1711 // explicitly installed permission for.
1712 test_turn_server()->set_enable_permission_checks(false);
1713 IceConfig config;
1714 config.presume_writable_when_fully_relayed = true;
1715 GetEndpoint(0)->cd1_.ch_.reset(
1716 CreateChannel(0, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceUfrag[0],
1717 kIcePwd[0], kIceUfrag[1], kIcePwd[1]));
1718 GetEndpoint(1)->cd1_.ch_.reset(
1719 CreateChannel(1, ICE_CANDIDATE_COMPONENT_DEFAULT, kIceUfrag[1],
1720 kIcePwd[1], kIceUfrag[0], kIcePwd[0]));
1721 ep1_ch1()->SetIceConfig(config);
1722 ep2_ch1()->SetIceConfig(config);
1723 // Don't signal candidates from channel 2, so that channel 1 sees the TURN
1724 // candidate as peer reflexive.
1725 PauseCandidates(1);
1726 ep1_ch1()->MaybeStartGathering();
1727 ep2_ch1()->MaybeStartGathering();
1728
1729 // Wait for the TURN<->prflx connection.
1730 EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->receiving() && ep1_ch1()->writable(),
1731 1000, fake_clock);
1732 ASSERT_NE(nullptr, ep1_ch1()->selected_connection());
1733 EXPECT_EQ(RELAY_PORT_TYPE, LocalCandidate(ep1_ch1())->type());
1734 EXPECT_EQ(PRFLX_PORT_TYPE, RemoteCandidate(ep1_ch1())->type());
1735 // Make sure that at this point the connection is only presumed writable,
1736 // not fully writable.
1737 EXPECT_FALSE(ep1_ch1()->selected_connection()->writable());
1738
1739 // Now wait for it to actually become writable.
1740 EXPECT_TRUE_SIMULATED_WAIT(ep1_ch1()->selected_connection()->writable(), 1000,
1741 fake_clock);
1742
1743 // Explitly destroy channels, before fake clock is destroyed.
1744 DestroyChannels();
1745 }
1746
1701 // Test that a presumed-writable TURN<->TURN connection is preferred above an 1747 // Test that a presumed-writable TURN<->TURN connection is preferred above an
1702 // unreliable connection (one that has failed to be pinged for some time). 1748 // unreliable connection (one that has failed to be pinged for some time).
1703 TEST_F(P2PTransportChannelTest, PresumedWritablePreferredOverUnreliable) { 1749 TEST_F(P2PTransportChannelTest, PresumedWritablePreferredOverUnreliable) {
1704 rtc::ScopedFakeClock fake_clock; 1750 rtc::ScopedFakeClock fake_clock;
1705 1751
1706 ConfigureEndpoints(NAT_SYMMETRIC, NAT_SYMMETRIC, kDefaultPortAllocatorFlags, 1752 ConfigureEndpoints(NAT_SYMMETRIC, NAT_SYMMETRIC, kDefaultPortAllocatorFlags,
1707 kDefaultPortAllocatorFlags); 1753 kDefaultPortAllocatorFlags);
1708 IceConfig config; 1754 IceConfig config;
1709 config.presume_writable_when_fully_relayed = true; 1755 config.presume_writable_when_fully_relayed = true;
1710 GetEndpoint(0)->cd1_.ch_.reset( 1756 GetEndpoint(0)->cd1_.ch_.reset(
(...skipping 1717 matching lines...) Expand 10 before | Expand all | Expand 10 after
3428 3474
3429 // TCP Relay/Relay is the next. 3475 // TCP Relay/Relay is the next.
3430 VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE, 3476 VerifyNextPingableConnection(RELAY_PORT_TYPE, RELAY_PORT_TYPE,
3431 TCP_PROTOCOL_NAME); 3477 TCP_PROTOCOL_NAME);
3432 3478
3433 // Finally, Local/Relay will be pinged. 3479 // Finally, Local/Relay will be pinged.
3434 VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE); 3480 VerifyNextPingableConnection(LOCAL_PORT_TYPE, RELAY_PORT_TYPE);
3435 } 3481 }
3436 3482
3437 } // namespace cricket { 3483 } // namespace cricket {
OLDNEW
« no previous file with comments | « no previous file | webrtc/p2p/base/testturnserver.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698