1269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org/*
2269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  Copyright 2008 The WebRTC Project Authors. All rights reserved.
3269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *
4269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
5269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
6269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
7269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
8269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org */
10269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
11269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#ifndef WEBRTC_P2P_BASE_TESTSTUNSERVER_H_
12269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#define WEBRTC_P2P_BASE_TESTSTUNSERVER_H_
13269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
14269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/p2p/base/stunserver.h"
15269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/socketaddress.h"
16269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#include "webrtc/base/thread.h"
17269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
18269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgnamespace cricket {
19269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
20269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org// A test STUN server. Useful for unit tests.
21269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.orgclass TestStunServer : StunServer {
22269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org public:
23269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  static TestStunServer* Create(rtc::Thread* thread,
24269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org                                const rtc::SocketAddress& addr) {
25269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    rtc::AsyncSocket* socket =
26269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org        thread->socketserver()->CreateAsyncSocket(addr.family(), SOCK_DGRAM);
27269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    rtc::AsyncUDPSocket* udp_socket =
28269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org        rtc::AsyncUDPSocket::Create(socket, addr);
29269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
30269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    return new TestStunServer(udp_socket);
31269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  }
32269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
33269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  // Set a fake STUN address to return to the client.
34269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void set_fake_stun_addr(const rtc::SocketAddress& addr) {
35269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    fake_stun_addr_ = addr;
36269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  }
37269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
38269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private:
39269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  explicit TestStunServer(rtc::AsyncUDPSocket* socket) : StunServer(socket) {}
40269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
41269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  void OnBindingRequest(StunMessage* msg,
4214665ff7d4024d07e58622f498b23fd980001871kjellander@webrtc.org                        const rtc::SocketAddress& remote_addr) override {
43269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    if (fake_stun_addr_.IsNil()) {
44269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      StunServer::OnBindingRequest(msg, remote_addr);
45269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    } else {
46269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      StunMessage response;
47269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      GetStunBindReqponse(msg, fake_stun_addr_, &response);
48269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org      SendResponse(response, remote_addr);
49269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org    }
50269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  }
51269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
52269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org private:
53269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org  rtc::SocketAddress fake_stun_addr_;
54269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org};
55269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
56269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org}  // namespace cricket
57269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org
58269fb4bc90b79bebbb8311da0110ccd6803fd0a8henrike@webrtc.org#endif  // WEBRTC_P2P_BASE_TESTSTUNSERVER_H_
59