Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(161)

Side by Side Diff: content/browser/renderer_host/resource_dispatcher_host_unittest.cc

Issue 10911297: Modify AsyncResourceHandler to use a single shared memory buffer (in ring (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698