| 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 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 729 net::URLRequest* req = host_.GetURLRequest(gid); | 730 net::URLRequest* req = host_.GetURLRequest(gid); |
| 730 EXPECT_TRUE(req); | 731 EXPECT_TRUE(req); |
| 731 if (req) | 732 if (req) |
| 732 URLRequestTestDelayedStartJob::CompleteStart(req); | 733 URLRequestTestDelayedStartJob::CompleteStart(req); |
| 733 } | 734 } |
| 734 | 735 |
| 735 void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages, | 736 void CheckSuccessfulRequest(const std::vector<IPC::Message>& messages, |
| 736 const std::string& reference_data) { | 737 const std::string& reference_data) { |
| 737 // A successful request will have received 4 messages: | 738 // A successful request will have received 4 messages: |
| 738 // ReceivedResponse (indicates headers received) | 739 // ReceivedResponse (indicates headers received) |
| 739 // DataReceived (data) | 740 // SetDataBuffer (contains shared memory handle) |
| 740 // XXX DataReceived (0 bytes remaining from a read) | 741 // DataReceived (data offset and length into shared memory) |
| 741 // RequestComplete (request is done) | 742 // RequestComplete (request is done) |
| 742 // | 743 // |
| 743 // This function verifies that we received 4 messages and that they | 744 // This function verifies that we received 4 messages and that they |
| 744 // are appropriate. | 745 // are appropriate. |
| 745 ASSERT_EQ(3U, messages.size()); | 746 ASSERT_EQ(4U, messages.size()); |
| 746 | 747 |
| 747 // The first messages should be received response | 748 // The first messages should be received response |
| 748 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type()); | 749 ASSERT_EQ(ResourceMsg_ReceivedResponse::ID, messages[0].type()); |
| 749 | 750 |
| 750 // followed by the data, currently we only do the data in one chunk, but | 751 ASSERT_EQ(ResourceMsg_SetDataBuffer::ID, messages[1].type()); |
| 751 // should probably test multiple chunks later | |
| 752 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[1].type()); | |
| 753 | 752 |
| 754 PickleIterator iter(messages[1]); | 753 PickleIterator iter(messages[1]); |
| 755 int request_id; | 754 int request_id; |
| 756 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &request_id)); | 755 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &request_id)); |
| 757 base::SharedMemoryHandle shm_handle; | 756 base::SharedMemoryHandle shm_handle; |
| 758 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_handle)); | 757 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_handle)); |
| 759 uint32 data_len; | 758 int shm_size; |
| 760 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &data_len)); | 759 ASSERT_TRUE(IPC::ReadParam(&messages[1], &iter, &shm_size)); |
| 761 | 760 |
| 762 ASSERT_EQ(reference_data.size(), data_len); | 761 // Followed by the data, currently we only do the data in one chunk, but |
| 762 // should probably test multiple chunks later |
| 763 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2].type()); |
| 764 |
| 765 PickleIterator iter2(messages[2]); |
| 766 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &request_id)); |
| 767 int data_offset; |
| 768 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &data_offset)); |
| 769 int data_length; |
| 770 ASSERT_TRUE(IPC::ReadParam(&messages[2], &iter2, &data_length)); |
| 771 |
| 772 ASSERT_EQ(reference_data.size(), static_cast<size_t>(data_length)); |
| 773 ASSERT_GE(shm_size, data_length); |
| 774 |
| 763 base::SharedMemory shared_mem(shm_handle, true); // read only | 775 base::SharedMemory shared_mem(shm_handle, true); // read only |
| 764 shared_mem.Map(data_len); | 776 shared_mem.Map(data_length); |
| 765 const char* data = static_cast<char*>(shared_mem.memory()); | 777 const char* data = static_cast<char*>(shared_mem.memory()) + data_offset; |
| 766 ASSERT_EQ(0, memcmp(reference_data.c_str(), data, data_len)); | 778 ASSERT_EQ(0, memcmp(reference_data.c_str(), data, data_length)); |
| 767 | 779 |
| 768 // followed by a 0-byte read | 780 // The last message should be all data received. |
| 769 //ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2].type()); | 781 ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[3].type()); |
| 770 | |
| 771 // the last message should be all data received | |
| 772 ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[2].type()); | |
| 773 } | 782 } |
| 774 | 783 |
| 775 // Tests whether many messages get dispatched properly. | 784 // Tests whether many messages get dispatched properly. |
| 776 TEST_F(ResourceDispatcherHostTest, TestMany) { | 785 TEST_F(ResourceDispatcherHostTest, TestMany) { |
| 777 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); | 786 EXPECT_EQ(0, host_.GetOutstandingRequestsMemoryCost(0)); |
| 778 | 787 |
| 779 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); | 788 MakeTestRequest(0, 1, net::URLRequestTestJob::test_url_1()); |
| 780 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2()); | 789 MakeTestRequest(0, 2, net::URLRequestTestJob::test_url_2()); |
| 781 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3()); | 790 MakeTestRequest(0, 3, net::URLRequestTestJob::test_url_3()); |
| 782 | 791 |
| (...skipping 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1791 HandleScheme("big-job"); | 1800 HandleScheme("big-job"); |
| 1792 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); | 1801 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); |
| 1793 | 1802 |
| 1794 // Sort all the messages we saw by request. | 1803 // Sort all the messages we saw by request. |
| 1795 ResourceIPCAccumulator::ClassifiedMessages msgs; | 1804 ResourceIPCAccumulator::ClassifiedMessages msgs; |
| 1796 accum_.GetClassifiedMessages(&msgs); | 1805 accum_.GetClassifiedMessages(&msgs); |
| 1797 | 1806 |
| 1798 size_t size = msgs[0].size(); | 1807 size_t size = msgs[0].size(); |
| 1799 | 1808 |
| 1800 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); | 1809 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); |
| 1801 for (size_t i = 1; i < size - 1; ++i) | 1810 EXPECT_EQ(ResourceMsg_SetDataBuffer::ID, msgs[0][1].type()); |
| 1811 for (size_t i = 2; i < size - 1; ++i) |
| 1802 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); | 1812 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); |
| 1803 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][size - 1].type()); | 1813 EXPECT_EQ(ResourceMsg_RequestComplete::ID, msgs[0][size - 1].type()); |
| 1804 } | 1814 } |
| 1805 | 1815 |
| 1806 TEST_F(ResourceDispatcherHostTest, DelayedDataReceivedACKs) { | 1816 TEST_F(ResourceDispatcherHostTest, DelayedDataReceivedACKs) { |
| 1807 EXPECT_EQ(0, host_.pending_requests()); | 1817 EXPECT_EQ(0, host_.pending_requests()); |
| 1808 | 1818 |
| 1809 HandleScheme("big-job"); | 1819 HandleScheme("big-job"); |
| 1810 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); | 1820 MakeTestRequest(0, 1, GURL("big-job:0123456789,1000000")); |
| 1811 | 1821 |
| 1812 // Sort all the messages we saw by request. | 1822 // Sort all the messages we saw by request. |
| 1813 ResourceIPCAccumulator::ClassifiedMessages msgs; | 1823 ResourceIPCAccumulator::ClassifiedMessages msgs; |
| 1814 accum_.GetClassifiedMessages(&msgs); | 1824 accum_.GetClassifiedMessages(&msgs); |
| 1815 | 1825 |
| 1816 // We expect 1x ReceivedResponse + Nx ReceivedData messages. | 1826 // We expect 1x ReceivedResponse, 1x SetDataBuffer, Nx ReceivedData messages. |
| 1817 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); | 1827 EXPECT_EQ(ResourceMsg_ReceivedResponse::ID, msgs[0][0].type()); |
| 1818 for (size_t i = 1; i < msgs[0].size(); ++i) | 1828 EXPECT_EQ(ResourceMsg_SetDataBuffer::ID, msgs[0][1].type()); |
| 1829 for (size_t i = 2; i < msgs[0].size(); ++i) |
| 1819 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); | 1830 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); |
| 1820 | 1831 |
| 1821 // NOTE: If we fail the above checks then it means that we probably didn't | 1832 // NOTE: If we fail the above checks then it means that we probably didn't |
| 1822 // load a big enough response to trigger the delay mechanism we are trying to | 1833 // load a big enough response to trigger the delay mechanism we are trying to |
| 1823 // test! | 1834 // test! |
| 1824 | 1835 |
| 1825 msgs[0].erase(msgs[0].begin()); | 1836 msgs[0].erase(msgs[0].begin()); |
| 1837 msgs[0].erase(msgs[0].begin()); |
| 1826 | 1838 |
| 1827 // ACK all DataReceived messages until we find a RequestComplete message. | 1839 // ACK all DataReceived messages until we find a RequestComplete message. |
| 1828 bool complete = false; | 1840 bool complete = false; |
| 1829 while (!complete) { | 1841 while (!complete) { |
| 1830 for (size_t i = 0; i < msgs[0].size(); ++i) { | 1842 for (size_t i = 0; i < msgs[0].size(); ++i) { |
| 1831 if (msgs[0][i].type() == ResourceMsg_RequestComplete::ID) { | 1843 if (msgs[0][i].type() == ResourceMsg_RequestComplete::ID) { |
| 1832 complete = true; | 1844 complete = true; |
| 1833 break; | 1845 break; |
| 1834 } | 1846 } |
| 1835 | 1847 |
| 1836 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); | 1848 EXPECT_EQ(ResourceMsg_DataReceived::ID, msgs[0][i].type()); |
| 1837 | 1849 |
| 1838 ResourceHostMsg_DataReceived_ACK msg(0, 1); | 1850 ResourceHostMsg_DataReceived_ACK msg(0, 1); |
| 1839 bool msg_was_ok; | 1851 bool msg_was_ok; |
| 1840 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok); | 1852 host_.OnMessageReceived(msg, filter_.get(), &msg_was_ok); |
| 1841 } | 1853 } |
| 1842 | 1854 |
| 1843 MessageLoop::current()->RunAllPending(); | 1855 MessageLoop::current()->RunAllPending(); |
| 1844 | 1856 |
| 1845 msgs.clear(); | 1857 msgs.clear(); |
| 1846 accum_.GetClassifiedMessages(&msgs); | 1858 accum_.GetClassifiedMessages(&msgs); |
| 1847 } | 1859 } |
| 1848 } | 1860 } |
| 1849 | 1861 |
| 1850 } // namespace content | 1862 } // namespace content |
| OLD | NEW |