| OLD | NEW |
| 1 // Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2009 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/address_list.h" | 5 #include "net/base/address_list.h" |
| 6 #include "net/base/host_resolver.h" | 6 #include "net/base/host_resolver.h" |
| 7 #include "net/base/listen_socket.h" | 7 #include "net/base/listen_socket.h" |
| 8 #include "net/base/net_errors.h" | 8 #include "net/base/net_errors.h" |
| 9 #include "net/base/tcp_client_socket.h" | 9 #include "net/base/tcp_client_socket.h" |
| 10 #include "net/base/test_completion_callback.h" | 10 #include "net/base/test_completion_callback.h" |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 TestCompletionCallback callback; | 96 TestCompletionCallback callback; |
| 97 int rv = sock_->Connect(&callback); | 97 int rv = sock_->Connect(&callback); |
| 98 if (rv != net::OK) { | 98 if (rv != net::OK) { |
| 99 ASSERT_EQ(rv, net::ERR_IO_PENDING); | 99 ASSERT_EQ(rv, net::ERR_IO_PENDING); |
| 100 | 100 |
| 101 rv = callback.WaitForResult(); | 101 rv = callback.WaitForResult(); |
| 102 EXPECT_EQ(rv, net::OK); | 102 EXPECT_EQ(rv, net::OK); |
| 103 } | 103 } |
| 104 | 104 |
| 105 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 105 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
| 106 rv = sock_->Write(request_text, arraysize(request_text) - 1, &callback); | 106 scoped_refptr<net::IOBuffer> request_buffer = |
| 107 new net::IOBuffer(arraysize(request_text) - 1); |
| 108 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
| 109 |
| 110 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); |
| 107 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 111 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 108 | 112 |
| 109 if (rv == net::ERR_IO_PENDING) { | 113 if (rv == net::ERR_IO_PENDING) { |
| 110 rv = callback.WaitForResult(); | 114 rv = callback.WaitForResult(); |
| 111 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); | 115 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); |
| 112 } | 116 } |
| 113 | 117 |
| 114 char buf[4096]; | 118 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(4096); |
| 115 for (;;) { | 119 for (;;) { |
| 116 rv = sock_->Read(buf, sizeof(buf), &callback); | 120 rv = sock_->Read(buf, 4096, &callback); |
| 117 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 121 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 118 | 122 |
| 119 if (rv == net::ERR_IO_PENDING) | 123 if (rv == net::ERR_IO_PENDING) |
| 120 rv = callback.WaitForResult(); | 124 rv = callback.WaitForResult(); |
| 121 | 125 |
| 122 EXPECT_GE(rv, 0); | 126 EXPECT_GE(rv, 0); |
| 123 if (rv <= 0) | 127 if (rv <= 0) |
| 124 break; | 128 break; |
| 125 } | 129 } |
| 126 } | 130 } |
| 127 | 131 |
| 128 TEST_F(TCPClientSocketTest, Read_SmallChunks) { | 132 TEST_F(TCPClientSocketTest, Read_SmallChunks) { |
| 129 TestCompletionCallback callback; | 133 TestCompletionCallback callback; |
| 130 int rv = sock_->Connect(&callback); | 134 int rv = sock_->Connect(&callback); |
| 131 if (rv != net::OK) { | 135 if (rv != net::OK) { |
| 132 ASSERT_EQ(rv, net::ERR_IO_PENDING); | 136 ASSERT_EQ(rv, net::ERR_IO_PENDING); |
| 133 | 137 |
| 134 rv = callback.WaitForResult(); | 138 rv = callback.WaitForResult(); |
| 135 EXPECT_EQ(rv, net::OK); | 139 EXPECT_EQ(rv, net::OK); |
| 136 } | 140 } |
| 137 | 141 |
| 138 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 142 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
| 139 rv = sock_->Write(request_text, arraysize(request_text) - 1, &callback); | 143 scoped_refptr<net::IOBuffer> request_buffer = |
| 144 new net::IOBuffer(arraysize(request_text) - 1); |
| 145 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
| 146 |
| 147 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); |
| 140 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 148 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 141 | 149 |
| 142 if (rv == net::ERR_IO_PENDING) { | 150 if (rv == net::ERR_IO_PENDING) { |
| 143 rv = callback.WaitForResult(); | 151 rv = callback.WaitForResult(); |
| 144 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); | 152 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); |
| 145 } | 153 } |
| 146 | 154 |
| 147 char buf[1]; | 155 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(1); |
| 148 for (;;) { | 156 for (;;) { |
| 149 rv = sock_->Read(buf, sizeof(buf), &callback); | 157 rv = sock_->Read(buf, 1, &callback); |
| 150 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 158 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 151 | 159 |
| 152 if (rv == net::ERR_IO_PENDING) | 160 if (rv == net::ERR_IO_PENDING) |
| 153 rv = callback.WaitForResult(); | 161 rv = callback.WaitForResult(); |
| 154 | 162 |
| 155 EXPECT_GE(rv, 0); | 163 EXPECT_GE(rv, 0); |
| 156 if (rv <= 0) | 164 if (rv <= 0) |
| 157 break; | 165 break; |
| 158 } | 166 } |
| 159 } | 167 } |
| 160 | 168 |
| 161 TEST_F(TCPClientSocketTest, Read_Interrupted) { | 169 TEST_F(TCPClientSocketTest, Read_Interrupted) { |
| 162 TestCompletionCallback callback; | 170 TestCompletionCallback callback; |
| 163 int rv = sock_->Connect(&callback); | 171 int rv = sock_->Connect(&callback); |
| 164 if (rv != net::OK) { | 172 if (rv != net::OK) { |
| 165 ASSERT_EQ(rv, net::ERR_IO_PENDING); | 173 ASSERT_EQ(rv, net::ERR_IO_PENDING); |
| 166 | 174 |
| 167 rv = callback.WaitForResult(); | 175 rv = callback.WaitForResult(); |
| 168 EXPECT_EQ(rv, net::OK); | 176 EXPECT_EQ(rv, net::OK); |
| 169 } | 177 } |
| 170 | 178 |
| 171 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 179 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
| 172 rv = sock_->Write(request_text, arraysize(request_text) - 1, &callback); | 180 scoped_refptr<net::IOBuffer> request_buffer = |
| 181 new net::IOBuffer(arraysize(request_text) - 1); |
| 182 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
| 183 |
| 184 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, &callback); |
| 173 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 185 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 174 | 186 |
| 175 if (rv == net::ERR_IO_PENDING) { | 187 if (rv == net::ERR_IO_PENDING) { |
| 176 rv = callback.WaitForResult(); | 188 rv = callback.WaitForResult(); |
| 177 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); | 189 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); |
| 178 } | 190 } |
| 179 | 191 |
| 180 // Do a partial read and then exit. This test should not crash! | 192 // Do a partial read and then exit. This test should not crash! |
| 181 char buf[512]; | 193 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(512); |
| 182 rv = sock_->Read(buf, sizeof(buf), &callback); | 194 rv = sock_->Read(buf, 512, &callback); |
| 183 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 195 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 184 | 196 |
| 185 if (rv == net::ERR_IO_PENDING) | 197 if (rv == net::ERR_IO_PENDING) |
| 186 rv = callback.WaitForResult(); | 198 rv = callback.WaitForResult(); |
| 187 | 199 |
| 188 EXPECT_NE(rv, 0); | 200 EXPECT_NE(rv, 0); |
| 189 } | 201 } |
| 190 | 202 |
| 191 TEST_F(TCPClientSocketTest, FullDuplex_ReadFirst) { | 203 TEST_F(TCPClientSocketTest, FullDuplex_ReadFirst) { |
| 192 TestCompletionCallback callback; | 204 TestCompletionCallback callback; |
| 193 int rv = sock_->Connect(&callback); | 205 int rv = sock_->Connect(&callback); |
| 194 if (rv != net::OK) { | 206 if (rv != net::OK) { |
| 195 ASSERT_EQ(rv, net::ERR_IO_PENDING); | 207 ASSERT_EQ(rv, net::ERR_IO_PENDING); |
| 196 | 208 |
| 197 rv = callback.WaitForResult(); | 209 rv = callback.WaitForResult(); |
| 198 EXPECT_EQ(rv, net::OK); | 210 EXPECT_EQ(rv, net::OK); |
| 199 } | 211 } |
| 200 | 212 |
| 201 char buf[4096]; | 213 const int kBufLen = 4096; |
| 202 rv = sock_->Read(buf, sizeof(buf), &callback); | 214 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kBufLen); |
| 215 rv = sock_->Read(buf, kBufLen, &callback); |
| 203 EXPECT_EQ(net::ERR_IO_PENDING, rv); | 216 EXPECT_EQ(net::ERR_IO_PENDING, rv); |
| 204 | 217 |
| 205 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 218 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
| 219 scoped_refptr<net::IOBuffer> request_buffer = |
| 220 new net::IOBuffer(arraysize(request_text) - 1); |
| 221 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
| 206 TestCompletionCallback write_callback; | 222 TestCompletionCallback write_callback; |
| 207 rv = sock_->Write(request_text, arraysize(request_text) - 1, &write_callback); | 223 |
| 224 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, |
| 225 &write_callback); |
| 208 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 226 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 209 | 227 |
| 210 if (rv == net::ERR_IO_PENDING) { | 228 if (rv == net::ERR_IO_PENDING) { |
| 211 rv = write_callback.WaitForResult(); | 229 rv = write_callback.WaitForResult(); |
| 212 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); | 230 EXPECT_EQ(rv, static_cast<int>(arraysize(request_text) - 1)); |
| 213 } | 231 } |
| 214 | 232 |
| 215 rv = callback.WaitForResult(); | 233 rv = callback.WaitForResult(); |
| 216 EXPECT_GE(rv, 0); | 234 EXPECT_GE(rv, 0); |
| 217 while (rv > 0) { | 235 while (rv > 0) { |
| 218 rv = sock_->Read(buf, sizeof(buf), &callback); | 236 rv = sock_->Read(buf, kBufLen, &callback); |
| 219 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 237 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 220 | 238 |
| 221 if (rv == net::ERR_IO_PENDING) | 239 if (rv == net::ERR_IO_PENDING) |
| 222 rv = callback.WaitForResult(); | 240 rv = callback.WaitForResult(); |
| 223 | 241 |
| 224 EXPECT_GE(rv, 0); | 242 EXPECT_GE(rv, 0); |
| 225 if (rv <= 0) | 243 if (rv <= 0) |
| 226 break; | 244 break; |
| 227 } | 245 } |
| 228 } | 246 } |
| 229 | 247 |
| 230 TEST_F(TCPClientSocketTest, FullDuplex_WriteFirst) { | 248 TEST_F(TCPClientSocketTest, FullDuplex_WriteFirst) { |
| 231 TestCompletionCallback callback; | 249 TestCompletionCallback callback; |
| 232 int rv = sock_->Connect(&callback); | 250 int rv = sock_->Connect(&callback); |
| 233 if (rv != net::OK) { | 251 if (rv != net::OK) { |
| 234 ASSERT_EQ(rv, net::ERR_IO_PENDING); | 252 ASSERT_EQ(rv, net::ERR_IO_PENDING); |
| 235 | 253 |
| 236 rv = callback.WaitForResult(); | 254 rv = callback.WaitForResult(); |
| 237 EXPECT_EQ(rv, net::OK); | 255 EXPECT_EQ(rv, net::OK); |
| 238 } | 256 } |
| 239 | 257 |
| 240 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; | 258 const char request_text[] = "GET / HTTP/1.0\r\n\r\n"; |
| 259 scoped_refptr<net::IOBuffer> request_buffer = |
| 260 new net::IOBuffer(arraysize(request_text) - 1); |
| 261 memcpy(request_buffer->data(), request_text, arraysize(request_text) - 1); |
| 241 TestCompletionCallback write_callback; | 262 TestCompletionCallback write_callback; |
| 242 rv = sock_->Write(request_text, arraysize(request_text) - 1, &write_callback); | 263 |
| 264 rv = sock_->Write(request_buffer, arraysize(request_text) - 1, |
| 265 &write_callback); |
| 243 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 266 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 244 | 267 |
| 245 char buf[4096]; | 268 const int kBufLen = 4096; |
| 246 int read_rv = sock_->Read(buf, sizeof(buf), &callback); | 269 scoped_refptr<net::IOBuffer> buf = new net::IOBuffer(kBufLen); |
| 270 int read_rv = sock_->Read(buf, kBufLen, &callback); |
| 247 EXPECT_TRUE(read_rv >= 0 || read_rv == net::ERR_IO_PENDING); | 271 EXPECT_TRUE(read_rv >= 0 || read_rv == net::ERR_IO_PENDING); |
| 248 | 272 |
| 249 if (rv == net::ERR_IO_PENDING) { | 273 if (rv == net::ERR_IO_PENDING) { |
| 250 rv = write_callback.WaitForResult(); | 274 rv = write_callback.WaitForResult(); |
| 251 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); | 275 EXPECT_EQ(static_cast<int>(arraysize(request_text) - 1), rv); |
| 252 } | 276 } |
| 253 | 277 |
| 254 rv = callback.WaitForResult(); | 278 rv = callback.WaitForResult(); |
| 255 EXPECT_GE(rv, 0); | 279 EXPECT_GE(rv, 0); |
| 256 while (rv > 0) { | 280 while (rv > 0) { |
| 257 rv = sock_->Read(buf, sizeof(buf), &callback); | 281 rv = sock_->Read(buf, kBufLen, &callback); |
| 258 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); | 282 EXPECT_TRUE(rv >= 0 || rv == net::ERR_IO_PENDING); |
| 259 | 283 |
| 260 if (rv == net::ERR_IO_PENDING) | 284 if (rv == net::ERR_IO_PENDING) |
| 261 rv = callback.WaitForResult(); | 285 rv = callback.WaitForResult(); |
| 262 | 286 |
| 263 EXPECT_GE(rv, 0); | 287 EXPECT_GE(rv, 0); |
| 264 if (rv <= 0) | 288 if (rv <= 0) |
| 265 break; | 289 break; |
| 266 } | 290 } |
| 267 } | 291 } |
| OLD | NEW |