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

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: Address comments. 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 std::string actions = actions_;
31 actions_.clear();
32 return actions;
33 }
34
35 protected:
36 // Appends |new_action| to |actions_|, using a comma as a separator if
37 // other actions are already listed.
38 void AppendAction(const std::string& new_action) {
39 if (!actions_.empty())
40 actions_ += ",";
41 actions_ += new_action;
42 }
43
44 private:
45 // Comma-separated list of actions that have been performed.
46 std::string actions_;
47
48 DISALLOW_COPY_AND_ASSIGN(ActionRecorder);
49 };
50
51 // Actions that can be returned by TestDelegate::GetActions().
52 const char kFreezeRenderers[] = "freeze_renderers";
53 const char kThawRenderers[] = "thaw_renderers";
54 const char kNoActions[] = "";
55
56 // Test implementation of RendererFreezer::Delegate that records the actions it
57 // was asked to perform.
58 class TestDelegate : public RendererFreezer::Delegate, public ActionRecorder {
59 public:
60 TestDelegate()
61 : can_freeze_renderers_(true),
62 freeze_renderers_result_(true),
63 thaw_renderers_result_(true) {}
64
65 virtual ~TestDelegate() {}
66
67 // RendererFreezer::Delegate overrides.
68 virtual bool FreezeRenderers() OVERRIDE {
69 AppendAction(kFreezeRenderers);
70
71 return freeze_renderers_result_;
72 }
73 virtual bool ThawRenderers() OVERRIDE {
74 AppendAction(kThawRenderers);
75
76 return thaw_renderers_result_;
77 }
78 virtual bool CanFreezeRenderers() OVERRIDE { return can_freeze_renderers_; }
79
80 void set_freeze_renderers_result(bool result) {
81 freeze_renderers_result_ = result;
82 }
83
84 void set_thaw_renderers_result(bool result) {
85 thaw_renderers_result_ = result;
86 }
87
88 // Sets whether the delegate is capable of freezing renderers. This also
89 // changes |freeze_renderers_result_| and |thaw_renderers_result_|.
90 void set_can_freeze_renderers(bool can_freeze) {
91 can_freeze_renderers_ = can_freeze;
92
93 // If the delegate cannot freeze renderers, then the result of trying to do
94 // so will be false.
95 freeze_renderers_result_ = can_freeze;
96 thaw_renderers_result_ = can_freeze;
97 }
98
99 private:
100 bool can_freeze_renderers_;
101 bool freeze_renderers_result_;
102 bool thaw_renderers_result_;
103
104 DISALLOW_COPY_AND_ASSIGN(TestDelegate);
105 };
106
107 } // namespace
108
109 class RendererFreezerTest : public testing::Test {
110 public:
111 RendererFreezerTest()
112 : power_manager_client_(new FakePowerManagerClient()),
113 test_delegate_(new TestDelegate()) {
114 DBusThreadManager::GetSetterForTesting()->SetPowerManagerClient(
115 scoped_ptr<PowerManagerClient>(power_manager_client_));
116 }
117
118 virtual ~RendererFreezerTest() {
119 renderer_freezer_.reset();
120
121 // This should never be false since all tests should be calling Init() but
122 // it doesn't hurt to check.
Daniel Erat 2014/09/12 22:53:22 your call to DBusThreadManager::GetSetterForTestin
Chirantan Ekbote 2014/09/16 02:51:40 You're right. This is no longer necessary.
123 if (DBusThreadManager::IsInitialized())
124 DBusThreadManager::Shutdown();
125 }
126
127 void Init() {
128 renderer_freezer_.reset(new RendererFreezer(
129 scoped_ptr<RendererFreezer::Delegate>(test_delegate_)));
130 }
131
132 protected:
133 FakePowerManagerClient* power_manager_client_;
134 TestDelegate* test_delegate_;
135
136 scoped_ptr<RendererFreezer> renderer_freezer_;
137
138 private:
139 base::MessageLoop message_loop_;
140 DISALLOW_COPY_AND_ASSIGN(RendererFreezerTest);
141 };
142
143 // Tests that the RendererFreezer freezes renderers on suspend and thaws them on
144 // resume.
145 TEST_F(RendererFreezerTest, SuspendResume) {
146 Init();
147
148 power_manager_client_->SendSuspendImminent();
149
150 // The RendererFreezer should have grabbed an asynchronous callback and done
151 // nothing else.
152 EXPECT_EQ(1, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
153 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
154
155 // The RendererFreezer should eventually freeze the renderers and run the
156 // callback.
157 base::RunLoop().RunUntilIdle();
158 EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
159 EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
160
161 // The renderers should be thawed when we resume.
162 power_manager_client_->SendSuspendDone();
163 EXPECT_EQ(kThawRenderers, test_delegate_->GetActions());
164 }
165
166 // Tests that the renderer freezer does nothing if the delegate cannot freeze
167 // renderers.
168 TEST_F(RendererFreezerTest, DelegateCannotFreezeRenderers) {
169 test_delegate_->set_can_freeze_renderers(false);
170 Init();
171
172 power_manager_client_->SendSuspendImminent();
173
174 // The RendererFreezer should not have grabbed a callback or done anything
175 // else.
176 EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
177 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
178
179 // There should be nothing in the message loop.
180 base::RunLoop().RunUntilIdle();
181 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
182
183 // Nothing happens on resume.
184 power_manager_client_->SendSuspendDone();
185 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
186 }
187
188 // Tests that the RendererFreezer does nothing on resume if the freezing
189 // operation was unsuccessful.
190 TEST_F(RendererFreezerTest, ErrorFreezingRenderers) {
191 Init();
192 test_delegate_->set_freeze_renderers_result(false);
193
194 power_manager_client_->SendSuspendImminent();
195 EXPECT_EQ(1, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
196
197 // The freezing operation should fail, but we should still report readiness.
198 base::RunLoop().RunUntilIdle();
199 EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
200 EXPECT_EQ(0, power_manager_client_->GetNumPendingSuspendReadinessCallbacks());
201
202 // Since the delegate reported that the freezing was unsuccessful, don't do
203 // anything on resume.
204 power_manager_client_->SendSuspendDone();
205 EXPECT_EQ(kNoActions, test_delegate_->GetActions());
206 }
207
208 #if defined(GTEST_HAS_DEATH_TEST)
209 // Tests that the RendererFreezer crashes the browser if the freezing operation
210 // was successful but the thawing operation failed.
211 TEST_F(RendererFreezerTest, ErrorThawingRenderers) {
212 Init();
213 test_delegate_->set_thaw_renderers_result(false);
214
215 power_manager_client_->SendSuspendImminent();
216 base::RunLoop().RunUntilIdle();
217 EXPECT_EQ(kFreezeRenderers, test_delegate_->GetActions());
218
219 EXPECT_DEATH(power_manager_client_->SendSuspendDone(), "Unable to thaw");
220 }
221 #endif // GTEST_HAS_DEATH_TEST
222
223 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698