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

Side by Side Diff: chrome/browser/chromeos/power/renderer_freezer_unittest.cc

Issue 543303002: chromeos: power: Refactor RendererFreezer and add tests (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add more tests Created 6 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
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 "chrome/browser/chromeos/power/renderer_freezer.h"
6
7 #include <string>
8
9 #include "base/message_loop/message_loop.h"
10 #include "base/run_loop.h"
11 #include "chromeos/dbus/dbus_thread_manager.h"
12 #include "chromeos/dbus/fake_power_manager_client.h"
13 #include "testing/gtest/include/gtest/gtest-death-test.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15
16 namespace chromeos {
17
18 namespace {
19 // Class that delegates used in testing can inherit from to record calls that
20 // are made by the code being tested.
21 class ActionRecorder {
22 public:
23 ActionRecorder();
24 virtual ~ActionRecorder();
25
26 // Returns a comma-separated string describing the actions that were
27 // requested since the previous call to GetActions() (i.e. results are
28 // non-repeatable).
29 std::string GetActions();
30
31 protected:
32 // Appends |new_action| to |actions_|, using a comma as a separator if
33 // other actions are already listed.
34 void AppendAction(const std::string& new_action);
35
36 private:
37 // Comma-separated list of actions that have been performed.
38 std::string actions_;
39
40 DISALLOW_COPY_AND_ASSIGN(ActionRecorder);
41 };
42
43 ActionRecorder::ActionRecorder() {
44 }
45
46 ActionRecorder::~ActionRecorder() {
47 }
48
49 std::string ActionRecorder::GetActions() {
50 std::string actions = actions_;
51 actions_.clear();
52 return actions;
53 }
54
55 void ActionRecorder::AppendAction(const std::string& new_action) {
56 if (!actions_.empty())
57 actions_ += ",";
58 actions_ += new_action;
59 }
60
61 // Actions that can be returned by TestDelegate::GetActions().
62 const char kFreezeRenderers[] = "freeze_renderers";
63 const char kThawRenderers[] = "thaw_renderers";
64 const char kNoActions[] = "";
65
66 // Test implementation of RendererFreezer::Delegate that records the actions it
67 // was asked to perform.
68 class TestDelegate : public RendererFreezer::Delegate, public ActionRecorder {
69 public:
70 TestDelegate();
71 virtual ~TestDelegate();
72
73 // RendererFreezer::Delegate overrides.
74 virtual bool FreezeRenderers() OVERRIDE;
75 virtual bool ThawRenderers() OVERRIDE;
76 virtual bool CanFreezeRenderers() OVERRIDE;
77
78 void set_freeze_renderers_result(bool result);
79 void set_thaw_renderers_result(bool result);
80
81 // Sets whether the delegate is capable of freezing renderers. This also
82 // changes |freeze_renderers_result_| and |thaw_renderers_result_|.
83 void set_can_freeze_renderers(bool can_freeze);
84
85 private:
86 bool can_freeze_renderers_;
87 bool freeze_renderers_result_;
88 bool thaw_renderers_result_;
89
90 DISALLOW_COPY_AND_ASSIGN(TestDelegate);
91 };
92
93 TestDelegate::TestDelegate()
Daniel Erat 2014/09/06 02:01:25 all of these implementations are short enough that
94 : can_freeze_renderers_(true),
95 freeze_renderers_result_(true),
96 thaw_renderers_result_(true) {
97 }
98
99 TestDelegate::~TestDelegate() {
100 }
101
102 bool TestDelegate::FreezeRenderers() {
103 AppendAction(kFreezeRenderers);
104
105 return freeze_renderers_result_;
106 }
107
108 bool TestDelegate::ThawRenderers() {
109 AppendAction(kThawRenderers);
110
111 return thaw_renderers_result_;
112 }
113
114 bool TestDelegate::CanFreezeRenderers() {
115 return can_freeze_renderers_;
116 }
117
118 void TestDelegate::set_can_freeze_renderers(bool can_freeze) {
119 can_freeze_renderers_ = can_freeze;
120
121 // If the delegate cannot freeze renderers, then the result of trying to do so
122 // will be false.
123 freeze_renderers_result_ = can_freeze;
124 thaw_renderers_result_ = can_freeze;
125 }
126
127 void TestDelegate::set_freeze_renderers_result(bool result) {
128 freeze_renderers_result_ = result;
129 }
130
131 void TestDelegate::set_thaw_renderers_result(bool result) {
132 thaw_renderers_result_ = result;
133 }
134
135 } // namespace
136
137 class RendererFreezerTest : public testing::Test {
138 public:
139 RendererFreezerTest();
140 virtual ~RendererFreezerTest();
141
142 void Init();
143
144 protected:
145 FakePowerManagerClient* fake_power_manager_client_;
Daniel Erat 2014/09/06 02:01:25 nit: name this |client_| to avoid awkward-looking
146 TestDelegate* test_delegate_;
147
148 scoped_ptr<RendererFreezer> renderer_freezer_;
Daniel Erat 2014/09/06 02:01:25 nit: name this |freezer_|? (feel free to ignore if
149
150 private:
151 base::MessageLoop message_loop_;
152 DISALLOW_COPY_AND_ASSIGN(RendererFreezerTest);
153 };
154
155 RendererFreezerTest::RendererFreezerTest()
Daniel Erat 2014/09/06 02:01:25 i'd recommend inlining these too
156 : fake_power_manager_client_(new FakePowerManagerClient()),
157 test_delegate_(new TestDelegate()) {
158 }
159
160 RendererFreezerTest::~RendererFreezerTest() {
161 renderer_freezer_.reset();
162
163 // This should never be false since all tests should be calling Init() but it
164 // doesn't hurt to check.
165 if (DBusThreadManager::IsInitialized())
166 DBusThreadManager::Shutdown();
167 }
168
169 void RendererFreezerTest::Init() {
170 DBusThreadManager::GetSetterForTesting()->SetPowerManagerClient(
Daniel Erat 2014/09/06 02:01:25 nit: probably a bit cleaner to do this in the c'to
171 scoped_ptr<PowerManagerClient>(fake_power_manager_client_));
172
173 renderer_freezer_.reset(new RendererFreezer(
174 scoped_ptr<RendererFreezer::Delegate>(test_delegate_)));
175 }
176
177 // Tests that the RendererFreezer freezes renderers on suspend and thaws them on
178 // resume.
179 TEST_F(RendererFreezerTest, SuspendResume) {
180 Init();
181
182 fake_power_manager_client_->SendSuspendImminent();
183
184 // The RendererFreezer should have grabbed an asynchronous callback and done
185 // nothing else.
186 EXPECT_EQ(
187 1, fake_power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
188 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
189
190 // The RendererFreezer should eventually freeze the renderers and run the
191 // callback.
192 base::RunLoop().RunUntilIdle();
193 EXPECT_EQ(
194 0, fake_power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
195 EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
196
197 // The renderers should be thawed when we resume.
198 fake_power_manager_client_->SendSuspendDone();
199 EXPECT_EQ(kThawRenderers, test_delegate_->GetActions());
200 }
201
202 // Tests that the renderer freezer does nothing if the delegate cannot freeze
203 // renderers.
204 TEST_F(RendererFreezerTest, DelegateCannotFreezeRenderers) {
205 test_delegate_->set_can_freeze_renderers(false);
206 Init();
207
208 fake_power_manager_client_->SendSuspendImminent();
209
210 // The RendererFreezer should not have grabbed a callback or done anything
211 // else.
212 EXPECT_EQ(
213 0, fake_power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
214 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
215
216 // There should be nothing in the message loop.
217 base::RunLoop().RunUntilIdle();
218 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
219
220 // Nothing happens on resume.
221 fake_power_manager_client_->SendSuspendDone();
222 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
223 }
224
225 // Tests that the RendererFreezer does nothing on resume if the freezing
226 // operation was unsuccessful.
227 TEST_F(RendererFreezerTest, ErrorFreezingRenderers) {
228 Init();
229 test_delegate_->set_freeze_renderers_result(false);
230
231 fake_power_manager_client_->SendSuspendImminent();
232 EXPECT_EQ(
233 1, fake_power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
234
235 // The freezing operation should fail, but we should still report readiness.
236 base::RunLoop().RunUntilIdle();
237 EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
238 EXPECT_EQ(
239 0, fake_power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
240
241 // Since the delegate reported that the freezing was unsuccessful, don't do
242 // anything on resume.
243 fake_power_manager_client_->SendSuspendDone();
244 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
245 }
246
247 #if defined(GTEST_HAS_DEATH_TEST)
248 // Tests that the RendererFreezer crashes the browser if the freezing operation
249 // was successful but the thawing operation failed.
250 TEST_F(RendererFreezerTest, ErrorThawingRenderers) {
251 Init();
252 test_delegate_->set_thaw_renderers_result(false);
253
254 fake_power_manager_client_->SendSuspendImminent();
255 base::RunLoop().RunUntilIdle();
256 EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
257
258 EXPECT_DEATH(fake_power_manager_client_->SendSuspendDone(), "Unable to thaw");
259 }
260 #endif // GTEST_HAS_DEATH_TEST
261
262 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698