1 /*
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_TESTSTUNSERVER_H_
12 #define WEBRTC_P2P_BASE_TESTSTUNSERVER_H_
13 
14 #include "webrtc/p2p/base/stunserver.h"
15 #include "webrtc/base/socketaddress.h"
16 #include "webrtc/base/thread.h"
17 
18 namespace cricket {
19 
20 // A test STUN server. Useful for unit tests.
21 class TestStunServer : StunServer {
22  public:
Create(rtc::Thread * thread,const rtc::SocketAddress & addr)23   static TestStunServer* Create(rtc::Thread* thread,
24                                 const rtc::SocketAddress& addr) {
25     rtc::AsyncSocket* socket =
26         thread->socketserver()->CreateAsyncSocket(addr.family(), SOCK_DGRAM);
27     rtc::AsyncUDPSocket* udp_socket =
28         rtc::AsyncUDPSocket::Create(socket, addr);
29 
30     return new TestStunServer(udp_socket);
31   }
32 
33   // Set a fake STUN address to return to the client.
set_fake_stun_addr(const rtc::SocketAddress & addr)34   void set_fake_stun_addr(const rtc::SocketAddress& addr) {
35     fake_stun_addr_ = addr;
36   }
37 
38  private:
TestStunServer(rtc::AsyncUDPSocket * socket)39   explicit TestStunServer(rtc::AsyncUDPSocket* socket) : StunServer(socket) {}
40 
OnBindingRequest(StunMessage * msg,const rtc::SocketAddress & remote_addr)41   void OnBindingRequest(StunMessage* msg,
42                         const rtc::SocketAddress& remote_addr) override {
43     if (fake_stun_addr_.IsNil()) {
44       StunServer::OnBindingRequest(msg, remote_addr);
45     } else {
46       StunMessage response;
47       GetStunBindReqponse(msg, fake_stun_addr_, &response);
48       SendResponse(response, remote_addr);
49     }
50   }
51 
52  private:
53   rtc::SocketAddress fake_stun_addr_;
54 };
55 
56 }  // namespace cricket
57 
58 #endif  // WEBRTC_P2P_BASE_TESTSTUNSERVER_H_
59