| 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 "content/browser/renderer_host/resource_dispatcher_host_impl.h" | 5 #include "content/browser/renderer_host/resource_dispatcher_host_impl.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 68 } | 68 } |
| 69 | 69 |
| 70 } // namespace | 70 } // namespace |
| 71 | 71 |
| 72 static int RequestIDForMessage(const IPC::Message& msg) { | 72 static int RequestIDForMessage(const IPC::Message& msg) { |
| 73 int request_id = -1; | 73 int request_id = -1; |
| 74 switch (msg.type()) { | 74 switch (msg.type()) { |
| 75 case ResourceMsg_UploadProgress::ID: | 75 case ResourceMsg_UploadProgress::ID: |
| 76 case ResourceMsg_ReceivedResponse::ID: | 76 case ResourceMsg_ReceivedResponse::ID: |
| 77 case ResourceMsg_ReceivedRedirect::ID: | 77 case ResourceMsg_ReceivedRedirect::ID: |
| 78 case ResourceMsg_SetDataBuffer::ID: |
| 78 case ResourceMsg_DataReceived::ID: | 79 case ResourceMsg_DataReceived::ID: |
| 79 case ResourceMsg_RequestComplete::ID: | 80 case ResourceMsg_RequestComplete::ID: |
| 80 request_id = IPC::MessageIterator(msg).NextInt(); | 81 request_id = IPC::MessageIterator(msg).NextInt(); |
| 81 break; | 82 break; |
| 82 } | 83 } |
| 83 return request_id; | 84 return request_id; |
| 84 } | 85 } |
| 85 | 86 |
| 86 static ResourceHostMsg_Request CreateResourceRequest( | 87 static ResourceHostMsg_Request CreateResourceRequest( |
| 87 const char* method, | 88 const char* method, |
| (...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 689 net::URLRequest* req = host_.GetURLRequest(gid); | 690 net::URLRequest* req = host_.GetURLRequest(gid); |
| 690 EXPECT_TRUE(req); | 691 EXPECT_TRUE(req); |
| 691 if (req) | 692 if (req) |
| 692 URLRequestTestDelayedStartJob::CompleteStart(req); | 693 URLRequestTestDelayedStartJob::CompleteStart(req); |
| 693 } | 694 } |
| 694 | 695 |
| 695 void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages, | 696 void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages, |
| 696 const std::string& reference_data) { | 697 const std::string& reference_data) { |
| 697 // A successful request will have received 4 messages: | 698 // A successful request will have received 4 messages: |
| 698 // ReceivedResponse (indicates headers received) | 699 // ReceivedResponse (indicates headers received) |
| 699 // DataReceived (data) | 700 // SetDataBuffer (contains shared memory handle) |
| 700 // XXX DataReceived (0 bytes remaining from a read) | 701 // DataReceived (data offset and length into shared memory) |
| 701 // RequestComplete (request is done) | 702 // RequestComplete (request is done) |
| 702 // | 703 // |
| 703 // This function verifies that we received 4 messages and that they | 704 // This function verifies that we received 4 messages and that they |
| 704 // are appropriate. | 705 // are appropriate. |
| 705 ASSERT_EQ(3U, messages.size()); | 706 ASSERT_EQ(4U, messages.size()); |
| 706 | 707 |
| 707 // The first messages should be received response | 708 // The first messages should be received response |
| 708 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type()); | 709 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type()); |
| 709 | 710 |
| 710 // followed by the data, currently we only do the data in one chunk, but | 711 ASSERT_EQ(ResourceMsg_SetDataBuffer::ID, messages[1].type()); |
| 711 // should probably test multiple chunks later | |
| 712 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[1].type()); | |
| 713 | 712 |
| 714 PickleIterator iter(messages[1]); | 713 PickleIterator iter(messages[1]); |
| 715 int request_id; | 714 int request_id; |
| 716 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &request_id)); | 715 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &request_id)); |
| 717 base::SharedMemoryHandle shm_handle; | 716 base::SharedMemoryHandle shm_handle; |
| 718 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_handle)); | 717 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_handle)); |
| 719 uint32 data_len; | 718 int shm_size; |
| 720 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &data_len)); | 719 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_size)); |
| 721 | 720 |
| 722 ASSERT_EQ(reference_data.size(), data_len); | 721 // Followed by the data, currently we only do the data in one chunk, but |
| 722 // should probably test multiple chunks later |
| 723 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2].type()); |
| 724 |
| 725 PickleIterator iter2(messages[2]); |
| 726 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &request_id)); |
| 727 int data_offset; |
| 728 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &data_offset)); |
| 729 int data_length; |
| 730 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &data_length)); |
| 731 |
| 732 ASSERT_EQ(reference_data.size(), static_cast<size_t>(data_length)); |
| 733 ASSERT_GE(shm_size, data_length); |
| 734 |
| 723 base::SharedMemory shared_mem(shm_handle, true); // read only | 735 base::SharedMemory shared_mem(shm_handle, true); // read only |
| 724 shared_mem.Map(data_len); | 736 shared_mem.Map(data_length); |
| 725 const char* data = static_cast<char*>(shared_mem.memory()); | 737 const char* data = static_cast<char*>(shared_mem.memory()) + data_offset; |
| 726 ASSERT_EQ(0, memcmp(reference_data.c_str(), data, data_len)); | 738 ASSERT_EQ(0, memcmp(reference_data.c_str(), data, data_length)); |
| 727 | 739 |
| 728 // followed by a 0-byte read | 740 // The last message should be all data received. |
| 729 //ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2].type()); | 741 ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[3].type()); |
| 730 | |
| 731 // the last message should be all data received | |
| 732 ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[2].type()); | |
| 733 } | 742 } |
| 734 | 743 |
| 735 // Tests whether many messages get dispatched properly. | 744 // Tests whether many messages get dispatched properly. |
| 736 TEST_F(ResourceDispatcherHostTest, TestMany) { | 745 TEST_F(ResourceDispatcherHostTest, TestMany) { |
| 737 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); | 746 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 738 | 747 |
| 739 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); | 748 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); |
| 740 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2()); | 749 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2()); |
| 741 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3()); | 750 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3()); |
| 742 | 751 |
| (...skipping 969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1712 HandleScheme("big-job"); | 1721 HandleScheme("big-job"); |
| 1713 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); | 1722 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); |
| 1714 | 1723 |
| 1715 // Sort all the messages we saw by request. | 1724 // Sort all the messages we saw by request. |
| 1716 ResourceIPCAccumulator::ClassifiedMessages msgs; | 1725 ResourceIPCAccumulator::ClassifiedMessages msgs; |
| 1717 accum_.GetClassifiedMessages(&msgs); | 1726 accum_.GetClassifiedMessages(&msgs); |
| 1718 | 1727 |
| 1719 size_t size = msgs[0].size(); | 1728 size_t size = msgs[0].size(); |
| 1720 | 1729 |
| 1721 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); | 1730 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); |
| 1722 for (size_t i = 1; i < size - 1; ++i) | 1731 EXPECT_EQ(ResourceMsg_SetDataBuffer::ID, msgs[0][1].type()); |
| 1732 for (size_t i = 2; i < size - 1; ++i) |
| 1723 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); | 1733 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); |
| 1724 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][size - 1].type()); | 1734 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][size - 1].type()); |
| 1725 } | 1735 } |
| 1726 | 1736 |
| 1727 TEST_F(ResourceDispatcherHostTest, DelayedDataReceivedACKs) { | 1737 TEST_F(ResourceDispatcherHostTest, DelayedDataReceivedACKs) { |
| 1728 EXPECT_EQ(0, host_.pending_requests()); | 1738 EXPECT_EQ(0, host_.pending_requests()); |
| 1729 | 1739 |
| 1730 HandleScheme("big-job"); | 1740 HandleScheme("big-job"); |
| 1731 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); | 1741 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); |
| 1732 | 1742 |
| 1733 // Sort all the messages we saw by request. | 1743 // Sort all the messages we saw by request. |
| 1734 ResourceIPCAccumulator::ClassifiedMessages msgs; | 1744 ResourceIPCAccumulator::ClassifiedMessages msgs; |
| 1735 accum_.GetClassifiedMessages(&msgs); | 1745 accum_.GetClassifiedMessages(&msgs); |
| 1736 | 1746 |
| 1737 // We expect 1x ReceivedResponse + Nx ReceivedData messages. | 1747 // We expect 1x ReceivedResponse, 1x SetDataBuffer, Nx ReceivedData messages. |
| 1738 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); | 1748 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); |
| 1739 for (size_t i = 1; i < msgs[0].size(); ++i) | 1749 EXPECT_EQ(ResourceMsg_SetDataBuffer::ID, msgs[0][1].type()); |
| 1750 for (size_t i = 2; i < msgs[0].size(); ++i) |
| 1740 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); | 1751 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); |
| 1741 | 1752 |
| 1742 // NOTE: If we fail the above checks then it means that we probably didn't | 1753 // NOTE: If we fail the above checks then it means that we probably didn't |
| 1743 // load a big enough response to trigger the delay mechanism we are trying to | 1754 // load a big enough response to trigger the delay mechanism we are trying to |
| 1744 // test! | 1755 // test! |
| 1745 | 1756 |
| 1746 msgs[0].erase(msgs[0].begin()); | 1757 msgs[0].erase(msgs[0].begin()); |
| 1758 msgs[0].erase(msgs[0].begin()); |
| 1747 | 1759 |
| 1748 // ACK all DataReceived messages until we find a RequestComplete message. | 1760 // ACK all DataReceived messages until we find a RequestComplete message. |
| 1749 bool complete = false; | 1761 bool complete = false; |
| 1750 while (!complete) { | 1762 while (!complete) { |
| 1751 for (size_t i = 0; i < msgs[0].size(); ++i) { | 1763 for (size_t i = 0; i < msgs[0].size(); ++i) { |
| 1752 if (msgs[0][i].type() == ResourceMsg_RequestComplete::ID) { | 1764 if (msgs[0][i].type() == ResourceMsg_RequestComplete::ID) { |
| 1753 complete = true; | 1765 complete = true; |
| 1754 break; | 1766 break; |
| 1755 } | 1767 } |
| 1756 | 1768 |
| 1757 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); | 1769 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); |
| 1758 | 1770 |
| 1759 ResourceHostMsg_DataReceived_ACK msg(0, 1); | 1771 ResourceHostMsg_DataReceived_ACK msg(0, 1); |
| 1760 bool msg_was_ok; | 1772 bool msg_was_ok; |
| 1761 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok); | 1773 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok); |
| 1762 } | 1774 } |
| 1763 | 1775 |
| 1764 MessageLoop::current()->RunAllPending(); | 1776 MessageLoop::current()->RunAllPending(); |
| 1765 | 1777 |
| 1766 msgs.clear(); | 1778 msgs.clear(); |
| 1767 accum_.GetClassifiedMessages(&msgs); | 1779 accum_.GetClassifiedMessages(&msgs); |
| 1768 } | 1780 } |
| 1769 } | 1781 } |
| 1770 | 1782 |
| 1771 } // namespace content | 1783 } // namespace content |
| OLD | NEW |