server_thread.h revision 5d1f7b1de12d16ceb2c938c56701a3e8bfa558f7
168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#ifndef NET_TOOLS_QUIC_SERVER_THREAD_H_ 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#define NET_TOOLS_QUIC_SERVER_THREAD_H_ 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/threading/simple_thread.h" 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/base/ip_endpoint.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/quic/quic_config.h" 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "net/tools/quic/quic_server.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace net { 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace tools { 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace test { 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 1768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Simple wrapper class to run server in a thread. 1868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)class ServerThread : public base::SimpleThread { 1968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) public: 2068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ServerThread(IPEndPoint address, 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const QuicConfig& config, 221e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const QuicVersionVector& supported_versions, 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool strike_register_no_startup_period); 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~ServerThread(); 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Prepares the server, but does not start accepting connections. Useful for 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // injecting mocks. 295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Initialize(); 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Runs the event loop. Will initialize if necessary. 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Run() OVERRIDE; 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Waits for the handshake to be confirmed for the first session created. 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void WaitForCryptoHandshakeConfirmed(); 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Pauses execution of the server until Resume() is called. May only be 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // called once. 39f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Pause(); 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Resumes execution of the server after Pause() has been called. May only 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // be called once. 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Resume(); 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Stops the server from executing and shuts it down, destroying all 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // server objects. 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Quit(); 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns the underlying server. Care must be taken to avoid data races 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // when accessing the server. It is always safe to access the server 51f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // after calling Pause() and before calling Resume(). 521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) QuicServer* server() { return &server_; } 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns the port that the server is listening on. 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int GetPort(); 56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void MaybeNotifyOfHandshakeConfirmation(); 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent confirmed_; // Notified when the first handshake is 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // confirmed. 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent pause_; // Notified when the server should pause. 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent paused_; // Notitied when the server has paused 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent resume_; // Notified when the server should resume. 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent quit_; // Notified when the server should quit. 66f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) tools::QuicServer server_; 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IPEndPoint address_; 69f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Lock port_lock_; 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int port_; 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool initialized_; 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ServerThread); 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace test 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace tools 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace net 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // NET_TOOLS_QUIC_SERVER_THREAD_H_ 82