| 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 |