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: 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) ServerThread(QuicServer* server, 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) IPEndPoint address, 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) bool strike_register_no_startup_period); 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) virtual ~ServerThread(); 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Prepares the server, but does not start accepting connections. Useful for 275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // injecting mocks. 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Initialize(); 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Runs the event loop. Will initialize if necessary. 315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void Run() OVERRIDE; 32f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 33f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Waits for the handshake to be confirmed for the first session created. 34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void WaitForCryptoHandshakeConfirmed(); 35f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Pauses execution of the server until Resume() is called. May only be 37f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // called once. 38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Pause(); 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 40f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Resumes execution of the server after Pause() has been called. May only 41f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // be called once. 42f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Resume(); 43f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Stops the server from executing and shuts it down, destroying all 45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // server objects. 46f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Quit(); 47f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns the underlying server. Care must be taken to avoid data races 49f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // when accessing the server. It is always safe to access the server 50f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // after calling Pause() and before calling Resume(). 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) QuicServer* server() { return server_.get(); } 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns the port that the server is listening on. 54f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) int GetPort(); 55f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 5668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) private: 57f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void MaybeNotifyOfHandshakeConfirmation(); 58f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 59f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent confirmed_; // Notified when the first handshake is 60f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // confirmed. 61f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent pause_; // Notified when the server should pause. 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent paused_; // Notitied when the server has paused 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent resume_; // Notified when the server should resume. 64f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::WaitableEvent quit_; // Notified when the server should quit. 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 66f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) scoped_ptr<QuicServer> server_; 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) IPEndPoint address_; 68f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) base::Lock port_lock_; 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int port_; 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool initialized_; 725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ServerThread); 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)}; 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace test 7768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace tools 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace net 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#endif // NET_TOOLS_QUIC_SERVER_THREAD_H_ 81