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

Side by Side Diff: content/renderer/scheduler/throttled_message_sender_unittest.cc

Issue 847883002: Reland "Throttle resource message requests during user interaction" (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Tweak Created 5 years, 11 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
OLDNEW
(Empty)
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/renderer/scheduler/throttled_message_sender.h"
6
7 #include "base/memory/scoped_vector.h"
8 #include "content/common/resource_messages.h"
9 #include "content/renderer/scheduler/null_renderer_scheduler.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace content {
13 namespace {
14
15 const size_t kDefaultMaxMessagesPerSecond = 120;
16 const size_t kMessagesPerFlush = kDefaultMaxMessagesPerSecond / 60;
17
18 const int kRoutingId = 1;
19
20 } // namespace
21
22 class ThrottledMessageSenderTest : public testing::Test,
23 public IPC::Sender,
24 public NullRendererScheduler {
25 public:
26 ThrottledMessageSenderTest()
27 : throttled_sender_(
28 new ThrottledMessageSender(this,
29 this,
30 kDefaultMaxMessagesPerSecond)),
31 yield_(false),
32 next_request_id_(0) {}
33 ~ThrottledMessageSenderTest() override {}
34
35 // IPC::Sender implementation:
36 bool Send(IPC::Message* msg) override {
37 sent_messages_.push_back(msg);
38 return true;
39 }
40
41 // RendererScheduler implementation:
42 bool ShouldYieldForHighPriorityWork() override { return yield_; }
43
44 void SetShouldYieldForHighPriorityWork(bool yield) { yield_ = yield; }
45
46 void Run(base::TimeDelta delay) {
47 base::MessageLoop::current()->PostDelayedTask(
48 FROM_HERE, base::MessageLoop::QuitClosure(), delay);
49 base::MessageLoop::current()->Run();
50 }
51
52 void RunOneFlush() { Run(base::TimeDelta::FromSecondsD(1.f / 60.f)); }
53
54 bool SendMessage() {
55 return throttled_sender_->Send(new ResourceHostMsg_RequestResource(
56 kRoutingId, ++next_request_id_, ResourceHostMsg_Request()));
57 }
58
59 bool SendSyncMessage() {
60 SyncLoadResult result;
61 return throttled_sender_->Send(new ResourceHostMsg_SyncLoad(
62 kRoutingId, ++next_request_id_, ResourceHostMsg_Request(), &result));
63 }
64
65 size_t GetAndResetSentMessageCount() {
66 size_t sent_message_count = sent_messages_.size();
67 sent_messages_.clear();
68 return sent_message_count;
69 }
70
71 protected:
72 ScopedVector<IPC::Message> sent_messages_;
73
74 private:
75 base::MessageLoopForUI message_loop_;
76 scoped_ptr<ThrottledMessageSender> throttled_sender_;
77 bool yield_;
78 int next_request_id_;
79
80 DISALLOW_COPY_AND_ASSIGN(ThrottledMessageSenderTest);
81 };
82
83 TEST_F(ThrottledMessageSenderTest, NotThrottledByDefault) {
84 SetShouldYieldForHighPriorityWork(false);
85 for (size_t i = 0; i < kMessagesPerFlush * 2; ++i) {
86 SendMessage();
87 EXPECT_EQ(i + 1, sent_messages_.size());
88 }
89 }
90
91 TEST_F(ThrottledMessageSenderTest, NotThrottledIfSendLimitNotReached) {
92 SetShouldYieldForHighPriorityWork(true);
93 for (size_t i = 0; i < kMessagesPerFlush; ++i) {
94 SendMessage();
95 EXPECT_EQ(i + 1, sent_messages_.size());
96 }
97 }
98
99 TEST_F(ThrottledMessageSenderTest, ThrottledWhenHighPriorityWork) {
100 SetShouldYieldForHighPriorityWork(true);
101 for (size_t i = 0; i < kMessagesPerFlush; ++i)
102 SendMessage();
103 ASSERT_EQ(kMessagesPerFlush, GetAndResetSentMessageCount());
104
105 SendMessage();
106 EXPECT_EQ(0U, sent_messages_.size());
107
108 RunOneFlush();
109 EXPECT_EQ(1U, sent_messages_.size());
110 }
111
112 TEST_F(ThrottledMessageSenderTest, ThrottledWhenDeferredMessageQueueNonEmpty) {
113 SetShouldYieldForHighPriorityWork(true);
114 for (size_t i = 0; i < kMessagesPerFlush; ++i)
115 SendMessage();
116 ASSERT_EQ(kMessagesPerFlush, GetAndResetSentMessageCount());
117
118 SendMessage();
119 EXPECT_EQ(0U, sent_messages_.size());
120 SetShouldYieldForHighPriorityWork(false);
121 SendMessage();
122 EXPECT_EQ(0U, sent_messages_.size());
123
124 RunOneFlush();
125 EXPECT_EQ(2U, sent_messages_.size());
126 }
127
128 TEST_F(ThrottledMessageSenderTest, NotThrottledIfSufficientTimePassed) {
129 SetShouldYieldForHighPriorityWork(true);
130
131 for (size_t i = 0; i < kMessagesPerFlush * 2; ++i) {
132 SendMessage();
133 EXPECT_EQ(1U, GetAndResetSentMessageCount());
134 RunOneFlush();
135 }
136 }
137
138 TEST_F(ThrottledMessageSenderTest, SyncFlush) {
139 SetShouldYieldForHighPriorityWork(true);
140 for (size_t i = 0; i < kMessagesPerFlush; ++i)
141 SendMessage();
142 ASSERT_EQ(kMessagesPerFlush, GetAndResetSentMessageCount());
143
144 SendMessage();
145 EXPECT_EQ(0U, sent_messages_.size());
146 SendSyncMessage();
147 EXPECT_EQ(2U, sent_messages_.size());
148 }
149
150 TEST_F(ThrottledMessageSenderTest, MultipleFlushes) {
151 SetShouldYieldForHighPriorityWork(true);
152 for (size_t i = 0; i < kMessagesPerFlush * 4; ++i)
153 SendMessage();
154 ASSERT_EQ(kMessagesPerFlush, GetAndResetSentMessageCount());
155
156 for (size_t i = 0; i < 3; ++i) {
157 RunOneFlush();
158 EXPECT_EQ(kMessagesPerFlush, GetAndResetSentMessageCount());
159 }
160 }
161
162 TEST_F(ThrottledMessageSenderTest, MultipleFlushesWhileReceiving) {
163 SetShouldYieldForHighPriorityWork(true);
164 for (size_t i = 0; i < kMessagesPerFlush * 4; ++i)
165 SendMessage();
166 ASSERT_EQ(kMessagesPerFlush, GetAndResetSentMessageCount());
167
168 for (size_t i = 0; i < 3; ++i) {
169 RunOneFlush();
170 EXPECT_EQ(kMessagesPerFlush, GetAndResetSentMessageCount());
171 for (size_t i = 0; i < kMessagesPerFlush; ++i)
172 SendMessage();
173 }
174
175 for (size_t i = 0; i < 3; ++i) {
176 RunOneFlush();
177 EXPECT_EQ(kMessagesPerFlush, GetAndResetSentMessageCount());
178 }
179
180 RunOneFlush();
181 EXPECT_EQ(0U, sent_messages_.size());
182 }
183
184 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698