1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_TEST_CHROMEDRIVER_NET_TEST_HTTP_SERVER_H_
6#define CHROME_TEST_CHROMEDRIVER_NET_TEST_HTTP_SERVER_H_
7
8#include <set>
9
10#include "base/basictypes.h"
11#include "base/compiler_specific.h"
12#include "base/memory/ref_counted.h"
13#include "base/synchronization/lock.h"
14#include "base/synchronization/waitable_event.h"
15#include "base/threading/thread.h"
16#include "net/server/http_server.h"
17#include "url/gurl.h"
18
19namespace base {
20class WaitableEvent;
21}
22
23// HTTP server for web socket testing purposes that runs on its own thread.
24// All public methods are thread safe and may be called on any thread, unless
25// noted otherwise.
26class TestHttpServer : public net::HttpServer::Delegate {
27 public:
28  enum WebSocketRequestAction {
29    kAccept,
30    kNotFound,
31    kClose,
32  };
33
34  enum WebSocketMessageAction {
35    kEchoMessage,
36    kCloseOnMessage
37  };
38
39  // Creates an http server. By default it accepts WebSockets and echoes
40  // WebSocket messages back.
41  TestHttpServer();
42  virtual ~TestHttpServer();
43
44  // Starts the server. Returns whether it was started successfully.
45  bool Start();
46
47  // Stops the server. May be called multiple times.
48  void Stop();
49
50  // Waits until all open connections are closed. Returns true if all
51  // connections are closed, or false if a timeout is exceeded.
52  bool WaitForConnectionsToClose();
53
54  // Sets the action to perform when receiving a WebSocket connect request.
55  void SetRequestAction(WebSocketRequestAction action);
56
57  // Sets the action to perform when receiving a WebSocket message.
58  void SetMessageAction(WebSocketMessageAction action);
59
60  // Returns the web socket URL that points to the server.
61  GURL web_socket_url() const;
62
63  // Overridden from net::HttpServer::Delegate:
64  virtual void OnHttpRequest(int connection_id,
65                             const net::HttpServerRequestInfo& info) OVERRIDE {}
66  virtual void OnWebSocketRequest(
67      int connection_id,
68      const net::HttpServerRequestInfo& info) OVERRIDE;
69  virtual void OnWebSocketMessage(int connection_id,
70                                  const std::string& data) OVERRIDE;
71  virtual void OnClose(int connection_id) OVERRIDE;
72
73 private:
74  void StartOnServerThread(bool* success, base::WaitableEvent* event);
75  void StopOnServerThread(base::WaitableEvent* event);
76
77  base::Thread thread_;
78
79  // Access only on the server thread.
80  scoped_refptr<net::HttpServer> server_;
81
82  // Access only on the server thread.
83  std::set<int> connections_;
84
85  base::WaitableEvent all_closed_event_;
86
87  // Protects |web_socket_url_|.
88  mutable base::Lock url_lock_;
89  GURL web_socket_url_;
90
91  // Protects the action flags.
92  base::Lock action_lock_;
93  WebSocketRequestAction request_action_;
94  WebSocketMessageAction message_action_;
95
96  DISALLOW_COPY_AND_ASSIGN(TestHttpServer);
97};
98
99#endif  // CHROME_TEST_CHROMEDRIVER_NET_TEST_HTTP_SERVER_H_
100