OLD | NEW |
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/test/chromedriver/net/test_http_server.h" | 5 #include "chrome/test/chromedriver/net/test_http_server.h" |
6 | 6 |
7 #include "base/bind.h" | 7 #include "base/bind.h" |
8 #include "base/location.h" | 8 #include "base/location.h" |
9 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
10 #include "base/message_loop/message_loop_proxy.h" | 10 #include "base/message_loop/message_loop_proxy.h" |
11 #include "base/strings/stringprintf.h" | 11 #include "base/strings/stringprintf.h" |
12 #include "base/time/time.h" | 12 #include "base/time/time.h" |
13 #include "net/base/ip_endpoint.h" | 13 #include "net/base/ip_endpoint.h" |
14 #include "net/base/net_errors.h" | 14 #include "net/base/net_errors.h" |
15 #include "net/server/http_server_request_info.h" | 15 #include "net/server/http_server_request_info.h" |
16 #include "net/socket/tcp_server_socket.h" | 16 #include "net/socket/tcp_listen_socket.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
18 | 18 |
19 TestHttpServer::TestHttpServer() | 19 TestHttpServer::TestHttpServer() |
20 : thread_("ServerThread"), | 20 : thread_("ServerThread"), |
21 all_closed_event_(false, true), | 21 all_closed_event_(false, true), |
22 request_action_(kAccept), | 22 request_action_(kAccept), |
23 message_action_(kEchoMessage) { | 23 message_action_(kEchoMessage) { |
24 } | 24 } |
25 | 25 |
26 TestHttpServer::~TestHttpServer() { | 26 TestHttpServer::~TestHttpServer() { |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 all_closed_event_.Reset(); | 85 all_closed_event_.Reset(); |
86 | 86 |
87 switch (action) { | 87 switch (action) { |
88 case kAccept: | 88 case kAccept: |
89 server_->AcceptWebSocket(connection_id, info); | 89 server_->AcceptWebSocket(connection_id, info); |
90 break; | 90 break; |
91 case kNotFound: | 91 case kNotFound: |
92 server_->Send404(connection_id); | 92 server_->Send404(connection_id); |
93 break; | 93 break; |
94 case kClose: | 94 case kClose: |
95 server_->Close(connection_id); | 95 // net::HttpServer doesn't allow us to close connection during callback. |
| 96 base::MessageLoop::current()->PostTask( |
| 97 FROM_HERE, |
| 98 base::Bind(&net::HttpServer::Close, server_, connection_id)); |
96 break; | 99 break; |
97 } | 100 } |
98 } | 101 } |
99 | 102 |
100 void TestHttpServer::OnWebSocketMessage(int connection_id, | 103 void TestHttpServer::OnWebSocketMessage(int connection_id, |
101 const std::string& data) { | 104 const std::string& data) { |
102 WebSocketMessageAction action; | 105 WebSocketMessageAction action; |
103 { | 106 { |
104 base::AutoLock lock(action_lock_); | 107 base::AutoLock lock(action_lock_); |
105 action = message_action_; | 108 action = message_action_; |
106 } | 109 } |
107 switch (action) { | 110 switch (action) { |
108 case kEchoMessage: | 111 case kEchoMessage: |
109 server_->SendOverWebSocket(connection_id, data); | 112 server_->SendOverWebSocket(connection_id, data); |
110 break; | 113 break; |
111 case kCloseOnMessage: | 114 case kCloseOnMessage: |
112 server_->Close(connection_id); | 115 // net::HttpServer doesn't allow us to close connection during callback. |
| 116 base::MessageLoop::current()->PostTask( |
| 117 FROM_HERE, |
| 118 base::Bind(&net::HttpServer::Close, server_, connection_id)); |
113 break; | 119 break; |
114 } | 120 } |
115 } | 121 } |
116 | 122 |
117 void TestHttpServer::OnClose(int connection_id) { | 123 void TestHttpServer::OnClose(int connection_id) { |
118 connections_.erase(connection_id); | 124 connections_.erase(connection_id); |
119 if (connections_.empty()) | 125 if (connections_.empty()) |
120 all_closed_event_.Signal(); | 126 all_closed_event_.Signal(); |
121 } | 127 } |
122 | 128 |
123 void TestHttpServer::StartOnServerThread(bool* success, | 129 void TestHttpServer::StartOnServerThread(bool* success, |
124 base::WaitableEvent* event) { | 130 base::WaitableEvent* event) { |
125 scoped_ptr<net::ServerSocket> server_socket( | 131 net::TCPListenSocketFactory factory("127.0.0.1", 0); |
126 new net::TCPServerSocket(NULL, net::NetLog::Source())); | 132 server_ = new net::HttpServer(factory, this); |
127 server_socket->ListenWithAddressAndPort("127.0.0.1", 0, 1); | |
128 server_.reset(new net::HttpServer(server_socket.Pass(), this)); | |
129 | 133 |
130 net::IPEndPoint address; | 134 net::IPEndPoint address; |
131 int error = server_->GetLocalAddress(&address); | 135 int error = server_->GetLocalAddress(&address); |
132 EXPECT_EQ(net::OK, error); | 136 EXPECT_EQ(net::OK, error); |
133 if (error == net::OK) { | 137 if (error == net::OK) { |
134 base::AutoLock lock(url_lock_); | 138 base::AutoLock lock(url_lock_); |
135 web_socket_url_ = GURL(base::StringPrintf("ws://127.0.0.1:%d", | 139 web_socket_url_ = GURL(base::StringPrintf("ws://127.0.0.1:%d", |
136 address.port())); | 140 address.port())); |
137 } else { | 141 } else { |
138 server_.reset(NULL); | 142 server_ = NULL; |
139 } | 143 } |
140 *success = server_.get(); | 144 *success = server_.get(); |
141 event->Signal(); | 145 event->Signal(); |
142 } | 146 } |
143 | 147 |
144 void TestHttpServer::StopOnServerThread(base::WaitableEvent* event) { | 148 void TestHttpServer::StopOnServerThread(base::WaitableEvent* event) { |
145 server_.reset(NULL); | 149 if (server_.get()) |
| 150 server_ = NULL; |
146 event->Signal(); | 151 event->Signal(); |
147 } | 152 } |
OLD | NEW |