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/socket/tcp_client_socket.h" | 5 #include "net/socket/tcp_client_socket.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "net/base/address_list.h" | 8 #include "net/base/address_list.h" |
9 #include "net/base/host_resolver.h" | 9 #include "net/base/host_resolver.h" |
10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 TestCompletionCallback callback; | 131 TestCompletionCallback callback; |
132 int rv = sock_->Connect(&callback); | 132 int rv = sock_->Connect(&callback); |
133 if (rv != OK) { | 133 if (rv != OK) { |
134 ASSERT_EQ(rv, ERR_IO_PENDING); | 134 ASSERT_EQ(rv, ERR_IO_PENDING); |
135 | 135 |
136 rv = callback.WaitForResult(); | 136 rv = callback.WaitForResult(); |
137 EXPECT_EQ(rv, OK); | 137 EXPECT_EQ(rv, OK); |
138 } | 138 } |
139 | 139 |
140 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 140 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
141 scoped_refptr<IOBuffer> request_buffer = | 141 scoped_refptr<IOBuffer> request_buffer( |
142 new IOBuffer(arraysize(request_text) - 1); | 142 new IOBuffer(arraysize(request_text) - 1)); |
143 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); | 143 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
144 | 144 |
145 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); | 145 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); |
146 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 146 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
147 | 147 |
148 if (rv == ERR_IO_PENDING) { | 148 if (rv == ERR_IO_PENDING) { |
149 rv = callback.WaitForResult(); | 149 rv = callback.WaitForResult(); |
150 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); | 150 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); |
151 } | 151 } |
152 | 152 |
153 scoped_refptr<IOBuffer> buf = new IOBuffer(4096); | 153 scoped_refptr<IOBuffer> buf(new IOBuffer(4096)); |
154 uint32 bytes_read = 0; | 154 uint32 bytes_read = 0; |
155 while (bytes_read < arraysize(kServerReply) - 1) { | 155 while (bytes_read < arraysize(kServerReply) - 1) { |
156 rv = sock_->Read(buf, 4096, &callback); | 156 rv = sock_->Read(buf, 4096, &callback); |
157 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 157 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
158 | 158 |
159 if (rv == ERR_IO_PENDING) | 159 if (rv == ERR_IO_PENDING) |
160 rv = callback.WaitForResult(); | 160 rv = callback.WaitForResult(); |
161 | 161 |
162 ASSERT_GE(rv, 0); | 162 ASSERT_GE(rv, 0); |
163 bytes_read += rv; | 163 bytes_read += rv; |
(...skipping 12 matching lines...) Expand all Loading... |
176 TestCompletionCallback callback; | 176 TestCompletionCallback callback; |
177 int rv = sock_->Connect(&callback); | 177 int rv = sock_->Connect(&callback); |
178 if (rv != OK) { | 178 if (rv != OK) { |
179 ASSERT_EQ(rv, ERR_IO_PENDING); | 179 ASSERT_EQ(rv, ERR_IO_PENDING); |
180 | 180 |
181 rv = callback.WaitForResult(); | 181 rv = callback.WaitForResult(); |
182 EXPECT_EQ(rv, OK); | 182 EXPECT_EQ(rv, OK); |
183 } | 183 } |
184 | 184 |
185 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 185 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
186 scoped_refptr<IOBuffer> request_buffer = | 186 scoped_refptr<IOBuffer> request_buffer( |
187 new IOBuffer(arraysize(request_text) - 1); | 187 new IOBuffer(arraysize(request_text) - 1)); |
188 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); | 188 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
189 | 189 |
190 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); | 190 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); |
191 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 191 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
192 | 192 |
193 if (rv == ERR_IO_PENDING) { | 193 if (rv == ERR_IO_PENDING) { |
194 rv = callback.WaitForResult(); | 194 rv = callback.WaitForResult(); |
195 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); | 195 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); |
196 } | 196 } |
197 | 197 |
198 scoped_refptr<IOBuffer> buf = new IOBuffer(1); | 198 scoped_refptr<IOBuffer> buf(new IOBuffer(1)); |
199 uint32 bytes_read = 0; | 199 uint32 bytes_read = 0; |
200 while (bytes_read < arraysize(kServerReply) - 1) { | 200 while (bytes_read < arraysize(kServerReply) - 1) { |
201 rv = sock_->Read(buf, 1, &callback); | 201 rv = sock_->Read(buf, 1, &callback); |
202 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 202 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
203 | 203 |
204 if (rv == ERR_IO_PENDING) | 204 if (rv == ERR_IO_PENDING) |
205 rv = callback.WaitForResult(); | 205 rv = callback.WaitForResult(); |
206 | 206 |
207 ASSERT_EQ(1, rv); | 207 ASSERT_EQ(1, rv); |
208 bytes_read += rv; | 208 bytes_read += rv; |
(...skipping 12 matching lines...) Expand all Loading... |
221 TestCompletionCallback callback; | 221 TestCompletionCallback callback; |
222 int rv = sock_->Connect(&callback); | 222 int rv = sock_->Connect(&callback); |
223 if (rv != OK) { | 223 if (rv != OK) { |
224 ASSERT_EQ(ERR_IO_PENDING, rv); | 224 ASSERT_EQ(ERR_IO_PENDING, rv); |
225 | 225 |
226 rv = callback.WaitForResult(); | 226 rv = callback.WaitForResult(); |
227 EXPECT_EQ(rv, OK); | 227 EXPECT_EQ(rv, OK); |
228 } | 228 } |
229 | 229 |
230 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 230 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
231 scoped_refptr<IOBuffer> request_buffer = | 231 scoped_refptr<IOBuffer> request_buffer( |
232 new IOBuffer(arraysize(request_text) - 1); | 232 new IOBuffer(arraysize(request_text) - 1)); |
233 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); | 233 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
234 | 234 |
235 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); | 235 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); |
236 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 236 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
237 | 237 |
238 if (rv == ERR_IO_PENDING) { | 238 if (rv == ERR_IO_PENDING) { |
239 rv = callback.WaitForResult(); | 239 rv = callback.WaitForResult(); |
240 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); | 240 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); |
241 } | 241 } |
242 | 242 |
243 // Do a partial read and then exit. This test should not crash! | 243 // Do a partial read and then exit. This test should not crash! |
244 scoped_refptr<IOBuffer> buf = new IOBuffer(16); | 244 scoped_refptr<IOBuffer> buf(new IOBuffer(16)); |
245 rv = sock_->Read(buf, 16, &callback); | 245 rv = sock_->Read(buf, 16, &callback); |
246 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 246 EXPECT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
247 | 247 |
248 if (rv == ERR_IO_PENDING) | 248 if (rv == ERR_IO_PENDING) |
249 rv = callback.WaitForResult(); | 249 rv = callback.WaitForResult(); |
250 | 250 |
251 EXPECT_NE(0, rv); | 251 EXPECT_NE(0, rv); |
252 } | 252 } |
253 | 253 |
254 TEST_F(TCPClientSocketTest, DISABLED_FullDuplex_ReadFirst) { | 254 TEST_F(TCPClientSocketTest, DISABLED_FullDuplex_ReadFirst) { |
255 TestCompletionCallback callback; | 255 TestCompletionCallback callback; |
256 int rv = sock_->Connect(&callback); | 256 int rv = sock_->Connect(&callback); |
257 if (rv != OK) { | 257 if (rv != OK) { |
258 ASSERT_EQ(rv, ERR_IO_PENDING); | 258 ASSERT_EQ(rv, ERR_IO_PENDING); |
259 | 259 |
260 rv = callback.WaitForResult(); | 260 rv = callback.WaitForResult(); |
261 EXPECT_EQ(rv, OK); | 261 EXPECT_EQ(rv, OK); |
262 } | 262 } |
263 | 263 |
264 // Read first. There's no data, so it should return ERR_IO_PENDING. | 264 // Read first. There's no data, so it should return ERR_IO_PENDING. |
265 const int kBufLen = 4096; | 265 const int kBufLen = 4096; |
266 scoped_refptr<IOBuffer> buf = new IOBuffer(kBufLen); | 266 scoped_refptr<IOBuffer> buf(new IOBuffer(kBufLen)); |
267 rv = sock_->Read(buf, kBufLen, &callback); | 267 rv = sock_->Read(buf, kBufLen, &callback); |
268 EXPECT_EQ(ERR_IO_PENDING, rv); | 268 EXPECT_EQ(ERR_IO_PENDING, rv); |
269 | 269 |
270 PauseServerReads(); | 270 PauseServerReads(); |
271 const int kWriteBufLen = 64 * 1024; | 271 const int kWriteBufLen = 64 * 1024; |
272 scoped_refptr<IOBuffer> request_buffer = new IOBuffer(kWriteBufLen); | 272 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kWriteBufLen)); |
273 char* request_data = request_buffer->data(); | 273 char* request_data = request_buffer->data(); |
274 memset(request_data, 'A', kWriteBufLen); | 274 memset(request_data, 'A', kWriteBufLen); |
275 TestCompletionCallback write_callback; | 275 TestCompletionCallback write_callback; |
276 | 276 |
277 while (true) { | 277 while (true) { |
278 rv = sock_->Write(request_buffer, kWriteBufLen, &write_callback); | 278 rv = sock_->Write(request_buffer, kWriteBufLen, &write_callback); |
279 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 279 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
280 | 280 |
281 if (rv == ERR_IO_PENDING) { | 281 if (rv == ERR_IO_PENDING) { |
282 ResumeServerReads(); | 282 ResumeServerReads(); |
(...skipping 15 matching lines...) Expand all Loading... |
298 int rv = sock_->Connect(&callback); | 298 int rv = sock_->Connect(&callback); |
299 if (rv != OK) { | 299 if (rv != OK) { |
300 ASSERT_EQ(ERR_IO_PENDING, rv); | 300 ASSERT_EQ(ERR_IO_PENDING, rv); |
301 | 301 |
302 rv = callback.WaitForResult(); | 302 rv = callback.WaitForResult(); |
303 EXPECT_EQ(OK, rv); | 303 EXPECT_EQ(OK, rv); |
304 } | 304 } |
305 | 305 |
306 PauseServerReads(); | 306 PauseServerReads(); |
307 const int kWriteBufLen = 64 * 1024; | 307 const int kWriteBufLen = 64 * 1024; |
308 scoped_refptr<IOBuffer> request_buffer = new IOBuffer(kWriteBufLen); | 308 scoped_refptr<IOBuffer> request_buffer(new IOBuffer(kWriteBufLen)); |
309 char* request_data = request_buffer->data(); | 309 char* request_data = request_buffer->data(); |
310 memset(request_data, 'A', kWriteBufLen); | 310 memset(request_data, 'A', kWriteBufLen); |
311 TestCompletionCallback write_callback; | 311 TestCompletionCallback write_callback; |
312 | 312 |
313 while (true) { | 313 while (true) { |
314 rv = sock_->Write(request_buffer, kWriteBufLen, &write_callback); | 314 rv = sock_->Write(request_buffer, kWriteBufLen, &write_callback); |
315 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 315 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
316 | 316 |
317 if (rv == ERR_IO_PENDING) | 317 if (rv == ERR_IO_PENDING) |
318 break; | 318 break; |
319 } | 319 } |
320 | 320 |
321 // Now we have the Write() blocked on ERR_IO_PENDING. It's time to force the | 321 // Now we have the Write() blocked on ERR_IO_PENDING. It's time to force the |
322 // Read() to block on ERR_IO_PENDING too. | 322 // Read() to block on ERR_IO_PENDING too. |
323 | 323 |
324 const int kBufLen = 4096; | 324 const int kBufLen = 4096; |
325 scoped_refptr<IOBuffer> buf = new IOBuffer(kBufLen); | 325 scoped_refptr<IOBuffer> buf(new IOBuffer(kBufLen)); |
326 while (true) { | 326 while (true) { |
327 rv = sock_->Read(buf, kBufLen, &callback); | 327 rv = sock_->Read(buf, kBufLen, &callback); |
328 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); | 328 ASSERT_TRUE(rv >= 0 || rv == ERR_IO_PENDING); |
329 if (rv == ERR_IO_PENDING) | 329 if (rv == ERR_IO_PENDING) |
330 break; | 330 break; |
331 } | 331 } |
332 | 332 |
333 // At this point, both read and write have returned ERR_IO_PENDING. Now we | 333 // At this point, both read and write have returned ERR_IO_PENDING. Now we |
334 // run the write and read callbacks to make sure they can handle full duplex | 334 // run the write and read callbacks to make sure they can handle full duplex |
335 // communications. | 335 // communications. |
336 | 336 |
337 ResumeServerReads(); | 337 ResumeServerReads(); |
338 rv = write_callback.WaitForResult(); | 338 rv = write_callback.WaitForResult(); |
339 EXPECT_GE(rv, 0); | 339 EXPECT_GE(rv, 0); |
340 | 340 |
341 // It's possible the read is blocked because it's already read all the data. | 341 // It's possible the read is blocked because it's already read all the data. |
342 // Close the server socket, so there will at least be a 0-byte read. | 342 // Close the server socket, so there will at least be a 0-byte read. |
343 CloseServerSocket(); | 343 CloseServerSocket(); |
344 | 344 |
345 rv = callback.WaitForResult(); | 345 rv = callback.WaitForResult(); |
346 EXPECT_GE(rv, 0); | 346 EXPECT_GE(rv, 0); |
347 } | 347 } |
348 | 348 |
349 } // namespace | 349 } // namespace |
350 | 350 |
351 } // namespace net | 351 } // namespace net |
OLD | NEW |