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 |