OLD | NEW |
---|---|
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "base/compiler_specific.h" | 5 #include "base/compiler_specific.h" |
6 #include "base/platform_test.h" | 6 #include "base/platform_test.h" |
7 #include "net/base/client_socket_factory.h" | 7 #include "net/base/client_socket_factory.h" |
8 #include "net/base/test_completion_callback.h" | 8 #include "net/base/test_completion_callback.h" |
9 #include "net/base/upload_data.h" | 9 #include "net/base/upload_data.h" |
10 #include "net/http/http_network_session.h" | 10 #include "net/http/http_network_session.h" |
11 #include "net/http/http_network_transaction.h" | 11 #include "net/http/http_network_transaction.h" |
12 #include "net/http/http_transaction_unittest.h" | 12 #include "net/http/http_transaction_unittest.h" |
13 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
14 | 14 |
15 //----------------------------------------------------------------------------- | 15 //----------------------------------------------------------------------------- |
16 | 16 |
17 | 17 |
18 struct MockConnect { | 18 struct MockConnect { |
19 bool async; | 19 bool async; |
20 int result; | 20 int result; |
21 | |
22 // Asynchronous connection success. | |
23 MockConnect() : async(true), result(net::OK) { } | |
wtc
2008/09/29 20:16:33
Nit: list the constructor before the members, as y
eroman
2008/09/29 20:29:17
oops. will fix.
(I already submitted this as I rel
| |
21 }; | 24 }; |
22 | 25 |
23 struct MockRead { | 26 struct MockRead { |
27 // Read failure (no data). | |
28 MockRead(bool async, int result) : async(async) , result(result), data(NULL), | |
29 data_len(0) { } | |
30 | |
31 // Asynchronous read success (inferred data length). | |
32 MockRead(const char* data) : async(true), data(data), data_len(strlen(data)), | |
33 result(0) { } | |
34 | |
35 // Read success (inferred data length). | |
36 MockRead(bool async, const char* data) : async(async), data(data), | |
37 data_len(strlen(data)), result(0) { } | |
38 | |
39 // Read success. | |
40 MockRead(bool async, const char* data, int data_len) : async(async), | |
41 data(data), data_len(data_len), result(0) { } | |
wtc
2008/09/29 20:16:33
Ideally, these should be accompanied with the C++
eroman
2008/09/29 20:29:17
That happens automatically -- once you have a user
| |
42 | |
24 bool async; | 43 bool async; |
25 int result; // Ignored if data is non-null. | 44 int result; |
26 const char* data; | 45 const char* data; |
27 int data_len; // -1 if strlen(data) should be used. | 46 int data_len; |
28 }; | 47 }; |
29 | 48 |
30 struct MockSocket { | 49 struct MockSocket { |
50 MockSocket() : reads(NULL) { } | |
51 | |
31 MockConnect connect; | 52 MockConnect connect; |
32 MockRead* reads; // Terminated by a MockRead element with data == NULL. | 53 MockRead* reads; |
wtc
2008/09/29 20:16:33
Do we still need to terminate the 'reads' array wi
eroman
2008/09/29 20:29:17
as far as I can tell, that comment was wrong -- no
| |
33 }; | 54 }; |
34 | 55 |
35 // Holds an array of MockSocket elements. As MockTCPClientSocket objects get | 56 // Holds an array of MockSocket elements. As MockTCPClientSocket objects get |
36 // instantiated, they take their data from the i'th element of this array. | 57 // instantiated, they take their data from the i'th element of this array. |
37 // | 58 // |
38 // Tests should assign the first N entries of mock_sockets to point to valid | 59 // Tests should assign the first N entries of mock_sockets to point to valid |
39 // MockSocket objects. The first unused entry should be NULL'd. | 60 // MockSocket objects. The first unused entry should be NULL'd. |
40 // | 61 // |
41 MockSocket* mock_sockets[10]; | 62 MockSocket* mock_sockets[10]; |
42 | 63 |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
76 } | 97 } |
77 virtual bool IsConnected() const { | 98 virtual bool IsConnected() const { |
78 return connected_; | 99 return connected_; |
79 } | 100 } |
80 // Socket methods: | 101 // Socket methods: |
81 virtual int Read(char* buf, int buf_len, net::CompletionCallback* callback) { | 102 virtual int Read(char* buf, int buf_len, net::CompletionCallback* callback) { |
82 DCHECK(!callback_); | 103 DCHECK(!callback_); |
83 MockRead& r = data_->reads[read_index_]; | 104 MockRead& r = data_->reads[read_index_]; |
84 int result; | 105 int result; |
85 if (r.data) { | 106 if (r.data) { |
86 if (r.data_len == -1) | |
87 r.data_len = static_cast<int>(strlen(r.data)); | |
88 if (r.data_len - read_offset_ > 0) { | 107 if (r.data_len - read_offset_ > 0) { |
89 result = std::min(buf_len, r.data_len - read_offset_); | 108 result = std::min(buf_len, r.data_len - read_offset_); |
90 memcpy(buf, r.data + read_offset_, result); | 109 memcpy(buf, r.data + read_offset_, result); |
91 read_offset_ += result; | 110 read_offset_ += result; |
92 if (read_offset_ == r.data_len) { | 111 if (read_offset_ == r.data_len) { |
93 read_index_++; | 112 read_index_++; |
94 read_offset_ = 0; | 113 read_offset_ = 0; |
95 } | 114 } |
96 } else { | 115 } else { |
97 result = 0; // EOF | 116 result = 0; // EOF |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
184 | 203 |
185 net::HttpTransaction* trans = new net::HttpNetworkTransaction( | 204 net::HttpTransaction* trans = new net::HttpNetworkTransaction( |
186 CreateSession(), &mock_socket_factory); | 205 CreateSession(), &mock_socket_factory); |
187 | 206 |
188 net::HttpRequestInfo request; | 207 net::HttpRequestInfo request; |
189 request.method = "GET"; | 208 request.method = "GET"; |
190 request.url = GURL("http://www.google.com/"); | 209 request.url = GURL("http://www.google.com/"); |
191 request.load_flags = 0; | 210 request.load_flags = 0; |
192 | 211 |
193 MockSocket data; | 212 MockSocket data; |
194 data.connect.async = true; | |
195 data.connect.result = net::OK; | |
196 data.reads = data_reads; | 213 data.reads = data_reads; |
197 mock_sockets[0] = &data; | 214 mock_sockets[0] = &data; |
198 mock_sockets[1] = NULL; | 215 mock_sockets[1] = NULL; |
199 | 216 |
200 TestCompletionCallback callback; | 217 TestCompletionCallback callback; |
201 | 218 |
202 int rv = trans->Start(&request, &callback); | 219 int rv = trans->Start(&request, &callback); |
203 EXPECT_EQ(net::ERR_IO_PENDING, rv); | 220 EXPECT_EQ(net::ERR_IO_PENDING, rv); |
204 | 221 |
205 rv = callback.WaitForResult(); | 222 rv = callback.WaitForResult(); |
(...skipping 19 matching lines...) Expand all Loading... | |
225 //----------------------------------------------------------------------------- | 242 //----------------------------------------------------------------------------- |
226 | 243 |
227 TEST_F(HttpNetworkTransactionTest, Basic) { | 244 TEST_F(HttpNetworkTransactionTest, Basic) { |
228 net::HttpTransaction* trans = new net::HttpNetworkTransaction( | 245 net::HttpTransaction* trans = new net::HttpNetworkTransaction( |
229 CreateSession(), &mock_socket_factory); | 246 CreateSession(), &mock_socket_factory); |
230 trans->Destroy(); | 247 trans->Destroy(); |
231 } | 248 } |
232 | 249 |
233 TEST_F(HttpNetworkTransactionTest, SimpleGET) { | 250 TEST_F(HttpNetworkTransactionTest, SimpleGET) { |
234 MockRead data_reads[] = { | 251 MockRead data_reads[] = { |
235 { true, 0, "HTTP/1.0 200 OK\r\n\r\n", -1 }, | 252 MockRead("HTTP/1.0 200 OK\r\n\r\n"), |
236 { true, 0, "hello world", -1 }, | 253 MockRead("hello world"), |
237 { false, net::OK, NULL, 0 }, | 254 MockRead(false, net::OK), |
238 }; | 255 }; |
239 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 256 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
240 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); | 257 EXPECT_EQ("HTTP/1.0 200 OK", out.status_line); |
241 EXPECT_EQ("hello world", out.response_data); | 258 EXPECT_EQ("hello world", out.response_data); |
242 } | 259 } |
243 | 260 |
244 // Response with no status line. | 261 // Response with no status line. |
245 TEST_F(HttpNetworkTransactionTest, SimpleGETNoHeaders) { | 262 TEST_F(HttpNetworkTransactionTest, SimpleGETNoHeaders) { |
246 MockRead data_reads[] = { | 263 MockRead data_reads[] = { |
247 { true, 0, "hello world", -1 }, | 264 MockRead("hello world"), |
248 { false, net::OK, NULL, 0 }, | 265 MockRead(false, net::OK), |
249 }; | 266 }; |
250 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 267 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
251 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 268 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
252 EXPECT_EQ("hello world", out.response_data); | 269 EXPECT_EQ("hello world", out.response_data); |
253 } | 270 } |
254 | 271 |
255 // Allow up to 4 bytes of junk to precede status line. | 272 // Allow up to 4 bytes of junk to precede status line. |
256 TEST_F(HttpNetworkTransactionTest, StatusLineJunk2Bytes) { | 273 TEST_F(HttpNetworkTransactionTest, StatusLineJunk2Bytes) { |
257 MockRead data_reads[] = { | 274 MockRead data_reads[] = { |
258 { true, 0, "xxxHTTP/1.0 404 Not Found\nServer: blah\n\nDATA", -1 }, | 275 MockRead("xxxHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
259 { false, net::OK, NULL, 0 }, | 276 MockRead(false, net::OK), |
260 }; | 277 }; |
261 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 278 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
262 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 279 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
263 EXPECT_EQ("DATA", out.response_data); | 280 EXPECT_EQ("DATA", out.response_data); |
264 } | 281 } |
265 | 282 |
266 // Allow up to 4 bytes of junk to precede status line. | 283 // Allow up to 4 bytes of junk to precede status line. |
267 TEST_F(HttpNetworkTransactionTest, StatusLineJunk4Bytes) { | 284 TEST_F(HttpNetworkTransactionTest, StatusLineJunk4Bytes) { |
268 MockRead data_reads[] = { | 285 MockRead data_reads[] = { |
269 { true, 0, "\n\nQJHTTP/1.0 404 Not Found\nServer: blah\n\nDATA", -1 }, | 286 MockRead("\n\nQJHTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
270 { false, net::OK, NULL, 0 }, | 287 MockRead(false, net::OK), |
271 }; | 288 }; |
272 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 289 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
273 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 290 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
274 EXPECT_EQ("DATA", out.response_data); | 291 EXPECT_EQ("DATA", out.response_data); |
275 } | 292 } |
276 | 293 |
277 // Beyond 4 bytes of slop and it should fail to find a status line. | 294 // Beyond 4 bytes of slop and it should fail to find a status line. |
278 TEST_F(HttpNetworkTransactionTest, StatusLineJunk5Bytes) { | 295 TEST_F(HttpNetworkTransactionTest, StatusLineJunk5Bytes) { |
279 MockRead data_reads[] = { | 296 MockRead data_reads[] = { |
280 { true, 0, "xxxxxHTTP/1.1 404 Not Found\nServer: blah", -1 }, | 297 MockRead("xxxxxHTTP/1.1 404 Not Found\nServer: blah"), |
281 { false, net::OK, NULL, 0 }, | 298 MockRead(false, net::OK), |
282 }; | 299 }; |
283 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 300 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
284 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 301 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
285 EXPECT_EQ("xxxxxHTTP/1.1 404 Not Found\nServer: blah", out.response_data); | 302 EXPECT_EQ("xxxxxHTTP/1.1 404 Not Found\nServer: blah", out.response_data); |
286 } | 303 } |
287 | 304 |
288 // Same as StatusLineJunk4Bytes, except the read chunks are smaller. | 305 // Same as StatusLineJunk4Bytes, except the read chunks are smaller. |
289 TEST_F(HttpNetworkTransactionTest, StatusLineJunk4Bytes_Slow) { | 306 TEST_F(HttpNetworkTransactionTest, StatusLineJunk4Bytes_Slow) { |
290 MockRead data_reads[] = { | 307 MockRead data_reads[] = { |
291 { true, 0, "\n", -1 }, | 308 MockRead("\n"), |
292 { true, 0, "\n", -1 }, | 309 MockRead("\n"), |
293 { true, 0, "Q", -1 }, | 310 MockRead("Q"), |
294 { true, 0, "J", -1 }, | 311 MockRead("J"), |
295 { true, 0, "HTTP/1.0 404 Not Found\nServer: blah\n\nDATA", -1 }, | 312 MockRead("HTTP/1.0 404 Not Found\nServer: blah\n\nDATA"), |
296 { false, net::OK, NULL, 0 }, | 313 MockRead(false, net::OK), |
297 }; | 314 }; |
298 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 315 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
299 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); | 316 EXPECT_EQ("HTTP/1.0 404 Not Found", out.status_line); |
300 EXPECT_EQ("DATA", out.response_data); | 317 EXPECT_EQ("DATA", out.response_data); |
301 } | 318 } |
302 | 319 |
303 // Close the connection before enough bytes to have a status line. | 320 // Close the connection before enough bytes to have a status line. |
304 TEST_F(HttpNetworkTransactionTest, StatusLinePartial) { | 321 TEST_F(HttpNetworkTransactionTest, StatusLinePartial) { |
305 MockRead data_reads[] = { | 322 MockRead data_reads[] = { |
306 { true, 0, "HTT", -1 }, | 323 MockRead("HTT"), |
307 { false, net::OK, NULL, 0 }, | 324 MockRead(false, net::OK), |
308 }; | 325 }; |
309 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 326 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
310 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 327 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
311 EXPECT_EQ("HTT", out.response_data); | 328 EXPECT_EQ("HTT", out.response_data); |
312 } | 329 } |
313 | 330 |
314 // Simulate a 204 response, lacking a Content-Length header, sent over a | 331 // Simulate a 204 response, lacking a Content-Length header, sent over a |
315 // persistent connection. The response should still terminate since a 204 | 332 // persistent connection. The response should still terminate since a 204 |
316 // cannot have a response body. | 333 // cannot have a response body. |
317 TEST_F(HttpNetworkTransactionTest, StopsReading204) { | 334 TEST_F(HttpNetworkTransactionTest, StopsReading204) { |
318 MockRead data_reads[] = { | 335 MockRead data_reads[] = { |
319 { true, 0, "HTTP/1.1 204 No Content\r\n\r\n", -1 }, | 336 MockRead("HTTP/1.1 204 No Content\r\n\r\n"), |
320 { true, 0, "junk", -1 }, // Should not be read!! | 337 MockRead("junk"), // Should not be read!! |
321 { false, net::OK, NULL, 0 }, | 338 MockRead(false, net::OK), |
322 }; | 339 }; |
323 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 340 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
324 EXPECT_EQ("HTTP/1.1 204 No Content", out.status_line); | 341 EXPECT_EQ("HTTP/1.1 204 No Content", out.status_line); |
325 EXPECT_EQ("", out.response_data); | 342 EXPECT_EQ("", out.response_data); |
326 } | 343 } |
327 | 344 |
328 TEST_F(HttpNetworkTransactionTest, ReuseConnection) { | 345 TEST_F(HttpNetworkTransactionTest, ReuseConnection) { |
329 scoped_refptr<net::HttpNetworkSession> session = CreateSession(); | 346 scoped_refptr<net::HttpNetworkSession> session = CreateSession(); |
330 | 347 |
331 MockRead data_reads[] = { | 348 MockRead data_reads[] = { |
332 { true, 0, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n", -1 }, | 349 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
333 { true, 0, "hello", -1 }, | 350 MockRead("hello"), |
334 { true, 0, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n", -1 }, | 351 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
335 { true, 0, "world", -1 }, | 352 MockRead("world"), |
336 { false, net::OK, NULL, 0 }, | 353 MockRead(false, net::OK), |
337 }; | 354 }; |
338 MockSocket data; | 355 MockSocket data; |
339 data.connect.async = true; | |
340 data.connect.result = net::OK; | |
341 data.reads = data_reads; | 356 data.reads = data_reads; |
342 mock_sockets[0] = &data; | 357 mock_sockets[0] = &data; |
343 mock_sockets[1] = NULL; | 358 mock_sockets[1] = NULL; |
344 | 359 |
345 const char* kExpectedResponseData[] = { | 360 const char* kExpectedResponseData[] = { |
346 "hello", "world" | 361 "hello", "world" |
347 }; | 362 }; |
348 | 363 |
349 for (int i = 0; i < 2; ++i) { | 364 for (int i = 0; i < 2; ++i) { |
350 net::HttpTransaction* trans = | 365 net::HttpTransaction* trans = |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
386 CreateSession(), &mock_socket_factory); | 401 CreateSession(), &mock_socket_factory); |
387 | 402 |
388 net::HttpRequestInfo request; | 403 net::HttpRequestInfo request; |
389 request.method = "POST"; | 404 request.method = "POST"; |
390 request.url = GURL("http://www.foo.com/"); | 405 request.url = GURL("http://www.foo.com/"); |
391 request.upload_data = new net::UploadData; | 406 request.upload_data = new net::UploadData; |
392 request.upload_data->AppendBytes("foo", 3); | 407 request.upload_data->AppendBytes("foo", 3); |
393 request.load_flags = 0; | 408 request.load_flags = 0; |
394 | 409 |
395 MockRead data_reads[] = { | 410 MockRead data_reads[] = { |
396 { true, 0, "HTTP/1.0 100 Continue\r\n\r\n", -1 }, | 411 MockRead("HTTP/1.0 100 Continue\r\n\r\n"), |
397 { true, 0, "HTTP/1.0 200 OK\r\n\r\n", -1 }, | 412 MockRead("HTTP/1.0 200 OK\r\n\r\n"), |
398 { true, 0, "hello world", -1 }, | 413 MockRead("hello world"), |
399 { false, net::OK, NULL, 0 }, | 414 MockRead(false, net::OK), |
400 }; | 415 }; |
401 MockSocket data; | 416 MockSocket data; |
402 data.connect.async = true; | |
403 data.connect.result = net::OK; | |
404 data.reads = data_reads; | 417 data.reads = data_reads; |
405 mock_sockets[0] = &data; | 418 mock_sockets[0] = &data; |
406 mock_sockets[1] = NULL; | 419 mock_sockets[1] = NULL; |
407 | 420 |
408 TestCompletionCallback callback; | 421 TestCompletionCallback callback; |
409 | 422 |
410 int rv = trans->Start(&request, &callback); | 423 int rv = trans->Start(&request, &callback); |
411 EXPECT_EQ(net::ERR_IO_PENDING, rv); | 424 EXPECT_EQ(net::ERR_IO_PENDING, rv); |
412 | 425 |
413 rv = callback.WaitForResult(); | 426 rv = callback.WaitForResult(); |
(...skipping 21 matching lines...) Expand all Loading... | |
435 void HttpNetworkTransactionTest::KeepAliveConnectionResendRequestTest( | 448 void HttpNetworkTransactionTest::KeepAliveConnectionResendRequestTest( |
436 const MockRead& read_failure) { | 449 const MockRead& read_failure) { |
437 scoped_refptr<net::HttpNetworkSession> session = CreateSession(); | 450 scoped_refptr<net::HttpNetworkSession> session = CreateSession(); |
438 | 451 |
439 net::HttpRequestInfo request; | 452 net::HttpRequestInfo request; |
440 request.method = "GET"; | 453 request.method = "GET"; |
441 request.url = GURL("http://www.foo.com/"); | 454 request.url = GURL("http://www.foo.com/"); |
442 request.load_flags = 0; | 455 request.load_flags = 0; |
443 | 456 |
444 MockRead data1_reads[] = { | 457 MockRead data1_reads[] = { |
445 { true, 0, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n", -1 }, | 458 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
446 { true, 0, "hello", -1 }, | 459 MockRead("hello"), |
447 read_failure, // Now, we reuse the connection and fail the first read. | 460 read_failure, // Now, we reuse the connection and fail the first read. |
448 }; | 461 }; |
449 MockSocket data1; | 462 MockSocket data1; |
450 data1.connect.async = true; | |
451 data1.connect.result = net::OK; | |
452 data1.reads = data1_reads; | 463 data1.reads = data1_reads; |
453 mock_sockets[0] = &data1; | 464 mock_sockets[0] = &data1; |
454 | 465 |
455 MockRead data2_reads[] = { | 466 MockRead data2_reads[] = { |
456 { true, 0, "HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n", -1 }, | 467 MockRead("HTTP/1.1 200 OK\r\nContent-Length: 5\r\n\r\n"), |
457 { true, 0, "world", -1 }, | 468 MockRead("world"), |
458 { true, net::OK, NULL, 0 }, | 469 MockRead(true, net::OK), |
459 }; | 470 }; |
460 MockSocket data2; | 471 MockSocket data2; |
461 data2.connect.async = true; | |
462 data2.connect.result = net::OK; | |
463 data2.reads = data2_reads; | 472 data2.reads = data2_reads; |
464 mock_sockets[1] = &data2; | 473 mock_sockets[1] = &data2; |
465 | 474 |
466 const char* kExpectedResponseData[] = { | 475 const char* kExpectedResponseData[] = { |
467 "hello", "world" | 476 "hello", "world" |
468 }; | 477 }; |
469 | 478 |
470 for (int i = 0; i < 2; ++i) { | 479 for (int i = 0; i < 2; ++i) { |
471 TestCompletionCallback callback; | 480 TestCompletionCallback callback; |
472 | 481 |
(...skipping 18 matching lines...) Expand all Loading... | |
491 EXPECT_EQ(kExpectedResponseData[i], response_data); | 500 EXPECT_EQ(kExpectedResponseData[i], response_data); |
492 | 501 |
493 trans->Destroy(); | 502 trans->Destroy(); |
494 | 503 |
495 // Empty the current queue. | 504 // Empty the current queue. |
496 MessageLoop::current()->RunAllPending(); | 505 MessageLoop::current()->RunAllPending(); |
497 } | 506 } |
498 } | 507 } |
499 | 508 |
500 TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionReset) { | 509 TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionReset) { |
501 MockRead read_failure = { true, net::ERR_CONNECTION_RESET, NULL, 0 }; | 510 MockRead read_failure(true, net::ERR_CONNECTION_RESET); |
502 KeepAliveConnectionResendRequestTest(read_failure); | 511 KeepAliveConnectionResendRequestTest(read_failure); |
503 } | 512 } |
504 | 513 |
505 TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionEOF) { | 514 TEST_F(HttpNetworkTransactionTest, KeepAliveConnectionEOF) { |
506 MockRead read_failure = { false, net::OK, NULL, 0 }; // EOF | 515 MockRead read_failure(false, net::OK); // EOF |
507 KeepAliveConnectionResendRequestTest(read_failure); | 516 KeepAliveConnectionResendRequestTest(read_failure); |
508 } | 517 } |
509 | 518 |
510 TEST_F(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { | 519 TEST_F(HttpNetworkTransactionTest, NonKeepAliveConnectionReset) { |
511 net::HttpTransaction* trans = new net::HttpNetworkTransaction( | 520 net::HttpTransaction* trans = new net::HttpNetworkTransaction( |
512 CreateSession(), &mock_socket_factory); | 521 CreateSession(), &mock_socket_factory); |
513 | 522 |
514 net::HttpRequestInfo request; | 523 net::HttpRequestInfo request; |
515 request.method = "GET"; | 524 request.method = "GET"; |
516 request.url = GURL("http://www.google.com/"); | 525 request.url = GURL("http://www.google.com/"); |
517 request.load_flags = 0; | 526 request.load_flags = 0; |
518 | 527 |
519 MockRead data_reads[] = { | 528 MockRead data_reads[] = { |
520 { true, net::ERR_CONNECTION_RESET, NULL, 0 }, | 529 MockRead(true, net::ERR_CONNECTION_RESET), |
521 { true, 0, "HTTP/1.0 200 OK\r\n\r\n", -1 }, // Should not be used | 530 MockRead("HTTP/1.0 200 OK\r\n\r\n"), // Should not be used |
522 { true, 0, "hello world", -1 }, | 531 MockRead("hello world"), |
523 { false, net::OK, NULL, 0 }, | 532 MockRead(false, net::OK), |
524 }; | 533 }; |
525 MockSocket data; | 534 MockSocket data; |
526 data.connect.async = true; | |
527 data.connect.result = net::OK; | |
528 data.reads = data_reads; | 535 data.reads = data_reads; |
529 mock_sockets[0] = &data; | 536 mock_sockets[0] = &data; |
530 mock_sockets[1] = NULL; | 537 mock_sockets[1] = NULL; |
531 | 538 |
532 TestCompletionCallback callback; | 539 TestCompletionCallback callback; |
533 | 540 |
534 int rv = trans->Start(&request, &callback); | 541 int rv = trans->Start(&request, &callback); |
535 EXPECT_EQ(net::ERR_IO_PENDING, rv); | 542 EXPECT_EQ(net::ERR_IO_PENDING, rv); |
536 | 543 |
537 rv = callback.WaitForResult(); | 544 rv = callback.WaitForResult(); |
(...skipping 12 matching lines...) Expand all Loading... | |
550 // connection without sending any response header or body? | 557 // connection without sending any response header or body? |
551 // | 558 // |
552 // IE7: error page | 559 // IE7: error page |
553 // Safari 3.1.2 (Windows): error page | 560 // Safari 3.1.2 (Windows): error page |
554 // Firefox 3.0.1: blank page | 561 // Firefox 3.0.1: blank page |
555 // Opera 9.52: after five attempts, blank page | 562 // Opera 9.52: after five attempts, blank page |
556 // Us with WinHTTP: error page (net::ERR_INVALID_RESPONSE) | 563 // Us with WinHTTP: error page (net::ERR_INVALID_RESPONSE) |
557 // Us: blank page | 564 // Us: blank page |
558 TEST_F(HttpNetworkTransactionTest, NonKeepAliveConnectionEOF) { | 565 TEST_F(HttpNetworkTransactionTest, NonKeepAliveConnectionEOF) { |
559 MockRead data_reads[] = { | 566 MockRead data_reads[] = { |
560 { false, net::OK, NULL, 0 }, // EOF | 567 MockRead(false, net::OK), // EOF |
561 { true, 0, "HTTP/1.0 200 OK\r\n\r\n", -1 }, // Should not be used | 568 MockRead("HTTP/1.0 200 OK\r\n\r\n"), // Should not be used |
562 { true, 0, "hello world", -1 }, | 569 MockRead("hello world"), |
563 { false, net::OK, NULL, 0 }, | 570 MockRead(false, net::OK), |
564 }; | 571 }; |
565 SimpleGetHelperResult out = SimpleGetHelper(data_reads); | 572 SimpleGetHelperResult out = SimpleGetHelper(data_reads); |
566 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); | 573 EXPECT_EQ("HTTP/0.9 200 OK", out.status_line); |
567 EXPECT_EQ("", out.response_data); | 574 EXPECT_EQ("", out.response_data); |
568 } | 575 } |
OLD | NEW |