| Index: webrtc/p2p/client/connectivitychecker_unittest.cc
|
| diff --git a/webrtc/p2p/client/connectivitychecker_unittest.cc b/webrtc/p2p/client/connectivitychecker_unittest.cc
|
| deleted file mode 100644
|
| index d590a7206fb0c0eb5544237c15d94921844e33f5..0000000000000000000000000000000000000000
|
| --- a/webrtc/p2p/client/connectivitychecker_unittest.cc
|
| +++ /dev/null
|
| @@ -1,367 +0,0 @@
|
| -/*
|
| - * Copyright 2011 The WebRTC Project Authors. All rights reserved.
|
| - *
|
| - * Use of this source code is governed by a BSD-style license
|
| - * that can be found in the LICENSE file in the root of the source
|
| - * tree. An additional intellectual property rights grant can be found
|
| - * in the file PATENTS. All contributing project authors may
|
| - * be found in the AUTHORS file in the root of the source tree.
|
| - */
|
| -
|
| -#include <string>
|
| -
|
| -#include "webrtc/p2p/base/basicpacketsocketfactory.h"
|
| -#include "webrtc/p2p/base/relayport.h"
|
| -#include "webrtc/p2p/base/stunport.h"
|
| -#include "webrtc/p2p/client/connectivitychecker.h"
|
| -#include "webrtc/p2p/client/httpportallocator.h"
|
| -#include "webrtc/base/asynchttprequest.h"
|
| -#include "webrtc/base/fakenetwork.h"
|
| -#include "webrtc/base/gunit.h"
|
| -#include "webrtc/base/scoped_ptr.h"
|
| -#include "webrtc/base/socketaddress.h"
|
| -
|
| -namespace cricket {
|
| -
|
| -static const rtc::SocketAddress kClientAddr1("11.11.11.11", 0);
|
| -static const rtc::SocketAddress kClientAddr2("22.22.22.22", 0);
|
| -static const rtc::SocketAddress kExternalAddr("33.33.33.33", 3333);
|
| -static const rtc::SocketAddress kStunAddr("44.44.44.44", 4444);
|
| -static const rtc::SocketAddress kRelayAddr("55.55.55.55", 5555);
|
| -static const rtc::SocketAddress kProxyAddr("66.66.66.66", 6666);
|
| -static const rtc::ProxyType kProxyType = rtc::PROXY_HTTPS;
|
| -static const char kRelayHost[] = "relay.google.com";
|
| -static const char kRelayToken[] =
|
| - "CAESFwoOb2phQGdvb2dsZS5jb20Q043h47MmGhBTB1rbfIXkhuarDCZe+xF6";
|
| -static const char kBrowserAgent[] = "browser_test";
|
| -static const char kJid[] = "a.b@c";
|
| -static const char kUserName[] = "testuser";
|
| -static const char kPassword[] = "testpassword";
|
| -static const char kMagicCookie[] = "testcookie";
|
| -static const char kRelayUdpPort[] = "4444";
|
| -static const char kRelayTcpPort[] = "5555";
|
| -static const char kRelaySsltcpPort[] = "6666";
|
| -static const char kSessionId[] = "testsession";
|
| -static const char kConnection[] = "testconnection";
|
| -static const int kMinPort = 1000;
|
| -static const int kMaxPort = 2000;
|
| -
|
| -// Fake implementation to mock away real network usage.
|
| -class FakeRelayPort : public RelayPort {
|
| - public:
|
| - FakeRelayPort(rtc::Thread* thread,
|
| - rtc::PacketSocketFactory* factory,
|
| - rtc::Network* network, const rtc::IPAddress& ip,
|
| - int min_port, int max_port,
|
| - const std::string& username, const std::string& password)
|
| - : RelayPort(thread, factory, network, ip, min_port, max_port,
|
| - username, password) {
|
| - }
|
| -
|
| - // Just signal that we are done.
|
| - virtual void PrepareAddress() {
|
| - SignalPortComplete(this);
|
| - }
|
| -};
|
| -
|
| -// Fake implementation to mock away real network usage.
|
| -class FakeStunPort : public StunPort {
|
| - public:
|
| - FakeStunPort(rtc::Thread* thread,
|
| - rtc::PacketSocketFactory* factory,
|
| - rtc::Network* network,
|
| - const rtc::IPAddress& ip,
|
| - int min_port, int max_port,
|
| - const std::string& username, const std::string& password,
|
| - const ServerAddresses& server_addr)
|
| - : StunPort(thread, factory, network, ip, min_port, max_port,
|
| - username, password, server_addr, std::string()) {
|
| - }
|
| -
|
| - // Just set external address and signal that we are done.
|
| - virtual void PrepareAddress() {
|
| - AddAddress(kExternalAddr, kExternalAddr, rtc::SocketAddress(), "udp", "",
|
| - "", STUN_PORT_TYPE, ICE_TYPE_PREFERENCE_SRFLX, 0, true);
|
| - SignalPortComplete(this);
|
| - }
|
| -};
|
| -
|
| -// Fake implementation to mock away real network usage by responding
|
| -// to http requests immediately.
|
| -class FakeHttpPortAllocatorSession : public TestHttpPortAllocatorSession {
|
| - public:
|
| - FakeHttpPortAllocatorSession(
|
| - HttpPortAllocator* allocator,
|
| - const std::string& content_name,
|
| - int component,
|
| - const std::string& ice_ufrag, const std::string& ice_pwd,
|
| - const std::vector<rtc::SocketAddress>& stun_hosts,
|
| - const std::vector<std::string>& relay_hosts,
|
| - const std::string& relay_token,
|
| - const std::string& agent)
|
| - : TestHttpPortAllocatorSession(allocator,
|
| - content_name,
|
| - component,
|
| - ice_ufrag,
|
| - ice_pwd,
|
| - stun_hosts,
|
| - relay_hosts,
|
| - relay_token,
|
| - agent) {
|
| - }
|
| - virtual void SendSessionRequest(const std::string& host, int port) {
|
| - FakeReceiveSessionResponse(host, port);
|
| - }
|
| -
|
| - // Pass results to the real implementation.
|
| - void FakeReceiveSessionResponse(const std::string& host, int port) {
|
| - rtc::AsyncHttpRequest* response = CreateAsyncHttpResponse(port);
|
| - TestHttpPortAllocatorSession::OnRequestDone(response);
|
| - response->Destroy(true);
|
| - }
|
| -
|
| - private:
|
| - // Helper method for creating a response to a relay session request.
|
| - rtc::AsyncHttpRequest* CreateAsyncHttpResponse(int port) {
|
| - rtc::AsyncHttpRequest* request =
|
| - new rtc::AsyncHttpRequest(kBrowserAgent);
|
| - std::stringstream ss;
|
| - ss << "username=" << kUserName << std::endl
|
| - << "password=" << kPassword << std::endl
|
| - << "magic_cookie=" << kMagicCookie << std::endl
|
| - << "relay.ip=" << kRelayAddr.ipaddr().ToString() << std::endl
|
| - << "relay.udp_port=" << kRelayUdpPort << std::endl
|
| - << "relay.tcp_port=" << kRelayTcpPort << std::endl
|
| - << "relay.ssltcp_port=" << kRelaySsltcpPort << std::endl;
|
| - request->response().document.reset(
|
| - new rtc::MemoryStream(ss.str().c_str()));
|
| - request->response().set_success();
|
| - request->set_port(port);
|
| - request->set_secure(port == rtc::HTTP_SECURE_PORT);
|
| - return request;
|
| - }
|
| -};
|
| -
|
| -// Fake implementation for creating fake http sessions.
|
| -class FakeHttpPortAllocator : public HttpPortAllocator {
|
| - public:
|
| - FakeHttpPortAllocator(rtc::NetworkManager* network_manager,
|
| - const std::string& user_agent)
|
| - : HttpPortAllocator(network_manager, user_agent) {
|
| - }
|
| -
|
| - virtual PortAllocatorSession* CreateSessionInternal(
|
| - const std::string& content_name, int component,
|
| - const std::string& ice_ufrag, const std::string& ice_pwd) {
|
| - std::vector<rtc::SocketAddress> stun_hosts;
|
| - stun_hosts.push_back(kStunAddr);
|
| - std::vector<std::string> relay_hosts;
|
| - relay_hosts.push_back(kRelayHost);
|
| - return new FakeHttpPortAllocatorSession(this,
|
| - content_name,
|
| - component,
|
| - ice_ufrag,
|
| - ice_pwd,
|
| - stun_hosts,
|
| - relay_hosts,
|
| - kRelayToken,
|
| - kBrowserAgent);
|
| - }
|
| -};
|
| -
|
| -class ConnectivityCheckerForTest : public ConnectivityChecker {
|
| - public:
|
| - ConnectivityCheckerForTest(rtc::Thread* worker,
|
| - const std::string& jid,
|
| - const std::string& session_id,
|
| - const std::string& user_agent,
|
| - const std::string& relay_token,
|
| - const std::string& connection)
|
| - : ConnectivityChecker(worker,
|
| - jid,
|
| - session_id,
|
| - user_agent,
|
| - relay_token,
|
| - connection),
|
| - proxy_initiated_(false) {
|
| - }
|
| -
|
| - rtc::FakeNetworkManager* network_manager() const {
|
| - return network_manager_;
|
| - }
|
| -
|
| - FakeHttpPortAllocator* port_allocator() const {
|
| - return fake_port_allocator_;
|
| - }
|
| -
|
| - protected:
|
| - // Overridden methods for faking a real network.
|
| - virtual rtc::NetworkManager* CreateNetworkManager() {
|
| - network_manager_ = new rtc::FakeNetworkManager();
|
| - return network_manager_;
|
| - }
|
| - virtual rtc::BasicPacketSocketFactory* CreateSocketFactory(
|
| - rtc::Thread* thread) {
|
| - // Create socket factory, for simplicity, let it run on the current thread.
|
| - socket_factory_ =
|
| - new rtc::BasicPacketSocketFactory(rtc::Thread::Current());
|
| - return socket_factory_;
|
| - }
|
| - virtual HttpPortAllocator* CreatePortAllocator(
|
| - rtc::NetworkManager* network_manager,
|
| - const std::string& user_agent,
|
| - const std::string& relay_token) {
|
| - fake_port_allocator_ =
|
| - new FakeHttpPortAllocator(network_manager, user_agent);
|
| - return fake_port_allocator_;
|
| - }
|
| - virtual StunPort* CreateStunPort(
|
| - const std::string& username, const std::string& password,
|
| - const PortConfiguration* config, rtc::Network* network) {
|
| - return new FakeStunPort(worker(),
|
| - socket_factory_,
|
| - network,
|
| - network->GetBestIP(),
|
| - kMinPort,
|
| - kMaxPort,
|
| - username,
|
| - password,
|
| - config->stun_servers);
|
| - }
|
| - virtual RelayPort* CreateRelayPort(
|
| - const std::string& username, const std::string& password,
|
| - const PortConfiguration* config, rtc::Network* network) {
|
| - return new FakeRelayPort(worker(),
|
| - socket_factory_,
|
| - network,
|
| - network->GetBestIP(),
|
| - kMinPort,
|
| - kMaxPort,
|
| - username,
|
| - password);
|
| - }
|
| - virtual void InitiateProxyDetection() {
|
| - if (!proxy_initiated_) {
|
| - proxy_initiated_ = true;
|
| - proxy_info_.address = kProxyAddr;
|
| - proxy_info_.type = kProxyType;
|
| - SetProxyInfo(proxy_info_);
|
| - }
|
| - }
|
| -
|
| - virtual rtc::ProxyInfo GetProxyInfo() const {
|
| - return proxy_info_;
|
| - }
|
| -
|
| - private:
|
| - rtc::BasicPacketSocketFactory* socket_factory_;
|
| - FakeHttpPortAllocator* fake_port_allocator_;
|
| - rtc::FakeNetworkManager* network_manager_;
|
| - rtc::ProxyInfo proxy_info_;
|
| - bool proxy_initiated_;
|
| -};
|
| -
|
| -class ConnectivityCheckerTest : public testing::Test {
|
| - protected:
|
| - void VerifyNic(const NicInfo& info,
|
| - const rtc::SocketAddress& local_address) {
|
| - // Verify that the external address has been set.
|
| - EXPECT_EQ(kExternalAddr, info.external_address);
|
| -
|
| - // Verify that the stun server address has been set.
|
| - EXPECT_EQ(1U, info.stun_server_addresses.size());
|
| - EXPECT_EQ(kStunAddr, *(info.stun_server_addresses.begin()));
|
| -
|
| - // Verify that the media server address has been set. Don't care
|
| - // about port since it is different for different protocols.
|
| - EXPECT_EQ(kRelayAddr.ipaddr(), info.media_server_address.ipaddr());
|
| -
|
| - // Verify that local ip matches.
|
| - EXPECT_EQ(local_address.ipaddr(), info.ip);
|
| -
|
| - // Verify that we have received responses for our
|
| - // pings. Unsuccessful ping has rtt value -1, successful >= 0.
|
| - EXPECT_GE(info.stun.rtt, 0);
|
| - EXPECT_GE(info.udp.rtt, 0);
|
| - EXPECT_GE(info.tcp.rtt, 0);
|
| - EXPECT_GE(info.ssltcp.rtt, 0);
|
| -
|
| - // If proxy has been set, verify address and type.
|
| - if (!info.proxy_info.address.IsNil()) {
|
| - EXPECT_EQ(kProxyAddr, info.proxy_info.address);
|
| - EXPECT_EQ(kProxyType, info.proxy_info.type);
|
| - }
|
| - }
|
| -};
|
| -
|
| -// Tests a configuration with two network interfaces. Verifies that 4
|
| -// combinations of ip/proxy are created and that all protocols are
|
| -// tested on each combination.
|
| -TEST_F(ConnectivityCheckerTest, TestStart) {
|
| - ConnectivityCheckerForTest connectivity_checker(rtc::Thread::Current(),
|
| - kJid,
|
| - kSessionId,
|
| - kBrowserAgent,
|
| - kRelayToken,
|
| - kConnection);
|
| - connectivity_checker.Initialize();
|
| - connectivity_checker.set_stun_address(kStunAddr);
|
| - connectivity_checker.network_manager()->AddInterface(kClientAddr1);
|
| - connectivity_checker.network_manager()->AddInterface(kClientAddr2);
|
| -
|
| - connectivity_checker.Start();
|
| - rtc::Thread::Current()->ProcessMessages(1000);
|
| -
|
| - NicMap nics = connectivity_checker.GetResults();
|
| -
|
| - // There should be 4 nics in our map. 2 for each interface added,
|
| - // one with proxy set and one without.
|
| - EXPECT_EQ(4U, nics.size());
|
| -
|
| - // First verify interfaces without proxy.
|
| - rtc::SocketAddress nilAddress;
|
| -
|
| - // First lookup the address of the first nic combined with no proxy.
|
| - NicMap::iterator i = nics.find(NicId(kClientAddr1.ipaddr(), nilAddress));
|
| - ASSERT(i != nics.end());
|
| - NicInfo info = i->second;
|
| - VerifyNic(info, kClientAddr1);
|
| -
|
| - // Then make sure the second device has been tested without proxy.
|
| - i = nics.find(NicId(kClientAddr2.ipaddr(), nilAddress));
|
| - ASSERT(i != nics.end());
|
| - info = i->second;
|
| - VerifyNic(info, kClientAddr2);
|
| -
|
| - // Now verify both interfaces with proxy.
|
| - i = nics.find(NicId(kClientAddr1.ipaddr(), kProxyAddr));
|
| - ASSERT(i != nics.end());
|
| - info = i->second;
|
| - VerifyNic(info, kClientAddr1);
|
| -
|
| - i = nics.find(NicId(kClientAddr2.ipaddr(), kProxyAddr));
|
| - ASSERT(i != nics.end());
|
| - info = i->second;
|
| - VerifyNic(info, kClientAddr2);
|
| -};
|
| -
|
| -// Tests that nothing bad happens if thera are no network interfaces
|
| -// available to check.
|
| -TEST_F(ConnectivityCheckerTest, TestStartNoNetwork) {
|
| - ConnectivityCheckerForTest connectivity_checker(rtc::Thread::Current(),
|
| - kJid,
|
| - kSessionId,
|
| - kBrowserAgent,
|
| - kRelayToken,
|
| - kConnection);
|
| - connectivity_checker.Initialize();
|
| - connectivity_checker.Start();
|
| - rtc::Thread::Current()->ProcessMessages(1000);
|
| -
|
| - NicMap nics = connectivity_checker.GetResults();
|
| -
|
| - // Verify that no nics where checked.
|
| - EXPECT_EQ(0U, nics.size());
|
| -}
|
| -
|
| -} // namespace cricket
|
|
|