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 19 namespace base { 20 class 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. 26 class 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