10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*
20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle
30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2009 Google Inc.
40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without
60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met:
70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  1. Redistributions of source code must retain the above copyright notice,
90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer.
100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  2. Redistributions in binary form must reproduce the above copyright notice,
110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     this list of conditions and the following disclaimer in the documentation
120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     and/or other materials provided with the distribution.
130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *  3. The name of the author may not be used to endorse or promote products
140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *     derived from this software without specific prior written permission.
150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org *
160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */
270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
28cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/p2ptransportchannel.h"
29cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/testrelayserver.h"
30cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/teststunserver.h"
31cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/base/testturnserver.h"
32cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "talk/p2p/client/basicportallocator.h"
332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/dscp.h"
342a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/fakenetwork.h"
352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/firewallsocketserver.h"
362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/gunit.h"
372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/helpers.h"
382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/logging.h"
392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/natserver.h"
402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/natsocketfactory.h"
412a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/physicalsocketserver.h"
422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/proxyserver.h"
432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/socketaddress.h"
442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/ssladapter.h"
452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/thread.h"
462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org#include "webrtc/base/virtualsocketserver.h"
470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::kDefaultPortAllocatorFlags;
490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::kMinimumStepDelay;
500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::kDefaultStepDelay;
510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG;
520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET;
53459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.orgusing cricket::ServerAddresses;
542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.orgusing rtc::SocketAddress;
550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kDefaultTimeout = 1000;
570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kOnlyLocalPorts = cricket::PORTALLOCATOR_DISABLE_STUN |
580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   cricket::PORTALLOCATOR_DISABLE_RELAY |
590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   cricket::PORTALLOCATOR_DISABLE_TCP;
600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Addresses on the public internet.
610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kPublicAddrs[2] =
620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    { SocketAddress("11.11.11.11", 0), SocketAddress("22.22.22.22", 0) };
635c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org// IPv6 Addresses on the public internet.
645c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.orgstatic const SocketAddress kIPv6PublicAddrs[2] = {
655c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    SocketAddress("2400:4030:1:2c00:be30:abcd:efab:cdef", 0),
665c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org    SocketAddress("2620:0:1000:1b03:2e41:38ff:fea6:f2a4", 0)
675c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org};
680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// For configuring multihomed clients.
690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kAlternateAddrs[2] =
700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    { SocketAddress("11.11.11.101", 0), SocketAddress("22.22.22.202", 0) };
710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Addresses for HTTP proxy servers.
720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kHttpsProxyAddrs[2] =
730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    { SocketAddress("11.11.11.1", 443), SocketAddress("22.22.22.1", 443) };
740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Addresses for SOCKS proxy servers.
750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kSocksProxyAddrs[2] =
760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    { SocketAddress("11.11.11.1", 1080), SocketAddress("22.22.22.1", 1080) };
770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Internal addresses for NAT boxes.
780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kNatAddrs[2] =
790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    { SocketAddress("192.168.1.1", 0), SocketAddress("192.168.2.1", 0) };
800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Private addresses inside the NAT private networks.
810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kPrivateAddrs[2] =
820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    { SocketAddress("192.168.1.11", 0), SocketAddress("192.168.2.22", 0) };
830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// For cascaded NATs, the internal addresses of the inner NAT boxes.
840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kCascadedNatAddrs[2] =
850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    { SocketAddress("192.168.10.1", 0), SocketAddress("192.168.20.1", 0) };
860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// For cascaded NATs, private addresses inside the inner private networks.
870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kCascadedPrivateAddrs[2] =
880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    { SocketAddress("192.168.10.11", 0), SocketAddress("192.168.20.22", 0) };
890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// The address of the public STUN server.
900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const SocketAddress kStunAddr("99.99.99.1", cricket::STUN_SERVER_PORT);
910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// The addresses for the public relay server.
92353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.orgstatic const SocketAddress kRelayUdpIntAddr("99.99.99.2", 5000);
93353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.orgstatic const SocketAddress kRelayUdpExtAddr("99.99.99.3", 5001);
94353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.orgstatic const SocketAddress kRelayTcpIntAddr("99.99.99.2", 5002);
95353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.orgstatic const SocketAddress kRelayTcpExtAddr("99.99.99.3", 5003);
96353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.orgstatic const SocketAddress kRelaySslTcpIntAddr("99.99.99.2", 5004);
97353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.orgstatic const SocketAddress kRelaySslTcpExtAddr("99.99.99.3", 5005);
98ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org// The addresses for the public turn server.
99ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.orgstatic const SocketAddress kTurnUdpIntAddr("99.99.99.4",
100ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                                           cricket::STUN_SERVER_PORT);
101ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.orgstatic const SocketAddress kTurnUdpExtAddr("99.99.99.5", 0);
102ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.orgstatic const cricket::RelayCredentials kRelayCredentials("test", "test");
1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Based on ICE_UFRAG_LENGTH
1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char* kIceUfrag[4] = {"TESTICEUFRAG0000", "TESTICEUFRAG0001",
1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                   "TESTICEUFRAG0002", "TESTICEUFRAG0003"};
1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Based on ICE_PWD_LENGTH
1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const char* kIcePwd[4] = {"TESTICEPWD00000000000000",
1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 "TESTICEPWD00000000000001",
1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 "TESTICEPWD00000000000002",
1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                 "TESTICEPWD00000000000003"};
1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint64 kTiebreaker1 = 11111;
1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint64 kTiebreaker2 = 22222;
1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// This test simulates 2 P2P endpoints that want to establish connectivity
1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// with each other over various network topologies and conditions, which can be
1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// specified in each individial test.
1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// A virtual network (via VirtualSocketServer) along with virtual firewalls and
1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// NATs (via Firewall/NATSocketServer) are used to simulate the various network
1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// conditions. We can configure the IP addresses of the endpoints,
1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// block various types of connectivity, or add arbitrary levels of NAT.
1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// We also run a STUN server and a relay server on the virtual network to allow
1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// our typical P2P mechanisms to do their thing.
1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// For each case, we expect the P2P stack to eventually settle on a specific
1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// form of connectivity to the other side. The test checks that the P2P
1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// negotiation successfully establishes connectivity within a certain time,
1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// and that the result is what we expect.
1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Note that this class is a base class for use by other tests, who will provide
1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// specialized test behavior.
1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass P2PTransportChannelTestBase : public testing::Test,
1322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                                    public rtc::MessageHandler,
1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                                    public sigslot::has_slots<> {
1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public:
1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2PTransportChannelTestBase()
1362a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      : main_(rtc::Thread::Current()),
1372a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        pss_(new rtc::PhysicalSocketServer),
1382a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        vss_(new rtc::VirtualSocketServer(pss_.get())),
1392a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        nss_(new rtc::NATSocketServer(vss_.get())),
1402a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        ss_(new rtc::FirewallSocketServer(nss_.get())),
1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ss_scope_(ss_.get()),
1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        stun_server_(main_, kStunAddr),
143ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org        turn_server_(main_, kTurnUdpIntAddr, kTurnUdpExtAddr),
144353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.org        relay_server_(main_, kRelayUdpIntAddr, kRelayUdpExtAddr,
145353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.org                      kRelayTcpIntAddr, kRelayTcpExtAddr,
146353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.org                      kRelaySslTcpIntAddr, kRelaySslTcpExtAddr),
1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        socks_server1_(ss_.get(), kSocksProxyAddrs[0],
1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       ss_.get(), kSocksProxyAddrs[0]),
1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        socks_server2_(ss_.get(), kSocksProxyAddrs[1],
1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       ss_.get(), kSocksProxyAddrs[1]),
151ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org        clear_remote_candidates_ufrag_pwd_(false),
152ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org        force_relay_(false) {
153e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    ep1_.role_ = cricket::ICEROLE_CONTROLLING;
154e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    ep2_.role_ = cricket::ICEROLE_CONTROLLED;
155ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org
156459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org    ServerAddresses stun_servers;
157459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org    stun_servers.insert(kStunAddr);
158353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.org    ep1_.allocator_.reset(new cricket::BasicPortAllocator(
159459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org        &ep1_.network_manager_,
160459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org        stun_servers, kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr));
161353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.org    ep2_.allocator_.reset(new cricket::BasicPortAllocator(
162459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org        &ep2_.network_manager_,
163459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org        stun_servers, kRelayUdpIntAddr, kRelayTcpIntAddr, kRelaySslTcpIntAddr));
1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  enum Config {
1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    OPEN,                           // Open to the Internet
1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    NAT_FULL_CONE,                  // NAT, no filtering
1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    NAT_ADDR_RESTRICTED,            // NAT, must send to an addr to recv
1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    NAT_PORT_RESTRICTED,            // NAT, must send to an addr+port to recv
1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    NAT_SYMMETRIC,                  // NAT, endpoint-dependent bindings
1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    NAT_DOUBLE_CONE,                // Double NAT, both cone
1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    NAT_SYMMETRIC_THEN_CONE,        // Double NAT, symmetric outer, cone inner
1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    BLOCK_UDP,                      // Firewall, UDP in/out blocked
1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    BLOCK_UDP_AND_INCOMING_TCP,     // Firewall, UDP in/out and TCP in blocked
1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    BLOCK_ALL_BUT_OUTGOING_HTTP,    // Firewall, only TCP out on 80/443
1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    PROXY_HTTPS,                    // All traffic through HTTPS proxy
1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    PROXY_SOCKS,                    // All traffic through SOCKS proxy
1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    NUM_CONFIGS
1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct Result {
1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    Result(const std::string& lt, const std::string& lp,
1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           const std::string& rt, const std::string& rp,
1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           const std::string& lt2, const std::string& lp2,
1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org           const std::string& rt2, const std::string& rp2, int wait)
1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        : local_type(lt), local_proto(lp), remote_type(rt), remote_proto(rp),
1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          local_type2(lt2), local_proto2(lp2), remote_type2(rt2),
1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          remote_proto2(rp2), connect_wait(wait) {
1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string local_type;
1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string local_proto;
1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string remote_type;
1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string remote_proto;
1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string local_type2;
1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string local_proto2;
1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string remote_type2;
1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string remote_proto2;
2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int connect_wait;
2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct ChannelData {
2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool CheckData(const char* data, int len) {
2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      bool ret = false;
2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (!ch_packets_.empty()) {
2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        std::string packet =  ch_packets_.front();
2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ret = (packet == std::string(data, len));
2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ch_packets_.pop_front();
2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return ret;
2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string name_;  // TODO - Currently not used.
2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::list<std::string> ch_packets_;
2162a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::scoped_ptr<cricket::P2PTransportChannel> ch_;
2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  struct Endpoint {
220e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    Endpoint() : signaling_delay_(0), role_(cricket::ICEROLE_UNKNOWN),
2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        tiebreaker_(0), role_conflict_(false),
2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        protocol_type_(cricket::ICEPROTO_GOOGLE) {}
2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool HasChannel(cricket::TransportChannel* ch) {
2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return (ch == cd1_.ch_.get() || ch == cd2_.ch_.get());
2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ChannelData* GetChannelData(cricket::TransportChannel* ch) {
2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (!HasChannel(ch)) return NULL;
2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (cd1_.ch_.get() == ch)
2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        return &cd1_;
2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      else
2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        return &cd2_;
2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void SetSignalingDelay(int delay) { signaling_delay_ = delay; }
2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
235e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    void SetIceRole(cricket::IceRole role) { role_ = role; }
236e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    cricket::IceRole ice_role() { return role_; }
2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void SetIceProtocolType(cricket::IceProtocolType type) {
2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      protocol_type_ = type;
2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::IceProtocolType protocol_type() { return protocol_type_; }
241e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    void SetIceTiebreaker(uint64 tiebreaker) { tiebreaker_ = tiebreaker; }
242e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    uint64 GetIceTiebreaker() { return tiebreaker_; }
2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void OnRoleConflict(bool role_conflict) { role_conflict_ = role_conflict; }
2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool role_conflict() { return role_conflict_; }
2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    void SetAllocationStepDelay(uint32 delay) {
2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      allocator_->set_step_delay(delay);
2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2485aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org    void SetAllowTcpListen(bool allow_tcp_listen) {
2495aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org      allocator_->set_allow_tcp_listen(allow_tcp_listen);
2505aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org    }
2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::FakeNetworkManager network_manager_;
2532a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::scoped_ptr<cricket::BasicPortAllocator> allocator_;
2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ChannelData cd1_;
2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ChannelData cd2_;
2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    int signaling_delay_;
257e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    cricket::IceRole role_;
2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    uint64 tiebreaker_;
2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    bool role_conflict_;
2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::IceProtocolType protocol_type_;
2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  struct CandidateData : public rtc::MessageData {
2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CandidateData(cricket::TransportChannel* ch, const cricket::Candidate& c)
2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        : channel(ch), candidate(c) {
2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::TransportChannel* channel;
2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::Candidate candidate;
2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  };
2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ChannelData* GetChannelData(cricket::TransportChannel* channel) {
2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (ep1_.HasChannel(channel))
2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return ep1_.GetChannelData(channel);
2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else
2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return ep2_.GetChannelData(channel);
2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void CreateChannels(int num) {
2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string ice_ufrag_ep1_cd1_ch = kIceUfrag[0];
2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string ice_pwd_ep1_cd1_ch = kIcePwd[0];
2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string ice_ufrag_ep2_cd1_ch = kIceUfrag[1];
2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::string ice_pwd_ep2_cd1_ch = kIcePwd[1];
2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep1_.cd1_.ch_.reset(CreateChannel(
2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        0, cricket::ICE_CANDIDATE_COMPONENT_DEFAULT,
2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ice_ufrag_ep1_cd1_ch, ice_pwd_ep1_cd1_ch,
2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ice_ufrag_ep2_cd1_ch, ice_pwd_ep2_cd1_ch));
2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep2_.cd1_.ch_.reset(CreateChannel(
2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        1, cricket::ICE_CANDIDATE_COMPONENT_DEFAULT,
2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ice_ufrag_ep2_cd1_ch, ice_pwd_ep2_cd1_ch,
2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ice_ufrag_ep1_cd1_ch, ice_pwd_ep1_cd1_ch));
2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (num == 2) {
2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      std::string ice_ufrag_ep1_cd2_ch = kIceUfrag[2];
2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      std::string ice_pwd_ep1_cd2_ch = kIcePwd[2];
2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      std::string ice_ufrag_ep2_cd2_ch = kIceUfrag[3];
2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      std::string ice_pwd_ep2_cd2_ch = kIcePwd[3];
2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // In BUNDLE each endpoint must share common ICE credentials.
2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (ep1_.allocator_->flags() & cricket::PORTALLOCATOR_ENABLE_BUNDLE) {
2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ice_ufrag_ep1_cd2_ch = ice_ufrag_ep1_cd1_ch;
2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ice_pwd_ep1_cd2_ch = ice_pwd_ep1_cd1_ch;
3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (ep2_.allocator_->flags() & cricket::PORTALLOCATOR_ENABLE_BUNDLE) {
3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ice_ufrag_ep2_cd2_ch = ice_ufrag_ep2_cd1_ch;
3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ice_pwd_ep2_cd2_ch = ice_pwd_ep2_cd1_ch;
3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ep1_.cd2_.ch_.reset(CreateChannel(
3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          0, cricket::ICE_CANDIDATE_COMPONENT_DEFAULT,
3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          ice_ufrag_ep1_cd2_ch, ice_pwd_ep1_cd2_ch,
3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          ice_ufrag_ep2_cd2_ch, ice_pwd_ep2_cd2_ch));
3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ep2_.cd2_.ch_.reset(CreateChannel(
3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          1, cricket::ICE_CANDIDATE_COMPONENT_DEFAULT,
3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          ice_ufrag_ep2_cd2_ch, ice_pwd_ep2_cd2_ch,
3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          ice_ufrag_ep1_cd2_ch, ice_pwd_ep1_cd2_ch));
3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::P2PTransportChannel* CreateChannel(
3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int endpoint,
3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int component,
3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const std::string& local_ice_ufrag,
3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const std::string& local_ice_pwd,
3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const std::string& remote_ice_ufrag,
3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      const std::string& remote_ice_pwd) {
3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::P2PTransportChannel* channel = new cricket::P2PTransportChannel(
3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        "test content name", component, NULL, GetAllocator(endpoint));
3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel->SignalRequestSignaling.connect(
3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &P2PTransportChannelTestBase::OnChannelRequestSignaling);
3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel->SignalCandidateReady.connect(this,
3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        &P2PTransportChannelTestBase::OnCandidate);
3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel->SignalReadPacket.connect(
3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &P2PTransportChannelTestBase::OnReadPacket);
3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel->SignalRoleConflict.connect(
3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        this, &P2PTransportChannelTestBase::OnRoleConflict);
3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel->SetIceProtocolType(GetEndpoint(endpoint)->protocol_type());
3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel->SetIceCredentials(local_ice_ufrag, local_ice_pwd);
3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (clear_remote_candidates_ufrag_pwd_) {
3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // This only needs to be set if we're clearing them from the
3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // candidates.  Some unit tests rely on this not being set.
3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      channel->SetRemoteIceCredentials(remote_ice_ufrag, remote_ice_pwd);
3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
339e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    channel->SetIceRole(GetEndpoint(endpoint)->ice_role());
340e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    channel->SetIceTiebreaker(GetEndpoint(endpoint)->GetIceTiebreaker());
3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel->Connect();
3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return channel;
3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void DestroyChannels() {
3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep1_.cd1_.ch_.reset();
3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep2_.cd1_.ch_.reset();
3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep1_.cd2_.ch_.reset();
3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep2_.cd2_.ch_.reset();
3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::P2PTransportChannel* ep1_ch1() { return ep1_.cd1_.ch_.get(); }
3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::P2PTransportChannel* ep1_ch2() { return ep1_.cd2_.ch_.get(); }
3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::P2PTransportChannel* ep2_ch1() { return ep2_.cd1_.ch_.get(); }
3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::P2PTransportChannel* ep2_ch2() { return ep2_.cd2_.ch_.get(); }
3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Common results.
3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kLocalUdpToLocalUdp;
3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kLocalUdpToStunUdp;
3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kLocalUdpToPrflxUdp;
3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kPrflxUdpToLocalUdp;
3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kStunUdpToLocalUdp;
3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kStunUdpToStunUdp;
3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kPrflxUdpToStunUdp;
3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kLocalUdpToRelayUdp;
3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kPrflxUdpToRelayUdp;
3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kLocalTcpToLocalTcp;
3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kLocalTcpToPrflxTcp;
3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result kPrflxTcpToLocalTcp;
3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static void SetUpTestCase() {
3702a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::InitializeSSL();
371104540ba5b8d056cb0195bcd2e5d20abaa3dde7dmallinath@webrtc.org  }
372104540ba5b8d056cb0195bcd2e5d20abaa3dde7dmallinath@webrtc.org
373104540ba5b8d056cb0195bcd2e5d20abaa3dde7dmallinath@webrtc.org  static void TearDownTestCase() {
3742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::CleanupSSL();
3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3772a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::NATSocketServer* nat() { return nss_.get(); }
3782a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::FirewallSocketServer* fw() { return ss_.get(); }
3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Endpoint* GetEndpoint(int endpoint) {
3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (endpoint == 0) {
3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return &ep1_;
3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (endpoint == 1) {
3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return &ep2_;
3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return NULL;
3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::PortAllocator* GetAllocator(int endpoint) {
3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetEndpoint(endpoint)->allocator_.get();
3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void AddAddress(int endpoint, const SocketAddress& addr) {
3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetEndpoint(endpoint)->network_manager_.AddInterface(addr);
3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void RemoveAddress(int endpoint, const SocketAddress& addr) {
3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetEndpoint(endpoint)->network_manager_.RemoveInterface(addr);
3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
3982a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void SetProxy(int endpoint, rtc::ProxyType type) {
3992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::ProxyInfo info;
4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    info.type = type;
4012a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    info.address = (type == rtc::PROXY_HTTPS) ?
4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        kHttpsProxyAddrs[endpoint] : kSocksProxyAddrs[endpoint];
4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetAllocator(endpoint)->set_proxy("unittest/1.0", info);
4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetAllocatorFlags(int endpoint, int flags) {
4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetAllocator(endpoint)->set_flags(flags);
4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetSignalingDelay(int endpoint, int delay) {
4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetEndpoint(endpoint)->SetSignalingDelay(delay);
4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetIceProtocol(int endpoint, cricket::IceProtocolType type) {
4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetEndpoint(endpoint)->SetIceProtocolType(type);
4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
414e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org  void SetIceRole(int endpoint, cricket::IceRole role) {
415e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    GetEndpoint(endpoint)->SetIceRole(role);
4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
417e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org  void SetIceTiebreaker(int endpoint, uint64 tiebreaker) {
418e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    GetEndpoint(endpoint)->SetIceTiebreaker(tiebreaker);
4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool GetRoleConflict(int endpoint) {
4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetEndpoint(endpoint)->role_conflict();
4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void SetAllocationStepDelay(int endpoint, uint32 delay) {
4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetEndpoint(endpoint)->SetAllocationStepDelay(delay);
4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
4265aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  void SetAllowTcpListen(int endpoint, bool allow_tcp_listen) {
4275aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org    return GetEndpoint(endpoint)->SetAllowTcpListen(allow_tcp_listen);
4285aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  }
4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void Test(const Result& expected) {
4312a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    int32 connect_start = rtc::Time(), connect_time;
4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Create the channels and wait for them to connect.
4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(1);
4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT_MARGIN(ep1_ch1() != NULL &&
4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            ep2_ch1() != NULL &&
4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            ep1_ch1()->readable() &&
4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            ep1_ch1()->writable() &&
4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            ep2_ch1()->readable() &&
4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            ep2_ch1()->writable(),
4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            expected.connect_wait,
4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            1000);
4432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    connect_time = rtc::TimeSince(connect_start);
4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (connect_time < expected.connect_wait) {
4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LOG(LS_INFO) << "Connect time: " << connect_time << " ms";
4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LOG(LS_INFO) << "Connect time: " << "TIMEOUT ("
4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   << expected.connect_wait << " ms)";
4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Allow a few turns of the crank for the best connections to emerge.
4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // This may take up to 2 seconds.
4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (ep1_ch1()->best_connection() &&
4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        ep2_ch1()->best_connection()) {
4552a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      int32 converge_start = rtc::Time(), converge_time;
4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int converge_wait = 2000;
4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE_WAIT_MARGIN(
458353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.org          LocalCandidate(ep1_ch1())->type() == expected.local_type &&
4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          LocalCandidate(ep1_ch1())->protocol() == expected.local_proto &&
4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          RemoteCandidate(ep1_ch1())->type() == expected.remote_type &&
4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          RemoteCandidate(ep1_ch1())->protocol() == expected.remote_proto,
4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          converge_wait,
4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          converge_wait);
4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Also do EXPECT_EQ on each part so that failures are more verbose.
466353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.org      EXPECT_EQ(expected.local_type, LocalCandidate(ep1_ch1())->type());
4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(expected.local_proto, LocalCandidate(ep1_ch1())->protocol());
4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(expected.remote_type, RemoteCandidate(ep1_ch1())->type());
4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ(expected.remote_proto, RemoteCandidate(ep1_ch1())->protocol());
4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // Verifying remote channel best connection information. This is done
4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // only for the RFC 5245 as controlled agent will use USE-CANDIDATE
4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // from controlling (ep1) agent. We can easily predict from EP1 result
4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // matrix.
4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (ep2_.protocol_type_ == cricket::ICEPROTO_RFC5245) {
4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // Checking for best connection candidates information at remote.
4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        EXPECT_TRUE_WAIT(
4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            LocalCandidate(ep2_ch1())->type() == expected.local_type2 &&
4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            LocalCandidate(ep2_ch1())->protocol() == expected.local_proto2 &&
4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            RemoteCandidate(ep2_ch1())->protocol() == expected.remote_proto2,
4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            kDefaultTimeout);
4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // For verbose
4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        EXPECT_EQ(expected.local_type2, LocalCandidate(ep2_ch1())->type());
4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        EXPECT_EQ(expected.local_proto2, LocalCandidate(ep2_ch1())->protocol());
4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        EXPECT_EQ(expected.remote_proto2,
4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                  RemoteCandidate(ep2_ch1())->protocol());
4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // Removed remote_type comparision aginst best connection remote
4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // candidate. This is done to handle remote type discrepancy from
4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // local to stun based on the test type.
4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // For example in case of Open -> NAT, ep2 channels will have LULU
4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // and in other cases like NAT -> NAT it will be LUSU. To avoid these
4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // mismatches and we are doing comparision in different way.
4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // i.e. when don't match its remote type is either local or stun.
4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // TODO(ronghuawu): Refine the test criteria.
4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // https://code.google.com/p/webrtc/issues/detail?id=1953
497ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org        if (expected.remote_type2 != RemoteCandidate(ep2_ch1())->type()) {
4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          EXPECT_TRUE(expected.remote_type2 == cricket::LOCAL_PORT_TYPE ||
4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      expected.remote_type2 == cricket::STUN_PORT_TYPE);
5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          EXPECT_TRUE(
5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              RemoteCandidate(ep2_ch1())->type() == cricket::LOCAL_PORT_TYPE ||
5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              RemoteCandidate(ep2_ch1())->type() == cricket::STUN_PORT_TYPE ||
5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              RemoteCandidate(ep2_ch1())->type() == cricket::PRFLX_PORT_TYPE);
504ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org        }
5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      converge_time = rtc::TimeSince(converge_start);
5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (converge_time < converge_wait) {
5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        LOG(LS_INFO) << "Converge time: " << converge_time << " ms";
5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      } else {
5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        LOG(LS_INFO) << "Converge time: " << "TIMEOUT ("
5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     << converge_wait << " ms)";
5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Try sending some data to other end.
5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TestSendRecv(1);
5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Destroy the channels, and wait for them to be fully cleaned up.
5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    DestroyChannels();
5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSendRecv(int channels) {
5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    for (int i = 0; i < 10; ++i) {
5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const char* data = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
5250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int len = static_cast<int>(strlen(data));
5260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      // local_channel1 <==> remote_channel1
5270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ_WAIT(len, SendData(ep1_ch1(), data, len), 1000);
5280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE_WAIT(CheckDataOnChannel(ep2_ch1(), data, len), 1000);
5290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_EQ_WAIT(len, SendData(ep2_ch1(), data, len), 1000);
5300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      EXPECT_TRUE_WAIT(CheckDataOnChannel(ep1_ch1(), data, len), 1000);
5310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      if (channels == 2 && ep1_ch2() && ep2_ch2()) {
5320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // local_channel2 <==> remote_channel2
5330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        EXPECT_EQ_WAIT(len, SendData(ep1_ch2(), data, len), 1000);
5340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        EXPECT_TRUE_WAIT(CheckDataOnChannel(ep2_ch2(), data, len), 1000);
5350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        EXPECT_EQ_WAIT(len, SendData(ep2_ch2(), data, len), 1000);
5360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        EXPECT_TRUE_WAIT(CheckDataOnChannel(ep1_ch2(), data, len), 1000);
5370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      }
5380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
5390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // This test waits for the transport to become readable and writable on both
5420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // end points. Once they are, the end points set new local ice credentials to
5430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // restart the ice gathering. Finally it waits for the transport to select a
5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // new connection using the newly generated ice candidates.
5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Before calling this function the end points must be configured.
5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestHandleIceUfragPasswordChanged() {
5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[1], kIcePwd[1]);
5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[0], kIcePwd[0]);
5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->readable() && ep1_ch1()->writable() &&
5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            ep2_ch1()->readable() && ep2_ch1()->writable(),
5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            1000, 1000);
5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::Candidate* old_local_candidate1 = LocalCandidate(ep1_ch1());
5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::Candidate* old_local_candidate2 = LocalCandidate(ep2_ch1());
5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::Candidate* old_remote_candidate1 =
5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        RemoteCandidate(ep1_ch1());
5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    const cricket::Candidate* old_remote_candidate2 =
5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        RemoteCandidate(ep2_ch1());
5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep1_ch1()->SetIceCredentials(kIceUfrag[2], kIcePwd[2]);
5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep1_ch1()->SetRemoteIceCredentials(kIceUfrag[3], kIcePwd[3]);
5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep2_ch1()->SetIceCredentials(kIceUfrag[3], kIcePwd[3]);
5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ep2_ch1()->SetRemoteIceCredentials(kIceUfrag[2], kIcePwd[2]);
5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT_MARGIN(LocalCandidate(ep1_ch1())->generation() !=
5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            old_local_candidate1->generation(),
5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            1000, 1000);
5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT_MARGIN(LocalCandidate(ep2_ch1())->generation() !=
5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            old_local_candidate2->generation(),
5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            1000, 1000);
5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT_MARGIN(RemoteCandidate(ep1_ch1())->generation() !=
5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            old_remote_candidate1->generation(),
5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            1000, 1000);
5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT_MARGIN(RemoteCandidate(ep2_ch1())->generation() !=
5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            old_remote_candidate2->generation(),
5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                            1000, 1000);
5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1u, RemoteCandidate(ep2_ch1())->generation());
5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_EQ(1u, RemoteCandidate(ep1_ch1())->generation());
5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void TestSignalRoleConflict() {
5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetIceProtocol(0, cricket::ICEPROTO_RFC5245);
583e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    SetIceTiebreaker(0, kTiebreaker1);  // Default EP1 is in controlling state.
5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetIceProtocol(1, cricket::ICEPROTO_RFC5245);
586e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    SetIceRole(1, cricket::ICEROLE_CONTROLLING);
587e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    SetIceTiebreaker(1, kTiebreaker2);
5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Creating channels with both channels role set to CONTROLLING.
5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    CreateChannels(1);
5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // Since both the channels initiated with controlling state and channel2
5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    // has higher tiebreaker value, channel1 should receive SignalRoleConflict.
5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(GetRoleConflict(0), 1000);
5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_FALSE(GetRoleConflict(1));
5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE_WAIT(ep1_ch1()->readable() &&
5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     ep1_ch1()->writable() &&
5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     ep2_ch1()->readable() &&
5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     ep2_ch1()->writable(),
6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     1000);
6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    EXPECT_TRUE(ep1_ch1()->best_connection() &&
6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                ep2_ch1()->best_connection());
6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    TestSendRecv(1);
6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
608b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  void TestHybridConnectivity(cricket::IceProtocolType proto) {
609b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    AddAddress(0, kPublicAddrs[0]);
610b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    AddAddress(1, kPublicAddrs[1]);
611b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
612b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    SetAllocationStepDelay(0, kMinimumStepDelay);
613b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    SetAllocationStepDelay(1, kMinimumStepDelay);
614b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
615b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    SetIceRole(0, cricket::ICEROLE_CONTROLLING);
616b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    SetIceProtocol(0, cricket::ICEPROTO_HYBRID);
617b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    SetIceTiebreaker(0, kTiebreaker1);
618b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    SetIceRole(1, cricket::ICEROLE_CONTROLLED);
619b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    SetIceProtocol(1, proto);
620b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    SetIceTiebreaker(1, kTiebreaker2);
621b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
622b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    CreateChannels(1);
623b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // When channel is in hybrid and it's controlling agent, channel will
624b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // receive ping request from the remote. Hence connection is readable.
625b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // Since channel is in hybrid, it will not send any pings, so no writable
626b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // connection. Since channel2 is in controlled state, it will not have
627b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // any connections which are readable or writable, as it didn't received
628b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // pings (or none) with USE-CANDIDATE attribute.
629b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    EXPECT_TRUE_WAIT(ep1_ch1()->readable(), 1000);
630b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
631b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // Set real protocol type.
632b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    ep1_ch1()->SetIceProtocolType(proto);
633b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
634b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // Channel should able to send ping requests and connections become writable
635b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    // in both directions.
636b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    EXPECT_TRUE_WAIT(ep1_ch1()->readable() && ep1_ch1()->writable() &&
637b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org                     ep2_ch1()->readable() && ep2_ch1()->writable(),
638b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org                     1000);
639b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    EXPECT_TRUE(
640b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org        ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
641b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org        LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
642b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org        RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
643b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
644b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    TestSendRecv(1);
645b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org    DestroyChannels();
646b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  }
647b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnChannelRequestSignaling(cricket::TransportChannelImpl* channel) {
6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    channel->OnSignalingReady();
6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We pass the candidates directly to the other side.
6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnCandidate(cricket::TransportChannelImpl* ch,
6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   const cricket::Candidate& c) {
654ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    if (force_relay_ && c.type() != cricket::RELAY_PORT_TYPE)
655ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org      return;
656ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org
6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    main_->PostDelayed(GetEndpoint(ch)->signaling_delay_, this, 0,
6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       new CandidateData(ch, c));
6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6602a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void OnMessage(rtc::Message* msg) {
6612a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::scoped_ptr<CandidateData> data(
6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        static_cast<CandidateData*>(msg->pdata));
6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::P2PTransportChannel* rch = GetRemoteChannel(data->channel);
6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    cricket::Candidate c = data->candidate;
6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (clear_remote_candidates_ufrag_pwd_) {
6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      c.set_username("");
6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      c.set_password("");
6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    LOG(LS_INFO) << "Candidate(" << data->channel->component() << "->"
670e483a6bd4c266d65c82fc72d6480f898f193b27esergeyu@chromium.org                 << rch->component() << "): " << c.type() << ", " << c.protocol()
671e483a6bd4c266d65c82fc72d6480f898f193b27esergeyu@chromium.org                 << ", " << c.address().ToString() << ", " << c.username()
672e483a6bd4c266d65c82fc72d6480f898f193b27esergeyu@chromium.org                 << ", " << c.generation();
6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    rch->OnCandidate(c);
6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnReadPacket(cricket::TransportChannel* channel, const char* data,
6762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                    size_t len, const rtc::PacketTime& packet_time,
677f89a403cd8db88001322bbb0765c4636fd123700wu@webrtc.org                    int flags) {
6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    std::list<std::string>& packets = GetPacketList(channel);
6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    packets.push_front(std::string(data, len));
6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void OnRoleConflict(cricket::TransportChannelImpl* channel) {
6820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    GetEndpoint(channel)->OnRoleConflict(true);
683e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    cricket::IceRole new_role =
684e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org        GetEndpoint(channel)->ice_role() == cricket::ICEROLE_CONTROLLING ?
685e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org            cricket::ICEROLE_CONTROLLED : cricket::ICEROLE_CONTROLLING;
686e560834da4ee5a5f38a96a8cb9290c5ce1096989mallinath@webrtc.org    channel->SetIceRole(new_role);
6870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  int SendData(cricket::TransportChannel* channel,
6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org               const char* data, size_t len) {
6902a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::PacketOptions options;
691f5e5b3a9ce372d0e3cc594bf0036dda64a57d81dmallinath@webrtc.org    return channel->SendPacket(data, len, options, 0);
6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool CheckDataOnChannel(cricket::TransportChannel* channel,
6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          const char* data, int len) {
6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetChannelData(channel)->CheckData(data, len);
6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const cricket::Candidate* LocalCandidate(
6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::P2PTransportChannel* ch) {
6990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (ch && ch->best_connection()) ?
7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        &ch->best_connection()->local_candidate() : NULL;
7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const cricket::Candidate* RemoteCandidate(
7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::P2PTransportChannel* ch) {
7040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return (ch && ch->best_connection()) ?
7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        &ch->best_connection()->remote_candidate() : NULL;
7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Endpoint* GetEndpoint(cricket::TransportChannel* ch) {
7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (ep1_.HasChannel(ch)) {
7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return &ep1_;
7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else if (ep2_.HasChannel(ch)) {
7110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return &ep2_;
7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return NULL;
7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::P2PTransportChannel* GetRemoteChannel(
7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::TransportChannel* ch) {
7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (ch == ep1_ch1())
7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return ep2_ch1();
7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else if (ch == ep1_ch2())
7210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return ep2_ch2();
7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else if (ch == ep2_ch1())
7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return ep1_ch1();
7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else if (ch == ep2_ch2())
7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return ep1_ch2();
7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else
7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      return NULL;
7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  std::list<std::string>& GetPacketList(cricket::TransportChannel* ch) {
7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    return GetChannelData(ch)->ch_packets_;
7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void set_clear_remote_candidates_ufrag_pwd(bool clear) {
7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    clear_remote_candidates_ufrag_pwd_ = clear;
7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
737ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  void set_force_relay(bool relay) {
738ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    force_relay_ = relay;
739ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  }
740ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org
7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private:
7422a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::Thread* main_;
7432a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::PhysicalSocketServer> pss_;
7442a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::VirtualSocketServer> vss_;
7452a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::NATSocketServer> nss_;
7462a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::scoped_ptr<rtc::FirewallSocketServer> ss_;
7472a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::SocketServerScope ss_scope_;
7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::TestStunServer stun_server_;
749ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  cricket::TestTurnServer turn_server_;
750353ac3047d480819550f0a305849b03e7ff1f8c8buildbot@webrtc.org  cricket::TestRelayServer relay_server_;
7512a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::SocksProxyServer socks_server1_;
7522a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::SocksProxyServer socks_server2_;
7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Endpoint ep1_;
7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Endpoint ep2_;
7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  bool clear_remote_candidates_ufrag_pwd_;
756ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  bool force_relay_;
7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// The tests have only a few outcomes, which we predefine.
7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kLocalUdpToLocalUdp("local", "udp", "local", "udp",
7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        "local", "udp", "local", "udp", 1000);
7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kLocalUdpToStunUdp("local", "udp", "stun", "udp",
7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       "local", "udp", "stun", "udp", 1000);
7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kLocalUdpToPrflxUdp("local", "udp", "prflx", "udp",
7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        "prflx", "udp", "local", "udp", 1000);
7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kPrflxUdpToLocalUdp("prflx", "udp", "local", "udp",
7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        "local", "udp", "prflx", "udp", 1000);
7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kStunUdpToLocalUdp("stun", "udp", "local", "udp",
7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       "local", "udp", "stun", "udp", 1000);
7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kStunUdpToStunUdp("stun", "udp", "stun", "udp",
7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      "stun", "udp", "stun", "udp", 1000);
7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kPrflxUdpToStunUdp("prflx", "udp", "stun", "udp",
7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       "local", "udp", "prflx", "udp", 1000);
7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kLocalUdpToRelayUdp("local", "udp", "relay", "udp",
7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        "relay", "udp", "local", "udp", 2000);
7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kPrflxUdpToRelayUdp("prflx", "udp", "relay", "udp",
7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        "relay", "udp", "prflx", "udp", 2000);
7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kLocalTcpToLocalTcp("local", "tcp", "local", "tcp",
7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        "local", "tcp", "local", "tcp", 3000);
7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kLocalTcpToPrflxTcp("local", "tcp", "prflx", "tcp",
7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        "prflx", "tcp", "local", "tcp", 3000);
7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTestBase::Result P2PTransportChannelTestBase::
7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    kPrflxTcpToLocalTcp("prflx", "tcp", "local", "tcp",
7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        "local", "tcp", "prflx", "tcp", 3000);
7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test the matrix of all the connectivity types we expect to see in the wild.
7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Just test every combination of the configs in the Config enum.
7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass P2PTransportChannelTest : public P2PTransportChannelTestBase {
8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result* kMatrix[NUM_CONFIGS][NUM_CONFIGS];
8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result* kMatrixSharedUfrag[NUM_CONFIGS][NUM_CONFIGS];
8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result* kMatrixSharedSocketAsGice[NUM_CONFIGS][NUM_CONFIGS];
8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  static const Result* kMatrixSharedSocketAsIce[NUM_CONFIGS][NUM_CONFIGS];
8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void ConfigureEndpoints(Config config1, Config config2,
8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int allocator_flags1, int allocator_flags2,
8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      int delay1, int delay2,
8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      cricket::IceProtocolType type) {
809ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    // Ideally we want to use TURN server for both GICE and ICE, but in case
810ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    // of GICE, TURN server usage is not producing results reliabally.
811ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    // TODO(mallinath): Remove Relay and use TURN server for all tests.
812459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org    ServerAddresses stun_servers;
813459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org    stun_servers.insert(kStunAddr);
814ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    GetEndpoint(0)->allocator_.reset(
815ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org        new cricket::BasicPortAllocator(&(GetEndpoint(0)->network_manager_),
816459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org        stun_servers,
8172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        rtc::SocketAddress(), rtc::SocketAddress(),
8182a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        rtc::SocketAddress()));
819ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    GetEndpoint(1)->allocator_.reset(
820ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org        new cricket::BasicPortAllocator(&(GetEndpoint(1)->network_manager_),
821459f356846e5dc1e9b2c5182568660f5eaacfe3ebuildbot@webrtc.org        stun_servers,
8222a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        rtc::SocketAddress(), rtc::SocketAddress(),
8232a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        rtc::SocketAddress()));
824ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org
825ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    cricket::RelayServerConfig relay_server(cricket::RELAY_GTURN);
826ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    if (type == cricket::ICEPROTO_RFC5245) {
827ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org      relay_server.type = cricket::RELAY_TURN;
828ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org      relay_server.credentials = kRelayCredentials;
829ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org      relay_server.ports.push_back(cricket::ProtocolAddress(
830ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org          kTurnUdpIntAddr, cricket::PROTO_UDP, false));
831ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    } else {
832ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org      relay_server.ports.push_back(cricket::ProtocolAddress(
833ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org          kRelayUdpIntAddr, cricket::PROTO_UDP, false));
834ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org      relay_server.ports.push_back(cricket::ProtocolAddress(
835ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org          kRelayTcpIntAddr, cricket::PROTO_TCP, false));
836ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org      relay_server.ports.push_back(cricket::ProtocolAddress(
837ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org          kRelaySslTcpIntAddr, cricket::PROTO_SSLTCP, false));
838ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    }
839ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    GetEndpoint(0)->allocator_->AddRelay(relay_server);
840ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org    GetEndpoint(1)->allocator_->AddRelay(relay_server);
841ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org
8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoint(0, config1);
8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetIceProtocol(0, type);
8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetAllocatorFlags(0, allocator_flags1);
8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetAllocationStepDelay(0, delay1);
8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoint(1, config2);
8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetIceProtocol(1, type);
8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetAllocatorFlags(1, allocator_flags2);
8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    SetAllocationStepDelay(1, delay2);
8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void ConfigureEndpoint(int endpoint, Config config) {
8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    switch (config) {
8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case OPEN:
8540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        AddAddress(endpoint, kPublicAddrs[endpoint]);
8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        break;
8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case NAT_FULL_CONE:
8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case NAT_ADDR_RESTRICTED:
8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case NAT_PORT_RESTRICTED:
8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case NAT_SYMMETRIC:
8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        AddAddress(endpoint, kPrivateAddrs[endpoint]);
8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // Add a single NAT of the desired type
8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        nat()->AddTranslator(kPublicAddrs[endpoint], kNatAddrs[endpoint],
8632a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org            static_cast<rtc::NATType>(config - NAT_FULL_CONE))->
8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            AddClient(kPrivateAddrs[endpoint]);
8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        break;
8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case NAT_DOUBLE_CONE:
8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case NAT_SYMMETRIC_THEN_CONE:
8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        AddAddress(endpoint, kCascadedPrivateAddrs[endpoint]);
8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // Add a two cascaded NATs of the desired types
8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        nat()->AddTranslator(kPublicAddrs[endpoint], kNatAddrs[endpoint],
8710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            (config == NAT_DOUBLE_CONE) ?
8722a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                rtc::NAT_OPEN_CONE : rtc::NAT_SYMMETRIC)->
8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org            AddTranslator(kPrivateAddrs[endpoint], kCascadedNatAddrs[endpoint],
8742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                rtc::NAT_OPEN_CONE)->
8750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                AddClient(kCascadedPrivateAddrs[endpoint]);
8760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        break;
8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case BLOCK_UDP:
8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case BLOCK_UDP_AND_INCOMING_TCP:
8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case BLOCK_ALL_BUT_OUTGOING_HTTP:
8800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case PROXY_HTTPS:
8810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      case PROXY_SOCKS:
8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        AddAddress(endpoint, kPublicAddrs[endpoint]);
8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        // Block all UDP
8842a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org        fw()->AddRule(false, rtc::FP_UDP, rtc::FD_ANY,
8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                      kPublicAddrs[endpoint]);
8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        if (config == BLOCK_UDP_AND_INCOMING_TCP) {
8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          // Block TCP inbound to the endpoint
8882a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          fw()->AddRule(false, rtc::FP_TCP, SocketAddress(),
8890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        kPublicAddrs[endpoint]);
8900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        } else if (config == BLOCK_ALL_BUT_OUTGOING_HTTP) {
8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          // Block all TCP to/from the endpoint except 80/443 out
8922a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          fw()->AddRule(true, rtc::FP_TCP, kPublicAddrs[endpoint],
8932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                        SocketAddress(rtc::IPAddress(INADDR_ANY), 80));
8942a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          fw()->AddRule(true, rtc::FP_TCP, kPublicAddrs[endpoint],
8952a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org                        SocketAddress(rtc::IPAddress(INADDR_ANY), 443));
8962a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          fw()->AddRule(false, rtc::FP_TCP, rtc::FD_ANY,
8970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        kPublicAddrs[endpoint]);
8980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        } else if (config == PROXY_HTTPS) {
8990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          // Block all TCP to/from the endpoint except to the proxy server
9002a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          fw()->AddRule(true, rtc::FP_TCP, kPublicAddrs[endpoint],
9010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        kHttpsProxyAddrs[endpoint]);
9022a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          fw()->AddRule(false, rtc::FP_TCP, rtc::FD_ANY,
9030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        kPublicAddrs[endpoint]);
9042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          SetProxy(endpoint, rtc::PROXY_HTTPS);
9050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        } else if (config == PROXY_SOCKS) {
9060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org          // Block all TCP to/from the endpoint except to the proxy server
9072a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          fw()->AddRule(true, rtc::FP_TCP, kPublicAddrs[endpoint],
9080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        kSocksProxyAddrs[endpoint]);
9092a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          fw()->AddRule(false, rtc::FP_TCP, rtc::FD_ANY,
9100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                        kPublicAddrs[endpoint]);
9112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          SetProxy(endpoint, rtc::PROXY_SOCKS5);
9120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        }
9130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        break;
9140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      default:
9150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        break;
9160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
9170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
9180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
9190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Shorthands for use in the test matrix.
9210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define LULU &kLocalUdpToLocalUdp
9220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define LUSU &kLocalUdpToStunUdp
9230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define LUPU &kLocalUdpToPrflxUdp
9240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PULU &kPrflxUdpToLocalUdp
9250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define SULU &kStunUdpToLocalUdp
9260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define SUSU &kStunUdpToStunUdp
9270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PUSU &kPrflxUdpToStunUdp
9280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define LURU &kLocalUdpToRelayUdp
9290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PURU &kPrflxUdpToRelayUdp
9300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define LTLT &kLocalTcpToLocalTcp
9310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define LTPT &kLocalTcpToPrflxTcp
9320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define PTLT &kPrflxTcpToLocalTcp
9330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO: Enable these once TestRelayServer can accept external TCP.
9340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define LTRT NULL
9350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define LSRS NULL
9360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test matrix. Originator behavior defined by rows, receiever by columns.
9380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Currently the p2ptransportchannel.cc (specifically the
9400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// P2PTransportChannel::OnUnknownAddress) operates in 2 modes depend on the
9410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// remote candidates - ufrag per port or shared ufrag.
9420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// For example, if the remote candidates have the shared ufrag, for the unknown
9430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// address reaches the OnUnknownAddress, we will try to find the matched
9440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// remote candidate based on the address and protocol, if not found, a new
9450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// remote candidate will be created for this address. But if the remote
9460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// candidates have different ufrags, we will try to find the matched remote
9470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// candidate by comparing the ufrag. If not found, an error will be returned.
9480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Because currently the shared ufrag feature is under the experiment and will
9490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// be rolled out gradually. We want to test the different combinations of peers
9500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// with/without the shared ufrag enabled. And those different combinations have
9510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// different expectation of the best connection. For example in the OpenToCONE
9520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// case, an unknown address will be updated to a "host" remote candidate if the
9530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// remote peer uses different ufrag per port. But in the shared ufrag case,
9540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// a "stun" (should be peer-reflexive eventually) candidate will be created for
9550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// that. So the expected best candidate will be LUSU instead of LULU.
9560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// With all these, we have to keep 2 test matrixes for the tests:
9570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kMatrix - for the tests that the remote peer uses different ufrag per port.
9580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kMatrixSharedUfrag - for the tests that remote peer uses shared ufrag.
9590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// The different between the two matrixes are on:
9600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// OPToCONE, OPTo2CON,
9610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// COToCONE, COToADDR, COToPORT, COToSYMM, COTo2CON, COToSCON,
9620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// ADToCONE, ADToADDR, ADTo2CON,
9630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// POToADDR,
9640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SYToADDR,
9650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// 2CToCONE, 2CToADDR, 2CToPORT, 2CToSYMM, 2CTo2CON, 2CToSCON,
9660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// SCToADDR,
9670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
9680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO: Fix NULLs caused by lack of TCP support in NATSocket.
9690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO: Fix NULLs caused by no HTTP proxy support.
9700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO: Rearrange rows/columns from best to worst.
9710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// TODO(ronghuawu): Keep only one test matrix once the shared ufrag is enabled.
9720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTest::Result*
9730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    P2PTransportChannelTest::kMatrix[NUM_CONFIGS][NUM_CONFIGS] = {
9740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//      OPEN  CONE  ADDR  PORT  SYMM  2CON  SCON  !UDP  !TCP  HTTP  PRXH  PRXS
9750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*OP*/ {LULU, LULU, LULU, LULU, LULU, LULU, LULU, LTLT, LTLT, LSRS, NULL, LTLT},
9760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*CO*/ {LULU, LULU, LULU, SULU, SULU, LULU, SULU, NULL, NULL, LSRS, NULL, LTRT},
9770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*AD*/ {LULU, LULU, LULU, SUSU, SUSU, LULU, SUSU, NULL, NULL, LSRS, NULL, LTRT},
9780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PO*/ {LULU, LUSU, LUSU, SUSU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
9790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*SY*/ {LULU, LUSU, LUSU, LURU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
9800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*2C*/ {LULU, LULU, LULU, SULU, SULU, LULU, SULU, NULL, NULL, LSRS, NULL, LTRT},
9810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*SC*/ {LULU, LUSU, LUSU, LURU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
9820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*!U*/ {LTLT, NULL, NULL, NULL, NULL, NULL, NULL, LTLT, LTLT, LSRS, NULL, LTRT},
9830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*!T*/ {LTRT, NULL, NULL, NULL, NULL, NULL, NULL, LTLT, LTRT, LSRS, NULL, LTRT},
9840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*HT*/ {LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, NULL, LSRS},
9850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PR*/ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
9860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PR*/ {LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LSRS, NULL, LTRT},
9870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
9880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTest::Result*
9890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    P2PTransportChannelTest::kMatrixSharedUfrag[NUM_CONFIGS][NUM_CONFIGS] = {
9900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//      OPEN  CONE  ADDR  PORT  SYMM  2CON  SCON  !UDP  !TCP  HTTP  PRXH  PRXS
9910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*OP*/ {LULU, LUSU, LULU, LULU, LULU, LUSU, LULU, LTLT, LTLT, LSRS, NULL, LTLT},
9920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*CO*/ {LULU, LUSU, LUSU, SUSU, SUSU, LUSU, SUSU, NULL, NULL, LSRS, NULL, LTRT},
9930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*AD*/ {LULU, LUSU, LUSU, SUSU, SUSU, LUSU, SUSU, NULL, NULL, LSRS, NULL, LTRT},
9940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PO*/ {LULU, LUSU, LUSU, SUSU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
9950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*SY*/ {LULU, LUSU, LUSU, LURU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
9960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*2C*/ {LULU, LUSU, LUSU, SUSU, SUSU, LUSU, SUSU, NULL, NULL, LSRS, NULL, LTRT},
9970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*SC*/ {LULU, LUSU, LUSU, LURU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
9980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*!U*/ {LTLT, NULL, NULL, NULL, NULL, NULL, NULL, LTLT, LTLT, LSRS, NULL, LTRT},
9990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*!T*/ {LTRT, NULL, NULL, NULL, NULL, NULL, NULL, LTLT, LTRT, LSRS, NULL, LTRT},
10000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*HT*/ {LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, NULL, LSRS},
10010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PR*/ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
10020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PR*/ {LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LSRS, NULL, LTRT},
10030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
10040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTest::Result*
10050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    P2PTransportChannelTest::kMatrixSharedSocketAsGice
10060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        [NUM_CONFIGS][NUM_CONFIGS] = {
10070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//      OPEN  CONE  ADDR  PORT  SYMM  2CON  SCON  !UDP  !TCP  HTTP  PRXH  PRXS
10080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*OP*/ {LULU, LUSU, LUSU, LUSU, LUSU, LUSU, LUSU, LTLT, LTLT, LSRS, NULL, LTLT},
10090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*CO*/ {LULU, LUSU, LUSU, LUSU, LUSU, LUSU, LUSU, NULL, NULL, LSRS, NULL, LTRT},
10100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*AD*/ {LULU, LUSU, LUSU, LUSU, LUSU, LUSU, LUSU, NULL, NULL, LSRS, NULL, LTRT},
10110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PO*/ {LULU, LUSU, LUSU, LUSU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
10120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*SY*/ {LULU, LUSU, LUSU, LURU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
10130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*2C*/ {LULU, LUSU, LUSU, LUSU, LUSU, LUSU, LUSU, NULL, NULL, LSRS, NULL, LTRT},
10140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*SC*/ {LULU, LUSU, LUSU, LURU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
10150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*!U*/ {LTLT, NULL, NULL, NULL, NULL, NULL, NULL, LTLT, LTLT, LSRS, NULL, LTRT},
10160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*!T*/ {LTRT, NULL, NULL, NULL, NULL, NULL, NULL, LTLT, LTRT, LSRS, NULL, LTRT},
10170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*HT*/ {LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, NULL, LSRS},
10180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PR*/ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
10190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PR*/ {LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LSRS, NULL, LTRT},
10200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
10210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgconst P2PTransportChannelTest::Result*
10220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    P2PTransportChannelTest::kMatrixSharedSocketAsIce
10230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        [NUM_CONFIGS][NUM_CONFIGS] = {
10240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//      OPEN  CONE  ADDR  PORT  SYMM  2CON  SCON  !UDP  !TCP  HTTP  PRXH  PRXS
10250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*OP*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, PTLT, LTPT, LSRS, NULL, PTLT},
10260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*CO*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, NULL, NULL, LSRS, NULL, LTRT},
10270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*AD*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, NULL, NULL, LSRS, NULL, LTRT},
10280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PO*/ {LULU, LUSU, LUSU, LUSU, LURU, LUSU, LURU, NULL, NULL, LSRS, NULL, LTRT},
10290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*SY*/ {PULU, PUSU, PUSU, PURU, PURU, PUSU, PURU, NULL, NULL, LSRS, NULL, LTRT},
10300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*2C*/ {LULU, LUSU, LUSU, LUSU, LUPU, LUSU, LUPU, NULL, NULL, LSRS, NULL, LTRT},
10310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*SC*/ {PULU, PUSU, PUSU, PURU, PURU, PUSU, PURU, NULL, NULL, LSRS, NULL, LTRT},
10320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*!U*/ {PTLT, NULL, NULL, NULL, NULL, NULL, NULL, PTLT, LTPT, LSRS, NULL, LTRT},
10330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*!T*/ {LTRT, NULL, NULL, NULL, NULL, NULL, NULL, PTLT, LTRT, LSRS, NULL, LTRT},
10340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*HT*/ {LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, LSRS, NULL, LSRS},
10350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PR*/ {NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL},
10360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/*PR*/ {LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LTRT, LSRS, NULL, LTRT},
10370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
10380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
10390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// The actual tests that exercise all the various configurations.
10400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test names are of the form P2PTransportChannelTest_TestOPENToNAT_FULL_CONE
10410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Same test case is run in both GICE and ICE mode.
10420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kDefaultStepDelay - is used for all Gice cases.
10430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// kMinimumStepDelay - is used when both end points have
10440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org//                     PORTALLOCATOR_ENABLE_SHARED_UFRAG flag enabled.
10450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Technically we should be able to use kMinimumStepDelay irrespective of
10460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// protocol type. But which might need modifications to current result matrices
10470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// for tests in this file.
10480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define P2P_TEST_DECLARATION(x, y, z) \
10490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TEST_F(P2PTransportChannelTest, z##Test##x##To##y##AsGiceNoneSharedUfrag) { \
10500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoints(x, y, kDefaultPortAllocatorFlags, \
10510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kDefaultPortAllocatorFlags, \
10520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kDefaultStepDelay, kDefaultStepDelay, \
10530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       cricket::ICEPROTO_GOOGLE); \
10540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kMatrix[x][y] != NULL) \
10550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      Test(*kMatrix[x][y]); \
10560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else \
10570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LOG(LS_WARNING) << "Not yet implemented"; \
10580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  } \
10590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TEST_F(P2PTransportChannelTest, z##Test##x##To##y##AsGiceP0SharedUfrag) { \
10600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoints(x, y, PORTALLOCATOR_ENABLE_SHARED_UFRAG, \
10610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kDefaultPortAllocatorFlags, \
10620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kDefaultStepDelay, kDefaultStepDelay, \
10630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       cricket::ICEPROTO_GOOGLE); \
10640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kMatrix[x][y] != NULL) \
10650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      Test(*kMatrix[x][y]); \
10660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else \
10670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LOG(LS_WARNING) << "Not yet implemented"; \
10680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  } \
10690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TEST_F(P2PTransportChannelTest, z##Test##x##To##y##AsGiceP1SharedUfrag) { \
10700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoints(x, y, kDefaultPortAllocatorFlags, \
10710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_UFRAG, \
10720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kDefaultStepDelay, kDefaultStepDelay, \
10730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       cricket::ICEPROTO_GOOGLE); \
10740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kMatrixSharedUfrag[x][y] != NULL) \
10750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      Test(*kMatrixSharedUfrag[x][y]); \
10760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else \
10770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LOG(LS_WARNING) << "Not yet implemented"; \
10780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  } \
10790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TEST_F(P2PTransportChannelTest, z##Test##x##To##y##AsGiceBothSharedUfrag) { \
10800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoints(x, y, PORTALLOCATOR_ENABLE_SHARED_UFRAG, \
10810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_UFRAG, \
10820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kDefaultStepDelay, kDefaultStepDelay, \
10830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       cricket::ICEPROTO_GOOGLE); \
10840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kMatrixSharedUfrag[x][y] != NULL) \
10850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      Test(*kMatrixSharedUfrag[x][y]); \
10860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else \
10870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LOG(LS_WARNING) << "Not yet implemented"; \
10880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  } \
10890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TEST_F(P2PTransportChannelTest, \
10900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         z##Test##x##To##y##AsGiceBothSharedUfragWithMinimumStepDelay) { \
10910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoints(x, y, PORTALLOCATOR_ENABLE_SHARED_UFRAG, \
10920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_UFRAG, \
10930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kMinimumStepDelay, kMinimumStepDelay, \
10940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       cricket::ICEPROTO_GOOGLE); \
10950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kMatrixSharedUfrag[x][y] != NULL) \
10960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      Test(*kMatrixSharedUfrag[x][y]); \
10970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else \
10980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LOG(LS_WARNING) << "Not yet implemented"; \
10990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  } \
11000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TEST_F(P2PTransportChannelTest, \
11010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org         z##Test##x##To##y##AsGiceBothSharedUfragSocket) { \
11020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoints(x, y, PORTALLOCATOR_ENABLE_SHARED_UFRAG | \
11030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_SOCKET, \
11040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_UFRAG | \
11050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_SOCKET, \
11060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kMinimumStepDelay, kMinimumStepDelay, \
11070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       cricket::ICEPROTO_GOOGLE); \
11080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kMatrixSharedSocketAsGice[x][y] != NULL) \
11090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      Test(*kMatrixSharedSocketAsGice[x][y]); \
11100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else \
11110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    LOG(LS_WARNING) << "Not yet implemented"; \
11120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  } \
11130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TEST_F(P2PTransportChannelTest, z##Test##x##To##y##AsIce) { \
11140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoints(x, y, PORTALLOCATOR_ENABLE_SHARED_UFRAG | \
11150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_SOCKET, \
11160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_UFRAG | \
11170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       PORTALLOCATOR_ENABLE_SHARED_SOCKET, \
11180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       kMinimumStepDelay, kMinimumStepDelay, \
11190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                       cricket::ICEPROTO_RFC5245); \
11200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (kMatrixSharedSocketAsIce[x][y] != NULL) \
11210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      Test(*kMatrixSharedSocketAsIce[x][y]); \
11220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    else \
11230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    LOG(LS_WARNING) << "Not yet implemented"; \
11240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
11250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define P2P_TEST(x, y) \
11270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST_DECLARATION(x, y,)
11280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define FLAKY_P2P_TEST(x, y) \
11300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST_DECLARATION(x, y, DISABLED_)
11310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
113299133415f463cf3c4559597571657d32a598a7d0stefan@webrtc.org// TODO(holmer): Disabled due to randomly failing on webrtc buildbots.
113399133415f463cf3c4559597571657d32a598a7d0stefan@webrtc.org// Issue: webrtc/2383
11340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define P2P_TEST_SET(x) \
11350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, OPEN) \
113699133415f463cf3c4559597571657d32a598a7d0stefan@webrtc.org  FLAKY_P2P_TEST(x, NAT_FULL_CONE) \
11377262c0074086d60e77a075d336d2594fa0234b92asapersson@webrtc.org  FLAKY_P2P_TEST(x, NAT_ADDR_RESTRICTED) \
113894a6ec35222cb4b7ce23e472f0617e260727263ckjellander@webrtc.org  FLAKY_P2P_TEST(x, NAT_PORT_RESTRICTED) \
11390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, NAT_SYMMETRIC) \
114099133415f463cf3c4559597571657d32a598a7d0stefan@webrtc.org  FLAKY_P2P_TEST(x, NAT_DOUBLE_CONE) \
11410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, NAT_SYMMETRIC_THEN_CONE) \
11420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, BLOCK_UDP) \
11430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, BLOCK_UDP_AND_INCOMING_TCP) \
11440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, BLOCK_ALL_BUT_OUTGOING_HTTP) \
11450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, PROXY_HTTPS) \
11460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, PROXY_SOCKS)
11470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#define FLAKY_P2P_TEST_SET(x) \
11490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, OPEN) \
11500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, NAT_FULL_CONE) \
11510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, NAT_ADDR_RESTRICTED) \
11520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, NAT_PORT_RESTRICTED) \
11530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, NAT_SYMMETRIC) \
11540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, NAT_DOUBLE_CONE) \
11550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, NAT_SYMMETRIC_THEN_CONE) \
11560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, BLOCK_UDP) \
11570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, BLOCK_UDP_AND_INCOMING_TCP) \
11580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, BLOCK_ALL_BUT_OUTGOING_HTTP) \
11590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, PROXY_HTTPS) \
11600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  P2P_TEST(x, PROXY_SOCKS)
11610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(OPEN)
11630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(NAT_FULL_CONE)
11640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(NAT_ADDR_RESTRICTED)
11650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(NAT_PORT_RESTRICTED)
11660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(NAT_SYMMETRIC)
11670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(NAT_DOUBLE_CONE)
11680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(NAT_SYMMETRIC_THEN_CONE)
11690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(BLOCK_UDP)
11700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(BLOCK_UDP_AND_INCOMING_TCP)
11710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(BLOCK_ALL_BUT_OUTGOING_HTTP)
11720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(PROXY_HTTPS)
11730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgP2P_TEST_SET(PROXY_SOCKS)
11740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we restart candidate allocation when local ufrag&pwd changed.
11760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Standard Ice protocol is used.
11770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelTest, HandleUfragPwdChangeAsIce) {
11780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(OPEN, OPEN,
11790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
11800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
11810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kMinimumStepDelay, kMinimumStepDelay,
11820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_RFC5245);
11830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
11840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestHandleIceUfragPasswordChanged();
1185b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  DestroyChannels();
11860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
11870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we restart candidate allocation when local ufrag&pwd changed.
11890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Standard Ice protocol is used.
11900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelTest, HandleUfragPwdChangeBundleAsIce) {
11910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(OPEN, OPEN,
11920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
11930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
11940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kMinimumStepDelay, kMinimumStepDelay,
11950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_RFC5245);
11960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(0, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
11970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(1, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
11980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
11990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(2);
12000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestHandleIceUfragPasswordChanged();
1201b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  DestroyChannels();
12020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
12030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we restart candidate allocation when local ufrag&pwd changed.
12050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Google Ice protocol is used.
12060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelTest, HandleUfragPwdChangeAsGice) {
12070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(OPEN, OPEN,
12080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
12090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
12100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultStepDelay, kDefaultStepDelay,
12110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_GOOGLE);
12120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
12130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestHandleIceUfragPasswordChanged();
1214b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  DestroyChannels();
12150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
12160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that ICE restart works when bundle is enabled.
12180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Google Ice protocol is used.
12190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelTest, HandleUfragPwdChangeBundleAsGice) {
12200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(OPEN, OPEN,
12210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
12220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
12230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultStepDelay, kDefaultStepDelay,
12240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_GOOGLE);
12250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(0, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
12260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(1, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
12270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(2);
12290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestHandleIceUfragPasswordChanged();
1230b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  DestroyChannels();
12310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
12320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test the operation of GetStats.
12340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelTest, GetStats) {
12350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(OPEN, OPEN,
12360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultPortAllocatorFlags,
12370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultPortAllocatorFlags,
12380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultStepDelay, kDefaultStepDelay,
12390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_GOOGLE);
12400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
12410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE_WAIT_MARGIN(ep1_ch1()->readable() && ep1_ch1()->writable() &&
12420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          ep2_ch1()->readable() && ep2_ch1()->writable(),
12430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          1000, 1000);
12440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  TestSendRecv(1);
12450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  cricket::ConnectionInfos infos;
12460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_TRUE(ep1_ch1()->GetStats(&infos));
12470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ASSERT_EQ(1U, infos.size());
12480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(infos[0].new_connection);
12490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(infos[0].best_connection);
12500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(infos[0].readable);
12510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(infos[0].writable);
12520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(infos[0].timeout);
12530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(10 * 36U, infos[0].sent_total_bytes);
12540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_EQ(10 * 36U, infos[0].recv_total_bytes);
12550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_GT(infos[0].rtt, 0U);
12560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DestroyChannels();
12570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
12580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we properly handle getting a STUN error due to slow signaling.
12607262c0074086d60e77a075d336d2594fa0234b92asapersson@webrtc.orgTEST_F(P2PTransportChannelTest, DISABLED_SlowSignaling) {
12610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(OPEN, NAT_SYMMETRIC,
12620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultPortAllocatorFlags,
12630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultPortAllocatorFlags,
12640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultStepDelay, kDefaultStepDelay,
12650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_GOOGLE);
12660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Make signaling from the callee take 500ms, so that the initial STUN pings
12670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // from the callee beat the signaling, and so the caller responds with a
12680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // unknown username error. We should just eat that and carry on; mishandling
12690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // this will instead cause all the callee's connections to be discarded.
12700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetSignalingDelay(1, 1000);
12710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
12720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const cricket::Connection* best_connection = NULL;
12730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Wait until the callee's connections are created.
12740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WAIT((best_connection = ep2_ch1()->best_connection()) != NULL, 1000);
12750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Wait to see if they get culled; they shouldn't.
12760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WAIT(ep2_ch1()->best_connection() != best_connection, 1000);
12770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ep2_ch1()->best_connection() == best_connection);
12780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DestroyChannels();
12790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
12800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that if remote candidates don't have ufrag and pwd, we still work.
12820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelTest, RemoteCandidatesWithoutUfragPwd) {
12830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  set_clear_remote_candidates_ufrag_pwd(true);
12840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(OPEN, OPEN,
12850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
12860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     PORTALLOCATOR_ENABLE_SHARED_UFRAG,
12870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kMinimumStepDelay, kMinimumStepDelay,
12880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_GOOGLE);
12890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
12900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  const cricket::Connection* best_connection = NULL;
12910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Wait until the callee's connections are created.
12920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WAIT((best_connection = ep2_ch1()->best_connection()) != NULL, 1000);
12930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Wait to see if they get culled; they shouldn't.
12940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  WAIT(ep2_ch1()->best_connection() != best_connection, 1000);
12950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(ep2_ch1()->best_connection() == best_connection);
12960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DestroyChannels();
12970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
12980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
12990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a host behind NAT cannot be reached when incoming_only
13000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// is set to true.
13010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelTest, IncomingOnlyBlocked) {
13020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(NAT_FULL_CONE, OPEN,
13030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultPortAllocatorFlags,
13040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultPortAllocatorFlags,
13050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultStepDelay, kDefaultStepDelay,
13060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_GOOGLE);
13070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(0, kOnlyLocalPorts);
13090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
13100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ep1_ch1()->set_incoming_only(true);
13110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Pump for 1 second and verify that the channels are not connected.
13132a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  rtc::Thread::Current()->ProcessMessages(1000);
13140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ep1_ch1()->readable());
13160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ep1_ch1()->writable());
13170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ep2_ch1()->readable());
13180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_FALSE(ep2_ch1()->writable());
13190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DestroyChannels();
13210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
13220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a peer behind NAT can connect to a peer that has
13240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// incoming_only flag set.
13250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelTest, IncomingOnlyOpen) {
13260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(OPEN, NAT_FULL_CONE,
13270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultPortAllocatorFlags,
13280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultPortAllocatorFlags,
13290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     kDefaultStepDelay, kDefaultStepDelay,
13300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                     cricket::ICEPROTO_GOOGLE);
13310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(0, kOnlyLocalPorts);
13330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
13340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ep1_ch1()->set_incoming_only(true);
13350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE_WAIT_MARGIN(ep1_ch1() != NULL && ep2_ch1() != NULL &&
13370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          ep1_ch1()->readable() && ep1_ch1()->writable() &&
13380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          ep2_ch1()->readable() && ep2_ch1()->writable(),
13390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                          1000, 1000);
13400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DestroyChannels();
13420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
13430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
13445aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.orgTEST_F(P2PTransportChannelTest, TestTcpConnectionsFromActiveToPassive) {
13455aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  AddAddress(0, kPublicAddrs[0]);
13465aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  AddAddress(1, kPublicAddrs[1]);
13475aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org
13485aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  SetAllocationStepDelay(0, kMinimumStepDelay);
13495aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  SetAllocationStepDelay(1, kMinimumStepDelay);
13505aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org
13515aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  int kOnlyLocalTcpPorts = cricket::PORTALLOCATOR_DISABLE_UDP |
13525aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org                           cricket::PORTALLOCATOR_DISABLE_STUN |
13535aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org                           cricket::PORTALLOCATOR_DISABLE_RELAY |
13545aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org                           cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG;
13555aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  // Disable all protocols except TCP.
13565aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  SetAllocatorFlags(0, kOnlyLocalTcpPorts);
13575aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  SetAllocatorFlags(1, kOnlyLocalTcpPorts);
13585aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org
13595aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  SetAllowTcpListen(0, true);   // actpass.
13605aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  SetAllowTcpListen(1, false);  // active.
13615aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org
13625aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  CreateChannels(1);
13635aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org
13645aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch1()->readable() && ep1_ch1()->writable() &&
13655aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org                   ep2_ch1()->readable() && ep2_ch1()->writable(),
13665aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org                   1000);
13675aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  EXPECT_TRUE(
13685aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org      ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
13695aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org      LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
13705aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org      RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
13715aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org
13725aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  std::string kTcpProtocol = "tcp";
13735aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  EXPECT_EQ(kTcpProtocol, RemoteCandidate(ep1_ch1())->protocol());
13745aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  EXPECT_EQ(kTcpProtocol, LocalCandidate(ep1_ch1())->protocol());
13755aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  EXPECT_EQ(kTcpProtocol, RemoteCandidate(ep2_ch1())->protocol());
13765aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  EXPECT_EQ(kTcpProtocol, LocalCandidate(ep2_ch1())->protocol());
13775aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org
13785aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  TestSendRecv(1);
13795aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org  DestroyChannels();
13805aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org}
13815aed3bb9fb287faecd773b88bb68732c31579590wu@webrtc.org
1382391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgTEST_F(P2PTransportChannelTest, TestBundleAllocatorToBundleAllocator) {
1383391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(0, kPublicAddrs[0]);
1384391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(1, kPublicAddrs[1]);
1385391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetAllocatorFlags(0, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
1386391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetAllocatorFlags(1, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
1387391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1388391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  CreateChannels(2);
1389391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1390391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch1()->readable() &&
1391391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep1_ch1()->writable() &&
1392391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep2_ch1()->readable() &&
1393391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep2_ch1()->writable(),
1394391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   1000);
1395391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_TRUE(ep1_ch1()->best_connection() &&
1396391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org              ep2_ch1()->best_connection());
1397391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1398391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_FALSE(ep1_ch2()->readable());
1399391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_FALSE(ep1_ch2()->writable());
1400391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_FALSE(ep2_ch2()->readable());
1401391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_FALSE(ep2_ch2()->writable());
1402391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1403391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  TestSendRecv(1);  // Only 1 channel is writable per Endpoint.
1404391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  DestroyChannels();
1405391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org}
1406391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1407391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgTEST_F(P2PTransportChannelTest, TestBundleAllocatorToNonBundleAllocator) {
1408391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(0, kPublicAddrs[0]);
1409391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(1, kPublicAddrs[1]);
1410391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  // Enable BUNDLE flag at one side.
1411391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetAllocatorFlags(0, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
1412391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1413391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  CreateChannels(2);
1414391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1415391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch1()->readable() &&
1416391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep1_ch1()->writable() &&
1417391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep2_ch1()->readable() &&
1418391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep2_ch1()->writable(),
1419391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   1000);
1420391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch2()->readable() &&
1421391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep1_ch2()->writable() &&
1422391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep2_ch2()->readable() &&
1423391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep2_ch2()->writable(),
1424391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   1000);
1425391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1426391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_TRUE(ep1_ch1()->best_connection() &&
1427391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org              ep2_ch1()->best_connection());
1428391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_TRUE(ep1_ch2()->best_connection() &&
1429391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org              ep2_ch2()->best_connection());
1430391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1431391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  TestSendRecv(2);
1432391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  DestroyChannels();
1433391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org}
1434391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1435391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgTEST_F(P2PTransportChannelTest, TestIceRoleConflictWithoutBundle) {
1436391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(0, kPublicAddrs[0]);
1437391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(1, kPublicAddrs[1]);
1438391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  TestSignalRoleConflict();
1439391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org}
1440391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1441391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgTEST_F(P2PTransportChannelTest, TestIceRoleConflictWithBundle) {
1442391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(0, kPublicAddrs[0]);
1443391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(1, kPublicAddrs[1]);
1444391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetAllocatorFlags(0, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
1445391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetAllocatorFlags(1, cricket::PORTALLOCATOR_ENABLE_BUNDLE);
1446391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  TestSignalRoleConflict();
1447391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org}
1448391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1449391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org// Tests that the ice configs (protocol, tiebreaker and role) can be passed
1450391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org// down to ports.
1451391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgTEST_F(P2PTransportChannelTest, TestIceConfigWillPassDownToPort) {
1452391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(0, kPublicAddrs[0]);
1453391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(1, kPublicAddrs[1]);
1454391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1455391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetIceRole(0, cricket::ICEROLE_CONTROLLING);
1456391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetIceProtocol(0, cricket::ICEPROTO_GOOGLE);
1457391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetIceTiebreaker(0, kTiebreaker1);
1458391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetIceRole(1, cricket::ICEROLE_CONTROLLING);
1459391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetIceProtocol(1, cricket::ICEPROTO_RFC5245);
1460391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  SetIceTiebreaker(1, kTiebreaker2);
1461391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1462391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  CreateChannels(1);
1463391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1464391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_EQ_WAIT(2u, ep1_ch1()->ports().size(), 1000);
1465391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1466391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  const std::vector<cricket::PortInterface *> ports_before = ep1_ch1()->ports();
1467391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  for (size_t i = 0; i < ports_before.size(); ++i) {
1468391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org    EXPECT_EQ(cricket::ICEROLE_CONTROLLING, ports_before[i]->GetIceRole());
1469391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org    EXPECT_EQ(cricket::ICEPROTO_GOOGLE, ports_before[i]->IceProtocol());
1470391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org    EXPECT_EQ(kTiebreaker1, ports_before[i]->IceTiebreaker());
1471391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  }
1472391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1473391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  ep1_ch1()->SetIceRole(cricket::ICEROLE_CONTROLLED);
1474391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  ep1_ch1()->SetIceProtocolType(cricket::ICEPROTO_RFC5245);
1475391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  ep1_ch1()->SetIceTiebreaker(kTiebreaker2);
1476391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1477391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  const std::vector<cricket::PortInterface *> ports_after = ep1_ch1()->ports();
1478391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  for (size_t i = 0; i < ports_after.size(); ++i) {
1479391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org    EXPECT_EQ(cricket::ICEROLE_CONTROLLED, ports_before[i]->GetIceRole());
1480391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org    EXPECT_EQ(cricket::ICEPROTO_RFC5245, ports_before[i]->IceProtocol());
1481391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org    // SetIceTiebreaker after Connect() has been called will fail. So expect the
1482391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org    // original value.
1483391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org    EXPECT_EQ(kTiebreaker1, ports_before[i]->IceTiebreaker());
1484391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  }
1485391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1486391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch1()->readable() &&
1487391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep1_ch1()->writable() &&
1488391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep2_ch1()->readable() &&
1489391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   ep2_ch1()->writable(),
1490391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org                   1000);
1491391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1492391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  EXPECT_TRUE(ep1_ch1()->best_connection() &&
1493391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org              ep2_ch1()->best_connection());
1494391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1495391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  TestSendRecv(1);
1496b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  DestroyChannels();
1497b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org}
1498b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
1499b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org// This test verifies channel can handle ice messages when channel is in
1500b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org// hybrid mode.
1501b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.orgTEST_F(P2PTransportChannelTest, TestConnectivityBetweenHybridandIce) {
1502b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  TestHybridConnectivity(cricket::ICEPROTO_RFC5245);
1503b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org}
1504b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org
1505b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org// This test verifies channel can handle Gice messages when channel is in
1506b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org// hybrid mode.
1507b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.orgTEST_F(P2PTransportChannelTest, TestConnectivityBetweenHybridandGice) {
1508b881d27f23e9a8f52dc6a60fc66ebd75f9c2f15cmallinath@webrtc.org  TestHybridConnectivity(cricket::ICEPROTO_GOOGLE);
1509391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org}
1510391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1511391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org// Verify that we can set DSCP value and retrieve properly from P2PTC.
1512391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.orgTEST_F(P2PTransportChannelTest, TestDefaultDscpValue) {
1513391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(0, kPublicAddrs[0]);
1514391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  AddAddress(1, kPublicAddrs[1]);
1515391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org
1516391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  CreateChannels(1);
15172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_NO_CHANGE,
1518391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org            GetEndpoint(0)->cd1_.ch_->DefaultDscpValue());
15192a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_NO_CHANGE,
1520391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org            GetEndpoint(1)->cd1_.ch_->DefaultDscpValue());
1521391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  GetEndpoint(0)->cd1_.ch_->SetOption(
15222a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      rtc::Socket::OPT_DSCP, rtc::DSCP_CS6);
1523391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  GetEndpoint(1)->cd1_.ch_->SetOption(
15242a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      rtc::Socket::OPT_DSCP, rtc::DSCP_CS6);
15252a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_CS6,
1526391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org            GetEndpoint(0)->cd1_.ch_->DefaultDscpValue());
15272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_CS6,
1528391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org            GetEndpoint(1)->cd1_.ch_->DefaultDscpValue());
1529391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  GetEndpoint(0)->cd1_.ch_->SetOption(
15302a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      rtc::Socket::OPT_DSCP, rtc::DSCP_AF41);
1531391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org  GetEndpoint(1)->cd1_.ch_->SetOption(
15322a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org      rtc::Socket::OPT_DSCP, rtc::DSCP_AF41);
15332a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_AF41,
1534391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org            GetEndpoint(0)->cd1_.ch_->DefaultDscpValue());
15352a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  EXPECT_EQ(rtc::DSCP_AF41,
1536391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org            GetEndpoint(1)->cd1_.ch_->DefaultDscpValue());
1537391247d05a663265807c400947ab6eb01ae3d690mallinath@webrtc.org}
1538952740e2dafeb2599d21778eb2e1b8f1c8f2bb07wu@webrtc.org
15395c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org// Verify IPv6 connection is preferred over IPv4.
154095ed1960f457b29b7b2bfba563b3581288b1778fphoglund@webrtc.org// Flaky: https://code.google.com/p/webrtc/issues/detail?id=3317
154195ed1960f457b29b7b2bfba563b3581288b1778fphoglund@webrtc.orgTEST_F(P2PTransportChannelTest, DISABLED_TestIPv6Connections) {
15425c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  AddAddress(0, kIPv6PublicAddrs[0]);
15435c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  AddAddress(0, kPublicAddrs[0]);
15445c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  AddAddress(1, kIPv6PublicAddrs[1]);
15455c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  AddAddress(1, kPublicAddrs[1]);
15465c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
15475c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  SetAllocationStepDelay(0, kMinimumStepDelay);
15485c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  SetAllocationStepDelay(1, kMinimumStepDelay);
15495c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
15505c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  // Enable IPv6
15515c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  SetAllocatorFlags(0, cricket::PORTALLOCATOR_ENABLE_IPV6);
15525c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  SetAllocatorFlags(1, cricket::PORTALLOCATOR_ENABLE_IPV6);
15535c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
15545c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  CreateChannels(1);
15555c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
15565c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch1()->readable() && ep1_ch1()->writable() &&
15575c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org                   ep2_ch1()->readable() && ep2_ch1()->writable(),
15585c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org                   1000);
15595c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  EXPECT_TRUE(
15605c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
15615c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      LocalCandidate(ep1_ch1())->address().EqualIPs(kIPv6PublicAddrs[0]) &&
15625c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org      RemoteCandidate(ep1_ch1())->address().EqualIPs(kIPv6PublicAddrs[1]));
15635c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
15645c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  TestSendRecv(1);
15655c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org  DestroyChannels();
15665c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org}
15675c9dd59107e049112f2e9a62d08a02ef4448a957wu@webrtc.org
1568ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org// Testing forceful TURN connections.
1569ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.orgTEST_F(P2PTransportChannelTest, TestForceTurn) {
1570ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  ConfigureEndpoints(NAT_PORT_RESTRICTED, NAT_SYMMETRIC,
1571ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                     kDefaultPortAllocatorFlags |
1572ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                         cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1573ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                         cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG,
1574ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                     kDefaultPortAllocatorFlags |
1575ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                         cricket::PORTALLOCATOR_ENABLE_SHARED_SOCKET |
1576ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                         cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG,
1577ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                     kDefaultStepDelay, kDefaultStepDelay,
1578ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org                     cricket::ICEPROTO_RFC5245);
1579ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  set_force_relay(true);
1580bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org
1581bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org  SetAllocationStepDelay(0, kMinimumStepDelay);
1582bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org  SetAllocationStepDelay(1, kMinimumStepDelay);
1583bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org
1584bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org  CreateChannels(1);
1585bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org
1586bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch1()->readable() &&
1587bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org                   ep1_ch1()->writable() &&
1588bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org                   ep2_ch1()->readable() &&
1589bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org                   ep2_ch1()->writable(),
1590bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org                   1000);
1591bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org
1592bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org  EXPECT_TRUE(ep1_ch1()->best_connection() &&
1593bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org              ep2_ch1()->best_connection());
1594bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org
1595ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  EXPECT_EQ("relay", RemoteCandidate(ep1_ch1())->type());
1596ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  EXPECT_EQ("relay", LocalCandidate(ep1_ch1())->type());
1597ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  EXPECT_EQ("relay", RemoteCandidate(ep2_ch1())->type());
1598ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org  EXPECT_EQ("relay", LocalCandidate(ep2_ch1())->type());
1599ba4b69f4755d1bfb1a956f390cb3ce2713189cf2buildbot@webrtc.org
1600bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org  TestSendRecv(1);
1601bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org  DestroyChannels();
1602bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org}
1603bf9b1e0e3c606f615851d9f33f4d5222acfc921emallinath@webrtc.org
16040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test what happens when we have 2 users behind the same NAT. This can lead
16050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// to interesting behavior because the STUN server will only give out the
16060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// address of the outermost NAT.
16070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass P2PTransportChannelSameNatTest : public P2PTransportChannelTestBase {
16080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected:
16090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  void ConfigureEndpoints(Config nat_type, Config config1, Config config2) {
16100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT(nat_type >= NAT_FULL_CONE && nat_type <= NAT_SYMMETRIC);
16112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org    rtc::NATSocketServer::Translator* outer_nat =
16120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org        nat()->AddTranslator(kPublicAddrs[0], kNatAddrs[0],
16132a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org            static_cast<rtc::NATType>(nat_type - NAT_FULL_CONE));
16140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoint(outer_nat, 0, config1);
16150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ConfigureEndpoint(outer_nat, 1, config2);
16160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
16172a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  void ConfigureEndpoint(rtc::NATSocketServer::Translator* nat,
16180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                         int endpoint, Config config) {
16190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    ASSERT(config <= NAT_SYMMETRIC);
16200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    if (config == OPEN) {
16210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      AddAddress(endpoint, kPrivateAddrs[endpoint]);
16220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      nat->AddClient(kPrivateAddrs[endpoint]);
16230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    } else {
16240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      AddAddress(endpoint, kCascadedPrivateAddrs[endpoint]);
16250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      nat->AddTranslator(kPrivateAddrs[endpoint], kCascadedNatAddrs[endpoint],
16262a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org          static_cast<rtc::NATType>(config - NAT_FULL_CONE))->AddClient(
16270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org              kCascadedPrivateAddrs[endpoint]);
16280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org    }
16290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  }
16300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
16310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelSameNatTest, TestConesBehindSameCone) {
16330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ConfigureEndpoints(NAT_FULL_CONE, NAT_FULL_CONE, NAT_FULL_CONE);
16340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Test(kLocalUdpToStunUdp);
16350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
16360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test what happens when we have multiple available pathways.
16380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// In the future we will try different RTTs and configs for the different
16390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// interfaces, so that we can simulate a user with Ethernet and VPN networks.
16400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass P2PTransportChannelMultihomedTest : public P2PTransportChannelTestBase {
16410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org};
16420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can establish connectivity when both peers are multihomed.
16447262c0074086d60e77a075d336d2594fa0234b92asapersson@webrtc.orgTEST_F(P2PTransportChannelMultihomedTest, DISABLED_TestBasic) {
16450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AddAddress(0, kPublicAddrs[0]);
16460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AddAddress(0, kAlternateAddrs[0]);
16470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AddAddress(1, kPublicAddrs[1]);
16480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AddAddress(1, kAlternateAddrs[1]);
16490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  Test(kLocalUdpToLocalUdp);
16500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
16510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can quickly switch links if an interface goes down.
16530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelMultihomedTest, TestFailover) {
16540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AddAddress(0, kPublicAddrs[0]);
16558a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  // Adding alternate address will make sure |kPublicAddrs| has the higher
16568a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  // priority than others. This is due to FakeNetwork::AddInterface method.
1657f5b8e7a761959709cf8201685deaf35ed074cb83wu@webrtc.org  AddAddress(1, kAlternateAddrs[1]);
16588a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org  AddAddress(1, kPublicAddrs[1]);
16598a77f5bd83ba9386c19ff92f277c7268c1e9ef4awu@webrtc.org
16600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Use only local ports for simplicity.
16610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(0, kOnlyLocalPorts);
16620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(1, kOnlyLocalPorts);
16630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Create channels and let them go writable, as usual.
16650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
16660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch1()->readable() && ep1_ch1()->writable() &&
16670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   ep2_ch1()->readable() && ep2_ch1()->writable(),
16680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   1000);
16690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(
16700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
16710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
16720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
16730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Blackhole any traffic to or from the public addrs.
16750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  LOG(LS_INFO) << "Failing over...";
16762a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org  fw()->AddRule(false, rtc::FP_ANY, rtc::FD_ANY,
16770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                kPublicAddrs[1]);
16780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We should detect loss of connectivity within 5 seconds or so.
16800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE_WAIT(!ep1_ch1()->writable(), 7000);
16810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We should switch over to use the alternate addr immediately
16830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // when we lose writability.
16840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE_WAIT(
16850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
16860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
16870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]),
16880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      3000);
16890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DestroyChannels();
16910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
16920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
16930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can switch links in a coordinated fashion.
16940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(P2PTransportChannelMultihomedTest, TestDrain) {
16950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AddAddress(0, kPublicAddrs[0]);
16960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AddAddress(1, kPublicAddrs[1]);
16970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Use only local ports for simplicity.
16980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(0, kOnlyLocalPorts);
16990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  SetAllocatorFlags(1, kOnlyLocalPorts);
17000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Create channels and let them go writable, as usual.
17020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  CreateChannels(1);
17030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE_WAIT(ep1_ch1()->readable() && ep1_ch1()->writable() &&
17040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   ep2_ch1()->readable() && ep2_ch1()->writable(),
17050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org                   1000);
17060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE(
17070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
17080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
17090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      RemoteCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[1]));
17100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // Remove the public interface, add the alternate interface, and allocate
17120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // a new generation of candidates for the new interface (via Connect()).
17130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  LOG(LS_INFO) << "Draining...";
17140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  AddAddress(1, kAlternateAddrs[1]);
17150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  RemoveAddress(1, kPublicAddrs[1]);
17160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  ep2_ch1()->Connect();
17170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // We should switch over to use the alternate address after
17190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  // an exchange of pings.
17200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  EXPECT_TRUE_WAIT(
17210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      ep1_ch1()->best_connection() && ep2_ch1()->best_connection() &&
17220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      LocalCandidate(ep1_ch1())->address().EqualIPs(kPublicAddrs[0]) &&
17230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      RemoteCandidate(ep1_ch1())->address().EqualIPs(kAlternateAddrs[1]),
17240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org      3000);
17250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org
17260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org  DestroyChannels();
17270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}
1728