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