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

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 601 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698