3 * Copyright 2004 Google Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
8 * 1. Redistributions of source code must retain the above copyright notice,
9 * this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright notice,
11 * this list of conditions and the following disclaimer in the documentation
12 * and/or other materials provided with the distribution.
13 * 3. The name of the author may not be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 #include "talk/base/crc32.h"
29 #include "talk/base/gunit.h"
30 #include "talk/base/helpers.h"
31 #include "talk/base/logging.h"
32 #include "talk/base/natserver.h"
33 #include "talk/base/natsocketfactory.h"
34 #include "talk/base/physicalsocketserver.h"
35 #include "talk/base/scoped_ptr.h"
36 #include "talk/base/socketaddress.h"
37 #include "talk/base/ssladapter.h"
38 #include "talk/base/stringutils.h"
39 #include "talk/base/thread.h"
40 #include "talk/base/virtualsocketserver.h"
41 #include "talk/p2p/base/basicpacketsocketfactory.h"
42 #include "talk/p2p/base/portproxy.h"
43 #include "talk/p2p/base/relayport.h"
44 #include "talk/p2p/base/stunport.h"
45 #include "talk/p2p/base/tcpport.h"
46 #include "talk/p2p/base/testrelayserver.h"
47 #include "talk/p2p/base/teststunserver.h"
48 #include "talk/p2p/base/testturnserver.h"
49 #include "talk/p2p/base/transport.h"
50 #include "talk/p2p/base/turnport.h"
52 using talk_base::AsyncPacketSocket;
53 using talk_base::ByteBuffer;
54 using talk_base::NATType;
55 using talk_base::NAT_OPEN_CONE;
56 using talk_base::NAT_ADDR_RESTRICTED;
57 using talk_base::NAT_PORT_RESTRICTED;
58 using talk_base::NAT_SYMMETRIC;
59 using talk_base::PacketSocketFactory;
60 using talk_base::scoped_ptr;
61 using talk_base::Socket;
62 using talk_base::SocketAddress;
63 using namespace cricket;
65 static const int kTimeout = 1000;
66 static const SocketAddress kLocalAddr1("192.168.1.2", 0);
67 static const SocketAddress kLocalAddr2("192.168.1.3", 0);
68 static const SocketAddress kNatAddr1("77.77.77.77", talk_base::NAT_SERVER_PORT);
69 static const SocketAddress kNatAddr2("88.88.88.88", talk_base::NAT_SERVER_PORT);
70 static const SocketAddress kStunAddr("99.99.99.1", STUN_SERVER_PORT);
71 static const SocketAddress kRelayUdpIntAddr("99.99.99.2", 5000);
72 static const SocketAddress kRelayUdpExtAddr("99.99.99.3", 5001);
73 static const SocketAddress kRelayTcpIntAddr("99.99.99.2", 5002);
74 static const SocketAddress kRelayTcpExtAddr("99.99.99.3", 5003);
75 static const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004);
76 static const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005);
77 static const SocketAddress kTurnUdpIntAddr("99.99.99.4", STUN_SERVER_PORT);
78 static const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0);
79 static const RelayCredentials kRelayCredentials("test", "test");
81 // TODO: Update these when RFC5245 is completely supported.
82 // Magic value of 30 is from RFC3484, for IPv4 addresses.
83 static const uint32 kDefaultPrflxPriority = ICE_TYPE_PREFERENCE_PRFLX << 24 |
84 30 << 8 | (256 - ICE_CANDIDATE_COMPONENT_DEFAULT);
85 static const int STUN_ERROR_BAD_REQUEST_AS_GICE =
86 STUN_ERROR_BAD_REQUEST / 256 * 100 + STUN_ERROR_BAD_REQUEST % 256;
87 static const int STUN_ERROR_UNAUTHORIZED_AS_GICE =
88 STUN_ERROR_UNAUTHORIZED / 256 * 100 + STUN_ERROR_UNAUTHORIZED % 256;
89 static const int STUN_ERROR_SERVER_ERROR_AS_GICE =
90 STUN_ERROR_SERVER_ERROR / 256 * 100 + STUN_ERROR_SERVER_ERROR % 256;
92 static const int kTiebreaker1 = 11111;
93 static const int kTiebreaker2 = 22222;
95 static Candidate GetCandidate(Port* port) {
96 assert(port->Candidates().size() == 1);
97 return port->Candidates()[0];
100 static SocketAddress GetAddress(Port* port) {
101 return GetCandidate(port).address();
104 static IceMessage* CopyStunMessage(const IceMessage* src) {
105 IceMessage* dst = new IceMessage();
112 static bool WriteStunMessage(const StunMessage* msg, ByteBuffer* buf) {
113 buf->Resize(0); // clear out any existing buffer contents
114 return msg->Write(buf);
117 // Stub port class for testing STUN generation and processing.
118 class TestPort : public Port {
120 TestPort(talk_base::Thread* thread, const std::string& type,
121 talk_base::PacketSocketFactory* factory, talk_base::Network* network,
122 const talk_base::IPAddress& ip, int min_port, int max_port,
123 const std::string& username_fragment, const std::string& password)
124 : Port(thread, type, factory, network, ip,
125 min_port, max_port, username_fragment, password) {
129 // Expose GetStunMessage so that we can test it.
130 using cricket::Port::GetStunMessage;
132 // The last StunMessage that was sent on this Port.
133 // TODO: Make these const; requires changes to SendXXXXResponse.
134 ByteBuffer* last_stun_buf() { return last_stun_buf_.get(); }
135 IceMessage* last_stun_msg() { return last_stun_msg_.get(); }
136 int last_stun_error_code() {
138 if (last_stun_msg_) {
139 const StunErrorCodeAttribute* error_attr = last_stun_msg_->GetErrorCode();
141 code = error_attr->code();
147 virtual void PrepareAddress() {
148 talk_base::SocketAddress addr(ip(), min_port());
149 AddAddress(addr, addr, talk_base::SocketAddress(), "udp", Type(),
150 ICE_TYPE_PREFERENCE_HOST, true);
153 // Exposed for testing candidate building.
154 void AddCandidateAddress(const talk_base::SocketAddress& addr) {
155 AddAddress(addr, addr, talk_base::SocketAddress(), "udp", Type(),
156 type_preference_, false);
158 void AddCandidateAddress(const talk_base::SocketAddress& addr,
159 const talk_base::SocketAddress& base_address,
160 const std::string& type,
163 AddAddress(addr, base_address, talk_base::SocketAddress(), "udp", type,
164 type_preference, final);
167 virtual Connection* CreateConnection(const Candidate& remote_candidate,
168 CandidateOrigin origin) {
169 Connection* conn = new ProxyConnection(this, 0, remote_candidate);
171 // Set use-candidate attribute flag as this will add USE-CANDIDATE attribute
172 // in STUN binding requests.
173 conn->set_use_candidate_attr(true);
177 const void* data, size_t size, const talk_base::SocketAddress& addr,
178 const talk_base::PacketOptions& options, bool payload) {
180 IceMessage* msg = new IceMessage;
181 ByteBuffer* buf = new ByteBuffer(static_cast<const char*>(data), size);
182 ByteBuffer::ReadPosition pos(buf->GetReadPosition());
183 if (!msg->Read(buf)) {
188 buf->SetReadPosition(pos);
189 last_stun_buf_.reset(buf);
190 last_stun_msg_.reset(msg);
192 return static_cast<int>(size);
194 virtual int SetOption(talk_base::Socket::Option opt, int value) {
197 virtual int GetOption(talk_base::Socket::Option opt, int* value) {
200 virtual int GetError() {
204 last_stun_buf_.reset();
205 last_stun_msg_.reset();
207 void set_type_preference(int type_preference) {
208 type_preference_ = type_preference;
212 talk_base::scoped_ptr<ByteBuffer> last_stun_buf_;
213 talk_base::scoped_ptr<IceMessage> last_stun_msg_;
214 int type_preference_;
217 class TestChannel : public sigslot::has_slots<> {
219 // Takes ownership of |p1| (but not |p2|).
220 TestChannel(Port* p1, Port* p2)
221 : ice_mode_(ICEMODE_FULL), src_(p1), dst_(p2), complete_count_(0),
222 conn_(NULL), remote_request_(), nominated_(false) {
223 src_->SignalPortComplete.connect(
224 this, &TestChannel::OnPortComplete);
225 src_->SignalUnknownAddress.connect(this, &TestChannel::OnUnknownAddress);
226 src_->SignalDestroyed.connect(this, &TestChannel::OnSrcPortDestroyed);
229 int complete_count() { return complete_count_; }
230 Connection* conn() { return conn_; }
231 const SocketAddress& remote_address() { return remote_address_; }
232 const std::string remote_fragment() { return remote_frag_; }
235 src_->PrepareAddress();
237 void CreateConnection() {
238 conn_ = src_->CreateConnection(GetCandidate(dst_), Port::ORIGIN_MESSAGE);
239 IceMode remote_ice_mode =
240 (ice_mode_ == ICEMODE_FULL) ? ICEMODE_LITE : ICEMODE_FULL;
241 conn_->set_remote_ice_mode(remote_ice_mode);
242 conn_->set_use_candidate_attr(remote_ice_mode == ICEMODE_FULL);
243 conn_->SignalStateChange.connect(
244 this, &TestChannel::OnConnectionStateChange);
246 void OnConnectionStateChange(Connection* conn) {
247 if (conn->write_state() == Connection::STATE_WRITABLE) {
248 conn->set_use_candidate_attr(true);
252 void AcceptConnection() {
253 ASSERT_TRUE(remote_request_.get() != NULL);
254 Candidate c = GetCandidate(dst_);
255 c.set_address(remote_address_);
256 conn_ = src_->CreateConnection(c, Port::ORIGIN_MESSAGE);
257 src_->SendBindingResponse(remote_request_.get(), remote_address_);
258 remote_request_.reset();
263 void Ping(uint32 now) {
267 conn_->SignalDestroyed.connect(this, &TestChannel::OnDestroyed);
271 void OnPortComplete(Port* port) {
274 void SetIceMode(IceMode ice_mode) {
275 ice_mode_ = ice_mode;
278 void OnUnknownAddress(PortInterface* port, const SocketAddress& addr,
280 IceMessage* msg, const std::string& rf,
281 bool /*port_muxed*/) {
282 ASSERT_EQ(src_.get(), port);
283 if (!remote_address_.IsNil()) {
284 ASSERT_EQ(remote_address_, addr);
286 // MI and PRIORITY attribute should be present in ping requests when port
287 // is in ICEPROTO_RFC5245 mode.
288 const cricket::StunUInt32Attribute* priority_attr =
289 msg->GetUInt32(STUN_ATTR_PRIORITY);
290 const cricket::StunByteStringAttribute* mi_attr =
291 msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY);
292 const cricket::StunUInt32Attribute* fingerprint_attr =
293 msg->GetUInt32(STUN_ATTR_FINGERPRINT);
294 if (src_->IceProtocol() == cricket::ICEPROTO_RFC5245) {
295 EXPECT_TRUE(priority_attr != NULL);
296 EXPECT_TRUE(mi_attr != NULL);
297 EXPECT_TRUE(fingerprint_attr != NULL);
299 EXPECT_TRUE(priority_attr == NULL);
300 EXPECT_TRUE(mi_attr == NULL);
301 EXPECT_TRUE(fingerprint_attr == NULL);
303 remote_address_ = addr;
304 remote_request_.reset(CopyStunMessage(msg));
308 void OnDestroyed(Connection* conn) {
309 ASSERT_EQ(conn_, conn);
313 void OnSrcPortDestroyed(PortInterface* port) {
314 Port* destroyed_src = src_.release();
315 ASSERT_EQ(destroyed_src, port);
318 bool nominated() const { return nominated_; }
322 talk_base::scoped_ptr<Port> src_;
327 SocketAddress remote_address_;
328 talk_base::scoped_ptr<StunMessage> remote_request_;
329 std::string remote_frag_;
333 class PortTest : public testing::Test, public sigslot::has_slots<> {
336 : main_(talk_base::Thread::Current()),
337 pss_(new talk_base::PhysicalSocketServer),
338 ss_(new talk_base::VirtualSocketServer(pss_.get())),
339 ss_scope_(ss_.get()),
340 network_("unittest", "unittest", talk_base::IPAddress(INADDR_ANY), 32),
341 socket_factory_(talk_base::Thread::Current()),
342 nat_factory1_(ss_.get(), kNatAddr1),
343 nat_factory2_(ss_.get(), kNatAddr2),
344 nat_socket_factory1_(&nat_factory1_),
345 nat_socket_factory2_(&nat_factory2_),
346 stun_server_(main_, kStunAddr),
347 turn_server_(main_, kTurnUdpIntAddr, kTurnUdpExtAddr),
348 relay_server_(main_, kRelayUdpIntAddr, kRelayUdpExtAddr,
349 kRelayTcpIntAddr, kRelayTcpExtAddr,
350 kRelaySslTcpIntAddr, kRelaySslTcpExtAddr),
351 username_(talk_base::CreateRandomString(ICE_UFRAG_LENGTH)),
352 password_(talk_base::CreateRandomString(ICE_PWD_LENGTH)),
353 ice_protocol_(cricket::ICEPROTO_GOOGLE),
354 role_conflict_(false),
356 network_.AddIP(talk_base::IPAddress(INADDR_ANY));
360 static void SetUpTestCase() {
361 talk_base::InitializeSSL();
364 static void TearDownTestCase() {
365 talk_base::CleanupSSL();
369 void TestLocalToLocal() {
370 Port* port1 = CreateUdpPort(kLocalAddr1);
371 Port* port2 = CreateUdpPort(kLocalAddr2);
372 TestConnectivity("udp", port1, "udp", port2, true, true, true, true);
374 void TestLocalToStun(NATType ntype) {
375 Port* port1 = CreateUdpPort(kLocalAddr1);
376 nat_server2_.reset(CreateNatServer(kNatAddr2, ntype));
377 Port* port2 = CreateStunPort(kLocalAddr2, &nat_socket_factory2_);
378 TestConnectivity("udp", port1, StunName(ntype), port2,
379 ntype == NAT_OPEN_CONE, true,
380 ntype != NAT_SYMMETRIC, true);
382 void TestLocalToRelay(RelayType rtype, ProtocolType proto) {
383 Port* port1 = CreateUdpPort(kLocalAddr1);
384 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_UDP);
385 TestConnectivity("udp", port1, RelayName(rtype, proto), port2,
386 rtype == RELAY_GTURN, true, true, true);
388 void TestStunToLocal(NATType ntype) {
389 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype));
390 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
391 Port* port2 = CreateUdpPort(kLocalAddr2);
392 TestConnectivity(StunName(ntype), port1, "udp", port2,
393 true, ntype != NAT_SYMMETRIC, true, true);
395 void TestStunToStun(NATType ntype1, NATType ntype2) {
396 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype1));
397 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
398 nat_server2_.reset(CreateNatServer(kNatAddr2, ntype2));
399 Port* port2 = CreateStunPort(kLocalAddr2, &nat_socket_factory2_);
400 TestConnectivity(StunName(ntype1), port1, StunName(ntype2), port2,
401 ntype2 == NAT_OPEN_CONE,
402 ntype1 != NAT_SYMMETRIC, ntype2 != NAT_SYMMETRIC,
403 ntype1 + ntype2 < (NAT_PORT_RESTRICTED + NAT_SYMMETRIC));
405 void TestStunToRelay(NATType ntype, RelayType rtype, ProtocolType proto) {
406 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype));
407 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
408 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_UDP);
409 TestConnectivity(StunName(ntype), port1, RelayName(rtype, proto), port2,
410 rtype == RELAY_GTURN, ntype != NAT_SYMMETRIC, true, true);
412 void TestTcpToTcp() {
413 Port* port1 = CreateTcpPort(kLocalAddr1);
414 Port* port2 = CreateTcpPort(kLocalAddr2);
415 TestConnectivity("tcp", port1, "tcp", port2, true, false, true, true);
417 void TestTcpToRelay(RelayType rtype, ProtocolType proto) {
418 Port* port1 = CreateTcpPort(kLocalAddr1);
419 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_TCP);
420 TestConnectivity("tcp", port1, RelayName(rtype, proto), port2,
421 rtype == RELAY_GTURN, false, true, true);
423 void TestSslTcpToRelay(RelayType rtype, ProtocolType proto) {
424 Port* port1 = CreateTcpPort(kLocalAddr1);
425 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_SSLTCP);
426 TestConnectivity("ssltcp", port1, RelayName(rtype, proto), port2,
427 rtype == RELAY_GTURN, false, true, true);
430 // helpers for above functions
431 UDPPort* CreateUdpPort(const SocketAddress& addr) {
432 return CreateUdpPort(addr, &socket_factory_);
434 UDPPort* CreateUdpPort(const SocketAddress& addr,
435 PacketSocketFactory* socket_factory) {
436 UDPPort* port = UDPPort::Create(main_, socket_factory, &network_,
437 addr.ipaddr(), 0, 0, username_, password_);
438 port->SetIceProtocolType(ice_protocol_);
441 TCPPort* CreateTcpPort(const SocketAddress& addr) {
442 TCPPort* port = CreateTcpPort(addr, &socket_factory_);
443 port->SetIceProtocolType(ice_protocol_);
446 TCPPort* CreateTcpPort(const SocketAddress& addr,
447 PacketSocketFactory* socket_factory) {
448 TCPPort* port = TCPPort::Create(main_, socket_factory, &network_,
449 addr.ipaddr(), 0, 0, username_, password_,
451 port->SetIceProtocolType(ice_protocol_);
454 StunPort* CreateStunPort(const SocketAddress& addr,
455 talk_base::PacketSocketFactory* factory) {
456 StunPort* port = StunPort::Create(main_, factory, &network_,
458 username_, password_, kStunAddr);
459 port->SetIceProtocolType(ice_protocol_);
462 Port* CreateRelayPort(const SocketAddress& addr, RelayType rtype,
463 ProtocolType int_proto, ProtocolType ext_proto) {
464 if (rtype == RELAY_TURN) {
465 return CreateTurnPort(addr, &socket_factory_, int_proto, ext_proto);
467 return CreateGturnPort(addr, int_proto, ext_proto);
470 TurnPort* CreateTurnPort(const SocketAddress& addr,
471 PacketSocketFactory* socket_factory,
472 ProtocolType int_proto, ProtocolType ext_proto) {
473 return CreateTurnPort(addr, socket_factory,
474 int_proto, ext_proto, kTurnUdpIntAddr);
476 TurnPort* CreateTurnPort(const SocketAddress& addr,
477 PacketSocketFactory* socket_factory,
478 ProtocolType int_proto, ProtocolType ext_proto,
479 const talk_base::SocketAddress& server_addr) {
480 TurnPort* port = TurnPort::Create(main_, socket_factory, &network_,
482 username_, password_, ProtocolAddress(
483 server_addr, PROTO_UDP),
485 port->SetIceProtocolType(ice_protocol_);
488 RelayPort* CreateGturnPort(const SocketAddress& addr,
489 ProtocolType int_proto, ProtocolType ext_proto) {
490 RelayPort* port = CreateGturnPort(addr);
491 SocketAddress addrs[] =
492 { kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr };
493 port->AddServerAddress(ProtocolAddress(addrs[int_proto], int_proto));
496 RelayPort* CreateGturnPort(const SocketAddress& addr) {
497 RelayPort* port = RelayPort::Create(main_, &socket_factory_, &network_,
499 username_, password_);
500 // TODO: Add an external address for ext_proto, so that the
501 // other side can connect to this port using a non-UDP protocol.
502 port->SetIceProtocolType(ice_protocol_);
505 talk_base::NATServer* CreateNatServer(const SocketAddress& addr,
506 talk_base::NATType type) {
507 return new talk_base::NATServer(type, ss_.get(), addr, ss_.get(), addr);
509 static const char* StunName(NATType type) {
511 case NAT_OPEN_CONE: return "stun(open cone)";
512 case NAT_ADDR_RESTRICTED: return "stun(addr restricted)";
513 case NAT_PORT_RESTRICTED: return "stun(port restricted)";
514 case NAT_SYMMETRIC: return "stun(symmetric)";
515 default: return "stun(?)";
518 static const char* RelayName(RelayType type, ProtocolType proto) {
519 if (type == RELAY_TURN) {
521 case PROTO_UDP: return "turn(udp)";
522 case PROTO_TCP: return "turn(tcp)";
523 case PROTO_SSLTCP: return "turn(ssltcp)";
524 default: return "turn(?)";
528 case PROTO_UDP: return "gturn(udp)";
529 case PROTO_TCP: return "gturn(tcp)";
530 case PROTO_SSLTCP: return "gturn(ssltcp)";
531 default: return "gturn(?)";
536 void TestCrossFamilyPorts(int type);
538 // This does all the work and then deletes |port1| and |port2|.
539 void TestConnectivity(const char* name1, Port* port1,
540 const char* name2, Port* port2,
541 bool accept, bool same_addr1,
542 bool same_addr2, bool possible);
544 // This connects and disconnects the provided channels in the same sequence as
545 // TestConnectivity with all options set to |true|. It does not delete either
547 void ConnectAndDisconnectChannels(TestChannel* ch1, TestChannel* ch2);
549 void SetIceProtocolType(cricket::IceProtocolType protocol) {
550 ice_protocol_ = protocol;
553 IceMessage* CreateStunMessage(int type) {
554 IceMessage* msg = new IceMessage();
556 msg->SetTransactionID("TESTTESTTEST");
559 IceMessage* CreateStunMessageWithUsername(int type,
560 const std::string& username) {
561 IceMessage* msg = CreateStunMessage(type);
563 new StunByteStringAttribute(STUN_ATTR_USERNAME, username));
566 TestPort* CreateTestPort(const talk_base::SocketAddress& addr,
567 const std::string& username,
568 const std::string& password) {
569 TestPort* port = new TestPort(main_, "test", &socket_factory_, &network_,
570 addr.ipaddr(), 0, 0, username, password);
571 port->SignalRoleConflict.connect(this, &PortTest::OnRoleConflict);
574 TestPort* CreateTestPort(const talk_base::SocketAddress& addr,
575 const std::string& username,
576 const std::string& password,
577 cricket::IceProtocolType type,
578 cricket::IceRole role,
580 TestPort* port = CreateTestPort(addr, username, password);
581 port->SetIceProtocolType(type);
582 port->SetIceRole(role);
583 port->SetIceTiebreaker(tiebreaker);
587 void OnRoleConflict(PortInterface* port) {
588 role_conflict_ = true;
590 bool role_conflict() const { return role_conflict_; }
592 void ConnectToSignalDestroyed(PortInterface* port) {
593 port->SignalDestroyed.connect(this, &PortTest::OnDestroyed);
596 void OnDestroyed(PortInterface* port) {
599 bool destroyed() const { return destroyed_; }
601 talk_base::BasicPacketSocketFactory* nat_socket_factory1() {
602 return &nat_socket_factory1_;
606 talk_base::Thread* main_;
607 talk_base::scoped_ptr<talk_base::PhysicalSocketServer> pss_;
608 talk_base::scoped_ptr<talk_base::VirtualSocketServer> ss_;
609 talk_base::SocketServerScope ss_scope_;
610 talk_base::Network network_;
611 talk_base::BasicPacketSocketFactory socket_factory_;
612 talk_base::scoped_ptr<talk_base::NATServer> nat_server1_;
613 talk_base::scoped_ptr<talk_base::NATServer> nat_server2_;
614 talk_base::NATSocketFactory nat_factory1_;
615 talk_base::NATSocketFactory nat_factory2_;
616 talk_base::BasicPacketSocketFactory nat_socket_factory1_;
617 talk_base::BasicPacketSocketFactory nat_socket_factory2_;
618 TestStunServer stun_server_;
619 TestTurnServer turn_server_;
620 TestRelayServer relay_server_;
621 std::string username_;
622 std::string password_;
623 cricket::IceProtocolType ice_protocol_;
628 void PortTest::TestConnectivity(const char* name1, Port* port1,
629 const char* name2, Port* port2,
630 bool accept, bool same_addr1,
631 bool same_addr2, bool possible) {
632 LOG(LS_INFO) << "Test: " << name1 << " to " << name2 << ": ";
633 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
634 port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
636 // Set up channels and ensure both ports will be deleted.
637 TestChannel ch1(port1, port2);
638 TestChannel ch2(port2, port1);
639 EXPECT_EQ(0, ch1.complete_count());
640 EXPECT_EQ(0, ch2.complete_count());
642 // Acquire addresses.
645 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout);
646 ASSERT_EQ_WAIT(1, ch2.complete_count(), kTimeout);
648 // Send a ping from src to dst. This may or may not make it.
649 ch1.CreateConnection();
650 ASSERT_TRUE(ch1.conn() != NULL);
651 EXPECT_TRUE_WAIT(ch1.conn()->connected(), kTimeout); // for TCP connect
653 WAIT(!ch2.remote_address().IsNil(), kTimeout);
656 // We are able to send a ping from src to dst. This is the case when
657 // sending to UDP ports and cone NATs.
658 EXPECT_TRUE(ch1.remote_address().IsNil());
659 EXPECT_EQ(ch2.remote_fragment(), port1->username_fragment());
661 // Ensure the ping came from the same address used for src.
662 // This is the case unless the source NAT was symmetric.
663 if (same_addr1) EXPECT_EQ(ch2.remote_address(), GetAddress(port1));
664 EXPECT_TRUE(same_addr2);
666 // Send a ping from dst to src.
667 ch2.AcceptConnection();
668 ASSERT_TRUE(ch2.conn() != NULL);
670 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch2.conn()->write_state(),
673 // We can't send a ping from src to dst, so flip it around. This will happen
674 // when the destination NAT is addr/port restricted or symmetric.
675 EXPECT_TRUE(ch1.remote_address().IsNil());
676 EXPECT_TRUE(ch2.remote_address().IsNil());
678 // Send a ping from dst to src. Again, this may or may not make it.
679 ch2.CreateConnection();
680 ASSERT_TRUE(ch2.conn() != NULL);
682 WAIT(ch2.conn()->write_state() == Connection::STATE_WRITABLE, kTimeout);
684 if (same_addr1 && same_addr2) {
685 // The new ping got back to the source.
686 EXPECT_EQ(Connection::STATE_READABLE, ch1.conn()->read_state());
687 EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state());
689 // First connection may not be writable if the first ping did not get
690 // through. So we will have to do another.
691 if (ch1.conn()->write_state() == Connection::STATE_WRITE_INIT) {
693 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(),
696 } else if (!same_addr1 && possible) {
697 // The new ping went to the candidate address, but that address was bad.
698 // This will happen when the source NAT is symmetric.
699 EXPECT_TRUE(ch1.remote_address().IsNil());
700 EXPECT_TRUE(ch2.remote_address().IsNil());
702 // However, since we have now sent a ping to the source IP, we should be
703 // able to get a ping from it. This gives us the real source address.
705 EXPECT_TRUE_WAIT(!ch2.remote_address().IsNil(), kTimeout);
706 EXPECT_EQ(Connection::STATE_READ_INIT, ch2.conn()->read_state());
707 EXPECT_TRUE(ch1.remote_address().IsNil());
709 // Pick up the actual address and establish the connection.
710 ch2.AcceptConnection();
711 ASSERT_TRUE(ch2.conn() != NULL);
713 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch2.conn()->write_state(),
715 } else if (!same_addr2 && possible) {
716 // The new ping came in, but from an unexpected address. This will happen
717 // when the destination NAT is symmetric.
718 EXPECT_FALSE(ch1.remote_address().IsNil());
719 EXPECT_EQ(Connection::STATE_READ_INIT, ch1.conn()->read_state());
721 // Update our address and complete the connection.
722 ch1.AcceptConnection();
724 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(),
726 } else { // (!possible)
727 // There should be s no way for the pings to reach each other. Check it.
728 EXPECT_TRUE(ch1.remote_address().IsNil());
729 EXPECT_TRUE(ch2.remote_address().IsNil());
731 WAIT(!ch2.remote_address().IsNil(), kTimeout);
732 EXPECT_TRUE(ch1.remote_address().IsNil());
733 EXPECT_TRUE(ch2.remote_address().IsNil());
737 // Everything should be good, unless we know the situation is impossible.
738 ASSERT_TRUE(ch1.conn() != NULL);
739 ASSERT_TRUE(ch2.conn() != NULL);
741 EXPECT_EQ(Connection::STATE_READABLE, ch1.conn()->read_state());
742 EXPECT_EQ(Connection::STATE_WRITABLE, ch1.conn()->write_state());
743 EXPECT_EQ(Connection::STATE_READABLE, ch2.conn()->read_state());
744 EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state());
746 EXPECT_NE(Connection::STATE_READABLE, ch1.conn()->read_state());
747 EXPECT_NE(Connection::STATE_WRITABLE, ch1.conn()->write_state());
748 EXPECT_NE(Connection::STATE_READABLE, ch2.conn()->read_state());
749 EXPECT_NE(Connection::STATE_WRITABLE, ch2.conn()->write_state());
752 // Tear down and ensure that goes smoothly.
755 EXPECT_TRUE_WAIT(ch1.conn() == NULL, kTimeout);
756 EXPECT_TRUE_WAIT(ch2.conn() == NULL, kTimeout);
759 void PortTest::ConnectAndDisconnectChannels(TestChannel* ch1,
761 // Acquire addresses.
765 // Send a ping from src to dst.
766 ch1->CreateConnection();
767 EXPECT_TRUE_WAIT(ch1->conn()->connected(), kTimeout); // for TCP connect
769 WAIT(!ch2->remote_address().IsNil(), kTimeout);
771 // Send a ping from dst to src.
772 ch2->AcceptConnection();
774 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch2->conn()->write_state(),
777 // Destroy the connections.
782 class FakePacketSocketFactory : public talk_base::PacketSocketFactory {
784 FakePacketSocketFactory()
785 : next_udp_socket_(NULL),
786 next_server_tcp_socket_(NULL),
787 next_client_tcp_socket_(NULL) {
789 virtual ~FakePacketSocketFactory() { }
791 virtual AsyncPacketSocket* CreateUdpSocket(
792 const SocketAddress& address, int min_port, int max_port) {
793 EXPECT_TRUE(next_udp_socket_ != NULL);
794 AsyncPacketSocket* result = next_udp_socket_;
795 next_udp_socket_ = NULL;
799 virtual AsyncPacketSocket* CreateServerTcpSocket(
800 const SocketAddress& local_address, int min_port, int max_port,
802 EXPECT_TRUE(next_server_tcp_socket_ != NULL);
803 AsyncPacketSocket* result = next_server_tcp_socket_;
804 next_server_tcp_socket_ = NULL;
808 // TODO: |proxy_info| and |user_agent| should be set
809 // per-factory and not when socket is created.
810 virtual AsyncPacketSocket* CreateClientTcpSocket(
811 const SocketAddress& local_address, const SocketAddress& remote_address,
812 const talk_base::ProxyInfo& proxy_info,
813 const std::string& user_agent, int opts) {
814 EXPECT_TRUE(next_client_tcp_socket_ != NULL);
815 AsyncPacketSocket* result = next_client_tcp_socket_;
816 next_client_tcp_socket_ = NULL;
820 void set_next_udp_socket(AsyncPacketSocket* next_udp_socket) {
821 next_udp_socket_ = next_udp_socket;
823 void set_next_server_tcp_socket(AsyncPacketSocket* next_server_tcp_socket) {
824 next_server_tcp_socket_ = next_server_tcp_socket;
826 void set_next_client_tcp_socket(AsyncPacketSocket* next_client_tcp_socket) {
827 next_client_tcp_socket_ = next_client_tcp_socket;
829 talk_base::AsyncResolverInterface* CreateAsyncResolver() {
834 AsyncPacketSocket* next_udp_socket_;
835 AsyncPacketSocket* next_server_tcp_socket_;
836 AsyncPacketSocket* next_client_tcp_socket_;
839 class FakeAsyncPacketSocket : public AsyncPacketSocket {
841 // Returns current local address. Address may be set to NULL if the
842 // socket is not bound yet (GetState() returns STATE_BINDING).
843 virtual SocketAddress GetLocalAddress() const {
844 return SocketAddress();
847 // Returns remote address. Returns zeroes if this is not a client TCP socket.
848 virtual SocketAddress GetRemoteAddress() const {
849 return SocketAddress();
853 virtual int Send(const void *pv, size_t cb,
854 const talk_base::PacketOptions& options) {
855 return static_cast<int>(cb);
857 virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr,
858 const talk_base::PacketOptions& options) {
859 return static_cast<int>(cb);
861 virtual int Close() {
865 virtual State GetState() const { return state_; }
866 virtual int GetOption(Socket::Option opt, int* value) { return 0; }
867 virtual int SetOption(Socket::Option opt, int value) { return 0; }
868 virtual int GetError() const { return 0; }
869 virtual void SetError(int error) { }
871 void set_state(State state) { state_ = state; }
878 TEST_F(PortTest, TestLocalToLocal) {
882 TEST_F(PortTest, TestLocalToConeNat) {
883 TestLocalToStun(NAT_OPEN_CONE);
886 TEST_F(PortTest, TestLocalToARNat) {
887 TestLocalToStun(NAT_ADDR_RESTRICTED);
890 TEST_F(PortTest, TestLocalToPRNat) {
891 TestLocalToStun(NAT_PORT_RESTRICTED);
894 TEST_F(PortTest, TestLocalToSymNat) {
895 TestLocalToStun(NAT_SYMMETRIC);
898 // Flaky: https://code.google.com/p/webrtc/issues/detail?id=3316.
899 TEST_F(PortTest, DISABLED_TestLocalToTurn) {
900 TestLocalToRelay(RELAY_TURN, PROTO_UDP);
903 TEST_F(PortTest, TestLocalToGturn) {
904 TestLocalToRelay(RELAY_GTURN, PROTO_UDP);
907 TEST_F(PortTest, TestLocalToTcpGturn) {
908 TestLocalToRelay(RELAY_GTURN, PROTO_TCP);
911 TEST_F(PortTest, TestLocalToSslTcpGturn) {
912 TestLocalToRelay(RELAY_GTURN, PROTO_SSLTCP);
916 TEST_F(PortTest, TestConeNatToLocal) {
917 TestStunToLocal(NAT_OPEN_CONE);
920 TEST_F(PortTest, TestConeNatToConeNat) {
921 TestStunToStun(NAT_OPEN_CONE, NAT_OPEN_CONE);
924 TEST_F(PortTest, TestConeNatToARNat) {
925 TestStunToStun(NAT_OPEN_CONE, NAT_ADDR_RESTRICTED);
928 TEST_F(PortTest, TestConeNatToPRNat) {
929 TestStunToStun(NAT_OPEN_CONE, NAT_PORT_RESTRICTED);
932 TEST_F(PortTest, TestConeNatToSymNat) {
933 TestStunToStun(NAT_OPEN_CONE, NAT_SYMMETRIC);
936 TEST_F(PortTest, TestConeNatToTurn) {
937 TestStunToRelay(NAT_OPEN_CONE, RELAY_TURN, PROTO_UDP);
940 TEST_F(PortTest, TestConeNatToGturn) {
941 TestStunToRelay(NAT_OPEN_CONE, RELAY_GTURN, PROTO_UDP);
944 TEST_F(PortTest, TestConeNatToTcpGturn) {
945 TestStunToRelay(NAT_OPEN_CONE, RELAY_GTURN, PROTO_TCP);
948 // Address-restricted NAT -> XXXX
949 TEST_F(PortTest, TestARNatToLocal) {
950 TestStunToLocal(NAT_ADDR_RESTRICTED);
953 TEST_F(PortTest, TestARNatToConeNat) {
954 TestStunToStun(NAT_ADDR_RESTRICTED, NAT_OPEN_CONE);
957 TEST_F(PortTest, TestARNatToARNat) {
958 TestStunToStun(NAT_ADDR_RESTRICTED, NAT_ADDR_RESTRICTED);
961 TEST_F(PortTest, TestARNatToPRNat) {
962 TestStunToStun(NAT_ADDR_RESTRICTED, NAT_PORT_RESTRICTED);
965 TEST_F(PortTest, TestARNatToSymNat) {
966 TestStunToStun(NAT_ADDR_RESTRICTED, NAT_SYMMETRIC);
969 TEST_F(PortTest, TestARNatToTurn) {
970 TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_TURN, PROTO_UDP);
973 TEST_F(PortTest, TestARNatToGturn) {
974 TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_GTURN, PROTO_UDP);
977 TEST_F(PortTest, TestARNATNatToTcpGturn) {
978 TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_GTURN, PROTO_TCP);
981 // Port-restricted NAT -> XXXX
982 TEST_F(PortTest, TestPRNatToLocal) {
983 TestStunToLocal(NAT_PORT_RESTRICTED);
986 TEST_F(PortTest, TestPRNatToConeNat) {
987 TestStunToStun(NAT_PORT_RESTRICTED, NAT_OPEN_CONE);
990 TEST_F(PortTest, TestPRNatToARNat) {
991 TestStunToStun(NAT_PORT_RESTRICTED, NAT_ADDR_RESTRICTED);
994 TEST_F(PortTest, TestPRNatToPRNat) {
995 TestStunToStun(NAT_PORT_RESTRICTED, NAT_PORT_RESTRICTED);
998 TEST_F(PortTest, TestPRNatToSymNat) {
1000 TestStunToStun(NAT_PORT_RESTRICTED, NAT_SYMMETRIC);
1003 TEST_F(PortTest, TestPRNatToTurn) {
1004 TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_TURN, PROTO_UDP);
1007 TEST_F(PortTest, TestPRNatToGturn) {
1008 TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_GTURN, PROTO_UDP);
1011 TEST_F(PortTest, TestPRNatToTcpGturn) {
1012 TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_GTURN, PROTO_TCP);
1015 // Symmetric NAT -> XXXX
1016 TEST_F(PortTest, TestSymNatToLocal) {
1017 TestStunToLocal(NAT_SYMMETRIC);
1020 TEST_F(PortTest, TestSymNatToConeNat) {
1021 TestStunToStun(NAT_SYMMETRIC, NAT_OPEN_CONE);
1024 TEST_F(PortTest, TestSymNatToARNat) {
1025 TestStunToStun(NAT_SYMMETRIC, NAT_ADDR_RESTRICTED);
1028 TEST_F(PortTest, TestSymNatToPRNat) {
1030 TestStunToStun(NAT_SYMMETRIC, NAT_PORT_RESTRICTED);
1033 TEST_F(PortTest, TestSymNatToSymNat) {
1035 TestStunToStun(NAT_SYMMETRIC, NAT_SYMMETRIC);
1038 TEST_F(PortTest, TestSymNatToTurn) {
1039 TestStunToRelay(NAT_SYMMETRIC, RELAY_TURN, PROTO_UDP);
1042 TEST_F(PortTest, TestSymNatToGturn) {
1043 TestStunToRelay(NAT_SYMMETRIC, RELAY_GTURN, PROTO_UDP);
1046 TEST_F(PortTest, TestSymNatToTcpGturn) {
1047 TestStunToRelay(NAT_SYMMETRIC, RELAY_GTURN, PROTO_TCP);
1050 // Outbound TCP -> XXXX
1051 TEST_F(PortTest, TestTcpToTcp) {
1055 /* TODO: Enable these once testrelayserver can accept external TCP.
1056 TEST_F(PortTest, TestTcpToTcpRelay) {
1057 TestTcpToRelay(PROTO_TCP);
1060 TEST_F(PortTest, TestTcpToSslTcpRelay) {
1061 TestTcpToRelay(PROTO_SSLTCP);
1065 // Outbound SSLTCP -> XXXX
1066 /* TODO: Enable these once testrelayserver can accept external SSL.
1067 TEST_F(PortTest, TestSslTcpToTcpRelay) {
1068 TestSslTcpToRelay(PROTO_TCP);
1071 TEST_F(PortTest, TestSslTcpToSslTcpRelay) {
1072 TestSslTcpToRelay(PROTO_SSLTCP);
1076 // This test case verifies standard ICE features in STUN messages. Currently it
1077 // verifies Message Integrity attribute in STUN messages and username in STUN
1078 // binding request will have colon (":") between remote and local username.
1079 TEST_F(PortTest, TestLocalToLocalAsIce) {
1080 SetIceProtocolType(cricket::ICEPROTO_RFC5245);
1081 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
1082 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
1083 port1->SetIceTiebreaker(kTiebreaker1);
1084 ASSERT_EQ(cricket::ICEPROTO_RFC5245, port1->IceProtocol());
1085 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
1086 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
1087 port2->SetIceTiebreaker(kTiebreaker2);
1088 ASSERT_EQ(cricket::ICEPROTO_RFC5245, port2->IceProtocol());
1089 // Same parameters as TestLocalToLocal above.
1090 TestConnectivity("udp", port1, "udp", port2, true, true, true, true);
1093 // This test is trying to validate a successful and failure scenario in a
1094 // loopback test when protocol is RFC5245. For success IceTiebreaker, username
1095 // should remain equal to the request generated by the port and role of port
1096 // must be in controlling.
1097 TEST_F(PortTest, TestLoopbackCallAsIce) {
1098 talk_base::scoped_ptr<TestPort> lport(
1099 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1100 lport->SetIceProtocolType(ICEPROTO_RFC5245);
1101 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1102 lport->SetIceTiebreaker(kTiebreaker1);
1103 lport->PrepareAddress();
1104 ASSERT_FALSE(lport->Candidates().empty());
1105 Connection* conn = lport->CreateConnection(lport->Candidates()[0],
1106 Port::ORIGIN_MESSAGE);
1109 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1110 IceMessage* msg = lport->last_stun_msg();
1111 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
1112 conn->OnReadPacket(lport->last_stun_buf()->Data(),
1113 lport->last_stun_buf()->Length(),
1114 talk_base::PacketTime());
1115 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1116 msg = lport->last_stun_msg();
1117 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type());
1119 // If the tiebreaker value is different from port, we expect a error
1122 lport->AddCandidateAddress(kLocalAddr2);
1123 // Creating a different connection as |conn| is in STATE_READABLE.
1124 Connection* conn1 = lport->CreateConnection(lport->Candidates()[1],
1125 Port::ORIGIN_MESSAGE);
1128 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1129 msg = lport->last_stun_msg();
1130 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
1131 talk_base::scoped_ptr<IceMessage> modified_req(
1132 CreateStunMessage(STUN_BINDING_REQUEST));
1133 const StunByteStringAttribute* username_attr = msg->GetByteString(
1134 STUN_ATTR_USERNAME);
1135 modified_req->AddAttribute(new StunByteStringAttribute(
1136 STUN_ATTR_USERNAME, username_attr->GetString()));
1137 // To make sure we receive error response, adding tiebreaker less than
1138 // what's present in request.
1139 modified_req->AddAttribute(new StunUInt64Attribute(
1140 STUN_ATTR_ICE_CONTROLLING, kTiebreaker1 - 1));
1141 modified_req->AddMessageIntegrity("lpass");
1142 modified_req->AddFingerprint();
1145 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1146 WriteStunMessage(modified_req.get(), buf.get());
1147 conn1->OnReadPacket(buf->Data(), buf->Length(), talk_base::PacketTime());
1148 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1149 msg = lport->last_stun_msg();
1150 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type());
1153 // This test verifies role conflict signal is received when there is
1154 // conflict in the role. In this case both ports are in controlling and
1155 // |rport| has higher tiebreaker value than |lport|. Since |lport| has lower
1156 // value of tiebreaker, when it receives ping request from |rport| it will
1157 // send role conflict signal.
1158 TEST_F(PortTest, TestIceRoleConflict) {
1159 talk_base::scoped_ptr<TestPort> lport(
1160 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1161 lport->SetIceProtocolType(ICEPROTO_RFC5245);
1162 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1163 lport->SetIceTiebreaker(kTiebreaker1);
1164 talk_base::scoped_ptr<TestPort> rport(
1165 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1166 rport->SetIceProtocolType(ICEPROTO_RFC5245);
1167 rport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1168 rport->SetIceTiebreaker(kTiebreaker2);
1170 lport->PrepareAddress();
1171 rport->PrepareAddress();
1172 ASSERT_FALSE(lport->Candidates().empty());
1173 ASSERT_FALSE(rport->Candidates().empty());
1174 Connection* lconn = lport->CreateConnection(rport->Candidates()[0],
1175 Port::ORIGIN_MESSAGE);
1176 Connection* rconn = rport->CreateConnection(lport->Candidates()[0],
1177 Port::ORIGIN_MESSAGE);
1180 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000);
1181 IceMessage* msg = rport->last_stun_msg();
1182 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
1183 // Send rport binding request to lport.
1184 lconn->OnReadPacket(rport->last_stun_buf()->Data(),
1185 rport->last_stun_buf()->Length(),
1186 talk_base::PacketTime());
1188 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1189 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type());
1190 EXPECT_TRUE(role_conflict());
1193 TEST_F(PortTest, TestTcpNoDelay) {
1194 TCPPort* port1 = CreateTcpPort(kLocalAddr1);
1195 int option_value = -1;
1196 int success = port1->GetOption(talk_base::Socket::OPT_NODELAY,
1198 ASSERT_EQ(0, success); // GetOption() should complete successfully w/ 0
1199 ASSERT_EQ(1, option_value);
1203 TEST_F(PortTest, TestDelayedBindingUdp) {
1204 FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket();
1205 FakePacketSocketFactory socket_factory;
1207 socket_factory.set_next_udp_socket(socket);
1208 scoped_ptr<UDPPort> port(
1209 CreateUdpPort(kLocalAddr1, &socket_factory));
1211 socket->set_state(AsyncPacketSocket::STATE_BINDING);
1212 port->PrepareAddress();
1214 EXPECT_EQ(0U, port->Candidates().size());
1215 socket->SignalAddressReady(socket, kLocalAddr2);
1217 EXPECT_EQ(1U, port->Candidates().size());
1220 TEST_F(PortTest, TestDelayedBindingTcp) {
1221 FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket();
1222 FakePacketSocketFactory socket_factory;
1224 socket_factory.set_next_server_tcp_socket(socket);
1225 scoped_ptr<TCPPort> port(
1226 CreateTcpPort(kLocalAddr1, &socket_factory));
1228 socket->set_state(AsyncPacketSocket::STATE_BINDING);
1229 port->PrepareAddress();
1231 EXPECT_EQ(0U, port->Candidates().size());
1232 socket->SignalAddressReady(socket, kLocalAddr2);
1234 EXPECT_EQ(1U, port->Candidates().size());
1237 void PortTest::TestCrossFamilyPorts(int type) {
1238 FakePacketSocketFactory factory;
1239 scoped_ptr<Port> ports[4];
1240 SocketAddress addresses[4] = {SocketAddress("192.168.1.3", 0),
1241 SocketAddress("192.168.1.4", 0),
1242 SocketAddress("2001:db8::1", 0),
1243 SocketAddress("2001:db8::2", 0)};
1244 for (int i = 0; i < 4; i++) {
1245 FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket();
1246 if (type == SOCK_DGRAM) {
1247 factory.set_next_udp_socket(socket);
1248 ports[i].reset(CreateUdpPort(addresses[i], &factory));
1249 } else if (type == SOCK_STREAM) {
1250 factory.set_next_server_tcp_socket(socket);
1251 ports[i].reset(CreateTcpPort(addresses[i], &factory));
1253 socket->set_state(AsyncPacketSocket::STATE_BINDING);
1254 socket->SignalAddressReady(socket, addresses[i]);
1255 ports[i]->PrepareAddress();
1258 // IPv4 Port, connects to IPv6 candidate and then to IPv4 candidate.
1259 if (type == SOCK_STREAM) {
1260 FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket();
1261 factory.set_next_client_tcp_socket(clientsocket);
1263 Connection* c = ports[0]->CreateConnection(GetCandidate(ports[2].get()),
1264 Port::ORIGIN_MESSAGE);
1265 EXPECT_TRUE(NULL == c);
1266 EXPECT_EQ(0U, ports[0]->connections().size());
1267 c = ports[0]->CreateConnection(GetCandidate(ports[1].get()),
1268 Port::ORIGIN_MESSAGE);
1269 EXPECT_FALSE(NULL == c);
1270 EXPECT_EQ(1U, ports[0]->connections().size());
1272 // IPv6 Port, connects to IPv4 candidate and to IPv6 candidate.
1273 if (type == SOCK_STREAM) {
1274 FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket();
1275 factory.set_next_client_tcp_socket(clientsocket);
1277 c = ports[2]->CreateConnection(GetCandidate(ports[0].get()),
1278 Port::ORIGIN_MESSAGE);
1279 EXPECT_TRUE(NULL == c);
1280 EXPECT_EQ(0U, ports[2]->connections().size());
1281 c = ports[2]->CreateConnection(GetCandidate(ports[3].get()),
1282 Port::ORIGIN_MESSAGE);
1283 EXPECT_FALSE(NULL == c);
1284 EXPECT_EQ(1U, ports[2]->connections().size());
1287 TEST_F(PortTest, TestSkipCrossFamilyTcp) {
1288 TestCrossFamilyPorts(SOCK_STREAM);
1291 TEST_F(PortTest, TestSkipCrossFamilyUdp) {
1292 TestCrossFamilyPorts(SOCK_DGRAM);
1295 // This test verifies DSCP value set through SetOption interface can be
1296 // get through DefaultDscpValue.
1297 TEST_F(PortTest, TestDefaultDscpValue) {
1299 talk_base::scoped_ptr<UDPPort> udpport(CreateUdpPort(kLocalAddr1));
1300 EXPECT_EQ(0, udpport->SetOption(talk_base::Socket::OPT_DSCP,
1301 talk_base::DSCP_CS6));
1302 EXPECT_EQ(0, udpport->GetOption(talk_base::Socket::OPT_DSCP, &dscp));
1303 talk_base::scoped_ptr<TCPPort> tcpport(CreateTcpPort(kLocalAddr1));
1304 EXPECT_EQ(0, tcpport->SetOption(talk_base::Socket::OPT_DSCP,
1305 talk_base::DSCP_AF31));
1306 EXPECT_EQ(0, tcpport->GetOption(talk_base::Socket::OPT_DSCP, &dscp));
1307 EXPECT_EQ(talk_base::DSCP_AF31, dscp);
1308 talk_base::scoped_ptr<StunPort> stunport(
1309 CreateStunPort(kLocalAddr1, nat_socket_factory1()));
1310 EXPECT_EQ(0, stunport->SetOption(talk_base::Socket::OPT_DSCP,
1311 talk_base::DSCP_AF41));
1312 EXPECT_EQ(0, stunport->GetOption(talk_base::Socket::OPT_DSCP, &dscp));
1313 EXPECT_EQ(talk_base::DSCP_AF41, dscp);
1314 talk_base::scoped_ptr<TurnPort> turnport1(CreateTurnPort(
1315 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
1316 // Socket is created in PrepareAddress.
1317 turnport1->PrepareAddress();
1318 EXPECT_EQ(0, turnport1->SetOption(talk_base::Socket::OPT_DSCP,
1319 talk_base::DSCP_CS7));
1320 EXPECT_EQ(0, turnport1->GetOption(talk_base::Socket::OPT_DSCP, &dscp));
1321 EXPECT_EQ(talk_base::DSCP_CS7, dscp);
1322 // This will verify correct value returned without the socket.
1323 talk_base::scoped_ptr<TurnPort> turnport2(CreateTurnPort(
1324 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
1325 EXPECT_EQ(0, turnport2->SetOption(talk_base::Socket::OPT_DSCP,
1326 talk_base::DSCP_CS6));
1327 EXPECT_EQ(0, turnport2->GetOption(talk_base::Socket::OPT_DSCP, &dscp));
1328 EXPECT_EQ(talk_base::DSCP_CS6, dscp);
1331 // Test sending STUN messages in GICE format.
1332 TEST_F(PortTest, TestSendStunMessageAsGice) {
1333 talk_base::scoped_ptr<TestPort> lport(
1334 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1335 talk_base::scoped_ptr<TestPort> rport(
1336 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1337 lport->SetIceProtocolType(ICEPROTO_GOOGLE);
1338 rport->SetIceProtocolType(ICEPROTO_GOOGLE);
1340 // Send a fake ping from lport to rport.
1341 lport->PrepareAddress();
1342 rport->PrepareAddress();
1343 ASSERT_FALSE(rport->Candidates().empty());
1344 Connection* conn = lport->CreateConnection(rport->Candidates()[0],
1345 Port::ORIGIN_MESSAGE);
1346 rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE);
1349 // Check that it's a proper BINDING-REQUEST.
1350 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1351 IceMessage* msg = lport->last_stun_msg();
1352 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
1353 EXPECT_FALSE(msg->IsLegacy());
1354 const StunByteStringAttribute* username_attr = msg->GetByteString(
1355 STUN_ATTR_USERNAME);
1356 ASSERT_TRUE(username_attr != NULL);
1357 EXPECT_EQ("rfraglfrag", username_attr->GetString());
1358 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL);
1359 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
1360 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL);
1362 // Save a copy of the BINDING-REQUEST for use below.
1363 talk_base::scoped_ptr<IceMessage> request(CopyStunMessage(msg));
1365 // Respond with a BINDING-RESPONSE.
1366 rport->SendBindingResponse(request.get(), lport->Candidates()[0].address());
1367 msg = rport->last_stun_msg();
1368 ASSERT_TRUE(msg != NULL);
1369 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type());
1370 EXPECT_FALSE(msg->IsLegacy());
1371 username_attr = msg->GetByteString(STUN_ATTR_USERNAME);
1372 ASSERT_TRUE(username_attr != NULL); // GICE has a username in the response.
1373 EXPECT_EQ("rfraglfrag", username_attr->GetString());
1374 const StunAddressAttribute* addr_attr = msg->GetAddress(
1375 STUN_ATTR_MAPPED_ADDRESS);
1376 ASSERT_TRUE(addr_attr != NULL);
1377 EXPECT_EQ(lport->Candidates()[0].address(), addr_attr->GetAddress());
1378 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_XOR_MAPPED_ADDRESS) == NULL);
1379 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL);
1380 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
1381 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL);
1383 // Respond with a BINDING-ERROR-RESPONSE. This wouldn't happen in real life,
1384 // but we can do it here.
1385 rport->SendBindingErrorResponse(request.get(),
1386 rport->Candidates()[0].address(),
1387 STUN_ERROR_SERVER_ERROR,
1388 STUN_ERROR_REASON_SERVER_ERROR);
1389 msg = rport->last_stun_msg();
1390 ASSERT_TRUE(msg != NULL);
1391 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type());
1392 EXPECT_FALSE(msg->IsLegacy());
1393 username_attr = msg->GetByteString(STUN_ATTR_USERNAME);
1394 ASSERT_TRUE(username_attr != NULL); // GICE has a username in the response.
1395 EXPECT_EQ("rfraglfrag", username_attr->GetString());
1396 const StunErrorCodeAttribute* error_attr = msg->GetErrorCode();
1397 ASSERT_TRUE(error_attr != NULL);
1398 // The GICE wire format for error codes is incorrect.
1399 EXPECT_EQ(STUN_ERROR_SERVER_ERROR_AS_GICE, error_attr->code());
1400 EXPECT_EQ(STUN_ERROR_SERVER_ERROR / 256, error_attr->eclass());
1401 EXPECT_EQ(STUN_ERROR_SERVER_ERROR % 256, error_attr->number());
1402 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), error_attr->reason());
1403 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
1404 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL);
1405 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL);
1408 // Test sending STUN messages in ICE format.
1409 TEST_F(PortTest, TestSendStunMessageAsIce) {
1410 talk_base::scoped_ptr<TestPort> lport(
1411 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1412 talk_base::scoped_ptr<TestPort> rport(
1413 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1414 lport->SetIceProtocolType(ICEPROTO_RFC5245);
1415 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1416 lport->SetIceTiebreaker(kTiebreaker1);
1417 rport->SetIceProtocolType(ICEPROTO_RFC5245);
1418 rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
1419 rport->SetIceTiebreaker(kTiebreaker2);
1421 // Send a fake ping from lport to rport.
1422 lport->PrepareAddress();
1423 rport->PrepareAddress();
1424 ASSERT_FALSE(rport->Candidates().empty());
1425 Connection* lconn = lport->CreateConnection(
1426 rport->Candidates()[0], Port::ORIGIN_MESSAGE);
1427 Connection* rconn = rport->CreateConnection(
1428 lport->Candidates()[0], Port::ORIGIN_MESSAGE);
1431 // Check that it's a proper BINDING-REQUEST.
1432 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1433 IceMessage* msg = lport->last_stun_msg();
1434 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
1435 EXPECT_FALSE(msg->IsLegacy());
1436 const StunByteStringAttribute* username_attr =
1437 msg->GetByteString(STUN_ATTR_USERNAME);
1438 ASSERT_TRUE(username_attr != NULL);
1439 const StunUInt32Attribute* priority_attr = msg->GetUInt32(STUN_ATTR_PRIORITY);
1440 ASSERT_TRUE(priority_attr != NULL);
1441 EXPECT_EQ(kDefaultPrflxPriority, priority_attr->value());
1442 EXPECT_EQ("rfrag:lfrag", username_attr->GetString());
1443 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
1444 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
1445 lport->last_stun_buf()->Data(), lport->last_stun_buf()->Length(),
1447 const StunUInt64Attribute* ice_controlling_attr =
1448 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING);
1449 ASSERT_TRUE(ice_controlling_attr != NULL);
1450 EXPECT_EQ(lport->IceTiebreaker(), ice_controlling_attr->value());
1451 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == NULL);
1452 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL);
1453 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL);
1454 EXPECT_TRUE(StunMessage::ValidateFingerprint(
1455 lport->last_stun_buf()->Data(), lport->last_stun_buf()->Length()));
1457 // Request should not include ping count.
1458 ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == NULL);
1460 // Save a copy of the BINDING-REQUEST for use below.
1461 talk_base::scoped_ptr<IceMessage> request(CopyStunMessage(msg));
1463 // Respond with a BINDING-RESPONSE.
1464 rport->SendBindingResponse(request.get(), lport->Candidates()[0].address());
1465 msg = rport->last_stun_msg();
1466 ASSERT_TRUE(msg != NULL);
1467 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type());
1470 EXPECT_FALSE(msg->IsLegacy());
1471 const StunAddressAttribute* addr_attr = msg->GetAddress(
1472 STUN_ATTR_XOR_MAPPED_ADDRESS);
1473 ASSERT_TRUE(addr_attr != NULL);
1474 EXPECT_EQ(lport->Candidates()[0].address(), addr_attr->GetAddress());
1475 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
1476 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
1477 rport->last_stun_buf()->Data(), rport->last_stun_buf()->Length(),
1479 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL);
1480 EXPECT_TRUE(StunMessage::ValidateFingerprint(
1481 lport->last_stun_buf()->Data(), lport->last_stun_buf()->Length()));
1482 // No USERNAME or PRIORITY in ICE responses.
1483 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == NULL);
1484 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
1485 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MAPPED_ADDRESS) == NULL);
1486 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLING) == NULL);
1487 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == NULL);
1488 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL);
1490 // Response should not include ping count.
1491 ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == NULL);
1493 // Respond with a BINDING-ERROR-RESPONSE. This wouldn't happen in real life,
1494 // but we can do it here.
1495 rport->SendBindingErrorResponse(request.get(),
1496 lport->Candidates()[0].address(),
1497 STUN_ERROR_SERVER_ERROR,
1498 STUN_ERROR_REASON_SERVER_ERROR);
1499 msg = rport->last_stun_msg();
1500 ASSERT_TRUE(msg != NULL);
1501 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type());
1502 EXPECT_FALSE(msg->IsLegacy());
1503 const StunErrorCodeAttribute* error_attr = msg->GetErrorCode();
1504 ASSERT_TRUE(error_attr != NULL);
1505 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, error_attr->code());
1506 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), error_attr->reason());
1507 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL);
1508 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity(
1509 rport->last_stun_buf()->Data(), rport->last_stun_buf()->Length(),
1511 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL);
1512 EXPECT_TRUE(StunMessage::ValidateFingerprint(
1513 lport->last_stun_buf()->Data(), lport->last_stun_buf()->Length()));
1514 // No USERNAME with ICE.
1515 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == NULL);
1516 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
1518 // Testing STUN binding requests from rport --> lport, having ICE_CONTROLLED
1519 // and (incremented) RETRANSMIT_COUNT attributes.
1521 rport->set_send_retransmit_count_attribute(true);
1525 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000);
1526 msg = rport->last_stun_msg();
1527 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
1528 const StunUInt64Attribute* ice_controlled_attr =
1529 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLED);
1530 ASSERT_TRUE(ice_controlled_attr != NULL);
1531 EXPECT_EQ(rport->IceTiebreaker(), ice_controlled_attr->value());
1532 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL);
1534 // Request should include ping count.
1535 const StunUInt32Attribute* retransmit_attr =
1536 msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT);
1537 ASSERT_TRUE(retransmit_attr != NULL);
1538 EXPECT_EQ(2U, retransmit_attr->value());
1540 // Respond with a BINDING-RESPONSE.
1541 request.reset(CopyStunMessage(msg));
1542 lport->SendBindingResponse(request.get(), rport->Candidates()[0].address());
1543 msg = lport->last_stun_msg();
1545 // Response should include same ping count.
1546 retransmit_attr = msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT);
1547 ASSERT_TRUE(retransmit_attr != NULL);
1548 EXPECT_EQ(2U, retransmit_attr->value());
1551 TEST_F(PortTest, TestUseCandidateAttribute) {
1552 talk_base::scoped_ptr<TestPort> lport(
1553 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1554 talk_base::scoped_ptr<TestPort> rport(
1555 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1556 lport->SetIceProtocolType(ICEPROTO_RFC5245);
1557 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1558 lport->SetIceTiebreaker(kTiebreaker1);
1559 rport->SetIceProtocolType(ICEPROTO_RFC5245);
1560 rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
1561 rport->SetIceTiebreaker(kTiebreaker2);
1563 // Send a fake ping from lport to rport.
1564 lport->PrepareAddress();
1565 rport->PrepareAddress();
1566 ASSERT_FALSE(rport->Candidates().empty());
1567 Connection* lconn = lport->CreateConnection(
1568 rport->Candidates()[0], Port::ORIGIN_MESSAGE);
1570 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1571 IceMessage* msg = lport->last_stun_msg();
1572 const StunUInt64Attribute* ice_controlling_attr =
1573 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING);
1574 ASSERT_TRUE(ice_controlling_attr != NULL);
1575 const StunByteStringAttribute* use_candidate_attr = msg->GetByteString(
1576 STUN_ATTR_USE_CANDIDATE);
1577 ASSERT_TRUE(use_candidate_attr != NULL);
1580 // Test handling STUN messages in GICE format.
1581 TEST_F(PortTest, TestHandleStunMessageAsGice) {
1582 // Our port will act as the "remote" port.
1583 talk_base::scoped_ptr<TestPort> port(
1584 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1585 port->SetIceProtocolType(ICEPROTO_GOOGLE);
1587 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1588 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1589 talk_base::SocketAddress addr(kLocalAddr1);
1590 std::string username;
1592 // BINDING-REQUEST from local to remote with valid GICE username and no M-I.
1593 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1595 WriteStunMessage(in_msg.get(), buf.get());
1596 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1597 out_msg.accept(), &username));
1598 EXPECT_TRUE(out_msg.get() != NULL); // Succeeds, since this is GICE.
1599 EXPECT_EQ("lfrag", username);
1601 // Add M-I; should be ignored and rest of message parsed normally.
1602 in_msg->AddMessageIntegrity("password");
1603 WriteStunMessage(in_msg.get(), buf.get());
1604 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1605 out_msg.accept(), &username));
1606 EXPECT_TRUE(out_msg.get() != NULL);
1607 EXPECT_EQ("lfrag", username);
1609 // BINDING-RESPONSE with username, as done in GICE. Should succeed.
1610 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_RESPONSE,
1612 in_msg->AddAttribute(
1613 new StunAddressAttribute(STUN_ATTR_MAPPED_ADDRESS, kLocalAddr2));
1614 WriteStunMessage(in_msg.get(), buf.get());
1615 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1616 out_msg.accept(), &username));
1617 EXPECT_TRUE(out_msg.get() != NULL);
1618 EXPECT_EQ("", username);
1620 // BINDING-RESPONSE without username. Should be tolerated as well.
1621 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE));
1622 in_msg->AddAttribute(
1623 new StunAddressAttribute(STUN_ATTR_MAPPED_ADDRESS, kLocalAddr2));
1624 WriteStunMessage(in_msg.get(), buf.get());
1625 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1626 out_msg.accept(), &username));
1627 EXPECT_TRUE(out_msg.get() != NULL);
1628 EXPECT_EQ("", username);
1630 // BINDING-ERROR-RESPONSE with username and error code.
1631 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_ERROR_RESPONSE,
1633 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE,
1634 STUN_ERROR_SERVER_ERROR_AS_GICE, STUN_ERROR_REASON_SERVER_ERROR));
1635 WriteStunMessage(in_msg.get(), buf.get());
1636 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1637 out_msg.accept(), &username));
1638 ASSERT_TRUE(out_msg.get() != NULL);
1639 EXPECT_EQ("", username);
1640 ASSERT_TRUE(out_msg->GetErrorCode() != NULL);
1641 // GetStunMessage doesn't unmunge the GICE error code (happens downstream).
1642 EXPECT_EQ(STUN_ERROR_SERVER_ERROR_AS_GICE, out_msg->GetErrorCode()->code());
1643 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR),
1644 out_msg->GetErrorCode()->reason());
1647 // Test handling STUN messages in ICE format.
1648 TEST_F(PortTest, TestHandleStunMessageAsIce) {
1649 // Our port will act as the "remote" port.
1650 talk_base::scoped_ptr<TestPort> port(
1651 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1652 port->SetIceProtocolType(ICEPROTO_RFC5245);
1654 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1655 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1656 talk_base::SocketAddress addr(kLocalAddr1);
1657 std::string username;
1659 // BINDING-REQUEST from local to remote with valid ICE username,
1660 // MESSAGE-INTEGRITY, and FINGERPRINT.
1661 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1663 in_msg->AddMessageIntegrity("rpass");
1664 in_msg->AddFingerprint();
1665 WriteStunMessage(in_msg.get(), buf.get());
1666 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1667 out_msg.accept(), &username));
1668 EXPECT_TRUE(out_msg.get() != NULL);
1669 EXPECT_EQ("lfrag", username);
1671 // BINDING-RESPONSE without username, with MESSAGE-INTEGRITY and FINGERPRINT.
1672 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE));
1673 in_msg->AddAttribute(
1674 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2));
1675 in_msg->AddMessageIntegrity("rpass");
1676 in_msg->AddFingerprint();
1677 WriteStunMessage(in_msg.get(), buf.get());
1678 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1679 out_msg.accept(), &username));
1680 EXPECT_TRUE(out_msg.get() != NULL);
1681 EXPECT_EQ("", username);
1683 // BINDING-ERROR-RESPONSE without username, with error, M-I, and FINGERPRINT.
1684 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE));
1685 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE,
1686 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR));
1687 in_msg->AddFingerprint();
1688 WriteStunMessage(in_msg.get(), buf.get());
1689 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1690 out_msg.accept(), &username));
1691 EXPECT_TRUE(out_msg.get() != NULL);
1692 EXPECT_EQ("", username);
1693 ASSERT_TRUE(out_msg->GetErrorCode() != NULL);
1694 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code());
1695 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR),
1696 out_msg->GetErrorCode()->reason());
1699 // This test verifies port can handle ICE messages in Hybrid mode and switches
1700 // ICEPROTO_RFC5245 mode after successfully handling the message.
1701 TEST_F(PortTest, TestHandleStunMessageAsIceInHybridMode) {
1702 // Our port will act as the "remote" port.
1703 talk_base::scoped_ptr<TestPort> port(
1704 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1705 port->SetIceProtocolType(ICEPROTO_HYBRID);
1707 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1708 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1709 talk_base::SocketAddress addr(kLocalAddr1);
1710 std::string username;
1712 // BINDING-REQUEST from local to remote with valid ICE username,
1713 // MESSAGE-INTEGRITY, and FINGERPRINT.
1714 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1716 in_msg->AddMessageIntegrity("rpass");
1717 in_msg->AddFingerprint();
1718 WriteStunMessage(in_msg.get(), buf.get());
1719 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1720 out_msg.accept(), &username));
1721 EXPECT_TRUE(out_msg.get() != NULL);
1722 EXPECT_EQ("lfrag", username);
1723 EXPECT_EQ(ICEPROTO_RFC5245, port->IceProtocol());
1726 // This test verifies port can handle GICE messages in Hybrid mode and switches
1727 // ICEPROTO_GOOGLE mode after successfully handling the message.
1728 TEST_F(PortTest, TestHandleStunMessageAsGiceInHybridMode) {
1729 // Our port will act as the "remote" port.
1730 talk_base::scoped_ptr<TestPort> port(
1731 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1732 port->SetIceProtocolType(ICEPROTO_HYBRID);
1734 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1735 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1736 talk_base::SocketAddress addr(kLocalAddr1);
1737 std::string username;
1739 // BINDING-REQUEST from local to remote with valid GICE username and no M-I.
1740 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1742 WriteStunMessage(in_msg.get(), buf.get());
1743 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1744 out_msg.accept(), &username));
1745 EXPECT_TRUE(out_msg.get() != NULL); // Succeeds, since this is GICE.
1746 EXPECT_EQ("lfrag", username);
1747 EXPECT_EQ(ICEPROTO_GOOGLE, port->IceProtocol());
1750 // Verify port is not switched out of RFC5245 mode if GICE message is received
1752 TEST_F(PortTest, TestHandleStunMessageAsGiceInIceMode) {
1753 // Our port will act as the "remote" port.
1754 talk_base::scoped_ptr<TestPort> port(
1755 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1756 port->SetIceProtocolType(ICEPROTO_RFC5245);
1758 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1759 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1760 talk_base::SocketAddress addr(kLocalAddr1);
1761 std::string username;
1763 // BINDING-REQUEST from local to remote with valid GICE username and no M-I.
1764 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1766 WriteStunMessage(in_msg.get(), buf.get());
1767 // Should fail as there is no MI and fingerprint.
1768 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1769 out_msg.accept(), &username));
1770 EXPECT_EQ(ICEPROTO_RFC5245, port->IceProtocol());
1774 // Tests handling of GICE binding requests with missing or incorrect usernames.
1775 TEST_F(PortTest, TestHandleStunMessageAsGiceBadUsername) {
1776 talk_base::scoped_ptr<TestPort> port(
1777 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1778 port->SetIceProtocolType(ICEPROTO_GOOGLE);
1780 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1781 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1782 talk_base::SocketAddress addr(kLocalAddr1);
1783 std::string username;
1785 // BINDING-REQUEST with no username.
1786 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST));
1787 WriteStunMessage(in_msg.get(), buf.get());
1788 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1789 out_msg.accept(), &username));
1790 EXPECT_TRUE(out_msg.get() == NULL);
1791 EXPECT_EQ("", username);
1792 EXPECT_EQ(STUN_ERROR_BAD_REQUEST_AS_GICE, port->last_stun_error_code());
1794 // BINDING-REQUEST with empty username.
1795 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, ""));
1796 WriteStunMessage(in_msg.get(), buf.get());
1797 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1798 out_msg.accept(), &username));
1799 EXPECT_TRUE(out_msg.get() == NULL);
1800 EXPECT_EQ("", username);
1801 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code());
1803 // BINDING-REQUEST with too-short username.
1804 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "lfra"));
1805 WriteStunMessage(in_msg.get(), buf.get());
1806 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1807 out_msg.accept(), &username));
1808 EXPECT_TRUE(out_msg.get() == NULL);
1809 EXPECT_EQ("", username);
1810 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code());
1812 // BINDING-REQUEST with reversed username.
1813 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1815 WriteStunMessage(in_msg.get(), buf.get());
1816 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1817 out_msg.accept(), &username));
1818 EXPECT_TRUE(out_msg.get() == NULL);
1819 EXPECT_EQ("", username);
1820 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code());
1822 // BINDING-REQUEST with garbage username.
1823 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1825 WriteStunMessage(in_msg.get(), buf.get());
1826 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1827 out_msg.accept(), &username));
1828 EXPECT_TRUE(out_msg.get() == NULL);
1829 EXPECT_EQ("", username);
1830 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code());
1833 // Tests handling of ICE binding requests with missing or incorrect usernames.
1834 TEST_F(PortTest, TestHandleStunMessageAsIceBadUsername) {
1835 talk_base::scoped_ptr<TestPort> port(
1836 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1837 port->SetIceProtocolType(ICEPROTO_RFC5245);
1839 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1840 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1841 talk_base::SocketAddress addr(kLocalAddr1);
1842 std::string username;
1844 // BINDING-REQUEST with no username.
1845 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST));
1846 in_msg->AddMessageIntegrity("rpass");
1847 in_msg->AddFingerprint();
1848 WriteStunMessage(in_msg.get(), buf.get());
1849 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1850 out_msg.accept(), &username));
1851 EXPECT_TRUE(out_msg.get() == NULL);
1852 EXPECT_EQ("", username);
1853 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code());
1855 // BINDING-REQUEST with empty username.
1856 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, ""));
1857 in_msg->AddMessageIntegrity("rpass");
1858 in_msg->AddFingerprint();
1859 WriteStunMessage(in_msg.get(), buf.get());
1860 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1861 out_msg.accept(), &username));
1862 EXPECT_TRUE(out_msg.get() == NULL);
1863 EXPECT_EQ("", username);
1864 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
1866 // BINDING-REQUEST with too-short username.
1867 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "rfra"));
1868 in_msg->AddMessageIntegrity("rpass");
1869 in_msg->AddFingerprint();
1870 WriteStunMessage(in_msg.get(), buf.get());
1871 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1872 out_msg.accept(), &username));
1873 EXPECT_TRUE(out_msg.get() == NULL);
1874 EXPECT_EQ("", username);
1875 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
1877 // BINDING-REQUEST with reversed username.
1878 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1880 in_msg->AddMessageIntegrity("rpass");
1881 in_msg->AddFingerprint();
1882 WriteStunMessage(in_msg.get(), buf.get());
1883 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1884 out_msg.accept(), &username));
1885 EXPECT_TRUE(out_msg.get() == NULL);
1886 EXPECT_EQ("", username);
1887 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
1889 // BINDING-REQUEST with garbage username.
1890 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1892 in_msg->AddMessageIntegrity("rpass");
1893 in_msg->AddFingerprint();
1894 WriteStunMessage(in_msg.get(), buf.get());
1895 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1896 out_msg.accept(), &username));
1897 EXPECT_TRUE(out_msg.get() == NULL);
1898 EXPECT_EQ("", username);
1899 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
1902 // Test handling STUN messages (as ICE) with missing or malformed M-I.
1903 TEST_F(PortTest, TestHandleStunMessageAsIceBadMessageIntegrity) {
1904 // Our port will act as the "remote" port.
1905 talk_base::scoped_ptr<TestPort> port(
1906 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1907 port->SetIceProtocolType(ICEPROTO_RFC5245);
1909 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1910 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1911 talk_base::SocketAddress addr(kLocalAddr1);
1912 std::string username;
1914 // BINDING-REQUEST from local to remote with valid ICE username and
1915 // FINGERPRINT, but no MESSAGE-INTEGRITY.
1916 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1918 in_msg->AddFingerprint();
1919 WriteStunMessage(in_msg.get(), buf.get());
1920 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1921 out_msg.accept(), &username));
1922 EXPECT_TRUE(out_msg.get() == NULL);
1923 EXPECT_EQ("", username);
1924 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code());
1926 // BINDING-REQUEST from local to remote with valid ICE username and
1927 // FINGERPRINT, but invalid MESSAGE-INTEGRITY.
1928 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1930 in_msg->AddMessageIntegrity("invalid");
1931 in_msg->AddFingerprint();
1932 WriteStunMessage(in_msg.get(), buf.get());
1933 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1934 out_msg.accept(), &username));
1935 EXPECT_TRUE(out_msg.get() == NULL);
1936 EXPECT_EQ("", username);
1937 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
1939 // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked
1940 // by the Connection, not the Port, since they require the remote username.
1941 // Change this test to pass in data via Connection::OnReadPacket instead.
1944 // Test handling STUN messages (as ICE) with missing or malformed FINGERPRINT.
1945 TEST_F(PortTest, TestHandleStunMessageAsIceBadFingerprint) {
1946 // Our port will act as the "remote" port.
1947 talk_base::scoped_ptr<TestPort> port(
1948 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1949 port->SetIceProtocolType(ICEPROTO_RFC5245);
1951 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
1952 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1953 talk_base::SocketAddress addr(kLocalAddr1);
1954 std::string username;
1956 // BINDING-REQUEST from local to remote with valid ICE username and
1957 // MESSAGE-INTEGRITY, but no FINGERPRINT; GetStunMessage should fail.
1958 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1960 in_msg->AddMessageIntegrity("rpass");
1961 WriteStunMessage(in_msg.get(), buf.get());
1962 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1963 out_msg.accept(), &username));
1964 EXPECT_EQ(0, port->last_stun_error_code());
1966 // Now, add a fingerprint, but munge the message so it's not valid.
1967 in_msg->AddFingerprint();
1968 in_msg->SetTransactionID("TESTTESTBADD");
1969 WriteStunMessage(in_msg.get(), buf.get());
1970 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1971 out_msg.accept(), &username));
1972 EXPECT_EQ(0, port->last_stun_error_code());
1974 // Valid BINDING-RESPONSE, except no FINGERPRINT.
1975 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE));
1976 in_msg->AddAttribute(
1977 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2));
1978 in_msg->AddMessageIntegrity("rpass");
1979 WriteStunMessage(in_msg.get(), buf.get());
1980 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1981 out_msg.accept(), &username));
1982 EXPECT_EQ(0, port->last_stun_error_code());
1984 // Now, add a fingerprint, but munge the message so it's not valid.
1985 in_msg->AddFingerprint();
1986 in_msg->SetTransactionID("TESTTESTBADD");
1987 WriteStunMessage(in_msg.get(), buf.get());
1988 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1989 out_msg.accept(), &username));
1990 EXPECT_EQ(0, port->last_stun_error_code());
1992 // Valid BINDING-ERROR-RESPONSE, except no FINGERPRINT.
1993 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE));
1994 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE,
1995 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR));
1996 in_msg->AddMessageIntegrity("rpass");
1997 WriteStunMessage(in_msg.get(), buf.get());
1998 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1999 out_msg.accept(), &username));
2000 EXPECT_EQ(0, port->last_stun_error_code());
2002 // Now, add a fingerprint, but munge the message so it's not valid.
2003 in_msg->AddFingerprint();
2004 in_msg->SetTransactionID("TESTTESTBADD");
2005 WriteStunMessage(in_msg.get(), buf.get());
2006 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2007 out_msg.accept(), &username));
2008 EXPECT_EQ(0, port->last_stun_error_code());
2011 // Test handling of STUN binding indication messages (as ICE). STUN binding
2012 // indications are allowed only to the connection which is in read mode.
2013 TEST_F(PortTest, TestHandleStunBindingIndication) {
2014 talk_base::scoped_ptr<TestPort> lport(
2015 CreateTestPort(kLocalAddr2, "lfrag", "lpass"));
2016 lport->SetIceProtocolType(ICEPROTO_RFC5245);
2017 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
2018 lport->SetIceTiebreaker(kTiebreaker1);
2020 // Verifying encoding and decoding STUN indication message.
2021 talk_base::scoped_ptr<IceMessage> in_msg, out_msg;
2022 talk_base::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
2023 talk_base::SocketAddress addr(kLocalAddr1);
2024 std::string username;
2026 in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION));
2027 in_msg->AddFingerprint();
2028 WriteStunMessage(in_msg.get(), buf.get());
2029 EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr,
2030 out_msg.accept(), &username));
2031 EXPECT_TRUE(out_msg.get() != NULL);
2032 EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION);
2033 EXPECT_EQ("", username);
2035 // Verify connection can handle STUN indication and updates
2036 // last_ping_received.
2037 talk_base::scoped_ptr<TestPort> rport(
2038 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
2039 rport->SetIceProtocolType(ICEPROTO_RFC5245);
2040 rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
2041 rport->SetIceTiebreaker(kTiebreaker2);
2043 lport->PrepareAddress();
2044 rport->PrepareAddress();
2045 ASSERT_FALSE(lport->Candidates().empty());
2046 ASSERT_FALSE(rport->Candidates().empty());
2048 Connection* lconn = lport->CreateConnection(rport->Candidates()[0],
2049 Port::ORIGIN_MESSAGE);
2050 Connection* rconn = rport->CreateConnection(lport->Candidates()[0],
2051 Port::ORIGIN_MESSAGE);
2054 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000);
2055 IceMessage* msg = rport->last_stun_msg();
2056 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
2057 // Send rport binding request to lport.
2058 lconn->OnReadPacket(rport->last_stun_buf()->Data(),
2059 rport->last_stun_buf()->Length(),
2060 talk_base::PacketTime());
2061 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
2062 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type());
2063 uint32 last_ping_received1 = lconn->last_ping_received();
2065 // Adding a delay of 100ms.
2066 talk_base::Thread::Current()->ProcessMessages(100);
2067 // Pinging lconn using stun indication message.
2068 lconn->OnReadPacket(buf->Data(), buf->Length(), talk_base::PacketTime());
2069 uint32 last_ping_received2 = lconn->last_ping_received();
2070 EXPECT_GT(last_ping_received2, last_ping_received1);
2073 TEST_F(PortTest, TestComputeCandidatePriority) {
2074 talk_base::scoped_ptr<TestPort> port(
2075 CreateTestPort(kLocalAddr1, "name", "pass"));
2076 port->set_type_preference(90);
2077 port->set_component(177);
2078 port->AddCandidateAddress(SocketAddress("192.168.1.4", 1234));
2079 port->AddCandidateAddress(SocketAddress("2001:db8::1234", 1234));
2080 port->AddCandidateAddress(SocketAddress("fc12:3456::1234", 1234));
2081 port->AddCandidateAddress(SocketAddress("::ffff:192.168.1.4", 1234));
2082 port->AddCandidateAddress(SocketAddress("::192.168.1.4", 1234));
2083 port->AddCandidateAddress(SocketAddress("2002::1234:5678", 1234));
2084 port->AddCandidateAddress(SocketAddress("2001::1234:5678", 1234));
2085 port->AddCandidateAddress(SocketAddress("fecf::1234:5678", 1234));
2086 port->AddCandidateAddress(SocketAddress("3ffe::1234:5678", 1234));
2087 // These should all be:
2088 // (90 << 24) | ([rfc3484 pref value] << 8) | (256 - 177)
2089 uint32 expected_priority_v4 = 1509957199U;
2090 uint32 expected_priority_v6 = 1509959759U;
2091 uint32 expected_priority_ula = 1509962319U;
2092 uint32 expected_priority_v4mapped = expected_priority_v4;
2093 uint32 expected_priority_v4compat = 1509949775U;
2094 uint32 expected_priority_6to4 = 1509954639U;
2095 uint32 expected_priority_teredo = 1509952079U;
2096 uint32 expected_priority_sitelocal = 1509949775U;
2097 uint32 expected_priority_6bone = 1509949775U;
2098 ASSERT_EQ(expected_priority_v4, port->Candidates()[0].priority());
2099 ASSERT_EQ(expected_priority_v6, port->Candidates()[1].priority());
2100 ASSERT_EQ(expected_priority_ula, port->Candidates()[2].priority());
2101 ASSERT_EQ(expected_priority_v4mapped, port->Candidates()[3].priority());
2102 ASSERT_EQ(expected_priority_v4compat, port->Candidates()[4].priority());
2103 ASSERT_EQ(expected_priority_6to4, port->Candidates()[5].priority());
2104 ASSERT_EQ(expected_priority_teredo, port->Candidates()[6].priority());
2105 ASSERT_EQ(expected_priority_sitelocal, port->Candidates()[7].priority());
2106 ASSERT_EQ(expected_priority_6bone, port->Candidates()[8].priority());
2109 TEST_F(PortTest, TestPortProxyProperties) {
2110 talk_base::scoped_ptr<TestPort> port(
2111 CreateTestPort(kLocalAddr1, "name", "pass"));
2112 port->SetIceRole(cricket::ICEROLE_CONTROLLING);
2113 port->SetIceTiebreaker(kTiebreaker1);
2115 // Create a proxy port.
2116 talk_base::scoped_ptr<PortProxy> proxy(new PortProxy());
2117 proxy->set_impl(port.get());
2118 EXPECT_EQ(port->Type(), proxy->Type());
2119 EXPECT_EQ(port->Network(), proxy->Network());
2120 EXPECT_EQ(port->GetIceRole(), proxy->GetIceRole());
2121 EXPECT_EQ(port->IceTiebreaker(), proxy->IceTiebreaker());
2124 // In the case of shared socket, one port may be shared by local and stun.
2125 // Test that candidates with different types will have different foundation.
2126 TEST_F(PortTest, TestFoundation) {
2127 talk_base::scoped_ptr<TestPort> testport(
2128 CreateTestPort(kLocalAddr1, "name", "pass"));
2129 testport->AddCandidateAddress(kLocalAddr1, kLocalAddr1,
2131 cricket::ICE_TYPE_PREFERENCE_HOST, false);
2132 testport->AddCandidateAddress(kLocalAddr2, kLocalAddr1,
2134 cricket::ICE_TYPE_PREFERENCE_SRFLX, true);
2135 EXPECT_NE(testport->Candidates()[0].foundation(),
2136 testport->Candidates()[1].foundation());
2139 // This test verifies the foundation of different types of ICE candidates.
2140 TEST_F(PortTest, TestCandidateFoundation) {
2141 talk_base::scoped_ptr<talk_base::NATServer> nat_server(
2142 CreateNatServer(kNatAddr1, NAT_OPEN_CONE));
2143 talk_base::scoped_ptr<UDPPort> udpport1(CreateUdpPort(kLocalAddr1));
2144 udpport1->PrepareAddress();
2145 talk_base::scoped_ptr<UDPPort> udpport2(CreateUdpPort(kLocalAddr1));
2146 udpport2->PrepareAddress();
2147 EXPECT_EQ(udpport1->Candidates()[0].foundation(),
2148 udpport2->Candidates()[0].foundation());
2149 talk_base::scoped_ptr<TCPPort> tcpport1(CreateTcpPort(kLocalAddr1));
2150 tcpport1->PrepareAddress();
2151 talk_base::scoped_ptr<TCPPort> tcpport2(CreateTcpPort(kLocalAddr1));
2152 tcpport2->PrepareAddress();
2153 EXPECT_EQ(tcpport1->Candidates()[0].foundation(),
2154 tcpport2->Candidates()[0].foundation());
2155 talk_base::scoped_ptr<Port> stunport(
2156 CreateStunPort(kLocalAddr1, nat_socket_factory1()));
2157 stunport->PrepareAddress();
2158 ASSERT_EQ_WAIT(1U, stunport->Candidates().size(), kTimeout);
2159 EXPECT_NE(tcpport1->Candidates()[0].foundation(),
2160 stunport->Candidates()[0].foundation());
2161 EXPECT_NE(tcpport2->Candidates()[0].foundation(),
2162 stunport->Candidates()[0].foundation());
2163 EXPECT_NE(udpport1->Candidates()[0].foundation(),
2164 stunport->Candidates()[0].foundation());
2165 EXPECT_NE(udpport2->Candidates()[0].foundation(),
2166 stunport->Candidates()[0].foundation());
2167 // Verify GTURN candidate foundation.
2168 talk_base::scoped_ptr<RelayPort> relayport(
2169 CreateGturnPort(kLocalAddr1));
2170 relayport->AddServerAddress(
2171 cricket::ProtocolAddress(kRelayUdpIntAddr, cricket::PROTO_UDP));
2172 relayport->PrepareAddress();
2173 ASSERT_EQ_WAIT(1U, relayport->Candidates().size(), kTimeout);
2174 EXPECT_NE(udpport1->Candidates()[0].foundation(),
2175 relayport->Candidates()[0].foundation());
2176 EXPECT_NE(udpport2->Candidates()[0].foundation(),
2177 relayport->Candidates()[0].foundation());
2178 // Verifying TURN candidate foundation.
2179 talk_base::scoped_ptr<Port> turnport1(CreateTurnPort(
2180 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
2181 turnport1->PrepareAddress();
2182 ASSERT_EQ_WAIT(1U, turnport1->Candidates().size(), kTimeout);
2183 EXPECT_NE(udpport1->Candidates()[0].foundation(),
2184 turnport1->Candidates()[0].foundation());
2185 EXPECT_NE(udpport2->Candidates()[0].foundation(),
2186 turnport1->Candidates()[0].foundation());
2187 EXPECT_NE(stunport->Candidates()[0].foundation(),
2188 turnport1->Candidates()[0].foundation());
2189 talk_base::scoped_ptr<Port> turnport2(CreateTurnPort(
2190 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
2191 turnport2->PrepareAddress();
2192 ASSERT_EQ_WAIT(1U, turnport2->Candidates().size(), kTimeout);
2193 EXPECT_EQ(turnport1->Candidates()[0].foundation(),
2194 turnport2->Candidates()[0].foundation());
2196 // Running a second turn server, to get different base IP address.
2197 SocketAddress kTurnUdpIntAddr2("99.99.98.4", STUN_SERVER_PORT);
2198 SocketAddress kTurnUdpExtAddr2("99.99.98.5", 0);
2199 TestTurnServer turn_server2(
2200 talk_base::Thread::Current(), kTurnUdpIntAddr2, kTurnUdpExtAddr2);
2201 talk_base::scoped_ptr<Port> turnport3(CreateTurnPort(
2202 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP,
2204 turnport3->PrepareAddress();
2205 ASSERT_EQ_WAIT(1U, turnport3->Candidates().size(), kTimeout);
2206 EXPECT_NE(turnport3->Candidates()[0].foundation(),
2207 turnport2->Candidates()[0].foundation());
2210 // This test verifies the related addresses of different types of
2212 TEST_F(PortTest, TestCandidateRelatedAddress) {
2213 talk_base::scoped_ptr<talk_base::NATServer> nat_server(
2214 CreateNatServer(kNatAddr1, NAT_OPEN_CONE));
2215 talk_base::scoped_ptr<UDPPort> udpport(CreateUdpPort(kLocalAddr1));
2216 udpport->PrepareAddress();
2217 // For UDPPort, related address will be empty.
2218 EXPECT_TRUE(udpport->Candidates()[0].related_address().IsNil());
2219 // Testing related address for stun candidates.
2220 // For stun candidate related address must be equal to the base
2222 talk_base::scoped_ptr<StunPort> stunport(
2223 CreateStunPort(kLocalAddr1, nat_socket_factory1()));
2224 stunport->PrepareAddress();
2225 ASSERT_EQ_WAIT(1U, stunport->Candidates().size(), kTimeout);
2226 // Check STUN candidate address.
2227 EXPECT_EQ(stunport->Candidates()[0].address().ipaddr(),
2228 kNatAddr1.ipaddr());
2229 // Check STUN candidate related address.
2230 EXPECT_EQ(stunport->Candidates()[0].related_address(),
2231 stunport->GetLocalAddress());
2232 // Verifying the related address for the GTURN candidates.
2233 // NOTE: In case of GTURN related address will be equal to the mapped
2234 // address, but address(mapped) will not be XOR.
2235 talk_base::scoped_ptr<RelayPort> relayport(
2236 CreateGturnPort(kLocalAddr1));
2237 relayport->AddServerAddress(
2238 cricket::ProtocolAddress(kRelayUdpIntAddr, cricket::PROTO_UDP));
2239 relayport->PrepareAddress();
2240 ASSERT_EQ_WAIT(1U, relayport->Candidates().size(), kTimeout);
2241 // For Gturn related address is set to "0.0.0.0:0"
2242 EXPECT_EQ(talk_base::SocketAddress(),
2243 relayport->Candidates()[0].related_address());
2244 // Verifying the related address for TURN candidate.
2245 // For TURN related address must be equal to the mapped address.
2246 talk_base::scoped_ptr<Port> turnport(CreateTurnPort(
2247 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
2248 turnport->PrepareAddress();
2249 ASSERT_EQ_WAIT(1U, turnport->Candidates().size(), kTimeout);
2250 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(),
2251 turnport->Candidates()[0].address().ipaddr());
2252 EXPECT_EQ(kNatAddr1.ipaddr(),
2253 turnport->Candidates()[0].related_address().ipaddr());
2256 // Test priority value overflow handling when preference is set to 3.
2257 TEST_F(PortTest, TestCandidatePreference) {
2258 cricket::Candidate cand1;
2259 cand1.set_preference(3);
2260 cricket::Candidate cand2;
2261 cand2.set_preference(1);
2262 EXPECT_TRUE(cand1.preference() > cand2.preference());
2265 // Test the Connection priority is calculated correctly.
2266 TEST_F(PortTest, TestConnectionPriority) {
2267 talk_base::scoped_ptr<TestPort> lport(
2268 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
2269 lport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_HOST);
2270 talk_base::scoped_ptr<TestPort> rport(
2271 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
2272 rport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_RELAY);
2273 lport->set_component(123);
2274 lport->AddCandidateAddress(SocketAddress("192.168.1.4", 1234));
2275 rport->set_component(23);
2276 rport->AddCandidateAddress(SocketAddress("10.1.1.100", 1234));
2278 EXPECT_EQ(0x7E001E85U, lport->Candidates()[0].priority());
2279 EXPECT_EQ(0x2001EE9U, rport->Candidates()[0].priority());
2282 // pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0)
2283 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
2284 rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
2285 Connection* lconn = lport->CreateConnection(
2286 rport->Candidates()[0], Port::ORIGIN_MESSAGE);
2288 EXPECT_EQ(0x2001EE9FC003D0BU, lconn->priority());
2290 EXPECT_EQ(0x2001EE9FC003D0BLLU, lconn->priority());
2293 lport->SetIceRole(cricket::ICEROLE_CONTROLLED);
2294 rport->SetIceRole(cricket::ICEROLE_CONTROLLING);
2295 Connection* rconn = rport->CreateConnection(
2296 lport->Candidates()[0], Port::ORIGIN_MESSAGE);
2298 EXPECT_EQ(0x2001EE9FC003D0AU, rconn->priority());
2300 EXPECT_EQ(0x2001EE9FC003D0ALLU, rconn->priority());
2304 TEST_F(PortTest, TestWritableState) {
2305 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
2306 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
2309 TestChannel ch1(port1, port2);
2310 TestChannel ch2(port2, port1);
2312 // Acquire addresses.
2315 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout);
2316 ASSERT_EQ_WAIT(1, ch2.complete_count(), kTimeout);
2318 // Send a ping from src to dst.
2319 ch1.CreateConnection();
2320 ASSERT_TRUE(ch1.conn() != NULL);
2321 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state());
2322 EXPECT_TRUE_WAIT(ch1.conn()->connected(), kTimeout); // for TCP connect
2324 WAIT(!ch2.remote_address().IsNil(), kTimeout);
2326 // Data should be unsendable until the connection is accepted.
2327 char data[] = "abcd";
2328 int data_size = ARRAY_SIZE(data);
2329 talk_base::PacketOptions options;
2330 EXPECT_EQ(SOCKET_ERROR, ch1.conn()->Send(data, data_size, options));
2332 // Accept the connection to return the binding response, transition to
2333 // writable, and allow data to be sent.
2334 ch2.AcceptConnection();
2335 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(),
2337 EXPECT_EQ(data_size, ch1.conn()->Send(data, data_size, options));
2339 // Ask the connection to update state as if enough time has passed to lose
2340 // full writability and 5 pings went unresponded to. We'll accomplish the
2341 // latter by sending pings but not pumping messages.
2342 for (uint32 i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) {
2345 uint32 unreliable_timeout_delay = CONNECTION_WRITE_CONNECT_TIMEOUT + 500u;
2346 ch1.conn()->UpdateState(unreliable_timeout_delay);
2347 EXPECT_EQ(Connection::STATE_WRITE_UNRELIABLE, ch1.conn()->write_state());
2349 // Data should be able to be sent in this state.
2350 EXPECT_EQ(data_size, ch1.conn()->Send(data, data_size, options));
2352 // And now allow the other side to process the pings and send binding
2354 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(),
2357 // Wait long enough for a full timeout (past however long we've already
2359 for (uint32 i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) {
2360 ch1.Ping(unreliable_timeout_delay + i);
2362 ch1.conn()->UpdateState(unreliable_timeout_delay + CONNECTION_WRITE_TIMEOUT +
2364 EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state());
2366 // Now that the connection has completely timed out, data send should fail.
2367 EXPECT_EQ(SOCKET_ERROR, ch1.conn()->Send(data, data_size, options));
2373 TEST_F(PortTest, TestTimeoutForNeverWritable) {
2374 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
2375 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
2378 TestChannel ch1(port1, port2);
2379 TestChannel ch2(port2, port1);
2381 // Acquire addresses.
2385 ch1.CreateConnection();
2386 ASSERT_TRUE(ch1.conn() != NULL);
2387 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state());
2389 // Attempt to go directly to write timeout.
2390 for (uint32 i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) {
2393 ch1.conn()->UpdateState(CONNECTION_WRITE_TIMEOUT + 500u);
2394 EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state());
2397 // This test verifies the connection setup between ICEMODE_FULL
2398 // and ICEMODE_LITE.
2399 // In this test |ch1| behaves like FULL mode client and we have created
2400 // port which responds to the ping message just like LITE client.
2401 TEST_F(PortTest, TestIceLiteConnectivity) {
2402 TestPort* ice_full_port = CreateTestPort(
2403 kLocalAddr1, "lfrag", "lpass", cricket::ICEPROTO_RFC5245,
2404 cricket::ICEROLE_CONTROLLING, kTiebreaker1);
2406 talk_base::scoped_ptr<TestPort> ice_lite_port(CreateTestPort(
2407 kLocalAddr2, "rfrag", "rpass", cricket::ICEPROTO_RFC5245,
2408 cricket::ICEROLE_CONTROLLED, kTiebreaker2));
2409 // Setup TestChannel. This behaves like FULL mode client.
2410 TestChannel ch1(ice_full_port, ice_lite_port.get());
2411 ch1.SetIceMode(ICEMODE_FULL);
2413 // Start gathering candidates.
2415 ice_lite_port->PrepareAddress();
2417 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout);
2418 ASSERT_FALSE(ice_lite_port->Candidates().empty());
2420 ch1.CreateConnection();
2421 ASSERT_TRUE(ch1.conn() != NULL);
2422 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state());
2424 // Send ping from full mode client.
2425 // This ping must not have USE_CANDIDATE_ATTR.
2428 // Verify stun ping is without USE_CANDIDATE_ATTR. Getting message directly
2430 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, 1000);
2431 IceMessage* msg = ice_full_port->last_stun_msg();
2432 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL);
2434 // Respond with a BINDING-RESPONSE from litemode client.
2435 // NOTE: Ideally we should't create connection at this stage from lite
2436 // port, as it should be done only after receiving ping with USE_CANDIDATE.
2437 // But we need a connection to send a response message.
2438 ice_lite_port->CreateConnection(
2439 ice_full_port->Candidates()[0], cricket::Port::ORIGIN_MESSAGE);
2440 talk_base::scoped_ptr<IceMessage> request(CopyStunMessage(msg));
2441 ice_lite_port->SendBindingResponse(
2442 request.get(), ice_full_port->Candidates()[0].address());
2444 // Feeding the respone message from litemode to the full mode connection.
2445 ch1.conn()->OnReadPacket(ice_lite_port->last_stun_buf()->Data(),
2446 ice_lite_port->last_stun_buf()->Length(),
2447 talk_base::PacketTime());
2448 // Verifying full mode connection becomes writable from the response.
2449 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(),
2451 EXPECT_TRUE_WAIT(ch1.nominated(), kTimeout);
2453 // Clear existing stun messsages. Otherwise we will process old stun
2454 // message right after we send ping.
2455 ice_full_port->Reset();
2456 // Send ping. This must have USE_CANDIDATE_ATTR.
2458 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, 1000);
2459 msg = ice_full_port->last_stun_msg();
2460 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL);
2464 // This test case verifies that the CONTROLLING port does not time out.
2465 TEST_F(PortTest, TestControllingNoTimeout) {
2466 SetIceProtocolType(cricket::ICEPROTO_RFC5245);
2467 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
2468 ConnectToSignalDestroyed(port1);
2469 port1->set_timeout_delay(10); // milliseconds
2470 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
2471 port1->SetIceTiebreaker(kTiebreaker1);
2473 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
2474 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
2475 port2->SetIceTiebreaker(kTiebreaker2);
2477 // Set up channels and ensure both ports will be deleted.
2478 TestChannel ch1(port1, port2);
2479 TestChannel ch2(port2, port1);
2481 // Simulate a connection that succeeds, and then is destroyed.
2482 ConnectAndDisconnectChannels(&ch1, &ch2);
2484 // After the connection is destroyed, the port should not be destroyed.
2485 talk_base::Thread::Current()->ProcessMessages(kTimeout);
2486 EXPECT_FALSE(destroyed());
2489 // This test case verifies that the CONTROLLED port does time out, but only
2490 // after connectivity is lost.
2491 TEST_F(PortTest, TestControlledTimeout) {
2492 SetIceProtocolType(cricket::ICEPROTO_RFC5245);
2493 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
2494 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
2495 port1->SetIceTiebreaker(kTiebreaker1);
2497 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
2498 ConnectToSignalDestroyed(port2);
2499 port2->set_timeout_delay(10); // milliseconds
2500 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
2501 port2->SetIceTiebreaker(kTiebreaker2);
2503 // The connection must not be destroyed before a connection is attempted.
2504 EXPECT_FALSE(destroyed());
2506 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
2507 port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
2509 // Set up channels and ensure both ports will be deleted.
2510 TestChannel ch1(port1, port2);
2511 TestChannel ch2(port2, port1);
2513 // Simulate a connection that succeeds, and then is destroyed.
2514 ConnectAndDisconnectChannels(&ch1, &ch2);
2516 // The controlled port should be destroyed after 10 milliseconds.
2517 EXPECT_TRUE_WAIT(destroyed(), kTimeout);