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

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

Issue 1353713002: Remove GICE (again). (Closed) Base URL: https://chromium.googlesource.com/external/webrtc.git@master
Patch Set: Undo .gclient Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « webrtc/p2p/base/port.cc ('k') | webrtc/p2p/base/portallocator.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC Project Authors. All rights reserved. 2 * Copyright 2004 The WebRTC Project Authors. All rights reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
57 static const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004); 57 static const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004);
58 static const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005); 58 static const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005);
59 static const SocketAddress kTurnUdpIntAddr("99.99.99.4", STUN_SERVER_PORT); 59 static const SocketAddress kTurnUdpIntAddr("99.99.99.4", STUN_SERVER_PORT);
60 static const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0); 60 static const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0);
61 static const RelayCredentials kRelayCredentials("test", "test"); 61 static const RelayCredentials kRelayCredentials("test", "test");
62 62
63 // TODO: Update these when RFC5245 is completely supported. 63 // TODO: Update these when RFC5245 is completely supported.
64 // Magic value of 30 is from RFC3484, for IPv4 addresses. 64 // Magic value of 30 is from RFC3484, for IPv4 addresses.
65 static const uint32 kDefaultPrflxPriority = ICE_TYPE_PREFERENCE_PRFLX << 24 | 65 static const uint32 kDefaultPrflxPriority = ICE_TYPE_PREFERENCE_PRFLX << 24 |
66 30 << 8 | (256 - ICE_CANDIDATE_COMPONENT_DEFAULT); 66 30 << 8 | (256 - ICE_CANDIDATE_COMPONENT_DEFAULT);
67 static const int STUN_ERROR_BAD_REQUEST_AS_GICE =
68 STUN_ERROR_BAD_REQUEST / 256 * 100 + STUN_ERROR_BAD_REQUEST % 256;
69 static const int STUN_ERROR_UNAUTHORIZED_AS_GICE =
70 STUN_ERROR_UNAUTHORIZED / 256 * 100 + STUN_ERROR_UNAUTHORIZED % 256;
71 static const int STUN_ERROR_SERVER_ERROR_AS_GICE =
72 STUN_ERROR_SERVER_ERROR / 256 * 100 + STUN_ERROR_SERVER_ERROR % 256;
73 67
74 static const int kTiebreaker1 = 11111; 68 static const int kTiebreaker1 = 11111;
75 static const int kTiebreaker2 = 22222; 69 static const int kTiebreaker2 = 22222;
76 70
77 static const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"; 71 static const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
78 72
79 static Candidate GetCandidate(Port* port) { 73 static Candidate GetCandidate(Port* port) {
80 assert(port->Candidates().size() == 1); 74 assert(port->Candidates().size() >= 1);
81 return port->Candidates()[0]; 75 return port->Candidates()[0];
82 } 76 }
83 77
84 static SocketAddress GetAddress(Port* port) { 78 static SocketAddress GetAddress(Port* port) {
85 return GetCandidate(port).address(); 79 return GetCandidate(port).address();
86 } 80 }
87 81
88 static IceMessage* CopyStunMessage(const IceMessage* src) { 82 static IceMessage* CopyStunMessage(const IceMessage* src) {
89 IceMessage* dst = new IceMessage(); 83 IceMessage* dst = new IceMessage();
90 ByteBuffer buf; 84 ByteBuffer buf;
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
277 } 271 }
278 272
279 void OnUnknownAddress(PortInterface* port, const SocketAddress& addr, 273 void OnUnknownAddress(PortInterface* port, const SocketAddress& addr,
280 ProtocolType proto, 274 ProtocolType proto,
281 IceMessage* msg, const std::string& rf, 275 IceMessage* msg, const std::string& rf,
282 bool /*port_muxed*/) { 276 bool /*port_muxed*/) {
283 ASSERT_EQ(port_.get(), port); 277 ASSERT_EQ(port_.get(), port);
284 if (!remote_address_.IsNil()) { 278 if (!remote_address_.IsNil()) {
285 ASSERT_EQ(remote_address_, addr); 279 ASSERT_EQ(remote_address_, addr);
286 } 280 }
287 // MI and PRIORITY attribute should be present in ping requests when port
288 // is in ICEPROTO_RFC5245 mode.
289 const cricket::StunUInt32Attribute* priority_attr = 281 const cricket::StunUInt32Attribute* priority_attr =
290 msg->GetUInt32(STUN_ATTR_PRIORITY); 282 msg->GetUInt32(STUN_ATTR_PRIORITY);
291 const cricket::StunByteStringAttribute* mi_attr = 283 const cricket::StunByteStringAttribute* mi_attr =
292 msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY); 284 msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY);
293 const cricket::StunUInt32Attribute* fingerprint_attr = 285 const cricket::StunUInt32Attribute* fingerprint_attr =
294 msg->GetUInt32(STUN_ATTR_FINGERPRINT); 286 msg->GetUInt32(STUN_ATTR_FINGERPRINT);
295 if (port_->IceProtocol() == cricket::ICEPROTO_RFC5245) { 287 EXPECT_TRUE(priority_attr != NULL);
296 EXPECT_TRUE(priority_attr != NULL); 288 EXPECT_TRUE(mi_attr != NULL);
297 EXPECT_TRUE(mi_attr != NULL); 289 EXPECT_TRUE(fingerprint_attr != NULL);
298 EXPECT_TRUE(fingerprint_attr != NULL);
299 } else {
300 EXPECT_TRUE(priority_attr == NULL);
301 EXPECT_TRUE(mi_attr == NULL);
302 EXPECT_TRUE(fingerprint_attr == NULL);
303 }
304 remote_address_ = addr; 290 remote_address_ = addr;
305 remote_request_.reset(CopyStunMessage(msg)); 291 remote_request_.reset(CopyStunMessage(msg));
306 remote_frag_ = rf; 292 remote_frag_ = rf;
307 } 293 }
308 294
309 void OnDestroyed(Connection* conn) { 295 void OnDestroyed(Connection* conn) {
310 ASSERT_EQ(conn_, conn); 296 ASSERT_EQ(conn_, conn);
311 LOG(INFO) << "OnDestroy connection " << conn << " deleted"; 297 LOG(INFO) << "OnDestroy connection " << conn << " deleted";
312 conn_ = NULL; 298 conn_ = NULL;
313 // When the connection is destroyed, also clear these fields so future 299 // When the connection is destroyed, also clear these fields so future
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
368 turn_server_(main_, kTurnUdpIntAddr, kTurnUdpExtAddr), 354 turn_server_(main_, kTurnUdpIntAddr, kTurnUdpExtAddr),
369 relay_server_(main_, 355 relay_server_(main_,
370 kRelayUdpIntAddr, 356 kRelayUdpIntAddr,
371 kRelayUdpExtAddr, 357 kRelayUdpExtAddr,
372 kRelayTcpIntAddr, 358 kRelayTcpIntAddr,
373 kRelayTcpExtAddr, 359 kRelayTcpExtAddr,
374 kRelaySslTcpIntAddr, 360 kRelaySslTcpIntAddr,
375 kRelaySslTcpExtAddr), 361 kRelaySslTcpExtAddr),
376 username_(rtc::CreateRandomString(ICE_UFRAG_LENGTH)), 362 username_(rtc::CreateRandomString(ICE_UFRAG_LENGTH)),
377 password_(rtc::CreateRandomString(ICE_PWD_LENGTH)), 363 password_(rtc::CreateRandomString(ICE_PWD_LENGTH)),
378 ice_protocol_(cricket::ICEPROTO_GOOGLE),
379 role_conflict_(false), 364 role_conflict_(false),
380 destroyed_(false) { 365 destroyed_(false) {
381 network_.AddIP(rtc::IPAddress(INADDR_ANY)); 366 network_.AddIP(rtc::IPAddress(INADDR_ANY));
382 } 367 }
383 368
384 protected: 369 protected:
385 void TestLocalToLocal() { 370 void TestLocalToLocal() {
386 Port* port1 = CreateUdpPort(kLocalAddr1); 371 Port* port1 = CreateUdpPort(kLocalAddr1);
372 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
387 Port* port2 = CreateUdpPort(kLocalAddr2); 373 Port* port2 = CreateUdpPort(kLocalAddr2);
374 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
388 TestConnectivity("udp", port1, "udp", port2, true, true, true, true); 375 TestConnectivity("udp", port1, "udp", port2, true, true, true, true);
389 } 376 }
390 void TestLocalToStun(NATType ntype) { 377 void TestLocalToStun(NATType ntype) {
391 Port* port1 = CreateUdpPort(kLocalAddr1); 378 Port* port1 = CreateUdpPort(kLocalAddr1);
379 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
392 nat_server2_.reset(CreateNatServer(kNatAddr2, ntype)); 380 nat_server2_.reset(CreateNatServer(kNatAddr2, ntype));
393 Port* port2 = CreateStunPort(kLocalAddr2, &nat_socket_factory2_); 381 Port* port2 = CreateStunPort(kLocalAddr2, &nat_socket_factory2_);
382 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
394 TestConnectivity("udp", port1, StunName(ntype), port2, 383 TestConnectivity("udp", port1, StunName(ntype), port2,
395 ntype == NAT_OPEN_CONE, true, 384 ntype == NAT_OPEN_CONE, true,
396 ntype != NAT_SYMMETRIC, true); 385 ntype != NAT_SYMMETRIC, true);
397 } 386 }
398 void TestLocalToRelay(RelayType rtype, ProtocolType proto) { 387 void TestLocalToRelay(RelayType rtype, ProtocolType proto) {
399 Port* port1 = CreateUdpPort(kLocalAddr1); 388 Port* port1 = CreateUdpPort(kLocalAddr1);
389 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
400 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_UDP); 390 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_UDP);
391 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
401 TestConnectivity("udp", port1, RelayName(rtype, proto), port2, 392 TestConnectivity("udp", port1, RelayName(rtype, proto), port2,
402 rtype == RELAY_GTURN, true, true, true); 393 rtype == RELAY_GTURN, true, true, true);
403 } 394 }
404 void TestStunToLocal(NATType ntype) { 395 void TestStunToLocal(NATType ntype) {
405 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype)); 396 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype));
406 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_); 397 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
398 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
407 Port* port2 = CreateUdpPort(kLocalAddr2); 399 Port* port2 = CreateUdpPort(kLocalAddr2);
400 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
408 TestConnectivity(StunName(ntype), port1, "udp", port2, 401 TestConnectivity(StunName(ntype), port1, "udp", port2,
409 true, ntype != NAT_SYMMETRIC, true, true); 402 true, ntype != NAT_SYMMETRIC, true, true);
410 } 403 }
411 void TestStunToStun(NATType ntype1, NATType ntype2) { 404 void TestStunToStun(NATType ntype1, NATType ntype2) {
412 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype1)); 405 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype1));
413 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_); 406 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
407 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
414 nat_server2_.reset(CreateNatServer(kNatAddr2, ntype2)); 408 nat_server2_.reset(CreateNatServer(kNatAddr2, ntype2));
415 Port* port2 = CreateStunPort(kLocalAddr2, &nat_socket_factory2_); 409 Port* port2 = CreateStunPort(kLocalAddr2, &nat_socket_factory2_);
410 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
416 TestConnectivity(StunName(ntype1), port1, StunName(ntype2), port2, 411 TestConnectivity(StunName(ntype1), port1, StunName(ntype2), port2,
417 ntype2 == NAT_OPEN_CONE, 412 ntype2 == NAT_OPEN_CONE,
418 ntype1 != NAT_SYMMETRIC, ntype2 != NAT_SYMMETRIC, 413 ntype1 != NAT_SYMMETRIC, ntype2 != NAT_SYMMETRIC,
419 ntype1 + ntype2 < (NAT_PORT_RESTRICTED + NAT_SYMMETRIC)); 414 ntype1 + ntype2 < (NAT_PORT_RESTRICTED + NAT_SYMMETRIC));
420 } 415 }
421 void TestStunToRelay(NATType ntype, RelayType rtype, ProtocolType proto) { 416 void TestStunToRelay(NATType ntype, RelayType rtype, ProtocolType proto) {
422 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype)); 417 nat_server1_.reset(CreateNatServer(kNatAddr1, ntype));
423 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_); 418 Port* port1 = CreateStunPort(kLocalAddr1, &nat_socket_factory1_);
419 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
424 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_UDP); 420 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_UDP);
421 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
425 TestConnectivity(StunName(ntype), port1, RelayName(rtype, proto), port2, 422 TestConnectivity(StunName(ntype), port1, RelayName(rtype, proto), port2,
426 rtype == RELAY_GTURN, ntype != NAT_SYMMETRIC, true, true); 423 rtype == RELAY_GTURN, ntype != NAT_SYMMETRIC, true, true);
427 } 424 }
428 void TestTcpToTcp() { 425 void TestTcpToTcp() {
429 Port* port1 = CreateTcpPort(kLocalAddr1); 426 Port* port1 = CreateTcpPort(kLocalAddr1);
427 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
430 Port* port2 = CreateTcpPort(kLocalAddr2); 428 Port* port2 = CreateTcpPort(kLocalAddr2);
429 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
431 TestConnectivity("tcp", port1, "tcp", port2, true, false, true, true); 430 TestConnectivity("tcp", port1, "tcp", port2, true, false, true, true);
432 } 431 }
433 void TestTcpToRelay(RelayType rtype, ProtocolType proto) { 432 void TestTcpToRelay(RelayType rtype, ProtocolType proto) {
434 Port* port1 = CreateTcpPort(kLocalAddr1); 433 Port* port1 = CreateTcpPort(kLocalAddr1);
434 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
435 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_TCP); 435 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_TCP);
436 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
436 TestConnectivity("tcp", port1, RelayName(rtype, proto), port2, 437 TestConnectivity("tcp", port1, RelayName(rtype, proto), port2,
437 rtype == RELAY_GTURN, false, true, true); 438 rtype == RELAY_GTURN, false, true, true);
438 } 439 }
439 void TestSslTcpToRelay(RelayType rtype, ProtocolType proto) { 440 void TestSslTcpToRelay(RelayType rtype, ProtocolType proto) {
440 Port* port1 = CreateTcpPort(kLocalAddr1); 441 Port* port1 = CreateTcpPort(kLocalAddr1);
442 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
441 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_SSLTCP); 443 Port* port2 = CreateRelayPort(kLocalAddr2, rtype, proto, PROTO_SSLTCP);
444 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
442 TestConnectivity("ssltcp", port1, RelayName(rtype, proto), port2, 445 TestConnectivity("ssltcp", port1, RelayName(rtype, proto), port2,
443 rtype == RELAY_GTURN, false, true, true); 446 rtype == RELAY_GTURN, false, true, true);
444 } 447 }
445 // helpers for above functions 448 // helpers for above functions
446 UDPPort* CreateUdpPort(const SocketAddress& addr) { 449 UDPPort* CreateUdpPort(const SocketAddress& addr) {
447 return CreateUdpPort(addr, &socket_factory_); 450 return CreateUdpPort(addr, &socket_factory_);
448 } 451 }
449 UDPPort* CreateUdpPort(const SocketAddress& addr, 452 UDPPort* CreateUdpPort(const SocketAddress& addr,
450 PacketSocketFactory* socket_factory) { 453 PacketSocketFactory* socket_factory) {
451 UDPPort* port = UDPPort::Create(main_, socket_factory, &network_, 454 return UDPPort::Create(main_, socket_factory, &network_,
452 addr.ipaddr(), 0, 0, username_, password_, 455 addr.ipaddr(), 0, 0, username_, password_,
453 std::string(), false); 456 std::string(), false);
454 port->SetIceProtocolType(ice_protocol_);
455 return port;
456 } 457 }
457 TCPPort* CreateTcpPort(const SocketAddress& addr) { 458 TCPPort* CreateTcpPort(const SocketAddress& addr) {
458 TCPPort* port = CreateTcpPort(addr, &socket_factory_); 459 return CreateTcpPort(addr, &socket_factory_);
459 port->SetIceProtocolType(ice_protocol_);
460 return port;
461 } 460 }
462 TCPPort* CreateTcpPort(const SocketAddress& addr, 461 TCPPort* CreateTcpPort(const SocketAddress& addr,
463 PacketSocketFactory* socket_factory) { 462 PacketSocketFactory* socket_factory) {
464 TCPPort* port = TCPPort::Create(main_, socket_factory, &network_, 463 return TCPPort::Create(main_, socket_factory, &network_,
465 addr.ipaddr(), 0, 0, username_, password_, 464 addr.ipaddr(), 0, 0, username_, password_,
466 true); 465 true);
467 port->SetIceProtocolType(ice_protocol_);
468 return port;
469 } 466 }
470 StunPort* CreateStunPort(const SocketAddress& addr, 467 StunPort* CreateStunPort(const SocketAddress& addr,
471 rtc::PacketSocketFactory* factory) { 468 rtc::PacketSocketFactory* factory) {
472 ServerAddresses stun_servers; 469 ServerAddresses stun_servers;
473 stun_servers.insert(kStunAddr); 470 stun_servers.insert(kStunAddr);
474 StunPort* port = StunPort::Create(main_, factory, &network_, 471 return StunPort::Create(main_, factory, &network_,
475 addr.ipaddr(), 0, 0, 472 addr.ipaddr(), 0, 0,
476 username_, password_, stun_servers, 473 username_, password_, stun_servers,
477 std::string()); 474 std::string());
478 port->SetIceProtocolType(ice_protocol_);
479 return port;
480 } 475 }
481 Port* CreateRelayPort(const SocketAddress& addr, RelayType rtype, 476 Port* CreateRelayPort(const SocketAddress& addr, RelayType rtype,
482 ProtocolType int_proto, ProtocolType ext_proto) { 477 ProtocolType int_proto, ProtocolType ext_proto) {
483 if (rtype == RELAY_TURN) { 478 if (rtype == RELAY_TURN) {
484 return CreateTurnPort(addr, &socket_factory_, int_proto, ext_proto); 479 return CreateTurnPort(addr, &socket_factory_, int_proto, ext_proto);
485 } else { 480 } else {
486 return CreateGturnPort(addr, int_proto, ext_proto); 481 return CreateGturnPort(addr, int_proto, ext_proto);
487 } 482 }
488 } 483 }
489 TurnPort* CreateTurnPort(const SocketAddress& addr, 484 TurnPort* CreateTurnPort(const SocketAddress& addr,
490 PacketSocketFactory* socket_factory, 485 PacketSocketFactory* socket_factory,
491 ProtocolType int_proto, ProtocolType ext_proto) { 486 ProtocolType int_proto, ProtocolType ext_proto) {
492 return CreateTurnPort(addr, socket_factory, 487 return CreateTurnPort(addr, socket_factory,
493 int_proto, ext_proto, kTurnUdpIntAddr); 488 int_proto, ext_proto, kTurnUdpIntAddr);
494 } 489 }
495 TurnPort* CreateTurnPort(const SocketAddress& addr, 490 TurnPort* CreateTurnPort(const SocketAddress& addr,
496 PacketSocketFactory* socket_factory, 491 PacketSocketFactory* socket_factory,
497 ProtocolType int_proto, ProtocolType ext_proto, 492 ProtocolType int_proto, ProtocolType ext_proto,
498 const rtc::SocketAddress& server_addr) { 493 const rtc::SocketAddress& server_addr) {
499 TurnPort* port = TurnPort::Create(main_, socket_factory, &network_, 494 return TurnPort::Create(main_, socket_factory, &network_,
500 addr.ipaddr(), 0, 0, 495 addr.ipaddr(), 0, 0,
501 username_, password_, ProtocolAddress( 496 username_, password_, ProtocolAddress(
502 server_addr, PROTO_UDP), 497 server_addr, PROTO_UDP),
503 kRelayCredentials, 0, 498 kRelayCredentials, 0,
504 std::string()); 499 std::string());
505 port->SetIceProtocolType(ice_protocol_);
506 return port;
507 } 500 }
508 RelayPort* CreateGturnPort(const SocketAddress& addr, 501 RelayPort* CreateGturnPort(const SocketAddress& addr,
509 ProtocolType int_proto, ProtocolType ext_proto) { 502 ProtocolType int_proto, ProtocolType ext_proto) {
510 RelayPort* port = CreateGturnPort(addr); 503 RelayPort* port = CreateGturnPort(addr);
511 SocketAddress addrs[] = 504 SocketAddress addrs[] =
512 { kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr }; 505 { kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr };
513 port->AddServerAddress(ProtocolAddress(addrs[int_proto], int_proto)); 506 port->AddServerAddress(ProtocolAddress(addrs[int_proto], int_proto));
514 return port; 507 return port;
515 } 508 }
516 RelayPort* CreateGturnPort(const SocketAddress& addr) { 509 RelayPort* CreateGturnPort(const SocketAddress& addr) {
517 RelayPort* port = RelayPort::Create(main_, &socket_factory_, &network_, 510 // TODO(pthatcher): Remove GTURN.
518 addr.ipaddr(), 0, 0, 511 return RelayPort::Create(main_, &socket_factory_, &network_,
519 username_, password_); 512 addr.ipaddr(), 0, 0,
513 username_, password_);
520 // TODO: Add an external address for ext_proto, so that the 514 // TODO: Add an external address for ext_proto, so that the
521 // other side can connect to this port using a non-UDP protocol. 515 // other side can connect to this port using a non-UDP protocol.
522 port->SetIceProtocolType(ice_protocol_);
523 return port;
524 } 516 }
525 rtc::NATServer* CreateNatServer(const SocketAddress& addr, 517 rtc::NATServer* CreateNatServer(const SocketAddress& addr,
526 rtc::NATType type) { 518 rtc::NATType type) {
527 return new rtc::NATServer(type, ss_.get(), addr, addr, ss_.get(), addr); 519 return new rtc::NATServer(type, ss_.get(), addr, addr, ss_.get(), addr);
528 } 520 }
529 static const char* StunName(NATType type) { 521 static const char* StunName(NATType type) {
530 switch (type) { 522 switch (type) {
531 case NAT_OPEN_CONE: return "stun(open cone)"; 523 case NAT_OPEN_CONE: return "stun(open cone)";
532 case NAT_ADDR_RESTRICTED: return "stun(addr restricted)"; 524 case NAT_ADDR_RESTRICTED: return "stun(addr restricted)";
533 case NAT_PORT_RESTRICTED: return "stun(port restricted)"; 525 case NAT_PORT_RESTRICTED: return "stun(port restricted)";
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
616 608
617 // Speed up destroying ch2's connection such that the test is ready to 609 // Speed up destroying ch2's connection such that the test is ready to
618 // accept a new connection from ch1 before ch1's connection destroys itself. 610 // accept a new connection from ch1 before ch1's connection destroys itself.
619 ch2->conn()->Destroy(); 611 ch2->conn()->Destroy();
620 EXPECT_TRUE_WAIT(ch2->conn() == NULL, kTimeout); 612 EXPECT_TRUE_WAIT(ch2->conn() == NULL, kTimeout);
621 } 613 }
622 614
623 void TestTcpReconnect(bool ping_after_disconnected, 615 void TestTcpReconnect(bool ping_after_disconnected,
624 bool send_after_disconnected) { 616 bool send_after_disconnected) {
625 Port* port1 = CreateTcpPort(kLocalAddr1); 617 Port* port1 = CreateTcpPort(kLocalAddr1);
618 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
626 Port* port2 = CreateTcpPort(kLocalAddr2); 619 Port* port2 = CreateTcpPort(kLocalAddr2);
620 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
627 621
628 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 622 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
629 port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 623 port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
630 624
631 // Set up channels and ensure both ports will be deleted. 625 // Set up channels and ensure both ports will be deleted.
632 TestChannel ch1(port1); 626 TestChannel ch1(port1);
633 TestChannel ch2(port2); 627 TestChannel ch2(port2);
634 EXPECT_EQ(0, ch1.complete_count()); 628 EXPECT_EQ(0, ch1.complete_count());
635 EXPECT_EQ(0, ch2.complete_count()); 629 EXPECT_EQ(0, ch2.complete_count());
636 630
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 EXPECT_TRUE(!ch2.conn()); 681 EXPECT_TRUE(!ch2.conn());
688 } 682 }
689 683
690 // Tear down and ensure that goes smoothly. 684 // Tear down and ensure that goes smoothly.
691 ch1.Stop(); 685 ch1.Stop();
692 ch2.Stop(); 686 ch2.Stop();
693 EXPECT_TRUE_WAIT(ch1.conn() == NULL, kTimeout); 687 EXPECT_TRUE_WAIT(ch1.conn() == NULL, kTimeout);
694 EXPECT_TRUE_WAIT(ch2.conn() == NULL, kTimeout); 688 EXPECT_TRUE_WAIT(ch2.conn() == NULL, kTimeout);
695 } 689 }
696 690
697 void SetIceProtocolType(cricket::IceProtocolType protocol) {
698 ice_protocol_ = protocol;
699 }
700
701 IceMessage* CreateStunMessage(int type) { 691 IceMessage* CreateStunMessage(int type) {
702 IceMessage* msg = new IceMessage(); 692 IceMessage* msg = new IceMessage();
703 msg->SetType(type); 693 msg->SetType(type);
704 msg->SetTransactionID("TESTTESTTEST"); 694 msg->SetTransactionID("TESTTESTTEST");
705 return msg; 695 return msg;
706 } 696 }
707 IceMessage* CreateStunMessageWithUsername(int type, 697 IceMessage* CreateStunMessageWithUsername(int type,
708 const std::string& username) { 698 const std::string& username) {
709 IceMessage* msg = CreateStunMessage(type); 699 IceMessage* msg = CreateStunMessage(type);
710 msg->AddAttribute( 700 msg->AddAttribute(
711 new StunByteStringAttribute(STUN_ATTR_USERNAME, username)); 701 new StunByteStringAttribute(STUN_ATTR_USERNAME, username));
712 return msg; 702 return msg;
713 } 703 }
714 TestPort* CreateTestPort(const rtc::SocketAddress& addr, 704 TestPort* CreateTestPort(const rtc::SocketAddress& addr,
715 const std::string& username, 705 const std::string& username,
716 const std::string& password) { 706 const std::string& password) {
717 TestPort* port = new TestPort(main_, "test", &socket_factory_, &network_, 707 TestPort* port = new TestPort(main_, "test", &socket_factory_, &network_,
718 addr.ipaddr(), 0, 0, username, password); 708 addr.ipaddr(), 0, 0, username, password);
719 port->SignalRoleConflict.connect(this, &PortTest::OnRoleConflict); 709 port->SignalRoleConflict.connect(this, &PortTest::OnRoleConflict);
720 return port; 710 return port;
721 } 711 }
722 TestPort* CreateTestPort(const rtc::SocketAddress& addr, 712 TestPort* CreateTestPort(const rtc::SocketAddress& addr,
723 const std::string& username, 713 const std::string& username,
724 const std::string& password, 714 const std::string& password,
725 cricket::IceProtocolType type,
726 cricket::IceRole role, 715 cricket::IceRole role,
727 int tiebreaker) { 716 int tiebreaker) {
728 TestPort* port = CreateTestPort(addr, username, password); 717 TestPort* port = CreateTestPort(addr, username, password);
729 port->SetIceProtocolType(type);
730 port->SetIceRole(role); 718 port->SetIceRole(role);
731 port->SetIceTiebreaker(tiebreaker); 719 port->SetIceTiebreaker(tiebreaker);
732 return port; 720 return port;
733 } 721 }
734 722
735 void OnRoleConflict(PortInterface* port) { 723 void OnRoleConflict(PortInterface* port) {
736 role_conflict_ = true; 724 role_conflict_ = true;
737 } 725 }
738 bool role_conflict() const { return role_conflict_; } 726 bool role_conflict() const { return role_conflict_; }
739 727
(...skipping 24 matching lines...) Expand all
764 rtc::scoped_ptr<rtc::NATServer> nat_server2_; 752 rtc::scoped_ptr<rtc::NATServer> nat_server2_;
765 rtc::NATSocketFactory nat_factory1_; 753 rtc::NATSocketFactory nat_factory1_;
766 rtc::NATSocketFactory nat_factory2_; 754 rtc::NATSocketFactory nat_factory2_;
767 rtc::BasicPacketSocketFactory nat_socket_factory1_; 755 rtc::BasicPacketSocketFactory nat_socket_factory1_;
768 rtc::BasicPacketSocketFactory nat_socket_factory2_; 756 rtc::BasicPacketSocketFactory nat_socket_factory2_;
769 scoped_ptr<TestStunServer> stun_server_; 757 scoped_ptr<TestStunServer> stun_server_;
770 TestTurnServer turn_server_; 758 TestTurnServer turn_server_;
771 TestRelayServer relay_server_; 759 TestRelayServer relay_server_;
772 std::string username_; 760 std::string username_;
773 std::string password_; 761 std::string password_;
774 cricket::IceProtocolType ice_protocol_;
775 bool role_conflict_; 762 bool role_conflict_;
776 bool destroyed_; 763 bool destroyed_;
777 }; 764 };
778 765
779 void PortTest::TestConnectivity(const char* name1, Port* port1, 766 void PortTest::TestConnectivity(const char* name1, Port* port1,
780 const char* name2, Port* port2, 767 const char* name2, Port* port2,
781 bool accept, bool same_addr1, 768 bool accept, bool same_addr1,
782 bool same_addr2, bool possible) { 769 bool same_addr2, bool possible) {
783 LOG(LS_INFO) << "Test: " << name1 << " to " << name2 << ": "; 770 LOG(LS_INFO) << "Test: " << name1 << " to " << name2 << ": ";
784 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 771 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
(...skipping 454 matching lines...) Expand 10 before | Expand all | Expand 10 after
1239 } 1226 }
1240 1227
1241 TEST_F(PortTest, TestSslTcpToSslTcpRelay) { 1228 TEST_F(PortTest, TestSslTcpToSslTcpRelay) {
1242 TestSslTcpToRelay(PROTO_SSLTCP); 1229 TestSslTcpToRelay(PROTO_SSLTCP);
1243 } 1230 }
1244 */ 1231 */
1245 1232
1246 // This test case verifies standard ICE features in STUN messages. Currently it 1233 // This test case verifies standard ICE features in STUN messages. Currently it
1247 // verifies Message Integrity attribute in STUN messages and username in STUN 1234 // verifies Message Integrity attribute in STUN messages and username in STUN
1248 // binding request will have colon (":") between remote and local username. 1235 // binding request will have colon (":") between remote and local username.
1249 TEST_F(PortTest, TestLocalToLocalAsIce) { 1236 TEST_F(PortTest, TestLocalToLocalStandard) {
1250 SetIceProtocolType(cricket::ICEPROTO_RFC5245);
1251 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 1237 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
1252 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); 1238 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
1253 port1->SetIceTiebreaker(kTiebreaker1); 1239 port1->SetIceTiebreaker(kTiebreaker1);
1254 ASSERT_EQ(cricket::ICEPROTO_RFC5245, port1->IceProtocol());
1255 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 1240 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
1256 port2->SetIceRole(cricket::ICEROLE_CONTROLLED); 1241 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
1257 port2->SetIceTiebreaker(kTiebreaker2); 1242 port2->SetIceTiebreaker(kTiebreaker2);
1258 ASSERT_EQ(cricket::ICEPROTO_RFC5245, port2->IceProtocol());
1259 // Same parameters as TestLocalToLocal above. 1243 // Same parameters as TestLocalToLocal above.
1260 TestConnectivity("udp", port1, "udp", port2, true, true, true, true); 1244 TestConnectivity("udp", port1, "udp", port2, true, true, true, true);
1261 } 1245 }
1262 1246
1263 // This test is trying to validate a successful and failure scenario in a 1247 // This test is trying to validate a successful and failure scenario in a
1264 // loopback test when protocol is RFC5245. For success IceTiebreaker, username 1248 // loopback test when protocol is RFC5245. For success IceTiebreaker, username
1265 // should remain equal to the request generated by the port and role of port 1249 // should remain equal to the request generated by the port and role of port
1266 // must be in controlling. 1250 // must be in controlling.
1267 TEST_F(PortTest, TestLoopbackCallAsIce) { 1251 TEST_F(PortTest, TestLoopbackCal) {
1268 rtc::scoped_ptr<TestPort> lport( 1252 rtc::scoped_ptr<TestPort> lport(
1269 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1253 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1270 lport->SetIceProtocolType(ICEPROTO_RFC5245);
1271 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1254 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1272 lport->SetIceTiebreaker(kTiebreaker1); 1255 lport->SetIceTiebreaker(kTiebreaker1);
1273 lport->PrepareAddress(); 1256 lport->PrepareAddress();
1274 ASSERT_FALSE(lport->Candidates().empty()); 1257 ASSERT_FALSE(lport->Candidates().empty());
1275 Connection* conn = lport->CreateConnection(lport->Candidates()[0], 1258 Connection* conn = lport->CreateConnection(lport->Candidates()[0],
1276 Port::ORIGIN_MESSAGE); 1259 Port::ORIGIN_MESSAGE);
1277 conn->Ping(0); 1260 conn->Ping(0);
1278 1261
1279 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1262 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1280 IceMessage* msg = lport->last_stun_msg(); 1263 IceMessage* msg = lport->last_stun_msg();
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
1321 } 1304 }
1322 1305
1323 // This test verifies role conflict signal is received when there is 1306 // This test verifies role conflict signal is received when there is
1324 // conflict in the role. In this case both ports are in controlling and 1307 // conflict in the role. In this case both ports are in controlling and
1325 // |rport| has higher tiebreaker value than |lport|. Since |lport| has lower 1308 // |rport| has higher tiebreaker value than |lport|. Since |lport| has lower
1326 // value of tiebreaker, when it receives ping request from |rport| it will 1309 // value of tiebreaker, when it receives ping request from |rport| it will
1327 // send role conflict signal. 1310 // send role conflict signal.
1328 TEST_F(PortTest, TestIceRoleConflict) { 1311 TEST_F(PortTest, TestIceRoleConflict) {
1329 rtc::scoped_ptr<TestPort> lport( 1312 rtc::scoped_ptr<TestPort> lport(
1330 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1313 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1331 lport->SetIceProtocolType(ICEPROTO_RFC5245);
1332 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1314 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1333 lport->SetIceTiebreaker(kTiebreaker1); 1315 lport->SetIceTiebreaker(kTiebreaker1);
1334 rtc::scoped_ptr<TestPort> rport( 1316 rtc::scoped_ptr<TestPort> rport(
1335 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1317 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1336 rport->SetIceProtocolType(ICEPROTO_RFC5245);
1337 rport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1318 rport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1338 rport->SetIceTiebreaker(kTiebreaker2); 1319 rport->SetIceTiebreaker(kTiebreaker2);
1339 1320
1340 lport->PrepareAddress(); 1321 lport->PrepareAddress();
1341 rport->PrepareAddress(); 1322 rport->PrepareAddress();
1342 ASSERT_FALSE(lport->Candidates().empty()); 1323 ASSERT_FALSE(lport->Candidates().empty());
1343 ASSERT_FALSE(rport->Candidates().empty()); 1324 ASSERT_FALSE(rport->Candidates().empty());
1344 Connection* lconn = lport->CreateConnection(rport->Candidates()[0], 1325 Connection* lconn = lport->CreateConnection(rport->Candidates()[0],
1345 Port::ORIGIN_MESSAGE); 1326 Port::ORIGIN_MESSAGE);
1346 Connection* rconn = rport->CreateConnection(lport->Candidates()[0], 1327 Connection* rconn = rport->CreateConnection(lport->Candidates()[0],
1347 Port::ORIGIN_MESSAGE); 1328 Port::ORIGIN_MESSAGE);
1348 rconn->Ping(0); 1329 rconn->Ping(0);
1349 1330
1350 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000); 1331 ASSERT_TRUE_WAIT(rport->last_stun_msg() != NULL, 1000);
1351 IceMessage* msg = rport->last_stun_msg(); 1332 IceMessage* msg = rport->last_stun_msg();
1352 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type()); 1333 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
1353 // Send rport binding request to lport. 1334 // Send rport binding request to lport.
1354 lconn->OnReadPacket(rport->last_stun_buf()->Data(), 1335 lconn->OnReadPacket(rport->last_stun_buf()->Data(),
1355 rport->last_stun_buf()->Length(), 1336 rport->last_stun_buf()->Length(),
1356 rtc::PacketTime()); 1337 rtc::PacketTime());
1357 1338
1358 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1339 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1359 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type()); 1340 EXPECT_EQ(STUN_BINDING_RESPONSE, lport->last_stun_msg()->type());
1360 EXPECT_TRUE(role_conflict()); 1341 EXPECT_TRUE(role_conflict());
1361 } 1342 }
1362 1343
1363 TEST_F(PortTest, TestTcpNoDelay) { 1344 TEST_F(PortTest, TestTcpNoDelay) {
1364 TCPPort* port1 = CreateTcpPort(kLocalAddr1); 1345 TCPPort* port1 = CreateTcpPort(kLocalAddr1);
1346 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
1365 int option_value = -1; 1347 int option_value = -1;
1366 int success = port1->GetOption(rtc::Socket::OPT_NODELAY, 1348 int success = port1->GetOption(rtc::Socket::OPT_NODELAY,
1367 &option_value); 1349 &option_value);
1368 ASSERT_EQ(0, success); // GetOption() should complete successfully w/ 0 1350 ASSERT_EQ(0, success); // GetOption() should complete successfully w/ 0
1369 ASSERT_EQ(1, option_value); 1351 ASSERT_EQ(1, option_value);
1370 delete port1; 1352 delete port1;
1371 } 1353 }
1372 1354
1373 TEST_F(PortTest, TestDelayedBindingUdp) { 1355 TEST_F(PortTest, TestDelayedBindingUdp) {
1374 FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket(); 1356 FakeAsyncPacketSocket *socket = new FakeAsyncPacketSocket();
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1534 EXPECT_EQ(rtc::DSCP_CS7, dscp); 1516 EXPECT_EQ(rtc::DSCP_CS7, dscp);
1535 // This will verify correct value returned without the socket. 1517 // This will verify correct value returned without the socket.
1536 rtc::scoped_ptr<TurnPort> turnport2(CreateTurnPort( 1518 rtc::scoped_ptr<TurnPort> turnport2(CreateTurnPort(
1537 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); 1519 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
1538 EXPECT_EQ(0, turnport2->SetOption(rtc::Socket::OPT_DSCP, 1520 EXPECT_EQ(0, turnport2->SetOption(rtc::Socket::OPT_DSCP,
1539 rtc::DSCP_CS6)); 1521 rtc::DSCP_CS6));
1540 EXPECT_EQ(0, turnport2->GetOption(rtc::Socket::OPT_DSCP, &dscp)); 1522 EXPECT_EQ(0, turnport2->GetOption(rtc::Socket::OPT_DSCP, &dscp));
1541 EXPECT_EQ(rtc::DSCP_CS6, dscp); 1523 EXPECT_EQ(rtc::DSCP_CS6, dscp);
1542 } 1524 }
1543 1525
1544 // Test sending STUN messages in GICE format. 1526 // Test sending STUN messages.
1545 TEST_F(PortTest, TestSendStunMessageAsGice) { 1527 TEST_F(PortTest, TestSendStunMessage) {
1546 rtc::scoped_ptr<TestPort> lport( 1528 rtc::scoped_ptr<TestPort> lport(
1547 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1529 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1548 rtc::scoped_ptr<TestPort> rport( 1530 rtc::scoped_ptr<TestPort> rport(
1549 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1531 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1550 lport->SetIceProtocolType(ICEPROTO_GOOGLE);
1551 rport->SetIceProtocolType(ICEPROTO_GOOGLE);
1552
1553 // Send a fake ping from lport to rport.
1554 lport->PrepareAddress();
1555 rport->PrepareAddress();
1556 ASSERT_FALSE(rport->Candidates().empty());
1557 Connection* conn = lport->CreateConnection(rport->Candidates()[0],
1558 Port::ORIGIN_MESSAGE);
1559 rport->CreateConnection(lport->Candidates()[0], Port::ORIGIN_MESSAGE);
1560 conn->Ping(0);
1561
1562 // Check that it's a proper BINDING-REQUEST.
1563 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1564 IceMessage* msg = lport->last_stun_msg();
1565 EXPECT_EQ(STUN_BINDING_REQUEST, msg->type());
1566 EXPECT_FALSE(msg->IsLegacy());
1567 const StunByteStringAttribute* username_attr = msg->GetByteString(
1568 STUN_ATTR_USERNAME);
1569 ASSERT_TRUE(username_attr != NULL);
1570 EXPECT_EQ("rfraglfrag", username_attr->GetString());
1571 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL);
1572 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
1573 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL);
1574
1575 // Save a copy of the BINDING-REQUEST for use below.
1576 rtc::scoped_ptr<IceMessage> request(CopyStunMessage(msg));
1577
1578 // Respond with a BINDING-RESPONSE.
1579 rport->SendBindingResponse(request.get(), lport->Candidates()[0].address());
1580 msg = rport->last_stun_msg();
1581 ASSERT_TRUE(msg != NULL);
1582 EXPECT_EQ(STUN_BINDING_RESPONSE, msg->type());
1583 EXPECT_FALSE(msg->IsLegacy());
1584 username_attr = msg->GetByteString(STUN_ATTR_USERNAME);
1585 ASSERT_TRUE(username_attr != NULL); // GICE has a username in the response.
1586 EXPECT_EQ("rfraglfrag", username_attr->GetString());
1587 const StunAddressAttribute* addr_attr = msg->GetAddress(
1588 STUN_ATTR_MAPPED_ADDRESS);
1589 ASSERT_TRUE(addr_attr != NULL);
1590 EXPECT_EQ(lport->Candidates()[0].address(), addr_attr->GetAddress());
1591 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_XOR_MAPPED_ADDRESS) == NULL);
1592 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL);
1593 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
1594 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL);
1595
1596 // Respond with a BINDING-ERROR-RESPONSE. This wouldn't happen in real life,
1597 // but we can do it here.
1598 rport->SendBindingErrorResponse(request.get(),
1599 rport->Candidates()[0].address(),
1600 STUN_ERROR_SERVER_ERROR,
1601 STUN_ERROR_REASON_SERVER_ERROR);
1602 msg = rport->last_stun_msg();
1603 ASSERT_TRUE(msg != NULL);
1604 EXPECT_EQ(STUN_BINDING_ERROR_RESPONSE, msg->type());
1605 EXPECT_FALSE(msg->IsLegacy());
1606 username_attr = msg->GetByteString(STUN_ATTR_USERNAME);
1607 ASSERT_TRUE(username_attr != NULL); // GICE has a username in the response.
1608 EXPECT_EQ("rfraglfrag", username_attr->GetString());
1609 const StunErrorCodeAttribute* error_attr = msg->GetErrorCode();
1610 ASSERT_TRUE(error_attr != NULL);
1611 // The GICE wire format for error codes is incorrect.
1612 EXPECT_EQ(STUN_ERROR_SERVER_ERROR_AS_GICE, error_attr->code());
1613 EXPECT_EQ(STUN_ERROR_SERVER_ERROR / 256, error_attr->eclass());
1614 EXPECT_EQ(STUN_ERROR_SERVER_ERROR % 256, error_attr->number());
1615 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), error_attr->reason());
1616 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_PRIORITY) == NULL);
1617 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_MESSAGE_INTEGRITY) == NULL);
1618 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_FINGERPRINT) == NULL);
1619 }
1620
1621 // Test sending STUN messages in ICE format.
1622 TEST_F(PortTest, TestSendStunMessageAsIce) {
1623 rtc::scoped_ptr<TestPort> lport(
1624 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1625 rtc::scoped_ptr<TestPort> rport(
1626 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1627 lport->SetIceProtocolType(ICEPROTO_RFC5245);
1628 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1532 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1629 lport->SetIceTiebreaker(kTiebreaker1); 1533 lport->SetIceTiebreaker(kTiebreaker1);
1630 rport->SetIceProtocolType(ICEPROTO_RFC5245);
1631 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); 1534 rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
1632 rport->SetIceTiebreaker(kTiebreaker2); 1535 rport->SetIceTiebreaker(kTiebreaker2);
1633 1536
1634 // Send a fake ping from lport to rport. 1537 // Send a fake ping from lport to rport.
1635 lport->PrepareAddress(); 1538 lport->PrepareAddress();
1636 rport->PrepareAddress(); 1539 rport->PrepareAddress();
1637 ASSERT_FALSE(rport->Candidates().empty()); 1540 ASSERT_FALSE(rport->Candidates().empty());
1638 Connection* lconn = lport->CreateConnection( 1541 Connection* lconn = lport->CreateConnection(
1639 rport->Candidates()[0], Port::ORIGIN_MESSAGE); 1542 rport->Candidates()[0], Port::ORIGIN_MESSAGE);
1640 Connection* rconn = rport->CreateConnection( 1543 Connection* rconn = rport->CreateConnection(
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after
1759 retransmit_attr = msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT); 1662 retransmit_attr = msg->GetUInt32(STUN_ATTR_RETRANSMIT_COUNT);
1760 ASSERT_TRUE(retransmit_attr != NULL); 1663 ASSERT_TRUE(retransmit_attr != NULL);
1761 EXPECT_EQ(2U, retransmit_attr->value()); 1664 EXPECT_EQ(2U, retransmit_attr->value());
1762 } 1665 }
1763 1666
1764 TEST_F(PortTest, TestUseCandidateAttribute) { 1667 TEST_F(PortTest, TestUseCandidateAttribute) {
1765 rtc::scoped_ptr<TestPort> lport( 1668 rtc::scoped_ptr<TestPort> lport(
1766 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 1669 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
1767 rtc::scoped_ptr<TestPort> rport( 1670 rtc::scoped_ptr<TestPort> rport(
1768 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1671 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1769 lport->SetIceProtocolType(ICEPROTO_RFC5245);
1770 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1672 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
1771 lport->SetIceTiebreaker(kTiebreaker1); 1673 lport->SetIceTiebreaker(kTiebreaker1);
1772 rport->SetIceProtocolType(ICEPROTO_RFC5245);
1773 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); 1674 rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
1774 rport->SetIceTiebreaker(kTiebreaker2); 1675 rport->SetIceTiebreaker(kTiebreaker2);
1775 1676
1776 // Send a fake ping from lport to rport. 1677 // Send a fake ping from lport to rport.
1777 lport->PrepareAddress(); 1678 lport->PrepareAddress();
1778 rport->PrepareAddress(); 1679 rport->PrepareAddress();
1779 ASSERT_FALSE(rport->Candidates().empty()); 1680 ASSERT_FALSE(rport->Candidates().empty());
1780 Connection* lconn = lport->CreateConnection( 1681 Connection* lconn = lport->CreateConnection(
1781 rport->Candidates()[0], Port::ORIGIN_MESSAGE); 1682 rport->Candidates()[0], Port::ORIGIN_MESSAGE);
1782 lconn->Ping(0); 1683 lconn->Ping(0);
1783 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000); 1684 ASSERT_TRUE_WAIT(lport->last_stun_msg() != NULL, 1000);
1784 IceMessage* msg = lport->last_stun_msg(); 1685 IceMessage* msg = lport->last_stun_msg();
1785 const StunUInt64Attribute* ice_controlling_attr = 1686 const StunUInt64Attribute* ice_controlling_attr =
1786 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING); 1687 msg->GetUInt64(STUN_ATTR_ICE_CONTROLLING);
1787 ASSERT_TRUE(ice_controlling_attr != NULL); 1688 ASSERT_TRUE(ice_controlling_attr != NULL);
1788 const StunByteStringAttribute* use_candidate_attr = msg->GetByteString( 1689 const StunByteStringAttribute* use_candidate_attr = msg->GetByteString(
1789 STUN_ATTR_USE_CANDIDATE); 1690 STUN_ATTR_USE_CANDIDATE);
1790 ASSERT_TRUE(use_candidate_attr != NULL); 1691 ASSERT_TRUE(use_candidate_attr != NULL);
1791 } 1692 }
1792 1693
1793 // Test handling STUN messages in GICE format. 1694 // Test handling STUN messages.
1794 TEST_F(PortTest, TestHandleStunMessageAsGice) { 1695 TEST_F(PortTest, TestHandleStunMessage) {
1795 // Our port will act as the "remote" port. 1696 // Our port will act as the "remote" port.
1796 rtc::scoped_ptr<TestPort> port( 1697 rtc::scoped_ptr<TestPort> port(
1797 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1698 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1798 port->SetIceProtocolType(ICEPROTO_GOOGLE);
1799 1699
1800 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1700 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
1801 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1701 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1802 rtc::SocketAddress addr(kLocalAddr1);
1803 std::string username;
1804
1805 // BINDING-REQUEST from local to remote with valid GICE username and no M-I.
1806 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1807 "rfraglfrag"));
1808 WriteStunMessage(in_msg.get(), buf.get());
1809 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1810 out_msg.accept(), &username));
1811 EXPECT_TRUE(out_msg.get() != NULL); // Succeeds, since this is GICE.
1812 EXPECT_EQ("lfrag", username);
1813
1814 // Add M-I; should be ignored and rest of message parsed normally.
1815 in_msg->AddMessageIntegrity("password");
1816 WriteStunMessage(in_msg.get(), buf.get());
1817 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1818 out_msg.accept(), &username));
1819 EXPECT_TRUE(out_msg.get() != NULL);
1820 EXPECT_EQ("lfrag", username);
1821
1822 // BINDING-RESPONSE with username, as done in GICE. Should succeed.
1823 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_RESPONSE,
1824 "rfraglfrag"));
1825 in_msg->AddAttribute(
1826 new StunAddressAttribute(STUN_ATTR_MAPPED_ADDRESS, kLocalAddr2));
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
1833 // BINDING-RESPONSE without username. Should be tolerated as well.
1834 in_msg.reset(CreateStunMessage(STUN_BINDING_RESPONSE));
1835 in_msg->AddAttribute(
1836 new StunAddressAttribute(STUN_ATTR_MAPPED_ADDRESS, kLocalAddr2));
1837 WriteStunMessage(in_msg.get(), buf.get());
1838 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1839 out_msg.accept(), &username));
1840 EXPECT_TRUE(out_msg.get() != NULL);
1841 EXPECT_EQ("", username);
1842
1843 // BINDING-ERROR-RESPONSE with username and error code.
1844 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_ERROR_RESPONSE,
1845 "rfraglfrag"));
1846 in_msg->AddAttribute(new StunErrorCodeAttribute(STUN_ATTR_ERROR_CODE,
1847 STUN_ERROR_SERVER_ERROR_AS_GICE, STUN_ERROR_REASON_SERVER_ERROR));
1848 WriteStunMessage(in_msg.get(), buf.get());
1849 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1850 out_msg.accept(), &username));
1851 ASSERT_TRUE(out_msg.get() != NULL);
1852 EXPECT_EQ("", username);
1853 ASSERT_TRUE(out_msg->GetErrorCode() != NULL);
1854 // GetStunMessage doesn't unmunge the GICE error code (happens downstream).
1855 EXPECT_EQ(STUN_ERROR_SERVER_ERROR_AS_GICE, out_msg->GetErrorCode()->code());
1856 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR),
1857 out_msg->GetErrorCode()->reason());
1858 }
1859
1860 // Test handling STUN messages in ICE format.
1861 TEST_F(PortTest, TestHandleStunMessageAsIce) {
1862 // Our port will act as the "remote" port.
1863 rtc::scoped_ptr<TestPort> port(
1864 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1865 port->SetIceProtocolType(ICEPROTO_RFC5245);
1866
1867 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
1868 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1869 rtc::SocketAddress addr(kLocalAddr1); 1702 rtc::SocketAddress addr(kLocalAddr1);
1870 std::string username; 1703 std::string username;
1871 1704
1872 // BINDING-REQUEST from local to remote with valid ICE username, 1705 // BINDING-REQUEST from local to remote with valid ICE username,
1873 // MESSAGE-INTEGRITY, and FINGERPRINT. 1706 // MESSAGE-INTEGRITY, and FINGERPRINT.
1874 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1707 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1875 "rfrag:lfrag")); 1708 "rfrag:lfrag"));
1876 in_msg->AddMessageIntegrity("rpass"); 1709 in_msg->AddMessageIntegrity("rpass");
1877 in_msg->AddFingerprint(); 1710 in_msg->AddFingerprint();
1878 WriteStunMessage(in_msg.get(), buf.get()); 1711 WriteStunMessage(in_msg.get(), buf.get());
(...skipping 23 matching lines...) Expand all
1902 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1735 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1903 out_msg.accept(), &username)); 1736 out_msg.accept(), &username));
1904 EXPECT_TRUE(out_msg.get() != NULL); 1737 EXPECT_TRUE(out_msg.get() != NULL);
1905 EXPECT_EQ("", username); 1738 EXPECT_EQ("", username);
1906 ASSERT_TRUE(out_msg->GetErrorCode() != NULL); 1739 ASSERT_TRUE(out_msg->GetErrorCode() != NULL);
1907 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code()); 1740 EXPECT_EQ(STUN_ERROR_SERVER_ERROR, out_msg->GetErrorCode()->code());
1908 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR), 1741 EXPECT_EQ(std::string(STUN_ERROR_REASON_SERVER_ERROR),
1909 out_msg->GetErrorCode()->reason()); 1742 out_msg->GetErrorCode()->reason());
1910 } 1743 }
1911 1744
1912 // This test verifies port can handle ICE messages in Hybrid mode and switches 1745 // Tests handling of ICE binding requests with missing or incorrect usernames.
1913 // ICEPROTO_RFC5245 mode after successfully handling the message. 1746 TEST_F(PortTest, TestHandleStunMessageBadUsername) {
1914 TEST_F(PortTest, TestHandleStunMessageAsIceInHybridMode) {
1915 // Our port will act as the "remote" port.
1916 rtc::scoped_ptr<TestPort> port( 1747 rtc::scoped_ptr<TestPort> port(
1917 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1748 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1918 port->SetIceProtocolType(ICEPROTO_HYBRID);
1919 1749
1920 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1750 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
1921 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1751 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1922 rtc::SocketAddress addr(kLocalAddr1);
1923 std::string username;
1924
1925 // BINDING-REQUEST from local to remote with valid ICE username,
1926 // MESSAGE-INTEGRITY, and FINGERPRINT.
1927 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1928 "rfrag:lfrag"));
1929 in_msg->AddMessageIntegrity("rpass");
1930 in_msg->AddFingerprint();
1931 WriteStunMessage(in_msg.get(), buf.get());
1932 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1933 out_msg.accept(), &username));
1934 EXPECT_TRUE(out_msg.get() != NULL);
1935 EXPECT_EQ("lfrag", username);
1936 EXPECT_EQ(ICEPROTO_RFC5245, port->IceProtocol());
1937 }
1938
1939 // This test verifies port can handle GICE messages in Hybrid mode and switches
1940 // ICEPROTO_GOOGLE mode after successfully handling the message.
1941 TEST_F(PortTest, TestHandleStunMessageAsGiceInHybridMode) {
1942 // Our port will act as the "remote" port.
1943 rtc::scoped_ptr<TestPort> port(
1944 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1945 port->SetIceProtocolType(ICEPROTO_HYBRID);
1946
1947 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
1948 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1949 rtc::SocketAddress addr(kLocalAddr1);
1950 std::string username;
1951
1952 // BINDING-REQUEST from local to remote with valid GICE username and no M-I.
1953 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1954 "rfraglfrag"));
1955 WriteStunMessage(in_msg.get(), buf.get());
1956 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1957 out_msg.accept(), &username));
1958 EXPECT_TRUE(out_msg.get() != NULL); // Succeeds, since this is GICE.
1959 EXPECT_EQ("lfrag", username);
1960 EXPECT_EQ(ICEPROTO_GOOGLE, port->IceProtocol());
1961 }
1962
1963 // Verify port is not switched out of RFC5245 mode if GICE message is received
1964 // in that mode.
1965 TEST_F(PortTest, TestHandleStunMessageAsGiceInIceMode) {
1966 // Our port will act as the "remote" port.
1967 rtc::scoped_ptr<TestPort> port(
1968 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1969 port->SetIceProtocolType(ICEPROTO_RFC5245);
1970
1971 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
1972 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1973 rtc::SocketAddress addr(kLocalAddr1);
1974 std::string username;
1975
1976 // BINDING-REQUEST from local to remote with valid GICE username and no M-I.
1977 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
1978 "rfraglfrag"));
1979 WriteStunMessage(in_msg.get(), buf.get());
1980 // Should fail as there is no MI and fingerprint.
1981 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
1982 out_msg.accept(), &username));
1983 EXPECT_EQ(ICEPROTO_RFC5245, port->IceProtocol());
1984 }
1985
1986
1987 // Tests handling of GICE binding requests with missing or incorrect usernames.
1988 TEST_F(PortTest, TestHandleStunMessageAsGiceBadUsername) {
1989 rtc::scoped_ptr<TestPort> port(
1990 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
1991 port->SetIceProtocolType(ICEPROTO_GOOGLE);
1992
1993 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
1994 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
1995 rtc::SocketAddress addr(kLocalAddr1);
1996 std::string username;
1997
1998 // BINDING-REQUEST with no username.
1999 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST));
2000 WriteStunMessage(in_msg.get(), buf.get());
2001 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2002 out_msg.accept(), &username));
2003 EXPECT_TRUE(out_msg.get() == NULL);
2004 EXPECT_EQ("", username);
2005 EXPECT_EQ(STUN_ERROR_BAD_REQUEST_AS_GICE, port->last_stun_error_code());
2006
2007 // BINDING-REQUEST with empty username.
2008 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, ""));
2009 WriteStunMessage(in_msg.get(), buf.get());
2010 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2011 out_msg.accept(), &username));
2012 EXPECT_TRUE(out_msg.get() == NULL);
2013 EXPECT_EQ("", username);
2014 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code());
2015
2016 // BINDING-REQUEST with too-short username.
2017 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, "lfra"));
2018 WriteStunMessage(in_msg.get(), buf.get());
2019 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2020 out_msg.accept(), &username));
2021 EXPECT_TRUE(out_msg.get() == NULL);
2022 EXPECT_EQ("", username);
2023 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code());
2024
2025 // BINDING-REQUEST with reversed username.
2026 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
2027 "lfragrfrag"));
2028 WriteStunMessage(in_msg.get(), buf.get());
2029 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2030 out_msg.accept(), &username));
2031 EXPECT_TRUE(out_msg.get() == NULL);
2032 EXPECT_EQ("", username);
2033 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code());
2034
2035 // BINDING-REQUEST with garbage username.
2036 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
2037 "abcdefgh"));
2038 WriteStunMessage(in_msg.get(), buf.get());
2039 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2040 out_msg.accept(), &username));
2041 EXPECT_TRUE(out_msg.get() == NULL);
2042 EXPECT_EQ("", username);
2043 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED_AS_GICE, port->last_stun_error_code());
2044 }
2045
2046 // Tests handling of ICE binding requests with missing or incorrect usernames.
2047 TEST_F(PortTest, TestHandleStunMessageAsIceBadUsername) {
2048 rtc::scoped_ptr<TestPort> port(
2049 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
2050 port->SetIceProtocolType(ICEPROTO_RFC5245);
2051
2052 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
2053 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
2054 rtc::SocketAddress addr(kLocalAddr1); 1752 rtc::SocketAddress addr(kLocalAddr1);
2055 std::string username; 1753 std::string username;
2056 1754
2057 // BINDING-REQUEST with no username. 1755 // BINDING-REQUEST with no username.
2058 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST)); 1756 in_msg.reset(CreateStunMessage(STUN_BINDING_REQUEST));
2059 in_msg->AddMessageIntegrity("rpass"); 1757 in_msg->AddMessageIntegrity("rpass");
2060 in_msg->AddFingerprint(); 1758 in_msg->AddFingerprint();
2061 WriteStunMessage(in_msg.get(), buf.get()); 1759 WriteStunMessage(in_msg.get(), buf.get());
2062 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1760 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2063 out_msg.accept(), &username)); 1761 out_msg.accept(), &username));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2105 in_msg->AddMessageIntegrity("rpass"); 1803 in_msg->AddMessageIntegrity("rpass");
2106 in_msg->AddFingerprint(); 1804 in_msg->AddFingerprint();
2107 WriteStunMessage(in_msg.get(), buf.get()); 1805 WriteStunMessage(in_msg.get(), buf.get());
2108 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1806 EXPECT_TRUE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2109 out_msg.accept(), &username)); 1807 out_msg.accept(), &username));
2110 EXPECT_TRUE(out_msg.get() == NULL); 1808 EXPECT_TRUE(out_msg.get() == NULL);
2111 EXPECT_EQ("", username); 1809 EXPECT_EQ("", username);
2112 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); 1810 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
2113 } 1811 }
2114 1812
2115 // Test handling STUN messages (as ICE) with missing or malformed M-I. 1813 // Test handling STUN messages with missing or malformed M-I.
2116 TEST_F(PortTest, TestHandleStunMessageAsIceBadMessageIntegrity) { 1814 TEST_F(PortTest, TestHandleStunMessageBadMessageIntegrity) {
2117 // Our port will act as the "remote" port. 1815 // Our port will act as the "remote" port.
2118 rtc::scoped_ptr<TestPort> port( 1816 rtc::scoped_ptr<TestPort> port(
2119 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1817 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
2120 port->SetIceProtocolType(ICEPROTO_RFC5245);
2121 1818
2122 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1819 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
2123 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1820 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
2124 rtc::SocketAddress addr(kLocalAddr1); 1821 rtc::SocketAddress addr(kLocalAddr1);
2125 std::string username; 1822 std::string username;
2126 1823
2127 // BINDING-REQUEST from local to remote with valid ICE username and 1824 // BINDING-REQUEST from local to remote with valid ICE username and
2128 // FINGERPRINT, but no MESSAGE-INTEGRITY. 1825 // FINGERPRINT, but no MESSAGE-INTEGRITY.
2129 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1826 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
2130 "rfrag:lfrag")); 1827 "rfrag:lfrag"));
(...skipping 16 matching lines...) Expand all
2147 out_msg.accept(), &username)); 1844 out_msg.accept(), &username));
2148 EXPECT_TRUE(out_msg.get() == NULL); 1845 EXPECT_TRUE(out_msg.get() == NULL);
2149 EXPECT_EQ("", username); 1846 EXPECT_EQ("", username);
2150 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code()); 1847 EXPECT_EQ(STUN_ERROR_UNAUTHORIZED, port->last_stun_error_code());
2151 1848
2152 // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked 1849 // TODO: BINDING-RESPONSES and BINDING-ERROR-RESPONSES are checked
2153 // by the Connection, not the Port, since they require the remote username. 1850 // by the Connection, not the Port, since they require the remote username.
2154 // Change this test to pass in data via Connection::OnReadPacket instead. 1851 // Change this test to pass in data via Connection::OnReadPacket instead.
2155 } 1852 }
2156 1853
2157 // Test handling STUN messages (as ICE) with missing or malformed FINGERPRINT. 1854 // Test handling STUN messages with missing or malformed FINGERPRINT.
2158 TEST_F(PortTest, TestHandleStunMessageAsIceBadFingerprint) { 1855 TEST_F(PortTest, TestHandleStunMessageBadFingerprint) {
2159 // Our port will act as the "remote" port. 1856 // Our port will act as the "remote" port.
2160 rtc::scoped_ptr<TestPort> port( 1857 rtc::scoped_ptr<TestPort> port(
2161 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1858 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
2162 port->SetIceProtocolType(ICEPROTO_RFC5245);
2163 1859
2164 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1860 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
2165 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1861 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
2166 rtc::SocketAddress addr(kLocalAddr1); 1862 rtc::SocketAddress addr(kLocalAddr1);
2167 std::string username; 1863 std::string username;
2168 1864
2169 // BINDING-REQUEST from local to remote with valid ICE username and 1865 // BINDING-REQUEST from local to remote with valid ICE username and
2170 // MESSAGE-INTEGRITY, but no FINGERPRINT; GetStunMessage should fail. 1866 // MESSAGE-INTEGRITY, but no FINGERPRINT; GetStunMessage should fail.
2171 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST, 1867 in_msg.reset(CreateStunMessageWithUsername(STUN_BINDING_REQUEST,
2172 "rfrag:lfrag")); 1868 "rfrag:lfrag"));
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
2214 1910
2215 // Now, add a fingerprint, but munge the message so it's not valid. 1911 // Now, add a fingerprint, but munge the message so it's not valid.
2216 in_msg->AddFingerprint(); 1912 in_msg->AddFingerprint();
2217 in_msg->SetTransactionID("TESTTESTBADD"); 1913 in_msg->SetTransactionID("TESTTESTBADD");
2218 WriteStunMessage(in_msg.get(), buf.get()); 1914 WriteStunMessage(in_msg.get(), buf.get());
2219 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr, 1915 EXPECT_FALSE(port->GetStunMessage(buf->Data(), buf->Length(), addr,
2220 out_msg.accept(), &username)); 1916 out_msg.accept(), &username));
2221 EXPECT_EQ(0, port->last_stun_error_code()); 1917 EXPECT_EQ(0, port->last_stun_error_code());
2222 } 1918 }
2223 1919
2224 // Test handling of STUN binding indication messages (as ICE). STUN binding 1920 // Test handling of STUN binding indication messages . STUN binding
2225 // indications are allowed only to the connection which is in read mode. 1921 // indications are allowed only to the connection which is in read mode.
2226 TEST_F(PortTest, TestHandleStunBindingIndication) { 1922 TEST_F(PortTest, TestHandleStunBindingIndication) {
2227 rtc::scoped_ptr<TestPort> lport( 1923 rtc::scoped_ptr<TestPort> lport(
2228 CreateTestPort(kLocalAddr2, "lfrag", "lpass")); 1924 CreateTestPort(kLocalAddr2, "lfrag", "lpass"));
2229 lport->SetIceProtocolType(ICEPROTO_RFC5245);
2230 lport->SetIceRole(cricket::ICEROLE_CONTROLLING); 1925 lport->SetIceRole(cricket::ICEROLE_CONTROLLING);
2231 lport->SetIceTiebreaker(kTiebreaker1); 1926 lport->SetIceTiebreaker(kTiebreaker1);
2232 1927
2233 // Verifying encoding and decoding STUN indication message. 1928 // Verifying encoding and decoding STUN indication message.
2234 rtc::scoped_ptr<IceMessage> in_msg, out_msg; 1929 rtc::scoped_ptr<IceMessage> in_msg, out_msg;
2235 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer()); 1930 rtc::scoped_ptr<ByteBuffer> buf(new ByteBuffer());
2236 rtc::SocketAddress addr(kLocalAddr1); 1931 rtc::SocketAddress addr(kLocalAddr1);
2237 std::string username; 1932 std::string username;
2238 1933
2239 in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION)); 1934 in_msg.reset(CreateStunMessage(STUN_BINDING_INDICATION));
2240 in_msg->AddFingerprint(); 1935 in_msg->AddFingerprint();
2241 WriteStunMessage(in_msg.get(), buf.get()); 1936 WriteStunMessage(in_msg.get(), buf.get());
2242 EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr, 1937 EXPECT_TRUE(lport->GetStunMessage(buf->Data(), buf->Length(), addr,
2243 out_msg.accept(), &username)); 1938 out_msg.accept(), &username));
2244 EXPECT_TRUE(out_msg.get() != NULL); 1939 EXPECT_TRUE(out_msg.get() != NULL);
2245 EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION); 1940 EXPECT_EQ(out_msg->type(), STUN_BINDING_INDICATION);
2246 EXPECT_EQ("", username); 1941 EXPECT_EQ("", username);
2247 1942
2248 // Verify connection can handle STUN indication and updates 1943 // Verify connection can handle STUN indication and updates
2249 // last_ping_received. 1944 // last_ping_received.
2250 rtc::scoped_ptr<TestPort> rport( 1945 rtc::scoped_ptr<TestPort> rport(
2251 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 1946 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
2252 rport->SetIceProtocolType(ICEPROTO_RFC5245);
2253 rport->SetIceRole(cricket::ICEROLE_CONTROLLED); 1947 rport->SetIceRole(cricket::ICEROLE_CONTROLLED);
2254 rport->SetIceTiebreaker(kTiebreaker2); 1948 rport->SetIceTiebreaker(kTiebreaker2);
2255 1949
2256 lport->PrepareAddress(); 1950 lport->PrepareAddress();
2257 rport->PrepareAddress(); 1951 rport->PrepareAddress();
2258 ASSERT_FALSE(lport->Candidates().empty()); 1952 ASSERT_FALSE(lport->Candidates().empty());
2259 ASSERT_FALSE(rport->Candidates().empty()); 1953 ASSERT_FALSE(rport->Candidates().empty());
2260 1954
2261 Connection* lconn = lport->CreateConnection(rport->Candidates()[0], 1955 Connection* lconn = lport->CreateConnection(rport->Candidates()[0],
2262 Port::ORIGIN_MESSAGE); 1956 Port::ORIGIN_MESSAGE);
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after
2445 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP)); 2139 kLocalAddr1, nat_socket_factory1(), PROTO_UDP, PROTO_UDP));
2446 turnport->PrepareAddress(); 2140 turnport->PrepareAddress();
2447 ASSERT_EQ_WAIT(1U, turnport->Candidates().size(), kTimeout); 2141 ASSERT_EQ_WAIT(1U, turnport->Candidates().size(), kTimeout);
2448 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(), 2142 EXPECT_EQ(kTurnUdpExtAddr.ipaddr(),
2449 turnport->Candidates()[0].address().ipaddr()); 2143 turnport->Candidates()[0].address().ipaddr());
2450 EXPECT_EQ(kNatAddr1.ipaddr(), 2144 EXPECT_EQ(kNatAddr1.ipaddr(),
2451 turnport->Candidates()[0].related_address().ipaddr()); 2145 turnport->Candidates()[0].related_address().ipaddr());
2452 } 2146 }
2453 2147
2454 // Test priority value overflow handling when preference is set to 3. 2148 // Test priority value overflow handling when preference is set to 3.
2455 TEST_F(PortTest, TestCandidatePreference) { 2149 TEST_F(PortTest, TestCandidatePriority) {
2456 cricket::Candidate cand1; 2150 cricket::Candidate cand1;
2457 cand1.set_preference(3); 2151 cand1.set_priority(3);
2458 cricket::Candidate cand2; 2152 cricket::Candidate cand2;
2459 cand2.set_preference(1); 2153 cand2.set_priority(1);
2460 EXPECT_TRUE(cand1.preference() > cand2.preference()); 2154 EXPECT_TRUE(cand1.priority() > cand2.priority());
2461 } 2155 }
2462 2156
2463 // Test the Connection priority is calculated correctly. 2157 // Test the Connection priority is calculated correctly.
2464 TEST_F(PortTest, TestConnectionPriority) { 2158 TEST_F(PortTest, TestConnectionPriority) {
2465 rtc::scoped_ptr<TestPort> lport( 2159 rtc::scoped_ptr<TestPort> lport(
2466 CreateTestPort(kLocalAddr1, "lfrag", "lpass")); 2160 CreateTestPort(kLocalAddr1, "lfrag", "lpass"));
2467 lport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_HOST); 2161 lport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_HOST);
2468 rtc::scoped_ptr<TestPort> rport( 2162 rtc::scoped_ptr<TestPort> rport(
2469 CreateTestPort(kLocalAddr2, "rfrag", "rpass")); 2163 CreateTestPort(kLocalAddr2, "rfrag", "rpass"));
2470 rport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_RELAY); 2164 rport->set_type_preference(cricket::ICE_TYPE_PREFERENCE_RELAY);
(...skipping 23 matching lines...) Expand all
2494 lport->Candidates()[0], Port::ORIGIN_MESSAGE); 2188 lport->Candidates()[0], Port::ORIGIN_MESSAGE);
2495 #if defined(WEBRTC_WIN) 2189 #if defined(WEBRTC_WIN)
2496 EXPECT_EQ(0x2001EE9FC003D0AU, rconn->priority()); 2190 EXPECT_EQ(0x2001EE9FC003D0AU, rconn->priority());
2497 #else 2191 #else
2498 EXPECT_EQ(0x2001EE9FC003D0ALLU, rconn->priority()); 2192 EXPECT_EQ(0x2001EE9FC003D0ALLU, rconn->priority());
2499 #endif 2193 #endif
2500 } 2194 }
2501 2195
2502 TEST_F(PortTest, TestWritableState) { 2196 TEST_F(PortTest, TestWritableState) {
2503 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 2197 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
2198 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
2504 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 2199 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
2200 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
2505 2201
2506 // Set up channels. 2202 // Set up channels.
2507 TestChannel ch1(port1); 2203 TestChannel ch1(port1);
2508 TestChannel ch2(port2); 2204 TestChannel ch2(port2);
2509 2205
2510 // Acquire addresses. 2206 // Acquire addresses.
2511 ch1.Start(); 2207 ch1.Start();
2512 ch2.Start(); 2208 ch2.Start();
2513 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout); 2209 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout);
2514 ASSERT_EQ_WAIT(1, ch2.complete_count(), kTimeout); 2210 ASSERT_EQ_WAIT(1, ch2.complete_count(), kTimeout);
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
2563 2259
2564 // Now that the connection has completely timed out, data send should fail. 2260 // Now that the connection has completely timed out, data send should fail.
2565 EXPECT_EQ(SOCKET_ERROR, ch1.conn()->Send(data, data_size, options)); 2261 EXPECT_EQ(SOCKET_ERROR, ch1.conn()->Send(data, data_size, options));
2566 2262
2567 ch1.Stop(); 2263 ch1.Stop();
2568 ch2.Stop(); 2264 ch2.Stop();
2569 } 2265 }
2570 2266
2571 TEST_F(PortTest, TestTimeoutForNeverWritable) { 2267 TEST_F(PortTest, TestTimeoutForNeverWritable) {
2572 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 2268 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
2269 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
2573 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 2270 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
2271 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
2574 2272
2575 // Set up channels. 2273 // Set up channels.
2576 TestChannel ch1(port1); 2274 TestChannel ch1(port1);
2577 TestChannel ch2(port2); 2275 TestChannel ch2(port2);
2578 2276
2579 // Acquire addresses. 2277 // Acquire addresses.
2580 ch1.Start(); 2278 ch1.Start();
2581 ch2.Start(); 2279 ch2.Start();
2582 2280
2583 ch1.CreateConnection(GetCandidate(port2)); 2281 ch1.CreateConnection(GetCandidate(port2));
2584 ASSERT_TRUE(ch1.conn() != NULL); 2282 ASSERT_TRUE(ch1.conn() != NULL);
2585 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state()); 2283 EXPECT_EQ(Connection::STATE_WRITE_INIT, ch1.conn()->write_state());
2586 2284
2587 // Attempt to go directly to write timeout. 2285 // Attempt to go directly to write timeout.
2588 for (uint32 i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) { 2286 for (uint32 i = 1; i <= CONNECTION_WRITE_CONNECT_FAILURES; ++i) {
2589 ch1.Ping(i); 2287 ch1.Ping(i);
2590 } 2288 }
2591 ch1.conn()->UpdateState(CONNECTION_WRITE_TIMEOUT + 500u); 2289 ch1.conn()->UpdateState(CONNECTION_WRITE_TIMEOUT + 500u);
2592 EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state()); 2290 EXPECT_EQ(Connection::STATE_WRITE_TIMEOUT, ch1.conn()->write_state());
2593 } 2291 }
2594 2292
2595 // This test verifies the connection setup between ICEMODE_FULL 2293 // This test verifies the connection setup between ICEMODE_FULL
2596 // and ICEMODE_LITE. 2294 // and ICEMODE_LITE.
2597 // In this test |ch1| behaves like FULL mode client and we have created 2295 // In this test |ch1| behaves like FULL mode client and we have created
2598 // port which responds to the ping message just like LITE client. 2296 // port which responds to the ping message just like LITE client.
2599 TEST_F(PortTest, TestIceLiteConnectivity) { 2297 TEST_F(PortTest, TestIceLiteConnectivity) {
2600 TestPort* ice_full_port = CreateTestPort( 2298 TestPort* ice_full_port = CreateTestPort(
2601 kLocalAddr1, "lfrag", "lpass", cricket::ICEPROTO_RFC5245, 2299 kLocalAddr1, "lfrag", "lpass",
2602 cricket::ICEROLE_CONTROLLING, kTiebreaker1); 2300 cricket::ICEROLE_CONTROLLING, kTiebreaker1);
2603 2301
2604 rtc::scoped_ptr<TestPort> ice_lite_port(CreateTestPort( 2302 rtc::scoped_ptr<TestPort> ice_lite_port(CreateTestPort(
2605 kLocalAddr2, "rfrag", "rpass", cricket::ICEPROTO_RFC5245, 2303 kLocalAddr2, "rfrag", "rpass",
2606 cricket::ICEROLE_CONTROLLED, kTiebreaker2)); 2304 cricket::ICEROLE_CONTROLLED, kTiebreaker2));
2607 // Setup TestChannel. This behaves like FULL mode client. 2305 // Setup TestChannel. This behaves like FULL mode client.
2608 TestChannel ch1(ice_full_port); 2306 TestChannel ch1(ice_full_port);
2609 ch1.SetIceMode(ICEMODE_FULL); 2307 ch1.SetIceMode(ICEMODE_FULL);
2610 2308
2611 // Start gathering candidates. 2309 // Start gathering candidates.
2612 ch1.Start(); 2310 ch1.Start();
2613 ice_lite_port->PrepareAddress(); 2311 ice_lite_port->PrepareAddress();
2614 2312
2615 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout); 2313 ASSERT_EQ_WAIT(1, ch1.complete_count(), kTimeout);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
2654 // Send ping. This must have USE_CANDIDATE_ATTR. 2352 // Send ping. This must have USE_CANDIDATE_ATTR.
2655 ch1.Ping(); 2353 ch1.Ping();
2656 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, 1000); 2354 ASSERT_TRUE_WAIT(ice_full_port->last_stun_msg() != NULL, 1000);
2657 msg = ice_full_port->last_stun_msg(); 2355 msg = ice_full_port->last_stun_msg();
2658 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL); 2356 EXPECT_TRUE(msg->GetByteString(STUN_ATTR_USE_CANDIDATE) != NULL);
2659 ch1.Stop(); 2357 ch1.Stop();
2660 } 2358 }
2661 2359
2662 // This test case verifies that the CONTROLLING port does not time out. 2360 // This test case verifies that the CONTROLLING port does not time out.
2663 TEST_F(PortTest, TestControllingNoTimeout) { 2361 TEST_F(PortTest, TestControllingNoTimeout) {
2664 SetIceProtocolType(cricket::ICEPROTO_RFC5245);
2665 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 2362 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
2666 ConnectToSignalDestroyed(port1); 2363 ConnectToSignalDestroyed(port1);
2667 port1->set_timeout_delay(10); // milliseconds 2364 port1->set_timeout_delay(10); // milliseconds
2668 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); 2365 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
2669 port1->SetIceTiebreaker(kTiebreaker1); 2366 port1->SetIceTiebreaker(kTiebreaker1);
2670 2367
2671 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 2368 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
2672 port2->SetIceRole(cricket::ICEROLE_CONTROLLED); 2369 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
2673 port2->SetIceTiebreaker(kTiebreaker2); 2370 port2->SetIceTiebreaker(kTiebreaker2);
2674 2371
2675 // Set up channels and ensure both ports will be deleted. 2372 // Set up channels and ensure both ports will be deleted.
2676 TestChannel ch1(port1); 2373 TestChannel ch1(port1);
2677 TestChannel ch2(port2); 2374 TestChannel ch2(port2);
2678 2375
2679 // Simulate a connection that succeeds, and then is destroyed. 2376 // Simulate a connection that succeeds, and then is destroyed.
2680 StartConnectAndStopChannels(&ch1, &ch2); 2377 StartConnectAndStopChannels(&ch1, &ch2);
2681 2378
2682 // After the connection is destroyed, the port should not be destroyed. 2379 // After the connection is destroyed, the port should not be destroyed.
2683 rtc::Thread::Current()->ProcessMessages(kTimeout); 2380 rtc::Thread::Current()->ProcessMessages(kTimeout);
2684 EXPECT_FALSE(destroyed()); 2381 EXPECT_FALSE(destroyed());
2685 } 2382 }
2686 2383
2687 // This test case verifies that the CONTROLLED port does time out, but only 2384 // This test case verifies that the CONTROLLED port does time out, but only
2688 // after connectivity is lost. 2385 // after connectivity is lost.
2689 TEST_F(PortTest, TestControlledTimeout) { 2386 TEST_F(PortTest, TestControlledTimeout) {
2690 SetIceProtocolType(cricket::ICEPROTO_RFC5245);
2691 UDPPort* port1 = CreateUdpPort(kLocalAddr1); 2387 UDPPort* port1 = CreateUdpPort(kLocalAddr1);
2692 port1->SetIceRole(cricket::ICEROLE_CONTROLLING); 2388 port1->SetIceRole(cricket::ICEROLE_CONTROLLING);
2693 port1->SetIceTiebreaker(kTiebreaker1); 2389 port1->SetIceTiebreaker(kTiebreaker1);
2694 2390
2695 UDPPort* port2 = CreateUdpPort(kLocalAddr2); 2391 UDPPort* port2 = CreateUdpPort(kLocalAddr2);
2696 ConnectToSignalDestroyed(port2); 2392 ConnectToSignalDestroyed(port2);
2697 port2->set_timeout_delay(10); // milliseconds 2393 port2->set_timeout_delay(10); // milliseconds
2698 port2->SetIceRole(cricket::ICEROLE_CONTROLLED); 2394 port2->SetIceRole(cricket::ICEROLE_CONTROLLED);
2699 port2->SetIceTiebreaker(kTiebreaker2); 2395 port2->SetIceTiebreaker(kTiebreaker2);
2700 2396
2701 // The connection must not be destroyed before a connection is attempted. 2397 // The connection must not be destroyed before a connection is attempted.
2702 EXPECT_FALSE(destroyed()); 2398 EXPECT_FALSE(destroyed());
2703 2399
2704 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 2400 port1->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
2705 port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT); 2401 port2->set_component(cricket::ICE_CANDIDATE_COMPONENT_DEFAULT);
2706 2402
2707 // Set up channels and ensure both ports will be deleted. 2403 // Set up channels and ensure both ports will be deleted.
2708 TestChannel ch1(port1); 2404 TestChannel ch1(port1);
2709 TestChannel ch2(port2); 2405 TestChannel ch2(port2);
2710 2406
2711 // Simulate a connection that succeeds, and then is destroyed. 2407 // Simulate a connection that succeeds, and then is destroyed.
2712 StartConnectAndStopChannels(&ch1, &ch2); 2408 StartConnectAndStopChannels(&ch1, &ch2);
2713 2409
2714 // The controlled port should be destroyed after 10 milliseconds. 2410 // The controlled port should be destroyed after 10 milliseconds.
2715 EXPECT_TRUE_WAIT(destroyed(), kTimeout); 2411 EXPECT_TRUE_WAIT(destroyed(), kTimeout);
2716 } 2412 }
OLDNEW
« no previous file with comments | « webrtc/p2p/base/port.cc ('k') | webrtc/p2p/base/portallocator.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698