OLD | NEW |
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "net/base/listen_socket_unittest.h" | 5 #include "net/base/listen_socket_unittest.h" |
6 | 6 |
7 #include <fcntl.h> | 7 #include <fcntl.h> |
8 #include <sys/types.h> | 8 #include <sys/types.h> |
9 | 9 |
10 #include "base/eintr_wrapper.h" | 10 #include "base/eintr_wrapper.h" |
11 #include "net/base/net_util.h" | 11 #include "net/base/net_util.h" |
12 #include "testing/platform_test.h" | 12 #include "testing/platform_test.h" |
13 | 13 |
14 const int ListenSocketTester::kTestPort = 9999; | 14 const int ListenSocketTester::kTestPort = 9999; |
15 | 15 |
16 static const int kReadBufSize = 1024; | 16 static const int kReadBufSize = 1024; |
17 static const char kHelloWorld[] = "HELLO, WORLD"; | 17 static const char kHelloWorld[] = "HELLO, WORLD"; |
18 static const int kMaxQueueSize = 20; | 18 static const int kMaxQueueSize = 20; |
19 static const char kLoopback[] = "127.0.0.1"; | 19 static const char kLoopback[] = "127.0.0.1"; |
20 static const int kDefaultTimeoutMs = 5000; | 20 static const int kDefaultTimeoutMs = 5000; |
21 | 21 |
22 ListenSocket* ListenSocketTester::DoListen() { | 22 ListenSocketTester::ListenSocketTester() |
23 return ListenSocket::Listen(kLoopback, kTestPort, this); | 23 : thread_(NULL), |
| 24 loop_(NULL), |
| 25 server_(NULL), |
| 26 connection_(NULL), |
| 27 cv_(&lock_) { |
24 } | 28 } |
25 | 29 |
26 void ListenSocketTester::SetUp() { | 30 void ListenSocketTester::SetUp() { |
27 base::Thread::Options options; | 31 base::Thread::Options options; |
28 options.message_loop_type = MessageLoop::TYPE_IO; | 32 options.message_loop_type = MessageLoop::TYPE_IO; |
29 thread_.reset(new base::Thread("socketio_test")); | 33 thread_.reset(new base::Thread("socketio_test")); |
30 thread_->StartWithOptions(options); | 34 thread_->StartWithOptions(options); |
31 loop_ = reinterpret_cast<MessageLoopForIO*>(thread_->message_loop()); | 35 loop_ = reinterpret_cast<MessageLoopForIO*>(thread_->message_loop()); |
32 | 36 |
33 loop_->PostTask(FROM_HERE, NewRunnableMethod( | 37 loop_->PostTask(FROM_HERE, NewRunnableMethod( |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
114 server_->AddRef(); | 118 server_->AddRef(); |
115 ReportAction(ListenSocketTestAction(ACTION_LISTEN)); | 119 ReportAction(ListenSocketTestAction(ACTION_LISTEN)); |
116 } | 120 } |
117 } | 121 } |
118 | 122 |
119 void ListenSocketTester::SendFromTester() { | 123 void ListenSocketTester::SendFromTester() { |
120 connection_->Send(kHelloWorld); | 124 connection_->Send(kHelloWorld); |
121 ReportAction(ListenSocketTestAction(ACTION_SEND)); | 125 ReportAction(ListenSocketTestAction(ACTION_SEND)); |
122 } | 126 } |
123 | 127 |
124 void ListenSocketTester::DidAccept(ListenSocket *server, | |
125 ListenSocket *connection) { | |
126 connection_ = connection; | |
127 connection_->AddRef(); | |
128 ReportAction(ListenSocketTestAction(ACTION_ACCEPT)); | |
129 } | |
130 | |
131 void ListenSocketTester::DidRead(ListenSocket *connection, | |
132 const char* data, | |
133 int len) { | |
134 std::string str(data, len); | |
135 ReportAction(ListenSocketTestAction(ACTION_READ, str)); | |
136 } | |
137 | |
138 void ListenSocketTester::DidClose(ListenSocket *sock) { | |
139 ReportAction(ListenSocketTestAction(ACTION_CLOSE)); | |
140 } | |
141 | |
142 bool ListenSocketTester::Send(SOCKET sock, const std::string& str) { | |
143 int len = static_cast<int>(str.length()); | |
144 int send_len = HANDLE_EINTR(send(sock, str.data(), len, 0)); | |
145 if (send_len == SOCKET_ERROR) { | |
146 LOG(ERROR) << "send failed: " << errno; | |
147 return false; | |
148 } else if (send_len != len) { | |
149 return false; | |
150 } | |
151 return true; | |
152 } | |
153 | |
154 void ListenSocketTester::TestClientSend() { | 128 void ListenSocketTester::TestClientSend() { |
155 ASSERT_TRUE(Send(test_socket_, kHelloWorld)); | 129 ASSERT_TRUE(Send(test_socket_, kHelloWorld)); |
156 NextAction(); | 130 NextAction(); |
157 ASSERT_EQ(ACTION_READ, last_action_.type()); | 131 ASSERT_EQ(ACTION_READ, last_action_.type()); |
158 ASSERT_EQ(last_action_.data(), kHelloWorld); | 132 ASSERT_EQ(last_action_.data(), kHelloWorld); |
159 } | 133 } |
160 | 134 |
161 void ListenSocketTester::TestClientSendLong() { | 135 void ListenSocketTester::TestClientSendLong() { |
162 size_t hello_len = strlen(kHelloWorld); | 136 size_t hello_len = strlen(kHelloWorld); |
163 std::string long_string; | 137 std::string long_string; |
(...skipping 29 matching lines...) Expand all Loading... |
193 int r = HANDLE_EINTR(recv(test_socket_, buf, buf_len, 0)); | 167 int r = HANDLE_EINTR(recv(test_socket_, buf, buf_len, 0)); |
194 ASSERT_GE(r, 0); | 168 ASSERT_GE(r, 0); |
195 recv_len += static_cast<unsigned>(r); | 169 recv_len += static_cast<unsigned>(r); |
196 if (!r) | 170 if (!r) |
197 break; | 171 break; |
198 } | 172 } |
199 buf[recv_len] = 0; | 173 buf[recv_len] = 0; |
200 ASSERT_STREQ(buf, kHelloWorld); | 174 ASSERT_STREQ(buf, kHelloWorld); |
201 } | 175 } |
202 | 176 |
| 177 bool ListenSocketTester::Send(SOCKET sock, const std::string& str) { |
| 178 int len = static_cast<int>(str.length()); |
| 179 int send_len = HANDLE_EINTR(send(sock, str.data(), len, 0)); |
| 180 if (send_len == SOCKET_ERROR) { |
| 181 LOG(ERROR) << "send failed: " << errno; |
| 182 return false; |
| 183 } else if (send_len != len) { |
| 184 return false; |
| 185 } |
| 186 return true; |
| 187 } |
| 188 |
| 189 void ListenSocketTester::DidAccept(ListenSocket *server, |
| 190 ListenSocket *connection) { |
| 191 connection_ = connection; |
| 192 connection_->AddRef(); |
| 193 ReportAction(ListenSocketTestAction(ACTION_ACCEPT)); |
| 194 } |
| 195 |
| 196 void ListenSocketTester::DidRead(ListenSocket *connection, |
| 197 const char* data, |
| 198 int len) { |
| 199 std::string str(data, len); |
| 200 ReportAction(ListenSocketTestAction(ACTION_READ, str)); |
| 201 } |
| 202 |
| 203 void ListenSocketTester::DidClose(ListenSocket *sock) { |
| 204 ReportAction(ListenSocketTestAction(ACTION_CLOSE)); |
| 205 } |
| 206 |
| 207 ListenSocketTester::~ListenSocketTester() {} |
| 208 |
| 209 ListenSocket* ListenSocketTester::DoListen() { |
| 210 return ListenSocket::Listen(kLoopback, kTestPort, this); |
| 211 } |
| 212 |
203 | 213 |
204 class ListenSocketTest: public PlatformTest { | 214 class ListenSocketTest: public PlatformTest { |
205 public: | 215 public: |
206 ListenSocketTest() { | 216 ListenSocketTest() { |
207 tester_ = NULL; | 217 tester_ = NULL; |
208 } | 218 } |
209 | 219 |
210 virtual void SetUp() { | 220 virtual void SetUp() { |
211 PlatformTest::SetUp(); | 221 PlatformTest::SetUp(); |
212 tester_ = new ListenSocketTester(); | 222 tester_ = new ListenSocketTester(); |
(...skipping 13 matching lines...) Expand all Loading... |
226 tester_->TestClientSend(); | 236 tester_->TestClientSend(); |
227 } | 237 } |
228 | 238 |
229 TEST_F(ListenSocketTest, ClientSendLong) { | 239 TEST_F(ListenSocketTest, ClientSendLong) { |
230 tester_->TestClientSendLong(); | 240 tester_->TestClientSendLong(); |
231 } | 241 } |
232 | 242 |
233 TEST_F(ListenSocketTest, ServerSend) { | 243 TEST_F(ListenSocketTest, ServerSend) { |
234 tester_->TestServerSend(); | 244 tester_->TestServerSend(); |
235 } | 245 } |
OLD | NEW |