1 /* 2 * libjingle 3 * Copyright 2004 Google Inc. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are met: 7 * 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. 15 * 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. 26 */ 27 28 #include "talk/p2p/base/basicpacketsocketfactory.h" 29 #include "talk/p2p/base/portproxy.h" 30 #include "talk/p2p/base/relayport.h" 31 #include "talk/p2p/base/stunport.h" 32 #include "talk/p2p/base/tcpport.h" 33 #include "talk/p2p/base/testrelayserver.h" 34 #include "talk/p2p/base/teststunserver.h" 35 #include "talk/p2p/base/testturnserver.h" 36 #include "talk/p2p/base/transport.h" 37 #include "talk/p2p/base/turnport.h" 38 #include "webrtc/base/crc32.h" 39 #include "webrtc/base/gunit.h" 40 #include "webrtc/base/helpers.h" 41 #include "webrtc/base/logging.h" 42 #include "webrtc/base/natserver.h" 43 #include "webrtc/base/natsocketfactory.h" 44 #include "webrtc/base/physicalsocketserver.h" 45 #include "webrtc/base/scoped_ptr.h" 46 #include "webrtc/base/socketaddress.h" 47 #include "webrtc/base/ssladapter.h" 48 #include "webrtc/base/stringutils.h" 49 #include "webrtc/base/thread.h" 50 #include "webrtc/base/virtualsocketserver.h" 51 52 using rtc::AsyncPacketSocket; 53 using rtc::ByteBuffer; 54 using rtc::NATType; 55 using rtc::NAT_OPEN_CONE; 56 using rtc::NAT_ADDR_RESTRICTED; 57 using rtc::NAT_PORT_RESTRICTED; 58 using rtc::NAT_SYMMETRIC; 59 using rtc::PacketSocketFactory; 60 using rtc::scoped_ptr; 61 using rtc::Socket; 62 using rtc::SocketAddress; 63 using namespace cricket; 64 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", rtc::NAT_SERVER_PORT); 69 static const SocketAddress kNatAddr2("88.88.88.88", rtc::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"); 80 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; 91 92 static const int kTiebreaker1 = 11111; 93 static const int kTiebreaker2 = 22222; 94 95 static Candidate GetCandidate(Port* port) { 96 assert(port->Candidates().size() == 1); 97 return port->Candidates()[0]; 98 } 99 100 static SocketAddress GetAddress(Port* port) { 101 return GetCandidate(port).address(); 102 } 103 104 static IceMessage* CopyStunMessage(const IceMessage* src) { 105 IceMessage* dst = new IceMessage(); 106 ByteBuffer buf; 107 src->Write(&buf); 108 dst->Read(&buf); 109 return dst; 110 } 111 112 static bool WriteStunMessage(const StunMessage* msg, ByteBuffer* buf) { 113 buf->Resize(0); // clear out any existing buffer contents 114 return msg->Write(buf); 115 } 116 117 // Stub port class for testing STUN generation and processing. 118 class TestPort : public Port { 119 public: 120 TestPort(rtc::Thread* thread, const std::string& type, 121 rtc::PacketSocketFactory* factory, rtc::Network* network, 122 const rtc::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) { 126 } 127 ~TestPort() {} 128 129 // Expose GetStunMessage so that we can test it. 130 using cricket::Port::GetStunMessage; 131 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() { 137 int code = 0; 138 if (last_stun_msg_) { 139 const StunErrorCodeAttribute* error_attr = last_stun_msg_->GetErrorCode(); 140 if (error_attr) { 141 code = error_attr->code(); 142 } 143 } 144 return code; 145 } 146 147 virtual void PrepareAddress() { 148 rtc::SocketAddress addr(ip(), min_port()); 149 AddAddress(addr, addr, rtc::SocketAddress(), "udp", "", Type(), 150 ICE_TYPE_PREFERENCE_HOST, 0, true); 151 } 152 153 // Exposed for testing candidate building. 154 void AddCandidateAddress(const rtc::SocketAddress& addr) { 155 AddAddress(addr, addr, rtc::SocketAddress(), "udp", "", Type(), 156 type_preference_, 0, false); 157 } 158 void AddCandidateAddress(const rtc::SocketAddress& addr, 159 const rtc::SocketAddress& base_address, 160 const std::string& type, 161 int type_preference, 162 bool final) { 163 AddAddress(addr, base_address, rtc::SocketAddress(), "udp", "", type, 164 type_preference, 0, final); 165 } 166 167 virtual Connection* CreateConnection(const Candidate& remote_candidate, 168 CandidateOrigin origin) { 169 Connection* conn = new ProxyConnection(this, 0, remote_candidate); 170 AddConnection(conn); 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); 174 return conn; 175 } 176 virtual int SendTo( 177 const void* data, size_t size, const rtc::SocketAddress& addr, 178 const rtc::PacketOptions& options, bool payload) { 179 if (!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)) { 184 delete msg; 185 delete buf; 186 return -1; 187 } 188 buf->SetReadPosition(pos); 189 last_stun_buf_.reset(buf); 190 last_stun_msg_.reset(msg); 191 } 192 return static_cast<int>(size); 193 } 194 virtual int SetOption(rtc::Socket::Option opt, int value) { 195 return 0; 196 } 197 virtual int GetOption(rtc::Socket::Option opt, int* value) { 198 return -1; 199 } 200 virtual int GetError() { 201 return 0; 202 } 203 void Reset() { 204 last_stun_buf_.reset(); 205 last_stun_msg_.reset(); 206 } 207 void set_type_preference(int type_preference) { 208 type_preference_ = type_preference; 209 } 210 211 private: 212 rtc::scoped_ptr<ByteBuffer> last_stun_buf_; 213 rtc::scoped_ptr<IceMessage> last_stun_msg_; 214 int type_preference_; 215 }; 216 217 class TestChannel : public sigslot::has_slots<> { 218 public: 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); 227 } 228 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_; } 233 234 void Start() { 235 src_->PrepareAddress(); 236 } 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); 245 } 246 void OnConnectionStateChange(Connection* conn) { 247 if (conn->write_state() == Connection::STATE_WRITABLE) { 248 conn->set_use_candidate_attr(true); 249 nominated_ = true; 250 } 251 } 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(); 259 } 260 void Ping() { 261 Ping(0); 262 } 263 void Ping(uint32 now) { 264 conn_->Ping(now); 265 } 266 void Stop() { 267 conn_->SignalDestroyed.connect(this, &TestChannel::OnDestroyed); 268 conn_->Destroy(); 269 } 270 271 void OnPortComplete(Port* port) { 272 complete_count_++; 273 } 274 void SetIceMode(IceMode ice_mode) { 275 ice_mode_ = ice_mode; 276 } 277 278 void OnUnknownAddress(PortInterface* port, const SocketAddress& addr, 279 ProtocolType proto, 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); 285 } 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); 298 } else { 299 EXPECT_TRUE(priority_attr == NULL); 300 EXPECT_TRUE(mi_attr == NULL); 301 EXPECT_TRUE(fingerprint_attr == NULL); 302 } 303 remote_address_ = addr; 304 remote_request_.reset(CopyStunMessage(msg)); 305 remote_frag_ = rf; 306 } 307 308 void OnDestroyed(Connection* conn) { 309 ASSERT_EQ(conn_, conn); 310 conn_ = NULL; 311 } 312 313 void OnSrcPortDestroyed(PortInterface* port) { 314 Port* destroyed_src = src_.release(); 315 ASSERT_EQ(destroyed_src, port); 316 } 317 318 bool nominated() const { return nominated_; } 319 320 private: 321 IceMode ice_mode_; 322 rtc::scoped_ptr<Port> src_; 323 Port* dst_; 324 325 int complete_count_; 326 Connection* conn_; 327 SocketAddress remote_address_; 328 rtc::scoped_ptr<StunMessage> remote_request_; 329 std::string remote_frag_; 330 bool nominated_; 331 }; 332 333 class PortTest : public testing::Test, public sigslot::has_slots<> { 334 public: 335 PortTest() 336 : main_(rtc::Thread::Current()), 337 pss_(new rtc::PhysicalSocketServer), 338 ss_(new rtc::VirtualSocketServer(pss_.get())), 339 ss_scope_(ss_.get()), 340 network_("unittest", "unittest", rtc::IPAddress(INADDR_ANY), 32), 341 socket_factory_(rtc::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_(rtc::CreateRandomString(ICE_UFRAG_LENGTH)), 352 password_(rtc::CreateRandomString(ICE_PWD_LENGTH)), 353 ice_protocol_(cricket::ICEPROTO_GOOGLE), 354 role_conflict_(false), 355 destroyed_(false) { 356 network_.AddIP(rtc::IPAddress(INADDR_ANY)); 357 } 358 359 protected: 360 static void SetUpTestCase() { 361 rtc::InitializeSSL(); 362 } 363 364 static void TearDownTestCase() { 365 rtc::CleanupSSL(); 366 } 367 368 369 void TestLocalToLocal() { 370 Port* port1 = CreateUdpPort(kLocalAddr1); 371 Port* port2 = CreateUdpPort(kLocalAddr2); 372 TestConnectivity("udp", port1, "udp", port2, true, true, true, true); 373 } 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); 381 } 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); 387 } 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); 394 } 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)); 404 } 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); 411 } 412 void TestTcpToTcp() { 413 Port* port1 = CreateTcpPort(kLocalAddr1); 414 Port* port2 = CreateTcpPort(kLocalAddr2); 415 TestConnectivity("tcp", port1, "tcp", port2, true, false, true, true); 416 } 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); 422 } 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); 428 } 429 430 // helpers for above functions 431 UDPPort* CreateUdpPort(const SocketAddress& addr) { 432 return CreateUdpPort(addr, &socket_factory_); 433 } 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_); 439 return port; 440 } 441 TCPPort* CreateTcpPort(const SocketAddress& addr) { 442 TCPPort* port = CreateTcpPort(addr, &socket_factory_); 443 port->SetIceProtocolType(ice_protocol_); 444 return port; 445 } 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_, 450 true); 451 port->SetIceProtocolType(ice_protocol_); 452 return port; 453 } 454 StunPort* CreateStunPort(const SocketAddress& addr, 455 rtc::PacketSocketFactory* factory) { 456 ServerAddresses stun_servers; 457 stun_servers.insert(kStunAddr); 458 StunPort* port = StunPort::Create(main_, factory, &network_, 459 addr.ipaddr(), 0, 0, 460 username_, password_, stun_servers); 461 port->SetIceProtocolType(ice_protocol_); 462 return port; 463 } 464 Port* CreateRelayPort(const SocketAddress& addr, RelayType rtype, 465 ProtocolType int_proto, ProtocolType ext_proto) { 466 if (rtype == RELAY_TURN) { 467 return CreateTurnPort(addr, &socket_factory_, int_proto, ext_proto); 468 } else { 469 return CreateGturnPort(addr, int_proto, ext_proto); 470 } 471 } 472 TurnPort* CreateTurnPort(const SocketAddress& addr, 473 PacketSocketFactory* socket_factory, 474 ProtocolType int_proto, ProtocolType ext_proto) { 475 return CreateTurnPort(addr, socket_factory, 476 int_proto, ext_proto, kTurnUdpIntAddr); 477 } 478 TurnPort* CreateTurnPort(const SocketAddress& addr, 479 PacketSocketFactory* socket_factory, 480 ProtocolType int_proto, ProtocolType ext_proto, 481 const rtc::SocketAddress& server_addr) { 482 TurnPort* port = TurnPort::Create(main_, socket_factory, &network_, 483 addr.ipaddr(), 0, 0, 484 username_, password_, ProtocolAddress( 485 server_addr, PROTO_UDP), 486 kRelayCredentials, 0); 487 port->SetIceProtocolType(ice_protocol_); 488 return port; 489 } 490 RelayPort* CreateGturnPort(const SocketAddress& addr, 491 ProtocolType int_proto, ProtocolType ext_proto) { 492 RelayPort* port = CreateGturnPort(addr); 493 SocketAddress addrs[] = 494 { kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr }; 495 port->AddServerAddress(ProtocolAddress(addrs[int_proto], int_proto)); 496 return port; 497 } 498 RelayPort* CreateGturnPort(const SocketAddress& addr) { 499 RelayPort* port = RelayPort::Create(main_, &socket_factory_, &network_, 500 addr.ipaddr(), 0, 0, 501 username_, password_); 502 // TODO: Add an external address for ext_proto, so that the 503 // other side can connect to this port using a non-UDP protocol. 504 port->SetIceProtocolType(ice_protocol_); 505 return port; 506 } 507 rtc::NATServer* CreateNatServer(const SocketAddress& addr, 508 rtc::NATType type) { 509 return new rtc::NATServer(type, ss_.get(), addr, ss_.get(), addr); 510 } 511 static const char* StunName(NATType type) { 512 switch (type) { 513 case NAT_OPEN_CONE: return "stun(open cone)"; 514 case NAT_ADDR_RESTRICTED: return "stun(addr restricted)"; 515 case NAT_PORT_RESTRICTED: return "stun(port restricted)"; 516 case NAT_SYMMETRIC: return "stun(symmetric)"; 517 default: return "stun(?)"; 518 } 519 } 520 static const char* RelayName(RelayType type, ProtocolType proto) { 521 if (type == RELAY_TURN) { 522 switch (proto) { 523 case PROTO_UDP: return "turn(udp)"; 524 case PROTO_TCP: return "turn(tcp)"; 525 case PROTO_SSLTCP: return "turn(ssltcp)"; 526 default: return "turn(?)"; 527 } 528 } else { 529 switch (proto) { 530 case PROTO_UDP: return "gturn(udp)"; 531 case PROTO_TCP: return "gturn(tcp)"; 532 case PROTO_SSLTCP: return "gturn(ssltcp)"; 533 default: return "gturn(?)"; 534 } 535 } 536 } 537 538 void TestCrossFamilyPorts(int type); 539 540 // This does all the work and then deletes |port1| and |port2|. 541 void TestConnectivity(const char* name1, Port* port1, 542 const char* name2, Port* port2, 543 bool accept, bool same_addr1, 544 bool same_addr2, bool possible); 545 546 // This connects and disconnects the provided channels in the same sequence as 547 // TestConnectivity with all options set to |true|. It does not delete either 548 // channel. 549 void ConnectAndDisconnectChannels(TestChannel* ch1, TestChannel* ch2); 550 551 void SetIceProtocolType(cricket::IceProtocolType protocol) { 552 ice_protocol_ = protocol; 553 } 554 555 IceMessage* CreateStunMessage(int type) { 556 IceMessage* msg = new IceMessage(); 557 msg->SetType(type); 558 msg->SetTransactionID("TESTTESTTEST"); 559 return msg; 560 } 561 IceMessage* CreateStunMessageWithUsername(int type, 562 const std::string& username) { 563 IceMessage* msg = CreateStunMessage(type); 564 msg->AddAttribute( 565 new StunByteStringAttribute(STUN_ATTR_USERNAME, username)); 566 return msg; 567 } 568 TestPort* CreateTestPort(const rtc::SocketAddress& addr, 569 const std::string& username, 570 const std::string& password) { 571 TestPort* port = new TestPort(main_, "test", &socket_factory_, &network_, 572 addr.ipaddr(), 0, 0, username, password); 573 port->SignalRoleConflict.connect(this, &PortTest::OnRoleConflict); 574 return port; 575 } 576 TestPort* CreateTestPort(const rtc::SocketAddress& addr, 577 const std::string& username, 578 const std::string& password, 579 cricket::IceProtocolType type, 580 cricket::IceRole role, 581 int tiebreaker) { 582 TestPort* port = CreateTestPort(addr, username, password); 583 port->SetIceProtocolType(type); 584 port->SetIceRole(role); 585 port->SetIceTiebreaker(tiebreaker); 586 return port; 587 } 588 589 void OnRoleConflict(PortInterface* port) { 590 role_conflict_ = true; 591 } 592 bool role_conflict() const { return role_conflict_; } 593 594 void ConnectToSignalDestroyed(PortInterface* port) { 595 port->SignalDestroyed.connect(this, &PortTest::OnDestroyed); 596 } 597 598 void OnDestroyed(PortInterface* port) { 599 destroyed_ = true; 600 } 601 bool destroyed() const { return destroyed_; } 602 603 rtc::BasicPacketSocketFactory* nat_socket_factory1() { 604 return &nat_socket_factory1_; 605 } 606 607 private: 608 rtc::Thread* main_; 609 rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_; 610 rtc::scoped_ptr<rtc::VirtualSocketServer> ss_; 611 rtc::SocketServerScope ss_scope_; 612 rtc::Network network_; 613 rtc::BasicPacketSocketFactory socket_factory_; 614 rtc::scoped_ptr<rtc::NATServer> nat_server1_; 615 rtc::scoped_ptr<rtc::NATServer> nat_server2_; 616 rtc::NATSocketFactory nat_factory1_; 617 rtc::NATSocketFactory nat_factory2_; 618 rtc::BasicPacketSocketFactory nat_socket_factory1_; 619 rtc::BasicPacketSocketFactory nat_socket_factory2_; 620 TestStunServer stun_server_; 621 TestTurnServer turn_server_; 622 TestRelayServer relay_server_; 623 std::string username_; 624 std::string password_; 625 cricket::IceProtocolType ice_protocol_; 626 bool role_conflict_; 627 bool destroyed_; 628 }; 629 630 void PortTest::TestConnectivity(const char* name1, Port* port1, 631 const char* name2, Port* port2, 632 bool accept, bool same_addr1, 633 bool same_addr2, bool possible) { 634 LOG(LS_INFO) << "Test: " << name1 << " to " << name2 << ": "; 635 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 636 port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 637 638 // Set up channels and ensure both ports will be deleted. 639 TestChannel ch1(port1, port2); 640 TestChannel ch2(port2, port1); 641 EXPECT_EQ(0, ch1.complete_count()); 642 EXPECT_EQ(0, ch2.complete_count()); 643 644 // Acquire addresses. 645 ch1.Start(); 646 ch2.Start(); 647 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout); 648 ASSERT_EQ_WAIT(1, ch2.complete_count(), kTimeout); 649 650 // Send a ping from src to dst. This may or may not make it. 651 ch1.CreateConnection(); 652 ASSERT_TRUE(ch1.conn() != NULL); 653 EXPECT_TRUE_WAIT(ch1.conn()->connected(), kTimeout); // for TCP connect 654 ch1.Ping(); 655 WAIT(!ch2.remote_address().IsNil(), kTimeout); 656 657 if (accept) { 658 // We are able to send a ping from src to dst. This is the case when 659 // sending to UDP ports and cone NATs. 660 EXPECT_TRUE(ch1.remote_address().IsNil()); 661 EXPECT_EQ(ch2.remote_fragment(), port1->username_fragment()); 662 663 // Ensure the ping came from the same address used for src. 664 // This is the case unless the source NAT was symmetric. 665 if (same_addr1) EXPECT_EQ(ch2.remote_address(), GetAddress(port1)); 666 EXPECT_TRUE(same_addr2); 667 668 // Send a ping from dst to src. 669 ch2.AcceptConnection(); 670 ASSERT_TRUE(ch2.conn() != NULL); 671 ch2.Ping(); 672 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch2.conn()->write_state(), 673 kTimeout); 674 } else { 675 // We can't send a ping from src to dst, so flip it around. This will happen 676 // when the destination NAT is addr/port restricted or symmetric. 677 EXPECT_TRUE(ch1.remote_address().IsNil()); 678 EXPECT_TRUE(ch2.remote_address().IsNil()); 679 680 // Send a ping from dst to src. Again, this may or may not make it. 681 ch2.CreateConnection(); 682 ASSERT_TRUE(ch2.conn() != NULL); 683 ch2.Ping(); 684 WAIT(ch2.conn()->write_state() == Connection::STATE_WRITABLE, kTimeout); 685 686 if (same_addr1 && same_addr2) { 687 // The new ping got back to the source. 688 EXPECT_EQ(Connection::STATE_READABLE, ch1.conn()->read_state()); 689 EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state()); 690 691 // First connection may not be writable if the first ping did not get 692 // through. So we will have to do another. 693 if (ch1.conn()->write_state() == Connection::STATE_WRITE_INIT) { 694 ch1.Ping(); 695 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(), 696 kTimeout); 697 } 698 } else if (!same_addr1 && possible) { 699 // The new ping went to the candidate address, but that address was bad. 700 // This will happen when the source NAT is symmetric. 701 EXPECT_TRUE(ch1.remote_address().IsNil()); 702 EXPECT_TRUE(ch2.remote_address().IsNil()); 703 704 // However, since we have now sent a ping to the source IP, we should be 705 // able to get a ping from it. This gives us the real source address. 706 ch1.Ping(); 707 EXPECT_TRUE_WAIT(!ch2.remote_address().IsNil(), kTimeout); 708 EXPECT_EQ(Connection::STATE_READ_INIT, ch2.conn()->read_state()); 709 EXPECT_TRUE(ch1.remote_address().IsNil()); 710 711 // Pick up the actual address and establish the connection. 712 ch2.AcceptConnection(); 713 ASSERT_TRUE(ch2.conn() != NULL); 714 ch2.Ping(); 715 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch2.conn()->write_state(), 716 kTimeout); 717 } else if (!same_addr2 && possible) { 718 // The new ping came in, but from an unexpected address. This will happen 719 // when the destination NAT is symmetric. 720 EXPECT_FALSE(ch1.remote_address().IsNil()); 721 EXPECT_EQ(Connection::STATE_READ_INIT, ch1.conn()->read_state()); 722 723 // Update our address and complete the connection. 724 ch1.AcceptConnection(); 725 ch1.Ping(); 726 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(), 727 kTimeout); 728 } else { // (!possible) 729 // There should be s no way for the pings to reach each other. Check it. 730 EXPECT_TRUE(ch1.remote_address().IsNil()); 731 EXPECT_TRUE(ch2.remote_address().IsNil()); 732 ch1.Ping(); 733 WAIT(!ch2.remote_address().IsNil(), kTimeout); 734 EXPECT_TRUE(ch1.remote_address().IsNil()); 735 EXPECT_TRUE(ch2.remote_address().IsNil()); 736 } 737 } 738 739 // Everything should be good, unless we know the situation is impossible. 740 ASSERT_TRUE(ch1.conn() != NULL); 741 ASSERT_TRUE(ch2.conn() != NULL); 742 if (possible) { 743 EXPECT_EQ(Connection::STATE_READABLE, ch1.conn()->read_state()); 744 EXPECT_EQ(Connection::STATE_WRITABLE, ch1.conn()->write_state()); 745 EXPECT_EQ(Connection::STATE_READABLE, ch2.conn()->read_state()); 746 EXPECT_EQ(Connection::STATE_WRITABLE, ch2.conn()->write_state()); 747 } else { 748 EXPECT_NE(Connection::STATE_READABLE, ch1.conn()->read_state()); 749 EXPECT_NE(Connection::STATE_WRITABLE, ch1.conn()->write_state()); 750 EXPECT_NE(Connection::STATE_READABLE, ch2.conn()->read_state()); 751 EXPECT_NE(Connection::STATE_WRITABLE, ch2.conn()->write_state()); 752 } 753 754 // Tear down and ensure that goes smoothly. 755 ch1.Stop(); 756 ch2.Stop(); 757 EXPECT_TRUE_WAIT(ch1.conn() == NULL, kTimeout); 758 EXPECT_TRUE_WAIT(ch2.conn() == NULL, kTimeout); 759 } 760 761 void PortTest::ConnectAndDisconnectChannels(TestChannel* ch1, 762 TestChannel* ch2) { 763 // Acquire addresses. 764 ch1->Start(); 765 ch2->Start(); 766 767 // Send a ping from src to dst. 768 ch1->CreateConnection(); 769 EXPECT_TRUE_WAIT(ch1->conn()->connected(), kTimeout); // for TCP connect 770 ch1->Ping(); 771 WAIT(!ch2->remote_address().IsNil(), kTimeout); 772 773 // Send a ping from dst to src. 774 ch2->AcceptConnection(); 775 ch2->Ping(); 776 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch2->conn()->write_state(), 777 kTimeout); 778 779 // Destroy the connections. 780 ch1->Stop(); 781 ch2->Stop(); 782 } 783 784 class FakePacketSocketFactory : public rtc::PacketSocketFactory { 785 public: 786 FakePacketSocketFactory() 787 : next_udp_socket_(NULL), 788 next_server_tcp_socket_(NULL), 789 next_client_tcp_socket_(NULL) { 790 } 791 virtual ~FakePacketSocketFactory() { } 792 793 virtual AsyncPacketSocket* CreateUdpSocket( 794 const SocketAddress& address, int min_port, int max_port) { 795 EXPECT_TRUE(next_udp_socket_ != NULL); 796 AsyncPacketSocket* result = next_udp_socket_; 797 next_udp_socket_ = NULL; 798 return result; 799 } 800 801 virtual AsyncPacketSocket* CreateServerTcpSocket( 802 const SocketAddress& local_address, int min_port, int max_port, 803 int opts) { 804 EXPECT_TRUE(next_server_tcp_socket_ != NULL); 805 AsyncPacketSocket* result = next_server_tcp_socket_; 806 next_server_tcp_socket_ = NULL; 807 return result; 808 } 809 810 // TODO: |proxy_info| and |user_agent| should be set 811 // per-factory and not when socket is created. 812 virtual AsyncPacketSocket* CreateClientTcpSocket( 813 const SocketAddress& local_address, const SocketAddress& remote_address, 814 const rtc::ProxyInfo& proxy_info, 815 const std::string& user_agent, int opts) { 816 EXPECT_TRUE(next_client_tcp_socket_ != NULL); 817 AsyncPacketSocket* result = next_client_tcp_socket_; 818 next_client_tcp_socket_ = NULL; 819 return result; 820 } 821 822 void set_next_udp_socket(AsyncPacketSocket* next_udp_socket) { 823 next_udp_socket_ = next_udp_socket; 824 } 825 void set_next_server_tcp_socket(AsyncPacketSocket* next_server_tcp_socket) { 826 next_server_tcp_socket_ = next_server_tcp_socket; 827 } 828 void set_next_client_tcp_socket(AsyncPacketSocket* next_client_tcp_socket) { 829 next_client_tcp_socket_ = next_client_tcp_socket; 830 } 831 rtc::AsyncResolverInterface* CreateAsyncResolver() { 832 return NULL; 833 } 834 835 private: 836 AsyncPacketSocket* next_udp_socket_; 837 AsyncPacketSocket* next_server_tcp_socket_; 838 AsyncPacketSocket* next_client_tcp_socket_; 839 }; 840 841 class FakeAsyncPacketSocket : public AsyncPacketSocket { 842 public: 843 // Returns current local address. Address may be set to NULL if the 844 // socket is not bound yet (GetState() returns STATE_BINDING). 845 virtual SocketAddress GetLocalAddress() const { 846 return SocketAddress(); 847 } 848 849 // Returns remote address. Returns zeroes if this is not a client TCP socket. 850 virtual SocketAddress GetRemoteAddress() const { 851 return SocketAddress(); 852 } 853 854 // Send a packet. 855 virtual int Send(const void *pv, size_t cb, 856 const rtc::PacketOptions& options) { 857 return static_cast<int>(cb); 858 } 859 virtual int SendTo(const void *pv, size_t cb, const SocketAddress& addr, 860 const rtc::PacketOptions& options) { 861 return static_cast<int>(cb); 862 } 863 virtual int Close() { 864 return 0; 865 } 866 867 virtual State GetState() const { return state_; } 868 virtual int GetOption(Socket::Option opt, int* value) { return 0; } 869 virtual int SetOption(Socket::Option opt, int value) { return 0; } 870 virtual int GetError() const { return 0; } 871 virtual void SetError(int error) { } 872 873 void set_state(State state) { state_ = state; } 874 875 private: 876 State state_; 877 }; 878 879 // Local -> XXXX 880 TEST_F(PortTest, TestLocalToLocal) { 881 TestLocalToLocal(); 882 } 883 884 TEST_F(PortTest, TestLocalToConeNat) { 885 TestLocalToStun(NAT_OPEN_CONE); 886 } 887 888 TEST_F(PortTest, TestLocalToARNat) { 889 TestLocalToStun(NAT_ADDR_RESTRICTED); 890 } 891 892 TEST_F(PortTest, TestLocalToPRNat) { 893 TestLocalToStun(NAT_PORT_RESTRICTED); 894 } 895 896 TEST_F(PortTest, TestLocalToSymNat) { 897 TestLocalToStun(NAT_SYMMETRIC); 898 } 899 900 // Flaky: https://code.google.com/p/webrtc/issues/detail?id=3316. 901 TEST_F(PortTest, DISABLED_TestLocalToTurn) { 902 TestLocalToRelay(RELAY_TURN, PROTO_UDP); 903 } 904 905 TEST_F(PortTest, TestLocalToGturn) { 906 TestLocalToRelay(RELAY_GTURN, PROTO_UDP); 907 } 908 909 TEST_F(PortTest, TestLocalToTcpGturn) { 910 TestLocalToRelay(RELAY_GTURN, PROTO_TCP); 911 } 912 913 TEST_F(PortTest, TestLocalToSslTcpGturn) { 914 TestLocalToRelay(RELAY_GTURN, PROTO_SSLTCP); 915 } 916 917 // Cone NAT -> XXXX 918 TEST_F(PortTest, TestConeNatToLocal) { 919 TestStunToLocal(NAT_OPEN_CONE); 920 } 921 922 TEST_F(PortTest, TestConeNatToConeNat) { 923 TestStunToStun(NAT_OPEN_CONE, NAT_OPEN_CONE); 924 } 925 926 TEST_F(PortTest, TestConeNatToARNat) { 927 TestStunToStun(NAT_OPEN_CONE, NAT_ADDR_RESTRICTED); 928 } 929 930 TEST_F(PortTest, TestConeNatToPRNat) { 931 TestStunToStun(NAT_OPEN_CONE, NAT_PORT_RESTRICTED); 932 } 933 934 TEST_F(PortTest, TestConeNatToSymNat) { 935 TestStunToStun(NAT_OPEN_CONE, NAT_SYMMETRIC); 936 } 937 938 TEST_F(PortTest, TestConeNatToTurn) { 939 TestStunToRelay(NAT_OPEN_CONE, RELAY_TURN, PROTO_UDP); 940 } 941 942 TEST_F(PortTest, TestConeNatToGturn) { 943 TestStunToRelay(NAT_OPEN_CONE, RELAY_GTURN, PROTO_UDP); 944 } 945 946 TEST_F(PortTest, TestConeNatToTcpGturn) { 947 TestStunToRelay(NAT_OPEN_CONE, RELAY_GTURN, PROTO_TCP); 948 } 949 950 // Address-restricted NAT -> XXXX 951 TEST_F(PortTest, TestARNatToLocal) { 952 TestStunToLocal(NAT_ADDR_RESTRICTED); 953 } 954 955 TEST_F(PortTest, TestARNatToConeNat) { 956 TestStunToStun(NAT_ADDR_RESTRICTED, NAT_OPEN_CONE); 957 } 958 959 TEST_F(PortTest, TestARNatToARNat) { 960 TestStunToStun(NAT_ADDR_RESTRICTED, NAT_ADDR_RESTRICTED); 961 } 962 963 TEST_F(PortTest, TestARNatToPRNat) { 964 TestStunToStun(NAT_ADDR_RESTRICTED, NAT_PORT_RESTRICTED); 965 } 966 967 TEST_F(PortTest, TestARNatToSymNat) { 968 TestStunToStun(NAT_ADDR_RESTRICTED, NAT_SYMMETRIC); 969 } 970 971 TEST_F(PortTest, TestARNatToTurn) { 972 TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_TURN, PROTO_UDP); 973 } 974 975 TEST_F(PortTest, TestARNatToGturn) { 976 TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_GTURN, PROTO_UDP); 977 } 978 979 TEST_F(PortTest, TestARNATNatToTcpGturn) { 980 TestStunToRelay(NAT_ADDR_RESTRICTED, RELAY_GTURN, PROTO_TCP); 981 } 982 983 // Port-restricted NAT -> XXXX 984 TEST_F(PortTest, TestPRNatToLocal) { 985 TestStunToLocal(NAT_PORT_RESTRICTED); 986 } 987 988 TEST_F(PortTest, TestPRNatToConeNat) { 989 TestStunToStun(NAT_PORT_RESTRICTED, NAT_OPEN_CONE); 990 } 991 992 TEST_F(PortTest, TestPRNatToARNat) { 993 TestStunToStun(NAT_PORT_RESTRICTED, NAT_ADDR_RESTRICTED); 994 } 995 996 TEST_F(PortTest, TestPRNatToPRNat) { 997 TestStunToStun(NAT_PORT_RESTRICTED, NAT_PORT_RESTRICTED); 998 } 999 1000 TEST_F(PortTest, TestPRNatToSymNat) { 1001 // Will "fail" 1002 TestStunToStun(NAT_PORT_RESTRICTED, NAT_SYMMETRIC); 1003 } 1004 1005 TEST_F(PortTest, TestPRNatToTurn) { 1006 TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_TURN, PROTO_UDP); 1007 } 1008 1009 TEST_F(PortTest, TestPRNatToGturn) { 1010 TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_GTURN, PROTO_UDP); 1011 } 1012 1013 TEST_F(PortTest, TestPRNatToTcpGturn) { 1014 TestStunToRelay(NAT_PORT_RESTRICTED, RELAY_GTURN, PROTO_TCP); 1015 } 1016 1017 // Symmetric NAT -> XXXX 1018 TEST_F(PortTest, TestSymNatToLocal) { 1019 TestStunToLocal(NAT_SYMMETRIC); 1020 } 1021 1022 TEST_F(PortTest, TestSymNatToConeNat) { 1023 TestStunToStun(NAT_SYMMETRIC, NAT_OPEN_CONE); 1024 } 1025 1026 TEST_F(PortTest, TestSymNatToARNat) { 1027 TestStunToStun(NAT_SYMMETRIC, NAT_ADDR_RESTRICTED); 1028 } 1029 1030 TEST_F(PortTest, TestSymNatToPRNat) { 1031 // Will "fail" 1032 TestStunToStun(NAT_SYMMETRIC, NAT_PORT_RESTRICTED); 1033 } 1034 1035 TEST_F(PortTest, TestSymNatToSymNat) { 1036 // Will "fail" 1037 TestStunToStun(NAT_SYMMETRIC, NAT_SYMMETRIC); 1038 } 1039 1040 TEST_F(PortTest, TestSymNatToTurn) { 1041 TestStunToRelay(NAT_SYMMETRIC, RELAY_TURN, PROTO_UDP); 1042 } 1043 1044 TEST_F(PortTest, TestSymNatToGturn) { 1045 TestStunToRelay(NAT_SYMMETRIC, RELAY_GTURN, PROTO_UDP); 1046 } 1047 1048 TEST_F(PortTest, TestSymNatToTcpGturn) { 1049 TestStunToRelay(NAT_SYMMETRIC, RELAY_GTURN, PROTO_TCP); 1050 } 1051 1052 // Outbound TCP -> XXXX 1053 TEST_F(PortTest, TestTcpToTcp) { 1054 TestTcpToTcp(); 1055 } 1056 1057 /* TODO: Enable these once testrelayserver can accept external TCP. 1058 TEST_F(PortTest, TestTcpToTcpRelay) { 1059 TestTcpToRelay(PROTO_TCP); 1060 } 1061 1062 TEST_F(PortTest, TestTcpToSslTcpRelay) { 1063 TestTcpToRelay(PROTO_SSLTCP); 1064 } 1065 */ 1066 1067 // Outbound SSLTCP -> XXXX 1068 /* TODO: Enable these once testrelayserver can accept external SSL. 1069 TEST_F(PortTest, TestSslTcpToTcpRelay) { 1070 TestSslTcpToRelay(PROTO_TCP); 1071 } 1072 1073 TEST_F(PortTest, TestSslTcpToSslTcpRelay) { 1074 TestSslTcpToRelay(PROTO_SSLTCP); 1075 } 1076 */ 1077 1078 // This test case verifies standard ICE features in STUN messages. Currently it 1079 // verifies Message Integrity attribute in STUN messages and username in STUN 1080 // binding request will have colon (":") between remote and local username. 1081 TEST_F(PortTest, TestLocalToLocalAsIce) { 1082 SetIceProtocolType(cricket::ICEPROTO_RFC5245); 1083 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 1084 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); 1085 port1->SetIceTiebreaker(kTiebreaker1); 1086 ASSERT_EQ(cricket::ICEPROTO_RFC5245, port1->IceProtocol()); 1087 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 1088 port2->SetIceRole(cricket::ICEROLE_CONTROLLED); 1089 port2->SetIceTiebreaker(kTiebreaker2); 1090 ASSERT_EQ(cricket::ICEPROTO_RFC5245, port2->IceProtocol()); 1091 // Same parameters as TestLocalToLocal above. 1092 TestConnectivity("udp", port1, "udp", port2, true, true, true, true); 1093 } 1094 1095 // This test is trying to validate a successful and failure scenario in a 1096 // loopback test when protocol is RFC5245. For success IceTiebreaker, username 1097 // should remain equal to the request generated by the port and role of port 1098 // must be in controlling. 1099 TEST_F(PortTest, TestLoopbackCallAsIce) { 1100 rtc::scoped_ptr<TestPort> lport( 1101 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1102 lport->SetIceProtocolType(ICEPROTO_RFC5245); 1103 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1104 lport->SetIceTiebreaker(kTiebreaker1); 1105 lport->PrepareAddress(); 1106 ASSERT_FALSE(lport->Candidates().empty()); 1107 Connection* conn = lport->CreateConnection(lport->Candidates()[0], 1108 Port::ORIGIN_MESSAGE); 1109 conn->Ping(0); 1110 1111 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1112 IceMessage* msg = lport->last_stun_msg(); 1113 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); 1114 conn->OnReadPacket(lport->last_stun_buf()->Data(), 1115 lport->last_stun_buf()->Length(), 1116 rtc::PacketTime()); 1117 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1118 msg = lport->last_stun_msg(); 1119 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type()); 1120 1121 // If the tiebreaker value is different from port, we expect a error 1122 // response. 1123 lport->Reset(); 1124 lport->AddCandidateAddress(kLocalAddr2); 1125 // Creating a different connection as |conn| is in STATE_READABLE. 1126 Connection* conn1 = lport->CreateConnection(lport->Candidates()[1], 1127 Port::ORIGIN_MESSAGE); 1128 conn1->Ping(0); 1129 1130 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1131 msg = lport->last_stun_msg(); 1132 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); 1133 rtc::scoped_ptr<IceMessage> modified_req( 1134 CreateStunMessage(STUN_BINDING_REQUEST)); 1135 const StunByteStringAttribute* username_attr = msg->GetByteString( 1136 STUN_ATTR_USERNAME); 1137 modified_req->AddAttribute(new StunByteStringAttribute( 1138 STUN_ATTR_USERNAME, username_attr->GetString())); 1139 // To make sure we receive error response, adding tiebreaker less than 1140 // what's present in request. 1141 modified_req->AddAttribute(new StunUInt64Attribute( 1142 STUN_ATTR_ICE_CONTROLLING, kTiebreaker1 - 1)); 1143 modified_req->AddMessageIntegrity("lpass"); 1144 modified_req->AddFingerprint(); 1145 1146 lport->Reset(); 1147 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1148 WriteStunMessage(modified_req.get(), buf.get()); 1149 conn1->OnReadPacket(buf->Data(), buf->Length(), rtc::PacketTime()); 1150 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1151 msg = lport->last_stun_msg(); 1152 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type()); 1153 } 1154 1155 // This test verifies role conflict signal is received when there is 1156 // conflict in the role. In this case both ports are in controlling and 1157 // |rport| has higher tiebreaker value than |lport|. Since |lport| has lower 1158 // value of tiebreaker, when it receives ping request from |rport| it will 1159 // send role conflict signal. 1160 TEST_F(PortTest, TestIceRoleConflict) { 1161 rtc::scoped_ptr<TestPort> lport( 1162 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1163 lport->SetIceProtocolType(ICEPROTO_RFC5245); 1164 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1165 lport->SetIceTiebreaker(kTiebreaker1); 1166 rtc::scoped_ptr<TestPort> rport( 1167 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1168 rport->SetIceProtocolType(ICEPROTO_RFC5245); 1169 rport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1170 rport->SetIceTiebreaker(kTiebreaker2); 1171 1172 lport->PrepareAddress(); 1173 rport->PrepareAddress(); 1174 ASSERT_FALSE(lport->Candidates().empty()); 1175 ASSERT_FALSE(rport->Candidates().empty()); 1176 Connection* lconn = lport->CreateConnection(rport->Candidates()[0], 1177 Port::ORIGIN_MESSAGE); 1178 Connection* rconn = rport->CreateConnection(lport->Candidates()[0], 1179 Port::ORIGIN_MESSAGE); 1180 rconn->Ping(0); 1181 1182 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000); 1183 IceMessage* msg = rport->last_stun_msg(); 1184 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); 1185 // Send rport binding request to lport. 1186 lconn->OnReadPacket(rport->last_stun_buf()->Data(), 1187 rport->last_stun_buf()->Length(), 1188 rtc::PacketTime()); 1189 1190 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1191 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type()); 1192 EXPECT_TRUE(role_conflict()); 1193 } 1194 1195 TEST_F(PortTest, TestTcpNoDelay) { 1196 TCPPort* port1 = CreateTcpPort(kLocalAddr1); 1197 int option_value = -1; 1198 int success = port1->GetOption(rtc::Socket::OPT_NODELAY, 1199 &option_value); 1200 ASSERT_EQ(0, success); // GetOption() should complete successfully w/ 0 1201 ASSERT_EQ(1, option_value); 1202 delete port1; 1203 } 1204 1205 TEST_F(PortTest, TestDelayedBindingUdp) { 1206 FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket(); 1207 FakePacketSocketFactory socket_factory; 1208 1209 socket_factory.set_next_udp_socket(socket); 1210 scoped_ptr<UDPPort> port( 1211 CreateUdpPort(kLocalAddr1, &socket_factory)); 1212 1213 socket->set_state(AsyncPacketSocket::STATE_BINDING); 1214 port->PrepareAddress(); 1215 1216 EXPECT_EQ(0U, port->Candidates().size()); 1217 socket->SignalAddressReady(socket, kLocalAddr2); 1218 1219 EXPECT_EQ(1U, port->Candidates().size()); 1220 } 1221 1222 TEST_F(PortTest, TestDelayedBindingTcp) { 1223 FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket(); 1224 FakePacketSocketFactory socket_factory; 1225 1226 socket_factory.set_next_server_tcp_socket(socket); 1227 scoped_ptr<TCPPort> port( 1228 CreateTcpPort(kLocalAddr1, &socket_factory)); 1229 1230 socket->set_state(AsyncPacketSocket::STATE_BINDING); 1231 port->PrepareAddress(); 1232 1233 EXPECT_EQ(0U, port->Candidates().size()); 1234 socket->SignalAddressReady(socket, kLocalAddr2); 1235 1236 EXPECT_EQ(1U, port->Candidates().size()); 1237 } 1238 1239 void PortTest::TestCrossFamilyPorts(int type) { 1240 FakePacketSocketFactory factory; 1241 scoped_ptr<Port> ports[4]; 1242 SocketAddress addresses[4] = {SocketAddress("192.168.1.3", 0), 1243 SocketAddress("192.168.1.4", 0), 1244 SocketAddress("2001:db8::1", 0), 1245 SocketAddress("2001:db8::2", 0)}; 1246 for (int i = 0; i < 4; i++) { 1247 FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket(); 1248 if (type == SOCK_DGRAM) { 1249 factory.set_next_udp_socket(socket); 1250 ports[i].reset(CreateUdpPort(addresses[i], &factory)); 1251 } else if (type == SOCK_STREAM) { 1252 factory.set_next_server_tcp_socket(socket); 1253 ports[i].reset(CreateTcpPort(addresses[i], &factory)); 1254 } 1255 socket->set_state(AsyncPacketSocket::STATE_BINDING); 1256 socket->SignalAddressReady(socket, addresses[i]); 1257 ports[i]->PrepareAddress(); 1258 } 1259 1260 // IPv4 Port, connects to IPv6 candidate and then to IPv4 candidate. 1261 if (type == SOCK_STREAM) { 1262 FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket(); 1263 factory.set_next_client_tcp_socket(clientsocket); 1264 } 1265 Connection* c = ports[0]->CreateConnection(GetCandidate(ports[2].get()), 1266 Port::ORIGIN_MESSAGE); 1267 EXPECT_TRUE(NULL == c); 1268 EXPECT_EQ(0U, ports[0]->connections().size()); 1269 c = ports[0]->CreateConnection(GetCandidate(ports[1].get()), 1270 Port::ORIGIN_MESSAGE); 1271 EXPECT_FALSE(NULL == c); 1272 EXPECT_EQ(1U, ports[0]->connections().size()); 1273 1274 // IPv6 Port, connects to IPv4 candidate and to IPv6 candidate. 1275 if (type == SOCK_STREAM) { 1276 FakeAsyncPacketSocket* clientsocket = new FakeAsyncPacketSocket(); 1277 factory.set_next_client_tcp_socket(clientsocket); 1278 } 1279 c = ports[2]->CreateConnection(GetCandidate(ports[0].get()), 1280 Port::ORIGIN_MESSAGE); 1281 EXPECT_TRUE(NULL == c); 1282 EXPECT_EQ(0U, ports[2]->connections().size()); 1283 c = ports[2]->CreateConnection(GetCandidate(ports[3].get()), 1284 Port::ORIGIN_MESSAGE); 1285 EXPECT_FALSE(NULL == c); 1286 EXPECT_EQ(1U, ports[2]->connections().size()); 1287 } 1288 1289 TEST_F(PortTest, TestSkipCrossFamilyTcp) { 1290 TestCrossFamilyPorts(SOCK_STREAM); 1291 } 1292 1293 TEST_F(PortTest, TestSkipCrossFamilyUdp) { 1294 TestCrossFamilyPorts(SOCK_DGRAM); 1295 } 1296 1297 // This test verifies DSCP value set through SetOption interface can be 1298 // get through DefaultDscpValue. 1299 TEST_F(PortTest, TestDefaultDscpValue) { 1300 int dscp; 1301 rtc::scoped_ptr<UDPPort> udpport(CreateUdpPort(kLocalAddr1)); 1302 EXPECT_EQ(0, udpport->SetOption(rtc::Socket::OPT_DSCP, 1303 rtc::DSCP_CS6)); 1304 EXPECT_EQ(0, udpport->GetOption(rtc::Socket::OPT_DSCP, &dscp)); 1305 rtc::scoped_ptr<TCPPort> tcpport(CreateTcpPort(kLocalAddr1)); 1306 EXPECT_EQ(0, tcpport->SetOption(rtc::Socket::OPT_DSCP, 1307 rtc::DSCP_AF31)); 1308 EXPECT_EQ(0, tcpport->GetOption(rtc::Socket::OPT_DSCP, &dscp)); 1309 EXPECT_EQ(rtc::DSCP_AF31, dscp); 1310 rtc::scoped_ptr<StunPort> stunport( 1311 CreateStunPort(kLocalAddr1, nat_socket_factory1())); 1312 EXPECT_EQ(0, stunport->SetOption(rtc::Socket::OPT_DSCP, 1313 rtc::DSCP_AF41)); 1314 EXPECT_EQ(0, stunport->GetOption(rtc::Socket::OPT_DSCP, &dscp)); 1315 EXPECT_EQ(rtc::DSCP_AF41, dscp); 1316 rtc::scoped_ptr<TurnPort> turnport1(CreateTurnPort( 1317 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); 1318 // Socket is created in PrepareAddress. 1319 turnport1->PrepareAddress(); 1320 EXPECT_EQ(0, turnport1->SetOption(rtc::Socket::OPT_DSCP, 1321 rtc::DSCP_CS7)); 1322 EXPECT_EQ(0, turnport1->GetOption(rtc::Socket::OPT_DSCP, &dscp)); 1323 EXPECT_EQ(rtc::DSCP_CS7, dscp); 1324 // This will verify correct value returned without the socket. 1325 rtc::scoped_ptr<TurnPort> turnport2(CreateTurnPort( 1326 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); 1327 EXPECT_EQ(0, turnport2->SetOption(rtc::Socket::OPT_DSCP, 1328 rtc::DSCP_CS6)); 1329 EXPECT_EQ(0, turnport2->GetOption(rtc::Socket::OPT_DSCP, &dscp)); 1330 EXPECT_EQ(rtc::DSCP_CS6, dscp); 1331 } 1332 1333 // Test sending STUN messages in GICE format. 1334 TEST_F(PortTest, TestSendStunMessageAsGice) { 1335 rtc::scoped_ptr<TestPort> lport( 1336 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1337 rtc::scoped_ptr<TestPort> rport( 1338 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1339 lport->SetIceProtocolType(ICEPROTO_GOOGLE); 1340 rport->SetIceProtocolType(ICEPROTO_GOOGLE); 1341 1342 // Send a fake ping from lport to rport. 1343 lport->PrepareAddress(); 1344 rport->PrepareAddress(); 1345 ASSERT_FALSE(rport->Candidates().empty()); 1346 Connection* conn = lport->CreateConnection(rport->Candidates()[0], 1347 Port::ORIGIN_MESSAGE); 1348 rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE); 1349 conn->Ping(0); 1350 1351 // Check that it's a proper BINDING-REQUEST. 1352 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1353 IceMessage* msg = lport->last_stun_msg(); 1354 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); 1355 EXPECT_FALSE(msg->IsLegacy()); 1356 const StunByteStringAttribute* username_attr = msg->GetByteString( 1357 STUN_ATTR_USERNAME); 1358 ASSERT_TRUE(username_attr != NULL); 1359 EXPECT_EQ("rfraglfrag", username_attr->GetString()); 1360 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL); 1361 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL); 1362 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL); 1363 1364 // Save a copy of the BINDING-REQUEST for use below. 1365 rtc::scoped_ptr<IceMessage> request(CopyStunMessage(msg)); 1366 1367 // Respond with a BINDING-RESPONSE. 1368 rport->SendBindingResponse(request.get(), lport->Candidates()[0].address()); 1369 msg = rport->last_stun_msg(); 1370 ASSERT_TRUE(msg != NULL); 1371 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type()); 1372 EXPECT_FALSE(msg->IsLegacy()); 1373 username_attr = msg->GetByteString(STUN_ATTR_USERNAME); 1374 ASSERT_TRUE(username_attr != NULL); // GICE has a username in the response. 1375 EXPECT_EQ("rfraglfrag", username_attr->GetString()); 1376 const StunAddressAttribute* addr_attr = msg->GetAddress( 1377 STUN_ATTR_MAPPED_ADDRESS); 1378 ASSERT_TRUE(addr_attr != NULL); 1379 EXPECT_EQ(lport->Candidates()[0].address(), addr_attr->GetAddress()); 1380 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_XOR_MAPPED_ADDRESS) == NULL); 1381 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL); 1382 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL); 1383 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL); 1384 1385 // Respond with a BINDING-ERROR-RESPONSE. This wouldn't happen in real life, 1386 // but we can do it here. 1387 rport->SendBindingErrorResponse(request.get(), 1388 rport->Candidates()[0].address(), 1389 STUN_ERROR_SERVER_ERROR, 1390 STUN_ERROR_REASON_SERVER_ERROR); 1391 msg = rport->last_stun_msg(); 1392 ASSERT_TRUE(msg != NULL); 1393 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type()); 1394 EXPECT_FALSE(msg->IsLegacy()); 1395 username_attr = msg->GetByteString(STUN_ATTR_USERNAME); 1396 ASSERT_TRUE(username_attr != NULL); // GICE has a username in the response. 1397 EXPECT_EQ("rfraglfrag", username_attr->GetString()); 1398 const StunErrorCodeAttribute* error_attr = msg->GetErrorCode(); 1399 ASSERT_TRUE(error_attr != NULL); 1400 // The GICE wire format for error codes is incorrect. 1401 EXPECT_EQ(STUN_ERROR_SERVER_ERROR_AS_GICE, error_attr->code()); 1402 EXPECT_EQ(STUN_ERROR_SERVER_ERROR / 256, error_attr->eclass()); 1403 EXPECT_EQ(STUN_ERROR_SERVER_ERROR % 256, error_attr->number()); 1404 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), error_attr->reason()); 1405 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL); 1406 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL); 1407 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL); 1408 } 1409 1410 // Test sending STUN messages in ICE format. 1411 TEST_F(PortTest, TestSendStunMessageAsIce) { 1412 rtc::scoped_ptr<TestPort> lport( 1413 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1414 rtc::scoped_ptr<TestPort> rport( 1415 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1416 lport->SetIceProtocolType(ICEPROTO_RFC5245); 1417 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1418 lport->SetIceTiebreaker(kTiebreaker1); 1419 rport->SetIceProtocolType(ICEPROTO_RFC5245); 1420 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); 1421 rport->SetIceTiebreaker(kTiebreaker2); 1422 1423 // Send a fake ping from lport to rport. 1424 lport->PrepareAddress(); 1425 rport->PrepareAddress(); 1426 ASSERT_FALSE(rport->Candidates().empty()); 1427 Connection* lconn = lport->CreateConnection( 1428 rport->Candidates()[0], Port::ORIGIN_MESSAGE); 1429 Connection* rconn = rport->CreateConnection( 1430 lport->Candidates()[0], Port::ORIGIN_MESSAGE); 1431 lconn->Ping(0); 1432 1433 // Check that it's a proper BINDING-REQUEST. 1434 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1435 IceMessage* msg = lport->last_stun_msg(); 1436 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); 1437 EXPECT_FALSE(msg->IsLegacy()); 1438 const StunByteStringAttribute* username_attr = 1439 msg->GetByteString(STUN_ATTR_USERNAME); 1440 ASSERT_TRUE(username_attr != NULL); 1441 const StunUInt32Attribute* priority_attr = msg->GetUInt32(STUN_ATTR_PRIORITY); 1442 ASSERT_TRUE(priority_attr != NULL); 1443 EXPECT_EQ(kDefaultPrflxPriority, priority_attr->value()); 1444 EXPECT_EQ("rfrag:lfrag", username_attr->GetString()); 1445 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL); 1446 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( 1447 lport->last_stun_buf()->Data(), lport->last_stun_buf()->Length(), 1448 "rpass")); 1449 const StunUInt64Attribute* ice_controlling_attr = 1450 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); 1451 ASSERT_TRUE(ice_controlling_attr != NULL); 1452 EXPECT_EQ(lport->IceTiebreaker(), ice_controlling_attr->value()); 1453 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == NULL); 1454 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL); 1455 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL); 1456 EXPECT_TRUE(StunMessage::ValidateFingerprint( 1457 lport->last_stun_buf()->Data(), lport->last_stun_buf()->Length())); 1458 1459 // Request should not include ping count. 1460 ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == NULL); 1461 1462 // Save a copy of the BINDING-REQUEST for use below. 1463 rtc::scoped_ptr<IceMessage> request(CopyStunMessage(msg)); 1464 1465 // Respond with a BINDING-RESPONSE. 1466 rport->SendBindingResponse(request.get(), lport->Candidates()[0].address()); 1467 msg = rport->last_stun_msg(); 1468 ASSERT_TRUE(msg != NULL); 1469 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type()); 1470 1471 1472 EXPECT_FALSE(msg->IsLegacy()); 1473 const StunAddressAttribute* addr_attr = msg->GetAddress( 1474 STUN_ATTR_XOR_MAPPED_ADDRESS); 1475 ASSERT_TRUE(addr_attr != NULL); 1476 EXPECT_EQ(lport->Candidates()[0].address(), addr_attr->GetAddress()); 1477 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL); 1478 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( 1479 rport->last_stun_buf()->Data(), rport->last_stun_buf()->Length(), 1480 "rpass")); 1481 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL); 1482 EXPECT_TRUE(StunMessage::ValidateFingerprint( 1483 lport->last_stun_buf()->Data(), lport->last_stun_buf()->Length())); 1484 // No USERNAME or PRIORITY in ICE responses. 1485 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == NULL); 1486 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL); 1487 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MAPPED_ADDRESS) == NULL); 1488 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLING) == NULL); 1489 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_ICE_CONTROLLED) == NULL); 1490 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL); 1491 1492 // Response should not include ping count. 1493 ASSERT_TRUE(msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT) == NULL); 1494 1495 // Respond with a BINDING-ERROR-RESPONSE. This wouldn't happen in real life, 1496 // but we can do it here. 1497 rport->SendBindingErrorResponse(request.get(), 1498 lport->Candidates()[0].address(), 1499 STUN_ERROR_SERVER_ERROR, 1500 STUN_ERROR_REASON_SERVER_ERROR); 1501 msg = rport->last_stun_msg(); 1502 ASSERT_TRUE(msg != NULL); 1503 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type()); 1504 EXPECT_FALSE(msg->IsLegacy()); 1505 const StunErrorCodeAttribute* error_attr = msg->GetErrorCode(); 1506 ASSERT_TRUE(error_attr != NULL); 1507 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, error_attr->code()); 1508 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), error_attr->reason()); 1509 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) != NULL); 1510 EXPECT_TRUE(StunMessage::ValidateMessageIntegrity( 1511 rport->last_stun_buf()->Data(), rport->last_stun_buf()->Length(), 1512 "rpass")); 1513 EXPECT_TRUE(msg->GetUInt32(STUN_ATTR_FINGERPRINT) != NULL); 1514 EXPECT_TRUE(StunMessage::ValidateFingerprint( 1515 lport->last_stun_buf()->Data(), lport->last_stun_buf()->Length())); 1516 // No USERNAME with ICE. 1517 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USERNAME) == NULL); 1518 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL); 1519 1520 // Testing STUN binding requests from rport --> lport, having ICE_CONTROLLED 1521 // and (incremented) RETRANSMIT_COUNT attributes. 1522 rport->Reset(); 1523 rport->set_send_retransmit_count_attribute(true); 1524 rconn->Ping(0); 1525 rconn->Ping(0); 1526 rconn->Ping(0); 1527 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000); 1528 msg = rport->last_stun_msg(); 1529 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); 1530 const StunUInt64Attribute* ice_controlled_attr = 1531 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLED); 1532 ASSERT_TRUE(ice_controlled_attr != NULL); 1533 EXPECT_EQ(rport->IceTiebreaker(), ice_controlled_attr->value()); 1534 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL); 1535 1536 // Request should include ping count. 1537 const StunUInt32Attribute* retransmit_attr = 1538 msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT); 1539 ASSERT_TRUE(retransmit_attr != NULL); 1540 EXPECT_EQ(2U, retransmit_attr->value()); 1541 1542 // Respond with a BINDING-RESPONSE. 1543 request.reset(CopyStunMessage(msg)); 1544 lport->SendBindingResponse(request.get(), rport->Candidates()[0].address()); 1545 msg = lport->last_stun_msg(); 1546 1547 // Response should include same ping count. 1548 retransmit_attr = msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT); 1549 ASSERT_TRUE(retransmit_attr != NULL); 1550 EXPECT_EQ(2U, retransmit_attr->value()); 1551 } 1552 1553 TEST_F(PortTest, TestUseCandidateAttribute) { 1554 rtc::scoped_ptr<TestPort> lport( 1555 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1556 rtc::scoped_ptr<TestPort> rport( 1557 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1558 lport->SetIceProtocolType(ICEPROTO_RFC5245); 1559 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1560 lport->SetIceTiebreaker(kTiebreaker1); 1561 rport->SetIceProtocolType(ICEPROTO_RFC5245); 1562 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); 1563 rport->SetIceTiebreaker(kTiebreaker2); 1564 1565 // Send a fake ping from lport to rport. 1566 lport->PrepareAddress(); 1567 rport->PrepareAddress(); 1568 ASSERT_FALSE(rport->Candidates().empty()); 1569 Connection* lconn = lport->CreateConnection( 1570 rport->Candidates()[0], Port::ORIGIN_MESSAGE); 1571 lconn->Ping(0); 1572 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1573 IceMessage* msg = lport->last_stun_msg(); 1574 const StunUInt64Attribute* ice_controlling_attr = 1575 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); 1576 ASSERT_TRUE(ice_controlling_attr != NULL); 1577 const StunByteStringAttribute* use_candidate_attr = msg->GetByteString( 1578 STUN_ATTR_USE_CANDIDATE); 1579 ASSERT_TRUE(use_candidate_attr != NULL); 1580 } 1581 1582 // Test handling STUN messages in GICE format. 1583 TEST_F(PortTest, TestHandleStunMessageAsGice) { 1584 // Our port will act as the "remote" port. 1585 rtc::scoped_ptr<TestPort> port( 1586 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1587 port->SetIceProtocolType(ICEPROTO_GOOGLE); 1588 1589 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1590 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1591 rtc::SocketAddress addr(kLocalAddr1); 1592 std::string username; 1593 1594 // BINDING-REQUEST from local to remote with valid GICE username and no M-I. 1595 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1596 "rfraglfrag")); 1597 WriteStunMessage(in_msg.get(), buf.get()); 1598 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1599 out_msg.accept(), &username)); 1600 EXPECT_TRUE(out_msg.get() != NULL); // Succeeds, since this is GICE. 1601 EXPECT_EQ("lfrag", username); 1602 1603 // Add M-I; should be ignored and rest of message parsed normally. 1604 in_msg->AddMessageIntegrity("password"); 1605 WriteStunMessage(in_msg.get(), buf.get()); 1606 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1607 out_msg.accept(), &username)); 1608 EXPECT_TRUE(out_msg.get() != NULL); 1609 EXPECT_EQ("lfrag", username); 1610 1611 // BINDING-RESPONSE with username, as done in GICE. Should succeed. 1612 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_RESPONSE, 1613 "rfraglfrag")); 1614 in_msg->AddAttribute( 1615 new StunAddressAttribute(STUN_ATTR_MAPPED_ADDRESS, kLocalAddr2)); 1616 WriteStunMessage(in_msg.get(), buf.get()); 1617 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1618 out_msg.accept(), &username)); 1619 EXPECT_TRUE(out_msg.get() != NULL); 1620 EXPECT_EQ("", username); 1621 1622 // BINDING-RESPONSE without username. Should be tolerated as well. 1623 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); 1624 in_msg->AddAttribute( 1625 new StunAddressAttribute(STUN_ATTR_MAPPED_ADDRESS, kLocalAddr2)); 1626 WriteStunMessage(in_msg.get(), buf.get()); 1627 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1628 out_msg.accept(), &username)); 1629 EXPECT_TRUE(out_msg.get() != NULL); 1630 EXPECT_EQ("", username); 1631 1632 // BINDING-ERROR-RESPONSE with username and error code. 1633 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_ERROR_RESPONSE, 1634 "rfraglfrag")); 1635 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, 1636 STUN_ERROR_SERVER_ERROR_AS_GICE, STUN_ERROR_REASON_SERVER_ERROR)); 1637 WriteStunMessage(in_msg.get(), buf.get()); 1638 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1639 out_msg.accept(), &username)); 1640 ASSERT_TRUE(out_msg.get() != NULL); 1641 EXPECT_EQ("", username); 1642 ASSERT_TRUE(out_msg->GetErrorCode() != NULL); 1643 // GetStunMessage doesn't unmunge the GICE error code (happens downstream). 1644 EXPECT_EQ(STUN_ERROR_SERVER_ERROR_AS_GICE, out_msg->GetErrorCode()->code()); 1645 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), 1646 out_msg->GetErrorCode()->reason()); 1647 } 1648 1649 // Test handling STUN messages in ICE format. 1650 TEST_F(PortTest, TestHandleStunMessageAsIce) { 1651 // Our port will act as the "remote" port. 1652 rtc::scoped_ptr<TestPort> port( 1653 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1654 port->SetIceProtocolType(ICEPROTO_RFC5245); 1655 1656 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1657 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1658 rtc::SocketAddress addr(kLocalAddr1); 1659 std::string username; 1660 1661 // BINDING-REQUEST from local to remote with valid ICE username, 1662 // MESSAGE-INTEGRITY, and FINGERPRINT. 1663 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1664 "rfrag:lfrag")); 1665 in_msg->AddMessageIntegrity("rpass"); 1666 in_msg->AddFingerprint(); 1667 WriteStunMessage(in_msg.get(), buf.get()); 1668 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1669 out_msg.accept(), &username)); 1670 EXPECT_TRUE(out_msg.get() != NULL); 1671 EXPECT_EQ("lfrag", username); 1672 1673 // BINDING-RESPONSE without username, with MESSAGE-INTEGRITY and FINGERPRINT. 1674 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); 1675 in_msg->AddAttribute( 1676 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); 1677 in_msg->AddMessageIntegrity("rpass"); 1678 in_msg->AddFingerprint(); 1679 WriteStunMessage(in_msg.get(), buf.get()); 1680 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1681 out_msg.accept(), &username)); 1682 EXPECT_TRUE(out_msg.get() != NULL); 1683 EXPECT_EQ("", username); 1684 1685 // BINDING-ERROR-RESPONSE without username, with error, M-I, and FINGERPRINT. 1686 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE)); 1687 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, 1688 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); 1689 in_msg->AddFingerprint(); 1690 WriteStunMessage(in_msg.get(), buf.get()); 1691 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1692 out_msg.accept(), &username)); 1693 EXPECT_TRUE(out_msg.get() != NULL); 1694 EXPECT_EQ("", username); 1695 ASSERT_TRUE(out_msg->GetErrorCode() != NULL); 1696 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code()); 1697 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), 1698 out_msg->GetErrorCode()->reason()); 1699 } 1700 1701 // This test verifies port can handle ICE messages in Hybrid mode and switches 1702 // ICEPROTO_RFC5245 mode after successfully handling the message. 1703 TEST_F(PortTest, TestHandleStunMessageAsIceInHybridMode) { 1704 // Our port will act as the "remote" port. 1705 rtc::scoped_ptr<TestPort> port( 1706 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1707 port->SetIceProtocolType(ICEPROTO_HYBRID); 1708 1709 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1710 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1711 rtc::SocketAddress addr(kLocalAddr1); 1712 std::string username; 1713 1714 // BINDING-REQUEST from local to remote with valid ICE username, 1715 // MESSAGE-INTEGRITY, and FINGERPRINT. 1716 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1717 "rfrag:lfrag")); 1718 in_msg->AddMessageIntegrity("rpass"); 1719 in_msg->AddFingerprint(); 1720 WriteStunMessage(in_msg.get(), buf.get()); 1721 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1722 out_msg.accept(), &username)); 1723 EXPECT_TRUE(out_msg.get() != NULL); 1724 EXPECT_EQ("lfrag", username); 1725 EXPECT_EQ(ICEPROTO_RFC5245, port->IceProtocol()); 1726 } 1727 1728 // This test verifies port can handle GICE messages in Hybrid mode and switches 1729 // ICEPROTO_GOOGLE mode after successfully handling the message. 1730 TEST_F(PortTest, TestHandleStunMessageAsGiceInHybridMode) { 1731 // Our port will act as the "remote" port. 1732 rtc::scoped_ptr<TestPort> port( 1733 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1734 port->SetIceProtocolType(ICEPROTO_HYBRID); 1735 1736 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1737 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1738 rtc::SocketAddress addr(kLocalAddr1); 1739 std::string username; 1740 1741 // BINDING-REQUEST from local to remote with valid GICE username and no M-I. 1742 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1743 "rfraglfrag")); 1744 WriteStunMessage(in_msg.get(), buf.get()); 1745 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1746 out_msg.accept(), &username)); 1747 EXPECT_TRUE(out_msg.get() != NULL); // Succeeds, since this is GICE. 1748 EXPECT_EQ("lfrag", username); 1749 EXPECT_EQ(ICEPROTO_GOOGLE, port->IceProtocol()); 1750 } 1751 1752 // Verify port is not switched out of RFC5245 mode if GICE message is received 1753 // in that mode. 1754 TEST_F(PortTest, TestHandleStunMessageAsGiceInIceMode) { 1755 // Our port will act as the "remote" port. 1756 rtc::scoped_ptr<TestPort> port( 1757 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1758 port->SetIceProtocolType(ICEPROTO_RFC5245); 1759 1760 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1761 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1762 rtc::SocketAddress addr(kLocalAddr1); 1763 std::string username; 1764 1765 // BINDING-REQUEST from local to remote with valid GICE username and no M-I. 1766 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1767 "rfraglfrag")); 1768 WriteStunMessage(in_msg.get(), buf.get()); 1769 // Should fail as there is no MI and fingerprint. 1770 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1771 out_msg.accept(), &username)); 1772 EXPECT_EQ(ICEPROTO_RFC5245, port->IceProtocol()); 1773 } 1774 1775 1776 // Tests handling of GICE binding requests with missing or incorrect usernames. 1777 TEST_F(PortTest, TestHandleStunMessageAsGiceBadUsername) { 1778 rtc::scoped_ptr<TestPort> port( 1779 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1780 port->SetIceProtocolType(ICEPROTO_GOOGLE); 1781 1782 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1783 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1784 rtc::SocketAddress addr(kLocalAddr1); 1785 std::string username; 1786 1787 // BINDING-REQUEST with no username. 1788 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST)); 1789 WriteStunMessage(in_msg.get(), buf.get()); 1790 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1791 out_msg.accept(), &username)); 1792 EXPECT_TRUE(out_msg.get() == NULL); 1793 EXPECT_EQ("", username); 1794 EXPECT_EQ(STUN_ERROR_BAD_REQUEST_AS_GICE, port->last_stun_error_code()); 1795 1796 // BINDING-REQUEST with empty username. 1797 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "")); 1798 WriteStunMessage(in_msg.get(), buf.get()); 1799 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1800 out_msg.accept(), &username)); 1801 EXPECT_TRUE(out_msg.get() == NULL); 1802 EXPECT_EQ("", username); 1803 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code()); 1804 1805 // BINDING-REQUEST with too-short username. 1806 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "lfra")); 1807 WriteStunMessage(in_msg.get(), buf.get()); 1808 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1809 out_msg.accept(), &username)); 1810 EXPECT_TRUE(out_msg.get() == NULL); 1811 EXPECT_EQ("", username); 1812 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code()); 1813 1814 // BINDING-REQUEST with reversed username. 1815 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1816 "lfragrfrag")); 1817 WriteStunMessage(in_msg.get(), buf.get()); 1818 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1819 out_msg.accept(), &username)); 1820 EXPECT_TRUE(out_msg.get() == NULL); 1821 EXPECT_EQ("", username); 1822 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code()); 1823 1824 // BINDING-REQUEST with garbage username. 1825 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1826 "abcdefgh")); 1827 WriteStunMessage(in_msg.get(), buf.get()); 1828 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1829 out_msg.accept(), &username)); 1830 EXPECT_TRUE(out_msg.get() == NULL); 1831 EXPECT_EQ("", username); 1832 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code()); 1833 } 1834 1835 // Tests handling of ICE binding requests with missing or incorrect usernames. 1836 TEST_F(PortTest, TestHandleStunMessageAsIceBadUsername) { 1837 rtc::scoped_ptr<TestPort> port( 1838 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1839 port->SetIceProtocolType(ICEPROTO_RFC5245); 1840 1841 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1842 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1843 rtc::SocketAddress addr(kLocalAddr1); 1844 std::string username; 1845 1846 // BINDING-REQUEST with no username. 1847 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST)); 1848 in_msg->AddMessageIntegrity("rpass"); 1849 in_msg->AddFingerprint(); 1850 WriteStunMessage(in_msg.get(), buf.get()); 1851 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1852 out_msg.accept(), &username)); 1853 EXPECT_TRUE(out_msg.get() == NULL); 1854 EXPECT_EQ("", username); 1855 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); 1856 1857 // BINDING-REQUEST with empty username. 1858 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "")); 1859 in_msg->AddMessageIntegrity("rpass"); 1860 in_msg->AddFingerprint(); 1861 WriteStunMessage(in_msg.get(), buf.get()); 1862 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1863 out_msg.accept(), &username)); 1864 EXPECT_TRUE(out_msg.get() == NULL); 1865 EXPECT_EQ("", username); 1866 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); 1867 1868 // BINDING-REQUEST with too-short username. 1869 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "rfra")); 1870 in_msg->AddMessageIntegrity("rpass"); 1871 in_msg->AddFingerprint(); 1872 WriteStunMessage(in_msg.get(), buf.get()); 1873 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1874 out_msg.accept(), &username)); 1875 EXPECT_TRUE(out_msg.get() == NULL); 1876 EXPECT_EQ("", username); 1877 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); 1878 1879 // BINDING-REQUEST with reversed username. 1880 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1881 "lfrag:rfrag")); 1882 in_msg->AddMessageIntegrity("rpass"); 1883 in_msg->AddFingerprint(); 1884 WriteStunMessage(in_msg.get(), buf.get()); 1885 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1886 out_msg.accept(), &username)); 1887 EXPECT_TRUE(out_msg.get() == NULL); 1888 EXPECT_EQ("", username); 1889 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); 1890 1891 // BINDING-REQUEST with garbage username. 1892 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1893 "abcd:efgh")); 1894 in_msg->AddMessageIntegrity("rpass"); 1895 in_msg->AddFingerprint(); 1896 WriteStunMessage(in_msg.get(), buf.get()); 1897 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1898 out_msg.accept(), &username)); 1899 EXPECT_TRUE(out_msg.get() == NULL); 1900 EXPECT_EQ("", username); 1901 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); 1902 } 1903 1904 // Test handling STUN messages (as ICE) with missing or malformed M-I. 1905 TEST_F(PortTest, TestHandleStunMessageAsIceBadMessageIntegrity) { 1906 // Our port will act as the "remote" port. 1907 rtc::scoped_ptr<TestPort> port( 1908 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1909 port->SetIceProtocolType(ICEPROTO_RFC5245); 1910 1911 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1912 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1913 rtc::SocketAddress addr(kLocalAddr1); 1914 std::string username; 1915 1916 // BINDING-REQUEST from local to remote with valid ICE username and 1917 // FINGERPRINT, but no MESSAGE-INTEGRITY. 1918 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1919 "rfrag:lfrag")); 1920 in_msg->AddFingerprint(); 1921 WriteStunMessage(in_msg.get(), buf.get()); 1922 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1923 out_msg.accept(), &username)); 1924 EXPECT_TRUE(out_msg.get() == NULL); 1925 EXPECT_EQ("", username); 1926 EXPECT_EQ(STUN_ERROR_BAD_REQUEST, port->last_stun_error_code()); 1927 1928 // BINDING-REQUEST from local to remote with valid ICE username and 1929 // FINGERPRINT, but invalid MESSAGE-INTEGRITY. 1930 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1931 "rfrag:lfrag")); 1932 in_msg->AddMessageIntegrity("invalid"); 1933 in_msg->AddFingerprint(); 1934 WriteStunMessage(in_msg.get(), buf.get()); 1935 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1936 out_msg.accept(), &username)); 1937 EXPECT_TRUE(out_msg.get() == NULL); 1938 EXPECT_EQ("", username); 1939 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); 1940 1941 // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked 1942 // by the Connection, not the Port, since they require the remote username. 1943 // Change this test to pass in data via Connection::OnReadPacket instead. 1944 } 1945 1946 // Test handling STUN messages (as ICE) with missing or malformed FINGERPRINT. 1947 TEST_F(PortTest, TestHandleStunMessageAsIceBadFingerprint) { 1948 // Our port will act as the "remote" port. 1949 rtc::scoped_ptr<TestPort> port( 1950 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1951 port->SetIceProtocolType(ICEPROTO_RFC5245); 1952 1953 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1954 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1955 rtc::SocketAddress addr(kLocalAddr1); 1956 std::string username; 1957 1958 // BINDING-REQUEST from local to remote with valid ICE username and 1959 // MESSAGE-INTEGRITY, but no FINGERPRINT; GetStunMessage should fail. 1960 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1961 "rfrag:lfrag")); 1962 in_msg->AddMessageIntegrity("rpass"); 1963 WriteStunMessage(in_msg.get(), buf.get()); 1964 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1965 out_msg.accept(), &username)); 1966 EXPECT_EQ(0, port->last_stun_error_code()); 1967 1968 // Now, add a fingerprint, but munge the message so it's not valid. 1969 in_msg->AddFingerprint(); 1970 in_msg->SetTransactionID("TESTTESTBADD"); 1971 WriteStunMessage(in_msg.get(), buf.get()); 1972 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1973 out_msg.accept(), &username)); 1974 EXPECT_EQ(0, port->last_stun_error_code()); 1975 1976 // Valid BINDING-RESPONSE, except no FINGERPRINT. 1977 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE)); 1978 in_msg->AddAttribute( 1979 new StunXorAddressAttribute(STUN_ATTR_XOR_MAPPED_ADDRESS, kLocalAddr2)); 1980 in_msg->AddMessageIntegrity("rpass"); 1981 WriteStunMessage(in_msg.get(), buf.get()); 1982 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1983 out_msg.accept(), &username)); 1984 EXPECT_EQ(0, port->last_stun_error_code()); 1985 1986 // Now, add a fingerprint, but munge the message so it's not valid. 1987 in_msg->AddFingerprint(); 1988 in_msg->SetTransactionID("TESTTESTBADD"); 1989 WriteStunMessage(in_msg.get(), buf.get()); 1990 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1991 out_msg.accept(), &username)); 1992 EXPECT_EQ(0, port->last_stun_error_code()); 1993 1994 // Valid BINDING-ERROR-RESPONSE, except no FINGERPRINT. 1995 in_msg.reset(CreateStunMessage(STUN_BINDING_ERROR_RESPONSE)); 1996 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE, 1997 STUN_ERROR_SERVER_ERROR, STUN_ERROR_REASON_SERVER_ERROR)); 1998 in_msg->AddMessageIntegrity("rpass"); 1999 WriteStunMessage(in_msg.get(), buf.get()); 2000 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 2001 out_msg.accept(), &username)); 2002 EXPECT_EQ(0, port->last_stun_error_code()); 2003 2004 // Now, add a fingerprint, but munge the message so it's not valid. 2005 in_msg->AddFingerprint(); 2006 in_msg->SetTransactionID("TESTTESTBADD"); 2007 WriteStunMessage(in_msg.get(), buf.get()); 2008 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 2009 out_msg.accept(), &username)); 2010 EXPECT_EQ(0, port->last_stun_error_code()); 2011 } 2012 2013 // Test handling of STUN binding indication messages (as ICE). STUN binding 2014 // indications are allowed only to the connection which is in read mode. 2015 TEST_F(PortTest, TestHandleStunBindingIndication) { 2016 rtc::scoped_ptr<TestPort> lport( 2017 CreateTestPort(kLocalAddr2, "lfrag", "lpass")); 2018 lport->SetIceProtocolType(ICEPROTO_RFC5245); 2019 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 2020 lport->SetIceTiebreaker(kTiebreaker1); 2021 2022 // Verifying encoding and decoding STUN indication message. 2023 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 2024 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 2025 rtc::SocketAddress addr(kLocalAddr1); 2026 std::string username; 2027 2028 in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION)); 2029 in_msg->AddFingerprint(); 2030 WriteStunMessage(in_msg.get(), buf.get()); 2031 EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, 2032 out_msg.accept(), &username)); 2033 EXPECT_TRUE(out_msg.get() != NULL); 2034 EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION); 2035 EXPECT_EQ("", username); 2036 2037 // Verify connection can handle STUN indication and updates 2038 // last_ping_received. 2039 rtc::scoped_ptr<TestPort> rport( 2040 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 2041 rport->SetIceProtocolType(ICEPROTO_RFC5245); 2042 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); 2043 rport->SetIceTiebreaker(kTiebreaker2); 2044 2045 lport->PrepareAddress(); 2046 rport->PrepareAddress(); 2047 ASSERT_FALSE(lport->Candidates().empty()); 2048 ASSERT_FALSE(rport->Candidates().empty()); 2049 2050 Connection* lconn = lport->CreateConnection(rport->Candidates()[0], 2051 Port::ORIGIN_MESSAGE); 2052 Connection* rconn = rport->CreateConnection(lport->Candidates()[0], 2053 Port::ORIGIN_MESSAGE); 2054 rconn->Ping(0); 2055 2056 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000); 2057 IceMessage* msg = rport->last_stun_msg(); 2058 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); 2059 // Send rport binding request to lport. 2060 lconn->OnReadPacket(rport->last_stun_buf()->Data(), 2061 rport->last_stun_buf()->Length(), 2062 rtc::PacketTime()); 2063 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 2064 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type()); 2065 uint32 last_ping_received1 = lconn->last_ping_received(); 2066 2067 // Adding a delay of 100ms. 2068 rtc::Thread::Current()->ProcessMessages(100); 2069 // Pinging lconn using stun indication message. 2070 lconn->OnReadPacket(buf->Data(), buf->Length(), rtc::PacketTime()); 2071 uint32 last_ping_received2 = lconn->last_ping_received(); 2072 EXPECT_GT(last_ping_received2, last_ping_received1); 2073 } 2074 2075 TEST_F(PortTest, TestComputeCandidatePriority) { 2076 rtc::scoped_ptr<TestPort> port( 2077 CreateTestPort(kLocalAddr1, "name", "pass")); 2078 port->set_type_preference(90); 2079 port->set_component(177); 2080 port->AddCandidateAddress(SocketAddress("192.168.1.4", 1234)); 2081 port->AddCandidateAddress(SocketAddress("2001:db8::1234", 1234)); 2082 port->AddCandidateAddress(SocketAddress("fc12:3456::1234", 1234)); 2083 port->AddCandidateAddress(SocketAddress("::ffff:192.168.1.4", 1234)); 2084 port->AddCandidateAddress(SocketAddress("::192.168.1.4", 1234)); 2085 port->AddCandidateAddress(SocketAddress("2002::1234:5678", 1234)); 2086 port->AddCandidateAddress(SocketAddress("2001::1234:5678", 1234)); 2087 port->AddCandidateAddress(SocketAddress("fecf::1234:5678", 1234)); 2088 port->AddCandidateAddress(SocketAddress("3ffe::1234:5678", 1234)); 2089 // These should all be: 2090 // (90 << 24) | ([rfc3484 pref value] << 8) | (256 - 177) 2091 uint32 expected_priority_v4 = 1509957199U; 2092 uint32 expected_priority_v6 = 1509959759U; 2093 uint32 expected_priority_ula = 1509962319U; 2094 uint32 expected_priority_v4mapped = expected_priority_v4; 2095 uint32 expected_priority_v4compat = 1509949775U; 2096 uint32 expected_priority_6to4 = 1509954639U; 2097 uint32 expected_priority_teredo = 1509952079U; 2098 uint32 expected_priority_sitelocal = 1509949775U; 2099 uint32 expected_priority_6bone = 1509949775U; 2100 ASSERT_EQ(expected_priority_v4, port->Candidates()[0].priority()); 2101 ASSERT_EQ(expected_priority_v6, port->Candidates()[1].priority()); 2102 ASSERT_EQ(expected_priority_ula, port->Candidates()[2].priority()); 2103 ASSERT_EQ(expected_priority_v4mapped, port->Candidates()[3].priority()); 2104 ASSERT_EQ(expected_priority_v4compat, port->Candidates()[4].priority()); 2105 ASSERT_EQ(expected_priority_6to4, port->Candidates()[5].priority()); 2106 ASSERT_EQ(expected_priority_teredo, port->Candidates()[6].priority()); 2107 ASSERT_EQ(expected_priority_sitelocal, port->Candidates()[7].priority()); 2108 ASSERT_EQ(expected_priority_6bone, port->Candidates()[8].priority()); 2109 } 2110 2111 TEST_F(PortTest, TestPortProxyProperties) { 2112 rtc::scoped_ptr<TestPort> port( 2113 CreateTestPort(kLocalAddr1, "name", "pass")); 2114 port->SetIceRole(cricket::ICEROLE_CONTROLLING); 2115 port->SetIceTiebreaker(kTiebreaker1); 2116 2117 // Create a proxy port. 2118 rtc::scoped_ptr<PortProxy> proxy(new PortProxy()); 2119 proxy->set_impl(port.get()); 2120 EXPECT_EQ(port->Type(), proxy->Type()); 2121 EXPECT_EQ(port->Network(), proxy->Network()); 2122 EXPECT_EQ(port->GetIceRole(), proxy->GetIceRole()); 2123 EXPECT_EQ(port->IceTiebreaker(), proxy->IceTiebreaker()); 2124 } 2125 2126 // In the case of shared socket, one port may be shared by local and stun. 2127 // Test that candidates with different types will have different foundation. 2128 TEST_F(PortTest, TestFoundation) { 2129 rtc::scoped_ptr<TestPort> testport( 2130 CreateTestPort(kLocalAddr1, "name", "pass")); 2131 testport->AddCandidateAddress(kLocalAddr1, kLocalAddr1, 2132 LOCAL_PORT_TYPE, 2133 cricket::ICE_TYPE_PREFERENCE_HOST, false); 2134 testport->AddCandidateAddress(kLocalAddr2, kLocalAddr1, 2135 STUN_PORT_TYPE, 2136 cricket::ICE_TYPE_PREFERENCE_SRFLX, true); 2137 EXPECT_NE(testport->Candidates()[0].foundation(), 2138 testport->Candidates()[1].foundation()); 2139 } 2140 2141 // This test verifies the foundation of different types of ICE candidates. 2142 TEST_F(PortTest, TestCandidateFoundation) { 2143 rtc::scoped_ptr<rtc::NATServer> nat_server( 2144 CreateNatServer(kNatAddr1, NAT_OPEN_CONE)); 2145 rtc::scoped_ptr<UDPPort> udpport1(CreateUdpPort(kLocalAddr1)); 2146 udpport1->PrepareAddress(); 2147 rtc::scoped_ptr<UDPPort> udpport2(CreateUdpPort(kLocalAddr1)); 2148 udpport2->PrepareAddress(); 2149 EXPECT_EQ(udpport1->Candidates()[0].foundation(), 2150 udpport2->Candidates()[0].foundation()); 2151 rtc::scoped_ptr<TCPPort> tcpport1(CreateTcpPort(kLocalAddr1)); 2152 tcpport1->PrepareAddress(); 2153 rtc::scoped_ptr<TCPPort> tcpport2(CreateTcpPort(kLocalAddr1)); 2154 tcpport2->PrepareAddress(); 2155 EXPECT_EQ(tcpport1->Candidates()[0].foundation(), 2156 tcpport2->Candidates()[0].foundation()); 2157 rtc::scoped_ptr<Port> stunport( 2158 CreateStunPort(kLocalAddr1, nat_socket_factory1())); 2159 stunport->PrepareAddress(); 2160 ASSERT_EQ_WAIT(1U, stunport->Candidates().size(), kTimeout); 2161 EXPECT_NE(tcpport1->Candidates()[0].foundation(), 2162 stunport->Candidates()[0].foundation()); 2163 EXPECT_NE(tcpport2->Candidates()[0].foundation(), 2164 stunport->Candidates()[0].foundation()); 2165 EXPECT_NE(udpport1->Candidates()[0].foundation(), 2166 stunport->Candidates()[0].foundation()); 2167 EXPECT_NE(udpport2->Candidates()[0].foundation(), 2168 stunport->Candidates()[0].foundation()); 2169 // Verify GTURN candidate foundation. 2170 rtc::scoped_ptr<RelayPort> relayport( 2171 CreateGturnPort(kLocalAddr1)); 2172 relayport->AddServerAddress( 2173 cricket::ProtocolAddress(kRelayUdpIntAddr, cricket::PROTO_UDP)); 2174 relayport->PrepareAddress(); 2175 ASSERT_EQ_WAIT(1U, relayport->Candidates().size(), kTimeout); 2176 EXPECT_NE(udpport1->Candidates()[0].foundation(), 2177 relayport->Candidates()[0].foundation()); 2178 EXPECT_NE(udpport2->Candidates()[0].foundation(), 2179 relayport->Candidates()[0].foundation()); 2180 // Verifying TURN candidate foundation. 2181 rtc::scoped_ptr<Port> turnport1(CreateTurnPort( 2182 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); 2183 turnport1->PrepareAddress(); 2184 ASSERT_EQ_WAIT(1U, turnport1->Candidates().size(), kTimeout); 2185 EXPECT_NE(udpport1->Candidates()[0].foundation(), 2186 turnport1->Candidates()[0].foundation()); 2187 EXPECT_NE(udpport2->Candidates()[0].foundation(), 2188 turnport1->Candidates()[0].foundation()); 2189 EXPECT_NE(stunport->Candidates()[0].foundation(), 2190 turnport1->Candidates()[0].foundation()); 2191 rtc::scoped_ptr<Port> turnport2(CreateTurnPort( 2192 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); 2193 turnport2->PrepareAddress(); 2194 ASSERT_EQ_WAIT(1U, turnport2->Candidates().size(), kTimeout); 2195 EXPECT_EQ(turnport1->Candidates()[0].foundation(), 2196 turnport2->Candidates()[0].foundation()); 2197 2198 // Running a second turn server, to get different base IP address. 2199 SocketAddress kTurnUdpIntAddr2("99.99.98.4", STUN_SERVER_PORT); 2200 SocketAddress kTurnUdpExtAddr2("99.99.98.5", 0); 2201 TestTurnServer turn_server2( 2202 rtc::Thread::Current(), kTurnUdpIntAddr2, kTurnUdpExtAddr2); 2203 rtc::scoped_ptr<Port> turnport3(CreateTurnPort( 2204 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP, 2205 kTurnUdpIntAddr2)); 2206 turnport3->PrepareAddress(); 2207 ASSERT_EQ_WAIT(1U, turnport3->Candidates().size(), kTimeout); 2208 EXPECT_NE(turnport3->Candidates()[0].foundation(), 2209 turnport2->Candidates()[0].foundation()); 2210 } 2211 2212 // This test verifies the related addresses of different types of 2213 // ICE candiates. 2214 TEST_F(PortTest, TestCandidateRelatedAddress) { 2215 rtc::scoped_ptr<rtc::NATServer> nat_server( 2216 CreateNatServer(kNatAddr1, NAT_OPEN_CONE)); 2217 rtc::scoped_ptr<UDPPort> udpport(CreateUdpPort(kLocalAddr1)); 2218 udpport->PrepareAddress(); 2219 // For UDPPort, related address will be empty. 2220 EXPECT_TRUE(udpport->Candidates()[0].related_address().IsNil()); 2221 // Testing related address for stun candidates. 2222 // For stun candidate related address must be equal to the base 2223 // socket address. 2224 rtc::scoped_ptr<StunPort> stunport( 2225 CreateStunPort(kLocalAddr1, nat_socket_factory1())); 2226 stunport->PrepareAddress(); 2227 ASSERT_EQ_WAIT(1U, stunport->Candidates().size(), kTimeout); 2228 // Check STUN candidate address. 2229 EXPECT_EQ(stunport->Candidates()[0].address().ipaddr(), 2230 kNatAddr1.ipaddr()); 2231 // Check STUN candidate related address. 2232 EXPECT_EQ(stunport->Candidates()[0].related_address(), 2233 stunport->GetLocalAddress()); 2234 // Verifying the related address for the GTURN candidates. 2235 // NOTE: In case of GTURN related address will be equal to the mapped 2236 // address, but address(mapped) will not be XOR. 2237 rtc::scoped_ptr<RelayPort> relayport( 2238 CreateGturnPort(kLocalAddr1)); 2239 relayport->AddServerAddress( 2240 cricket::ProtocolAddress(kRelayUdpIntAddr, cricket::PROTO_UDP)); 2241 relayport->PrepareAddress(); 2242 ASSERT_EQ_WAIT(1U, relayport->Candidates().size(), kTimeout); 2243 // For Gturn related address is set to "0.0.0.0:0" 2244 EXPECT_EQ(rtc::SocketAddress(), 2245 relayport->Candidates()[0].related_address()); 2246 // Verifying the related address for TURN candidate. 2247 // For TURN related address must be equal to the mapped address. 2248 rtc::scoped_ptr<Port> turnport(CreateTurnPort( 2249 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); 2250 turnport->PrepareAddress(); 2251 ASSERT_EQ_WAIT(1U, turnport->Candidates().size(), kTimeout); 2252 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), 2253 turnport->Candidates()[0].address().ipaddr()); 2254 EXPECT_EQ(kNatAddr1.ipaddr(), 2255 turnport->Candidates()[0].related_address().ipaddr()); 2256 } 2257 2258 // Test priority value overflow handling when preference is set to 3. 2259 TEST_F(PortTest, TestCandidatePreference) { 2260 cricket::Candidate cand1; 2261 cand1.set_preference(3); 2262 cricket::Candidate cand2; 2263 cand2.set_preference(1); 2264 EXPECT_TRUE(cand1.preference() > cand2.preference()); 2265 } 2266 2267 // Test the Connection priority is calculated correctly. 2268 TEST_F(PortTest, TestConnectionPriority) { 2269 rtc::scoped_ptr<TestPort> lport( 2270 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 2271 lport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_HOST); 2272 rtc::scoped_ptr<TestPort> rport( 2273 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 2274 rport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_RELAY); 2275 lport->set_component(123); 2276 lport->AddCandidateAddress(SocketAddress("192.168.1.4", 1234)); 2277 rport->set_component(23); 2278 rport->AddCandidateAddress(SocketAddress("10.1.1.100", 1234)); 2279 2280 EXPECT_EQ(0x7E001E85U, lport->Candidates()[0].priority()); 2281 EXPECT_EQ(0x2001EE9U, rport->Candidates()[0].priority()); 2282 2283 // RFC 5245 2284 // pair priority = 2^32*MIN(G,D) + 2*MAX(G,D) + (G>D?1:0) 2285 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 2286 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); 2287 Connection* lconn = lport->CreateConnection( 2288 rport->Candidates()[0], Port::ORIGIN_MESSAGE); 2289 #if defined(WIN32) 2290 EXPECT_EQ(0x2001EE9FC003D0BU, lconn->priority()); 2291 #else 2292 EXPECT_EQ(0x2001EE9FC003D0BLLU, lconn->priority()); 2293 #endif 2294 2295 lport->SetIceRole(cricket::ICEROLE_CONTROLLED); 2296 rport->SetIceRole(cricket::ICEROLE_CONTROLLING); 2297 Connection* rconn = rport->CreateConnection( 2298 lport->Candidates()[0], Port::ORIGIN_MESSAGE); 2299 #if defined(WIN32) 2300 EXPECT_EQ(0x2001EE9FC003D0AU, rconn->priority()); 2301 #else 2302 EXPECT_EQ(0x2001EE9FC003D0ALLU, rconn->priority()); 2303 #endif 2304 } 2305 2306 TEST_F(PortTest, TestWritableState) { 2307 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 2308 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 2309 2310 // Set up channels. 2311 TestChannel ch1(port1, port2); 2312 TestChannel ch2(port2, port1); 2313 2314 // Acquire addresses. 2315 ch1.Start(); 2316 ch2.Start(); 2317 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout); 2318 ASSERT_EQ_WAIT(1, ch2.complete_count(), kTimeout); 2319 2320 // Send a ping from src to dst. 2321 ch1.CreateConnection(); 2322 ASSERT_TRUE(ch1.conn() != NULL); 2323 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); 2324 EXPECT_TRUE_WAIT(ch1.conn()->connected(), kTimeout); // for TCP connect 2325 ch1.Ping(); 2326 WAIT(!ch2.remote_address().IsNil(), kTimeout); 2327 2328 // Data should be unsendable until the connection is accepted. 2329 char data[] = "abcd"; 2330 int data_size = ARRAY_SIZE(data); 2331 rtc::PacketOptions options; 2332 EXPECT_EQ(SOCKET_ERROR, ch1.conn()->Send(data, data_size, options)); 2333 2334 // Accept the connection to return the binding response, transition to 2335 // writable, and allow data to be sent. 2336 ch2.AcceptConnection(); 2337 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(), 2338 kTimeout); 2339 EXPECT_EQ(data_size, ch1.conn()->Send(data, data_size, options)); 2340 2341 // Ask the connection to update state as if enough time has passed to lose 2342 // full writability and 5 pings went unresponded to. We'll accomplish the 2343 // latter by sending pings but not pumping messages. 2344 for (uint32 i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) { 2345 ch1.Ping(i); 2346 } 2347 uint32 unreliable_timeout_delay = CONNECTION_WRITE_CONNECT_TIMEOUT + 500u; 2348 ch1.conn()->UpdateState(unreliable_timeout_delay); 2349 EXPECT_EQ(Connection::STATE_WRITE_UNRELIABLE, ch1.conn()->write_state()); 2350 2351 // Data should be able to be sent in this state. 2352 EXPECT_EQ(data_size, ch1.conn()->Send(data, data_size, options)); 2353 2354 // And now allow the other side to process the pings and send binding 2355 // responses. 2356 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(), 2357 kTimeout); 2358 2359 // Wait long enough for a full timeout (past however long we've already 2360 // waited). 2361 for (uint32 i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) { 2362 ch1.Ping(unreliable_timeout_delay + i); 2363 } 2364 ch1.conn()->UpdateState(unreliable_timeout_delay + CONNECTION_WRITE_TIMEOUT + 2365 500u); 2366 EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state()); 2367 2368 // Now that the connection has completely timed out, data send should fail. 2369 EXPECT_EQ(SOCKET_ERROR, ch1.conn()->Send(data, data_size, options)); 2370 2371 ch1.Stop(); 2372 ch2.Stop(); 2373 } 2374 2375 TEST_F(PortTest, TestTimeoutForNeverWritable) { 2376 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 2377 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 2378 2379 // Set up channels. 2380 TestChannel ch1(port1, port2); 2381 TestChannel ch2(port2, port1); 2382 2383 // Acquire addresses. 2384 ch1.Start(); 2385 ch2.Start(); 2386 2387 ch1.CreateConnection(); 2388 ASSERT_TRUE(ch1.conn() != NULL); 2389 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); 2390 2391 // Attempt to go directly to write timeout. 2392 for (uint32 i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) { 2393 ch1.Ping(i); 2394 } 2395 ch1.conn()->UpdateState(CONNECTION_WRITE_TIMEOUT + 500u); 2396 EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state()); 2397 } 2398 2399 // This test verifies the connection setup between ICEMODE_FULL 2400 // and ICEMODE_LITE. 2401 // In this test |ch1| behaves like FULL mode client and we have created 2402 // port which responds to the ping message just like LITE client. 2403 TEST_F(PortTest, TestIceLiteConnectivity) { 2404 TestPort* ice_full_port = CreateTestPort( 2405 kLocalAddr1, "lfrag", "lpass", cricket::ICEPROTO_RFC5245, 2406 cricket::ICEROLE_CONTROLLING, kTiebreaker1); 2407 2408 rtc::scoped_ptr<TestPort> ice_lite_port(CreateTestPort( 2409 kLocalAddr2, "rfrag", "rpass", cricket::ICEPROTO_RFC5245, 2410 cricket::ICEROLE_CONTROLLED, kTiebreaker2)); 2411 // Setup TestChannel. This behaves like FULL mode client. 2412 TestChannel ch1(ice_full_port, ice_lite_port.get()); 2413 ch1.SetIceMode(ICEMODE_FULL); 2414 2415 // Start gathering candidates. 2416 ch1.Start(); 2417 ice_lite_port->PrepareAddress(); 2418 2419 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout); 2420 ASSERT_FALSE(ice_lite_port->Candidates().empty()); 2421 2422 ch1.CreateConnection(); 2423 ASSERT_TRUE(ch1.conn() != NULL); 2424 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); 2425 2426 // Send ping from full mode client. 2427 // This ping must not have USE_CANDIDATE_ATTR. 2428 ch1.Ping(); 2429 2430 // Verify stun ping is without USE_CANDIDATE_ATTR. Getting message directly 2431 // from port. 2432 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, 1000); 2433 IceMessage* msg = ice_full_port->last_stun_msg(); 2434 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) == NULL); 2435 2436 // Respond with a BINDING-RESPONSE from litemode client. 2437 // NOTE: Ideally we should't create connection at this stage from lite 2438 // port, as it should be done only after receiving ping with USE_CANDIDATE. 2439 // But we need a connection to send a response message. 2440 ice_lite_port->CreateConnection( 2441 ice_full_port->Candidates()[0], cricket::Port::ORIGIN_MESSAGE); 2442 rtc::scoped_ptr<IceMessage> request(CopyStunMessage(msg)); 2443 ice_lite_port->SendBindingResponse( 2444 request.get(), ice_full_port->Candidates()[0].address()); 2445 2446 // Feeding the respone message from litemode to the full mode connection. 2447 ch1.conn()->OnReadPacket(ice_lite_port->last_stun_buf()->Data(), 2448 ice_lite_port->last_stun_buf()->Length(), 2449 rtc::PacketTime()); 2450 // Verifying full mode connection becomes writable from the response. 2451 EXPECT_EQ_WAIT(Connection::STATE_WRITABLE, ch1.conn()->write_state(), 2452 kTimeout); 2453 EXPECT_TRUE_WAIT(ch1.nominated(), kTimeout); 2454 2455 // Clear existing stun messsages. Otherwise we will process old stun 2456 // message right after we send ping. 2457 ice_full_port->Reset(); 2458 // Send ping. This must have USE_CANDIDATE_ATTR. 2459 ch1.Ping(); 2460 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, 1000); 2461 msg = ice_full_port->last_stun_msg(); 2462 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL); 2463 ch1.Stop(); 2464 } 2465 2466 // This test case verifies that the CONTROLLING port does not time out. 2467 TEST_F(PortTest, TestControllingNoTimeout) { 2468 SetIceProtocolType(cricket::ICEPROTO_RFC5245); 2469 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 2470 ConnectToSignalDestroyed(port1); 2471 port1->set_timeout_delay(10); // milliseconds 2472 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); 2473 port1->SetIceTiebreaker(kTiebreaker1); 2474 2475 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 2476 port2->SetIceRole(cricket::ICEROLE_CONTROLLED); 2477 port2->SetIceTiebreaker(kTiebreaker2); 2478 2479 // Set up channels and ensure both ports will be deleted. 2480 TestChannel ch1(port1, port2); 2481 TestChannel ch2(port2, port1); 2482 2483 // Simulate a connection that succeeds, and then is destroyed. 2484 ConnectAndDisconnectChannels(&ch1, &ch2); 2485 2486 // After the connection is destroyed, the port should not be destroyed. 2487 rtc::Thread::Current()->ProcessMessages(kTimeout); 2488 EXPECT_FALSE(destroyed()); 2489 } 2490 2491 // This test case verifies that the CONTROLLED port does time out, but only 2492 // after connectivity is lost. 2493 TEST_F(PortTest, TestControlledTimeout) { 2494 SetIceProtocolType(cricket::ICEPROTO_RFC5245); 2495 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 2496 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); 2497 port1->SetIceTiebreaker(kTiebreaker1); 2498 2499 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 2500 ConnectToSignalDestroyed(port2); 2501 port2->set_timeout_delay(10); // milliseconds 2502 port2->SetIceRole(cricket::ICEROLE_CONTROLLED); 2503 port2->SetIceTiebreaker(kTiebreaker2); 2504 2505 // The connection must not be destroyed before a connection is attempted. 2506 EXPECT_FALSE(destroyed()); 2507 2508 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 2509 port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 2510 2511 // Set up channels and ensure both ports will be deleted. 2512 TestChannel ch1(port1, port2); 2513 TestChannel ch2(port2, port1); 2514 2515 // Simulate a connection that succeeds, and then is destroyed. 2516 ConnectAndDisconnectChannels(&ch1, &ch2); 2517 2518 // The controlled port should be destroyed after 10 milliseconds. 2519 EXPECT_TRUE_WAIT(destroyed(), kTimeout); 2520 } 2521