OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <vector> | 8 #include <vector> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/bind_helpers.h" | 11 #include "base/bind_helpers.h" |
12 #include "base/file_util.h" | 12 #include "base/file_util.h" |
13 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
14 #include "base/memory/scoped_ptr.h" | |
14 #include "base/memory/scoped_vector.h" | 15 #include "base/memory/scoped_vector.h" |
15 #include "net/base/auth.h" | 16 #include "net/base/auth.h" |
17 #include "net/base/io_buffer.h" | |
16 #include "net/base/net_log_unittest.h" | 18 #include "net/base/net_log_unittest.h" |
19 #include "net/base/test_data_stream.h" | |
17 #include "net/base/upload_bytes_element_reader.h" | 20 #include "net/base/upload_bytes_element_reader.h" |
18 #include "net/base/upload_data_stream.h" | 21 #include "net/base/upload_data_stream.h" |
19 #include "net/base/upload_file_element_reader.h" | 22 #include "net/base/upload_file_element_reader.h" |
20 #include "net/http/http_network_session_peer.h" | 23 #include "net/http/http_network_session_peer.h" |
21 #include "net/http/http_transaction_unittest.h" | 24 #include "net/http/http_transaction_unittest.h" |
22 #include "net/socket/client_socket_pool_base.h" | 25 #include "net/socket/client_socket_pool_base.h" |
23 #include "net/spdy/buffered_spdy_framer.h" | 26 #include "net/spdy/buffered_spdy_framer.h" |
24 #include "net/spdy/spdy_http_stream.h" | 27 #include "net/spdy/spdy_http_stream.h" |
25 #include "net/spdy/spdy_http_utils.h" | 28 #include "net/spdy/spdy_http_utils.h" |
26 #include "net/spdy/spdy_session.h" | 29 #include "net/spdy/spdy_session.h" |
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1039 TestCompletionCallback callback1; | 1042 TestCompletionCallback callback1; |
1040 TestCompletionCallback callback2; | 1043 TestCompletionCallback callback2; |
1041 TestCompletionCallback callback3; | 1044 TestCompletionCallback callback3; |
1042 | 1045 |
1043 HttpRequestInfo httpreq1 = CreateGetRequest(); | 1046 HttpRequestInfo httpreq1 = CreateGetRequest(); |
1044 HttpRequestInfo httpreq2 = CreateGetRequest(); | 1047 HttpRequestInfo httpreq2 = CreateGetRequest(); |
1045 HttpRequestInfo httpreq3 = CreateGetRequest(); | 1048 HttpRequestInfo httpreq3 = CreateGetRequest(); |
1046 | 1049 |
1047 out.rv = trans1->Start(&httpreq1, callback1.callback(), log); | 1050 out.rv = trans1->Start(&httpreq1, callback1.callback(), log); |
1048 ASSERT_EQ(out.rv, ERR_IO_PENDING); | 1051 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
1049 // run transaction 1 through quickly to force a read of our SETTINGS | 1052 // Run transaction 1 through quickly to force a read of our SETTINGS |
1050 // frame | 1053 // frame. |
1051 out.rv = callback1.WaitForResult(); | 1054 out.rv = callback1.WaitForResult(); |
1052 ASSERT_EQ(OK, out.rv); | 1055 ASSERT_EQ(OK, out.rv); |
1053 | 1056 |
1054 out.rv = trans2->Start(&httpreq2, callback2.callback(), log); | 1057 out.rv = trans2->Start(&httpreq2, callback2.callback(), log); |
1055 ASSERT_EQ(out.rv, ERR_IO_PENDING); | 1058 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
1056 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); | 1059 out.rv = trans3->Start(&httpreq3, callback3.callback(), log); |
1057 ASSERT_EQ(out.rv, ERR_IO_PENDING); | 1060 ASSERT_EQ(out.rv, ERR_IO_PENDING); |
1058 out.rv = callback2.WaitForResult(); | 1061 out.rv = callback2.WaitForResult(); |
1059 ASSERT_EQ(OK, out.rv); | 1062 ASSERT_EQ(OK, out.rv); |
1060 EXPECT_EQ(7U, data.read_index()); // i.e. the third trans was queued | 1063 EXPECT_EQ(7U, data.read_index()); // i.e. the third trans was queued |
(...skipping 3436 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4497 MessageLoop::current()->RunUntilIdle(); | 4500 MessageLoop::current()->RunUntilIdle(); |
4498 | 4501 |
4499 // Verify that we consumed all test data. | 4502 // Verify that we consumed all test data. |
4500 helper.VerifyDataConsumed(); | 4503 helper.VerifyDataConsumed(); |
4501 | 4504 |
4502 EXPECT_EQ(OK, out.rv); | 4505 EXPECT_EQ(OK, out.rv); |
4503 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | 4506 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); |
4504 EXPECT_EQ("messagemessagemessagemessage", out.response_data); | 4507 EXPECT_EQ("messagemessagemessagemessage", out.response_data); |
4505 } | 4508 } |
4506 | 4509 |
4510 // Verify the case where SpdySession reads all the data synchronously without | |
4511 // yielding. | |
Ryan Hamilton
2013/01/19 00:32:13
How does this test verify that the session yields?
ramant (doing other things)
2013/02/04 18:30:46
With out DeterminsticSocketData changes and TaskOb
| |
4512 TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedSyncRead) { | |
4513 BufferedSpdyFramer framer(3, false); | |
4514 | |
4515 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | |
4516 MockWrite writes[] = { CreateMockWrite(*req) }; | |
4517 | |
4518 scoped_ptr<SpdyFrame> syn_reply( | |
4519 ConstructSpdyGetSynReply(NULL, 0, 1)); | |
4520 syn_reply->set_flags(CONTROL_FLAG_NONE); // Turn off FIN bit. | |
4521 | |
4522 const int kPayloadSize = 1600; | |
4523 net::TestDataStream test_stream; | |
Ryan Hamilton
2013/01/19 00:32:13
nit: no need for test::, I think. (And in the nex
ramant (doing other things)
2013/02/04 18:30:46
Made all these changes in SpdySession unit tests.
| |
4524 scoped_refptr<net::IOBuffer> payload(new net::IOBuffer(kPayloadSize)); | |
4525 test_stream.GetBytes(payload->data(), kPayloadSize); | |
4526 char* payload_data = payload->data(); | |
Ryan Hamilton
2013/01/19 00:32:13
nit: move this line above the previous, and use pa
ramant (doing other things)
2013/02/04 18:30:46
Made all these changes in SpdySession unit tests.
| |
4527 std::string payload_content(payload_data, kPayloadSize); | |
4528 scoped_ptr<SpdyFrame> data_frame( | |
4529 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_FIN)); | |
4530 const SpdyFrame* frames[2] = { | |
4531 syn_reply.get(), | |
4532 data_frame.get() | |
4533 }; | |
4534 char combined_frames[5000]; | |
4535 int combined_frames_len = | |
4536 CombineFrames(frames, arraysize(frames), | |
4537 combined_frames, arraysize(combined_frames)); | |
4538 | |
4539 MockRead reads[] = { | |
4540 MockRead(ASYNC, combined_frames, combined_frames_len), | |
4541 MockRead(ASYNC, 0, 0) // EOF | |
4542 }; | |
4543 | |
4544 DelayedSocketData data(1, reads, arraysize(reads), | |
4545 writes, arraysize(writes)); | |
4546 | |
4547 NormalSpdyTransactionHelper helper(CreateGetRequest(), | |
4548 BoundNetLog(), GetParam(), NULL); | |
4549 helper.RunPreTestSetup(); | |
4550 helper.AddData(&data); | |
4551 HttpNetworkTransaction* trans = helper.trans(); | |
4552 | |
4553 TestCompletionCallback callback; | |
4554 int rv = trans->Start( | |
4555 &CreateGetRequest(), callback.callback(), BoundNetLog()); | |
4556 EXPECT_EQ(ERR_IO_PENDING, rv); | |
4557 | |
4558 TransactionHelperResult out = helper.output(); | |
4559 out.rv = callback.WaitForResult(); | |
4560 EXPECT_EQ(out.rv, OK); | |
4561 | |
4562 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
4563 EXPECT_TRUE(response->headers != NULL); | |
4564 EXPECT_TRUE(response->was_fetched_via_spdy); | |
4565 out.status_line = response->headers->GetStatusLine(); | |
4566 out.response_info = *response; // Make a copy so we can verify. | |
4567 | |
4568 // Read Data. | |
4569 TestCompletionCallback read_callback; | |
4570 | |
4571 std::string content; | |
4572 int reads_completed = 0; | |
4573 do { | |
4574 // Read data in chunks. | |
4575 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kPayloadSize)); | |
4576 rv = trans->Read(buf, kPayloadSize, read_callback.callback()); | |
Ryan Hamilton
2013/01/19 00:32:13
nit: I would just do ASSERT_LE(0, rv);
ramant (doing other things)
2013/02/04 18:30:46
Deleted this test.
| |
4577 if (rv > 0) { | |
4578 content.append(buf->data(), rv); | |
4579 } else if (rv < 0) { | |
4580 FAIL() << "Unexpected read error: " << rv; | |
4581 } | |
4582 reads_completed++; | |
4583 } while (rv > 0); | |
4584 | |
4585 out.response_data.swap(content); | |
4586 | |
4587 // Flush the MessageLoop while the SpdySessionDependencies (in particular, the | |
4588 // MockClientSocketFactory) are still alive. | |
4589 MessageLoop::current()->RunUntilIdle(); | |
Ryan Hamilton
2013/01/19 00:32:13
Can you do this as the last thing line in this tes
ramant (doing other things)
2013/02/04 18:30:46
Deleted this test.
| |
4590 | |
4591 // Verify that we consumed all test data. | |
4592 helper.VerifyDataConsumed(); | |
4593 | |
4594 EXPECT_EQ(OK, out.rv); | |
4595 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | |
4596 EXPECT_EQ(payload_content, out.response_data); | |
4597 } | |
4598 | |
4599 // Verify the case where SpdySession reads kMaxReadBytes data synchronously and | |
4600 // then reads more data after yielding. | |
Ryan Hamilton
2013/01/19 00:32:13
I don't think I see how this shows that the sessio
ramant (doing other things)
2013/02/04 18:30:46
Wrote the new unit tests.
| |
4601 TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedASyncRead) { | |
4602 BufferedSpdyFramer framer(3, false); | |
4603 | |
4604 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | |
4605 MockWrite writes[] = { CreateMockWrite(*req) }; | |
4606 | |
4607 scoped_ptr<SpdyFrame> syn_reply( | |
4608 ConstructSpdyGetSynReply(NULL, 0, 1)); | |
4609 syn_reply->set_flags(CONTROL_FLAG_NONE); // Turn off FIN bit. | |
4610 | |
4611 const int kPayloadSize = kMaxReadBytes * 2; | |
4612 net::TestDataStream test_stream; | |
4613 scoped_refptr<net::IOBuffer> payload(new net::IOBuffer(kPayloadSize)); | |
4614 test_stream.GetBytes(payload->data(), kPayloadSize); | |
4615 char* payload_data = payload->data(); | |
4616 std::string payload_content(payload_data, kPayloadSize); | |
4617 scoped_ptr<SpdyFrame> data_frame( | |
4618 framer.CreateDataFrame(1, payload_data, kPayloadSize, DATA_FLAG_FIN)); | |
4619 const SpdyFrame* frames[2] = { | |
4620 syn_reply.get(), | |
4621 data_frame.get() | |
4622 }; | |
4623 int heap_size = kPayloadSize * 2; | |
4624 scoped_ptr<char, base::FreeDeleter> | |
4625 combined_frames(static_cast<char*>(malloc(heap_size))); | |
4626 CHECK(combined_frames.get()); | |
4627 int combined_frames_len = | |
4628 CombineFrames(frames, arraysize(frames), | |
4629 combined_frames.get(), heap_size); | |
4630 | |
4631 MockRead reads[] = { | |
4632 MockRead(ASYNC, combined_frames.get(), combined_frames_len), | |
4633 MockRead(ASYNC, 0, 0) // EOF | |
4634 }; | |
4635 | |
4636 DelayedSocketData data(1, reads, arraysize(reads), | |
4637 writes, arraysize(writes)); | |
4638 | |
4639 NormalSpdyTransactionHelper helper(CreateGetRequest(), | |
4640 BoundNetLog(), GetParam(), NULL); | |
4641 helper.RunPreTestSetup(); | |
4642 helper.AddData(&data); | |
4643 HttpNetworkTransaction* trans = helper.trans(); | |
4644 | |
4645 TestCompletionCallback callback; | |
4646 int rv = trans->Start( | |
4647 &CreateGetRequest(), callback.callback(), BoundNetLog()); | |
4648 EXPECT_EQ(ERR_IO_PENDING, rv); | |
4649 | |
4650 TransactionHelperResult out = helper.output(); | |
4651 out.rv = callback.WaitForResult(); | |
4652 EXPECT_EQ(out.rv, OK); | |
4653 | |
4654 const HttpResponseInfo* response = trans->GetResponseInfo(); | |
4655 EXPECT_TRUE(response->headers != NULL); | |
4656 EXPECT_TRUE(response->was_fetched_via_spdy); | |
4657 out.status_line = response->headers->GetStatusLine(); | |
4658 out.response_info = *response; // Make a copy so we can verify. | |
4659 | |
4660 // Read Data. | |
4661 TestCompletionCallback read_callback; | |
4662 | |
4663 std::string content; | |
4664 int reads_completed = 0; | |
4665 do { | |
4666 // Read data in chunks. | |
4667 scoped_refptr<net::IOBuffer> buf(new net::IOBuffer(kMaxReadBytes)); | |
4668 rv = trans->Read(buf, kMaxReadBytes, read_callback.callback()); | |
4669 if (rv > 0) { | |
4670 content.append(buf->data(), rv); | |
4671 } else if (rv < 0) { | |
4672 FAIL() << "Unexpected read error: " << rv; | |
4673 } | |
4674 reads_completed++; | |
4675 } while (rv > 0); | |
4676 | |
4677 out.response_data.swap(content); | |
4678 | |
4679 // Flush the MessageLoop while the SpdySessionDependencies (in particular, the | |
4680 // MockClientSocketFactory) are still alive. | |
4681 MessageLoop::current()->RunUntilIdle(); | |
4682 | |
4683 // Verify that we consumed all test data. | |
4684 helper.VerifyDataConsumed(); | |
4685 | |
4686 EXPECT_EQ(OK, out.rv); | |
4687 EXPECT_EQ("HTTP/1.1 200 OK", out.status_line); | |
4688 EXPECT_EQ(payload_content, out.response_data); | |
4689 } | |
4690 | |
4507 // Verify the case where we buffer data and close the connection. | 4691 // Verify the case where we buffer data and close the connection. |
4508 TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedClosed) { | 4692 TEST_P(SpdyNetworkTransactionSpdy3Test, BufferedClosed) { |
4509 BufferedSpdyFramer framer(3, false); | 4693 BufferedSpdyFramer framer(3, false); |
4510 | 4694 |
4511 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); | 4695 scoped_ptr<SpdyFrame> req(ConstructSpdyGet(NULL, 0, false, 1, LOWEST)); |
4512 MockWrite writes[] = { CreateMockWrite(*req) }; | 4696 MockWrite writes[] = { CreateMockWrite(*req) }; |
4513 | 4697 |
4514 // All data frames in a single read. | 4698 // All data frames in a single read. |
4515 // NOTE: We don't FIN the stream. | 4699 // NOTE: We don't FIN the stream. |
4516 scoped_ptr<SpdyFrame> data_frame( | 4700 scoped_ptr<SpdyFrame> data_frame( |
(...skipping 1840 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
6357 // And now we can allow everything else to run to completion. | 6541 // And now we can allow everything else to run to completion. |
6358 data.SetStop(10); | 6542 data.SetStop(10); |
6359 data.Run(); | 6543 data.Run(); |
6360 EXPECT_EQ(OK, callback2.WaitForResult()); | 6544 EXPECT_EQ(OK, callback2.WaitForResult()); |
6361 EXPECT_EQ(OK, callback3.WaitForResult()); | 6545 EXPECT_EQ(OK, callback3.WaitForResult()); |
6362 | 6546 |
6363 helper.VerifyDataConsumed(); | 6547 helper.VerifyDataConsumed(); |
6364 } | 6548 } |
6365 | 6549 |
6366 } // namespace net | 6550 } // namespace net |
OLD | NEW |