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

Side by Side Diff: trunk/src/chrome/browser/chromeos/policy/recommendation_restorer_unittest.cc

Issue 17068004: Revert 207755 "Add device policies to control accessibility sett..." (Closed) Base URL: svn://svn.chromium.org/chrome/
Patch Set: Created 7 years, 6 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
(Empty)
1 // Copyright 2013 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/policy/recommendation_restorer.h"
6
7 #include "ash/magnifier/magnifier_constants.h"
8 #include "base/memory/scoped_ptr.h"
9 #include "base/prefs/pref_notifier_impl.h"
10 #include "base/prefs/testing_pref_store.h"
11 #include "base/strings/utf_string_conversions.h"
12 #include "base/test/test_simple_task_runner.h"
13 #include "base/thread_task_runner_handle.h"
14 #include "base/time.h"
15 #include "base/values.h"
16 #include "chrome/browser/chromeos/policy/recommendation_restorer_factory.h"
17 #include "chrome/browser/prefs/browser_prefs.h"
18 #include "chrome/browser/prefs/pref_service_syncable.h"
19 #include "chrome/common/chrome_constants.h"
20 #include "chrome/common/chrome_notification_types.h"
21 #include "chrome/common/pref_names.h"
22 #include "chrome/test/base/testing_browser_process.h"
23 #include "chrome/test/base/testing_pref_service_syncable.h"
24 #include "chrome/test/base/testing_profile.h"
25 #include "chrome/test/base/testing_profile_manager.h"
26 #include "components/user_prefs/pref_registry_syncable.h"
27 #include "content/public/browser/notification_details.h"
28 #include "content/public/browser/notification_service.h"
29 #include "content/public/browser/notification_source.h"
30 #include "testing/gtest/include/gtest/gtest.h"
31
32 namespace policy {
33
34 namespace {
35 // The amount of idle time after which recommended values are restored.
36 const int kRestoreDelayInMs = 60 * 1000; // 1 minute.
37 } // namespace
38
39 class RecommendationRestorerTest : public testing::Test {
40 protected:
41 RecommendationRestorerTest();
42
43 // testing::Test:
44 virtual void SetUp() OVERRIDE;
45 virtual void TearDown() OVERRIDE;
46
47 void SetRecommendedValues();
48 void SetUserSettings();
49
50 void CreateLoginProfile();
51 void CreateUserProfile();
52
53 void NotifyOfSessionStart();
54 void NotifyOfUserActivity();
55
56 void VerifyPrefFollowsUser(const char* pref_name,
57 const base::Value& expected_value) const;
58 void VerifyPrefsFollowUser() const;
59 void VerifyPrefFollowsRecommendation(const char* pref_name,
60 const base::Value& expected_value) const;
61 void VerifyPrefsFollowRecommendations() const;
62
63 void VerifyNotListeningForNotifications() const;
64 void VerifyTimerIsStopped() const;
65 void VerifyTimerIsRunning() const;
66
67 TestingPrefStore* recommended_prefs_; // Not owned.
68 TestingPrefServiceSyncable* prefs_; // Not owned.
69 RecommendationRestorer* restorer_; // Not owned.
70
71 scoped_refptr<base::TestSimpleTaskRunner> runner_;
72 base::ThreadTaskRunnerHandle runner_handler_;
73
74 private:
75 scoped_ptr<PrefServiceSyncable> prefs_owner_;
76
77 TestingProfileManager* profile_manager_; // Not owned.
78
79 DISALLOW_COPY_AND_ASSIGN(RecommendationRestorerTest);
80 };
81
82 RecommendationRestorerTest::RecommendationRestorerTest()
83 : recommended_prefs_(new TestingPrefStore),
84 prefs_(new TestingPrefServiceSyncable(
85 new TestingPrefStore,
86 new TestingPrefStore,
87 recommended_prefs_,
88 new user_prefs::PrefRegistrySyncable,
89 new PrefNotifierImpl)),
90 restorer_(NULL),
91 runner_(new base::TestSimpleTaskRunner),
92 runner_handler_(runner_),
93 prefs_owner_(prefs_),
94 profile_manager_(NULL) {
95 chrome::RegisterUserPrefs(prefs_->registry());
96 }
97
98 void RecommendationRestorerTest::SetUp() {
99 testing::Test::SetUp();
100 profile_manager_ =
101 new TestingProfileManager(TestingBrowserProcess::GetGlobal());
102 ASSERT_TRUE(profile_manager_->SetUp());
103 }
104
105 void RecommendationRestorerTest::TearDown() {
106 TestingBrowserProcess::GetGlobal()->SetLocalState(NULL);
107 testing::Test::TearDown();
108 }
109
110 void RecommendationRestorerTest::SetRecommendedValues() {
111 recommended_prefs_->SetBoolean(prefs::kLargeCursorEnabled, false);
112 recommended_prefs_->SetBoolean(prefs::kSpokenFeedbackEnabled, false);
113 recommended_prefs_->SetBoolean(prefs::kHighContrastEnabled, false);
114 recommended_prefs_->SetBoolean(prefs::kScreenMagnifierEnabled, false);
115 recommended_prefs_->SetInteger(prefs::kScreenMagnifierType, 0);
116 }
117
118 void RecommendationRestorerTest::SetUserSettings() {
119 prefs_->SetBoolean(prefs::kLargeCursorEnabled, true);
120 prefs_->SetBoolean(prefs::kSpokenFeedbackEnabled, true);
121 prefs_->SetBoolean(prefs::kHighContrastEnabled, true);
122 prefs_->SetBoolean(prefs::kScreenMagnifierEnabled, true);
123 prefs_->SetInteger(prefs::kScreenMagnifierType, ash::MAGNIFIER_FULL);
124 }
125
126 void RecommendationRestorerTest::CreateLoginProfile() {
127 ASSERT_FALSE(restorer_);
128 TestingProfile* profile = profile_manager_->CreateTestingProfile(
129 chrome::kInitialProfile, prefs_owner_.Pass(),
130 UTF8ToUTF16(chrome::kInitialProfile), 0);
131 restorer_ = RecommendationRestorerFactory::GetForProfile(profile);
132 EXPECT_TRUE(restorer_);
133 }
134
135 void RecommendationRestorerTest::CreateUserProfile() {
136 ASSERT_FALSE(restorer_);
137 TestingProfile* profile = profile_manager_->CreateTestingProfile(
138 "user", prefs_owner_.Pass(), UTF8ToUTF16("user"), 0);
139 restorer_ = RecommendationRestorerFactory::GetForProfile(profile);
140 EXPECT_TRUE(restorer_);
141 }
142
143 void RecommendationRestorerTest::NotifyOfSessionStart() {
144 ASSERT_TRUE(restorer_);
145 restorer_->Observe(chrome::NOTIFICATION_LOGIN_USER_CHANGED,
146 content::Source<RecommendationRestorerTest>(this),
147 content::NotificationService::NoDetails());
148 }
149
150 void RecommendationRestorerTest::NotifyOfUserActivity() {
151 ASSERT_TRUE(restorer_);
152 restorer_->OnUserActivity();
153 }
154
155 void RecommendationRestorerTest::VerifyPrefFollowsUser(
156 const char* pref_name,
157 const base::Value& expected_value) const {
158 const PrefServiceSyncable::Preference* pref =
159 prefs_->FindPreference(pref_name);
160 ASSERT_TRUE(pref);
161 EXPECT_TRUE(pref->HasUserSetting());
162 const base::Value* value = pref->GetValue();
163 ASSERT_TRUE(value);
164 EXPECT_TRUE(expected_value.Equals(value));
165 }
166
167 void RecommendationRestorerTest::VerifyPrefsFollowUser() const {
168 VerifyPrefFollowsUser(prefs::kLargeCursorEnabled,
169 base::FundamentalValue(true));
170 VerifyPrefFollowsUser(prefs::kSpokenFeedbackEnabled,
171 base::FundamentalValue(true));
172 VerifyPrefFollowsUser(prefs::kHighContrastEnabled,
173 base::FundamentalValue(true));
174 VerifyPrefFollowsUser(prefs::kScreenMagnifierEnabled,
175 base::FundamentalValue(true));
176 VerifyPrefFollowsUser(prefs::kScreenMagnifierType,
177 base::FundamentalValue(ash::MAGNIFIER_FULL));
178 }
179
180 void RecommendationRestorerTest::VerifyPrefFollowsRecommendation(
181 const char* pref_name,
182 const base::Value& expected_value) const {
183 const PrefServiceSyncable::Preference* pref =
184 prefs_->FindPreference(pref_name);
185 ASSERT_TRUE(pref);
186 EXPECT_TRUE(pref->IsRecommended());
187 EXPECT_FALSE(pref->HasUserSetting());
188 const base::Value* value = pref->GetValue();
189 ASSERT_TRUE(value);
190 EXPECT_TRUE(expected_value.Equals(value));
191 }
192
193 void RecommendationRestorerTest::VerifyPrefsFollowRecommendations() const {
194 VerifyPrefFollowsRecommendation(prefs::kLargeCursorEnabled,
195 base::FundamentalValue(false));
196 VerifyPrefFollowsRecommendation(prefs::kSpokenFeedbackEnabled,
197 base::FundamentalValue(false));
198 VerifyPrefFollowsRecommendation(prefs::kHighContrastEnabled,
199 base::FundamentalValue(false));
200 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierEnabled,
201 base::FundamentalValue(false));
202 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierType,
203 base::FundamentalValue(0));
204 }
205
206 void RecommendationRestorerTest::VerifyNotListeningForNotifications() const {
207 ASSERT_TRUE(restorer_);
208 EXPECT_TRUE(restorer_->pref_change_registrar_.IsEmpty());
209 EXPECT_TRUE(restorer_->notification_registrar_.IsEmpty());
210 }
211
212 void RecommendationRestorerTest::VerifyTimerIsStopped() const {
213 ASSERT_TRUE(restorer_);
214 EXPECT_FALSE(restorer_->restore_timer_.IsRunning());
215 }
216
217 void RecommendationRestorerTest::VerifyTimerIsRunning() const {
218 ASSERT_TRUE(restorer_);
219 EXPECT_TRUE(restorer_->restore_timer_.IsRunning());
220 EXPECT_EQ(base::TimeDelta::FromMilliseconds(kRestoreDelayInMs),
221 restorer_->restore_timer_.GetCurrentDelay());
222 }
223
224 TEST_F(RecommendationRestorerTest, CreateForUserProfile) {
225 // Verifies that when a RecommendationRestorer is created for a user profile,
226 // it does not start listening for any notifications, does not clear user
227 // settings on initialization and does not start a timer that will clear user
228 // settings eventually.
229 SetRecommendedValues();
230 SetUserSettings();
231
232 CreateUserProfile();
233 VerifyNotListeningForNotifications();
234 VerifyPrefsFollowUser();
235 VerifyTimerIsStopped();
236 }
237
238 TEST_F(RecommendationRestorerTest, NoRecommendations) {
239 // Verifies that when no recommended values have been set and a
240 // RecommendationRestorer is created for the login profile, it does not clear
241 // user settings on initialization and does not start a timer that will clear
242 // user settings eventually.
243 SetUserSettings();
244
245 CreateLoginProfile();
246 VerifyPrefsFollowUser();
247 VerifyTimerIsStopped();
248 }
249
250 TEST_F(RecommendationRestorerTest, RestoreOnStartup) {
251 // Verifies that when recommended values have been set and a
252 // RecommendationRestorer is created for the login profile, it clears user
253 // settings on initialization.
254 SetRecommendedValues();
255 SetUserSettings();
256
257 CreateLoginProfile();
258 VerifyPrefsFollowRecommendations();
259 VerifyTimerIsStopped();
260 }
261
262 TEST_F(RecommendationRestorerTest, RestoreOnRecommendationChangeOnLoginScreen) {
263 // Verifies that if recommended values change while the login screen is being
264 // shown, a timer is started that will clear user settings eventually.
265 SetUserSettings();
266
267 CreateLoginProfile();
268
269 VerifyTimerIsStopped();
270 recommended_prefs_->SetBoolean(prefs::kLargeCursorEnabled, false);
271 VerifyPrefFollowsUser(prefs::kLargeCursorEnabled,
272 base::FundamentalValue(true));
273 VerifyTimerIsRunning();
274 runner_->RunUntilIdle();
275 VerifyPrefFollowsRecommendation(prefs::kLargeCursorEnabled,
276 base::FundamentalValue(false));
277
278 VerifyTimerIsStopped();
279 recommended_prefs_->SetBoolean(prefs::kSpokenFeedbackEnabled, false);
280 VerifyPrefFollowsUser(prefs::kSpokenFeedbackEnabled,
281 base::FundamentalValue(true));
282 VerifyTimerIsRunning();
283 runner_->RunUntilIdle();
284 VerifyPrefFollowsRecommendation(prefs::kSpokenFeedbackEnabled,
285 base::FundamentalValue(false));
286
287 VerifyTimerIsStopped();
288 recommended_prefs_->SetBoolean(prefs::kHighContrastEnabled, false);
289 VerifyPrefFollowsUser(prefs::kHighContrastEnabled,
290 base::FundamentalValue(true));
291 VerifyTimerIsRunning();
292 runner_->RunUntilIdle();
293 VerifyPrefFollowsRecommendation(prefs::kHighContrastEnabled,
294 base::FundamentalValue(false));
295
296 VerifyTimerIsStopped();
297 recommended_prefs_->SetBoolean(prefs::kScreenMagnifierEnabled, false);
298 recommended_prefs_->SetInteger(prefs::kScreenMagnifierType, 0);
299 VerifyPrefFollowsUser(prefs::kScreenMagnifierEnabled,
300 base::FundamentalValue(true));
301 VerifyPrefFollowsUser(prefs::kScreenMagnifierType,
302 base::FundamentalValue(ash::MAGNIFIER_FULL));
303 VerifyTimerIsRunning();
304 runner_->RunUntilIdle();
305 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierEnabled,
306 base::FundamentalValue(false));
307 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierType,
308 base::FundamentalValue(0));
309
310 VerifyTimerIsStopped();
311 }
312
313 TEST_F(RecommendationRestorerTest, RestoreOnRecommendationChangeInUserSession) {
314 // Verifies that if recommended values change while a user session is in
315 // progress, user settings are cleared immediately.
316 SetUserSettings();
317
318 CreateLoginProfile();
319 NotifyOfSessionStart();
320
321 VerifyPrefFollowsUser(prefs::kLargeCursorEnabled,
322 base::FundamentalValue(true));
323 recommended_prefs_->SetBoolean(prefs::kLargeCursorEnabled, false);
324 VerifyTimerIsStopped();
325 VerifyPrefFollowsRecommendation(prefs::kLargeCursorEnabled,
326 base::FundamentalValue(false));
327
328 VerifyPrefFollowsUser(prefs::kSpokenFeedbackEnabled,
329 base::FundamentalValue(true));
330 recommended_prefs_->SetBoolean(prefs::kSpokenFeedbackEnabled, false);
331 VerifyTimerIsStopped();
332 VerifyPrefFollowsRecommendation(prefs::kSpokenFeedbackEnabled,
333 base::FundamentalValue(false));
334
335 VerifyPrefFollowsUser(prefs::kHighContrastEnabled,
336 base::FundamentalValue(true));
337 recommended_prefs_->SetBoolean(prefs::kHighContrastEnabled, false);
338 VerifyTimerIsStopped();
339 VerifyPrefFollowsRecommendation(prefs::kHighContrastEnabled,
340 base::FundamentalValue(false));
341
342 VerifyPrefFollowsUser(prefs::kScreenMagnifierEnabled,
343 base::FundamentalValue(true));
344 VerifyPrefFollowsUser(prefs::kScreenMagnifierType,
345 base::FundamentalValue(ash::MAGNIFIER_FULL));
346 recommended_prefs_->SetBoolean(prefs::kScreenMagnifierEnabled, false);
347 recommended_prefs_->SetInteger(prefs::kScreenMagnifierType, 0);
348 VerifyTimerIsStopped();
349 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierEnabled,
350 base::FundamentalValue(false));
351 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierType,
352 base::FundamentalValue(0));
353 }
354
355 TEST_F(RecommendationRestorerTest, DoNothingOnUserChange) {
356 // Verifies that if no recommended values have been set and user settings
357 // change, the user settings are not cleared immediately and no timer is
358 // started that will clear the user settings eventually.
359 CreateLoginProfile();
360
361 prefs_->SetBoolean(prefs::kLargeCursorEnabled, true);
362 VerifyPrefFollowsUser(prefs::kLargeCursorEnabled,
363 base::FundamentalValue(true));
364 VerifyTimerIsStopped();
365
366 prefs_->SetBoolean(prefs::kSpokenFeedbackEnabled, true);
367 VerifyPrefFollowsUser(prefs::kSpokenFeedbackEnabled,
368 base::FundamentalValue(true));
369 VerifyTimerIsStopped();
370
371 prefs_->SetBoolean(prefs::kHighContrastEnabled, true);
372 VerifyPrefFollowsUser(prefs::kHighContrastEnabled,
373 base::FundamentalValue(true));
374 VerifyTimerIsStopped();
375
376 prefs_->SetBoolean(prefs::kScreenMagnifierEnabled, true);
377 VerifyPrefFollowsUser(prefs::kScreenMagnifierEnabled,
378 base::FundamentalValue(true));
379 VerifyTimerIsStopped();
380
381 prefs_->SetBoolean(prefs::kScreenMagnifierEnabled, true);
382 prefs_->SetInteger(prefs::kScreenMagnifierType, ash::MAGNIFIER_FULL);
383 VerifyPrefFollowsUser(prefs::kScreenMagnifierEnabled,
384 base::FundamentalValue(true));
385 VerifyPrefFollowsUser(prefs::kScreenMagnifierType,
386 base::FundamentalValue(ash::MAGNIFIER_FULL));
387 VerifyTimerIsStopped();
388 }
389
390 TEST_F(RecommendationRestorerTest, RestoreOnUserChange) {
391 // Verifies that if recommended values have been set and user settings change
392 // while the login screen is being shown, a timer is started that will clear
393 // the user settings eventually.
394 SetRecommendedValues();
395
396 CreateLoginProfile();
397
398 VerifyTimerIsStopped();
399 prefs_->SetBoolean(prefs::kLargeCursorEnabled, true);
400 VerifyPrefFollowsUser(prefs::kLargeCursorEnabled,
401 base::FundamentalValue(true));
402 VerifyTimerIsRunning();
403 runner_->RunUntilIdle();
404 VerifyPrefFollowsRecommendation(prefs::kLargeCursorEnabled,
405 base::FundamentalValue(false));
406
407 VerifyTimerIsStopped();
408 prefs_->SetBoolean(prefs::kSpokenFeedbackEnabled, true);
409 VerifyPrefFollowsUser(prefs::kSpokenFeedbackEnabled,
410 base::FundamentalValue(true));
411 VerifyTimerIsRunning();
412 runner_->RunUntilIdle();
413 VerifyPrefFollowsRecommendation(prefs::kSpokenFeedbackEnabled,
414 base::FundamentalValue(false));
415
416 VerifyTimerIsStopped();
417 prefs_->SetBoolean(prefs::kHighContrastEnabled, true);
418 VerifyPrefFollowsUser(prefs::kHighContrastEnabled,
419 base::FundamentalValue(true));
420 VerifyTimerIsRunning();
421 runner_->RunUntilIdle();
422 VerifyPrefFollowsRecommendation(prefs::kHighContrastEnabled,
423 base::FundamentalValue(false));
424
425 VerifyTimerIsStopped();
426 prefs_->SetBoolean(prefs::kScreenMagnifierEnabled, true);
427 prefs_->SetInteger(prefs::kScreenMagnifierType, ash::MAGNIFIER_FULL);
428 VerifyPrefFollowsUser(prefs::kScreenMagnifierEnabled,
429 base::FundamentalValue(true));
430 VerifyPrefFollowsUser(prefs::kScreenMagnifierType,
431 base::FundamentalValue(ash::MAGNIFIER_FULL));
432 VerifyTimerIsRunning();
433 runner_->RunUntilIdle();
434 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierEnabled,
435 base::FundamentalValue(false));
436 VerifyPrefFollowsRecommendation(prefs::kScreenMagnifierType,
437 base::FundamentalValue(0));
438
439 VerifyTimerIsStopped();
440 }
441
442 TEST_F(RecommendationRestorerTest, RestoreOnSessionStart) {
443 // Verifies that if recommended values have been set, user settings have
444 // changed and a session is then started, the user settings are cleared
445 // immediately and the timer that would have cleared them eventually on the
446 // login screen is stopped.
447 SetRecommendedValues();
448
449 CreateLoginProfile();
450 SetUserSettings();
451
452 NotifyOfSessionStart();
453 VerifyPrefsFollowRecommendations();
454 VerifyTimerIsStopped();
455 }
456
457 TEST_F(RecommendationRestorerTest, DoNothingOnSessionStart) {
458 // Verifies that if recommended values have not been set, user settings have
459 // changed and a session is then started, the user settings are not cleared
460 // immediately.
461 CreateLoginProfile();
462 SetUserSettings();
463
464 NotifyOfSessionStart();
465 VerifyPrefsFollowUser();
466 VerifyTimerIsStopped();
467 }
468
469 TEST_F(RecommendationRestorerTest, UserActivityResetsTimer) {
470 // Verifies that user activity resets the timer which clears user settings.
471 recommended_prefs_->SetBoolean(prefs::kLargeCursorEnabled, false);
472
473 CreateLoginProfile();
474
475 prefs_->SetBoolean(prefs::kLargeCursorEnabled, true);
476 VerifyTimerIsRunning();
477
478 // Notify that there is user activity, then fast forward until the originally
479 // set timer fires.
480 NotifyOfUserActivity();
481 runner_->RunPendingTasks();
482 VerifyPrefFollowsUser(prefs::kLargeCursorEnabled,
483 base::FundamentalValue(true));
484
485 // Fast forward until the reset timer fires.
486 VerifyTimerIsRunning();
487 runner_->RunUntilIdle();
488 VerifyPrefFollowsRecommendation(prefs::kLargeCursorEnabled,
489 base::FundamentalValue(false));
490 VerifyTimerIsStopped();
491 }
492
493 } // namespace policy
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698