blob: ba64008e5457288b0cec7aaee7244c7aa4952bc7 [file] [log] [blame]
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +00001/*
2 * Copyright 2008 The WebRTC Project Authors. All rights reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
11#ifndef WEBRTC_P2P_BASE_TESTRELAYSERVER_H_
12#define WEBRTC_P2P_BASE_TESTRELAYSERVER_H_
13
kwiberg3ec46792016-04-27 07:22:53 -070014#include <memory>
15
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000016#include "webrtc/p2p/base/relayserver.h"
17#include "webrtc/base/asynctcpsocket.h"
18#include "webrtc/base/scoped_ptr.h"
19#include "webrtc/base/sigslot.h"
20#include "webrtc/base/socketadapters.h"
21#include "webrtc/base/thread.h"
22
23namespace cricket {
24
25// A test relay server. Useful for unit tests.
26class TestRelayServer : public sigslot::has_slots<> {
27 public:
28 TestRelayServer(rtc::Thread* thread,
29 const rtc::SocketAddress& udp_int_addr,
30 const rtc::SocketAddress& udp_ext_addr,
31 const rtc::SocketAddress& tcp_int_addr,
32 const rtc::SocketAddress& tcp_ext_addr,
33 const rtc::SocketAddress& ssl_int_addr,
34 const rtc::SocketAddress& ssl_ext_addr)
35 : server_(thread) {
36 server_.AddInternalSocket(rtc::AsyncUDPSocket::Create(
37 thread->socketserver(), udp_int_addr));
38 server_.AddExternalSocket(rtc::AsyncUDPSocket::Create(
39 thread->socketserver(), udp_ext_addr));
40
41 tcp_int_socket_.reset(CreateListenSocket(thread, tcp_int_addr));
42 tcp_ext_socket_.reset(CreateListenSocket(thread, tcp_ext_addr));
43 ssl_int_socket_.reset(CreateListenSocket(thread, ssl_int_addr));
44 ssl_ext_socket_.reset(CreateListenSocket(thread, ssl_ext_addr));
45 }
46 int GetConnectionCount() const {
47 return server_.GetConnectionCount();
48 }
49 rtc::SocketAddressPair GetConnection(int connection) const {
50 return server_.GetConnection(connection);
51 }
52 bool HasConnection(const rtc::SocketAddress& address) const {
53 return server_.HasConnection(address);
54 }
55
56 private:
57 rtc::AsyncSocket* CreateListenSocket(rtc::Thread* thread,
58 const rtc::SocketAddress& addr) {
59 rtc::AsyncSocket* socket =
60 thread->socketserver()->CreateAsyncSocket(addr.family(), SOCK_STREAM);
61 socket->Bind(addr);
62 socket->Listen(5);
63 socket->SignalReadEvent.connect(this, &TestRelayServer::OnAccept);
64 return socket;
65 }
66 void OnAccept(rtc::AsyncSocket* socket) {
67 bool external = (socket == tcp_ext_socket_.get() ||
68 socket == ssl_ext_socket_.get());
69 bool ssl = (socket == ssl_int_socket_.get() ||
70 socket == ssl_ext_socket_.get());
71 rtc::AsyncSocket* raw_socket = socket->Accept(NULL);
72 if (raw_socket) {
73 rtc::AsyncTCPSocket* packet_socket = new rtc::AsyncTCPSocket(
74 (!ssl) ? raw_socket :
75 new rtc::AsyncSSLServerSocket(raw_socket), false);
76 if (!external) {
77 packet_socket->SignalClose.connect(this,
78 &TestRelayServer::OnInternalClose);
79 server_.AddInternalSocket(packet_socket);
80 } else {
81 packet_socket->SignalClose.connect(this,
82 &TestRelayServer::OnExternalClose);
83 server_.AddExternalSocket(packet_socket);
84 }
85 }
86 }
87 void OnInternalClose(rtc::AsyncPacketSocket* socket, int error) {
88 server_.RemoveInternalSocket(socket);
89 }
90 void OnExternalClose(rtc::AsyncPacketSocket* socket, int error) {
91 server_.RemoveExternalSocket(socket);
92 }
93 private:
94 cricket::RelayServer server_;
kwiberg3ec46792016-04-27 07:22:53 -070095 std::unique_ptr<rtc::AsyncSocket> tcp_int_socket_;
96 std::unique_ptr<rtc::AsyncSocket> tcp_ext_socket_;
97 std::unique_ptr<rtc::AsyncSocket> ssl_int_socket_;
98 std::unique_ptr<rtc::AsyncSocket> ssl_ext_socket_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11 +000099};
100
101} // namespace cricket
102
103#endif // WEBRTC_P2P_BASE_TESTRELAYSERVER_H_