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

Side by Side Diff: chrome/browser/chromeos/login/enrollment/enrollment_screen_unittest.cc

Issue 2526973002: Added retry policy (Closed)
Patch Set: Addressed more comments Created 3 years, 10 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 (c) 2017 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 "base/command_line.h"
6 #include "base/lazy_instance.h"
xiyuan 2017/02/01 23:01:51 nit: unused ?
kumarniranjan 2017/02/03 22:53:20 It was unused. I deleted it. Thanks for catching t
7 #include "base/logging.h"
xiyuan 2017/02/01 23:01:51 nit: unused ?
kumarniranjan 2017/02/03 22:53:21 Deleted
8 #include "base/message_loop/message_loop.h"
9 #include "base/run_loop.h"
xiyuan 2017/02/01 23:01:51 nit: unused ?
kumarniranjan 2017/02/03 22:53:20 Deleted
10 #include "base/test/scoped_mock_time_message_loop_task_runner.h"
11 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
12 #include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper. h"
13 #include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_ mock.h"
14 #include "chrome/browser/chromeos/login/enrollment/mock_enrollment_screen.h"
15 #include "chrome/browser/chromeos/login/screens/mock_base_screen_delegate.h"
16 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
17 #include "chrome/browser/chromeos/policy/enrollment_config.h"
18 #include "chrome/test/base/testing_browser_process.h"
19 #include "chromeos/chromeos_switches.h"
20 #include "chromeos/dbus/dbus_thread_manager.h"
21 #include "components/pairing/fake_controller_pairing_controller.h"
22 #include "testing/gtest/include/gtest/gtest.h"
23
24 using testing::AnyNumber;
25 using testing::Invoke;
xiyuan 2017/02/01 23:01:51 Are these used?
kumarniranjan 2017/02/03 22:53:20 Yes
26
27 namespace chromeos {
28
29 class EnrollmentScreenUnitTest : public testing::Test {
30 public:
31 EnrollmentScreenUnitTest() : fake_controller("") {
32 enrollment_config.mode = policy::EnrollmentConfig::MODE_ATTESTATION_FORCED;
33 enrollment_config.auth_mechanism =
34 policy::EnrollmentConfig::AUTH_MECHANISM_ATTESTATION;
35 }
36
37 static EnterpriseEnrollmentHelper* mock_enrollment_helper_creator(
xiyuan 2017/02/01 23:01:51 Move into anonymous namespace for static method wh
kumarniranjan 2017/02/03 22:53:20 Done.
38 EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer,
39 const policy::EnrollmentConfig& enrollment_config,
40 const std::string& enrolling_user_domain) {
41 return new EnterpriseEnrollmentHelperMock(status_consumer);
42 }
43
44 void SetUp() override {
xiyuan 2017/02/01 23:01:51 nit: Add a comment for overridden interface/class
kumarniranjan 2017/02/03 22:53:20 Done.
45 DBusThreadManager::Initialize();
46 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
47 &EnrollmentScreenUnitTest::mock_enrollment_helper_creator);
48 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
49 switches::kEnterpriseEnableZeroTouchEnrollment, "hands-off");
50 }
51
52 void TearDown() override { DBusThreadManager::Shutdown(); }
53
54 static bool should_enroll;
xiyuan 2017/02/01 23:01:51 Is this used anywhere?
kumarniranjan 2017/02/03 22:53:20 No. Deleted now.
55
56 // Replace main thread's task runner with a mock for duration of test.
57 base::MessageLoop loop;
58 base::ScopedMockTimeMessageLoopTaskRunner runner;
59
60 // Objects required by EnrollmentScreen that can be re-used.
61 policy::EnrollmentConfig enrollment_config;
62 pairing_chromeos::FakeControllerPairingController fake_controller;
63 MockBaseScreenDelegate mock_delegate;
64 MockEnrollmentScreenActor mock_actor;
xiyuan 2017/02/01 23:01:52 Name of a class member var should end with "_"
kumarniranjan 2017/02/03 22:53:20 Done.
65 };
66
67 TEST_F(EnrollmentScreenUnitTest, Retries) {
68 TestingBrowserProcess::DeleteInstance();
69 TestingBrowserProcess::CreateInstance();
xiyuan 2017/02/01 23:01:51 Why do we need to DeleteInstance then CreateInstan
kumarniranjan 2017/02/03 22:53:20 We want to replace the standard BrowserProcess wit
70
71 // Create EnrollmentScreen.
72 std::unique_ptr<EnrollmentScreen> enrollment_screen(
73 new EnrollmentScreen(&mock_delegate, &mock_actor));
74 enrollment_screen->SetParameters(
75 enrollment_config,
76 static_cast<pairing_chromeos::ControllerPairingController*>(
xiyuan 2017/02/01 23:01:51 Is static_cast necessary?
kumarniranjan 2017/02/03 22:53:21 Actually, it is not needed.
77 &fake_controller));
78
79 // Define behavior of EnterpriseEnrollmentHelperMock to always fail
80 // enrollment.
81 EnterpriseEnrollmentHelperMock::should_enroll = false;
xiyuan 2017/02/01 23:01:51 Can we avoid using static (or any global state) fo
kumarniranjan 2017/02/03 22:53:20 Yes. Done.
82
83 // Start zero-touch enrollment.
84 enrollment_screen->Show();
85
86 // Fast forward time by 1 minute.
87 runner.task_runner()->FastForwardBy(base::TimeDelta::FromMinutes(1));
88
89 // Check that we have retried 4 to 6 times.
90 // It is not an exact number due to the 10% jitter in each retry delay.
91 // Since these delays multiply exponentially, the jitter leads to
92 // significant differences in time taken after a few retries.
93 // For instance, it takes 26.5-39.5 sec for 4 retries,
94 // 39.8-69.1 sec for 5 retries, and 57.8-118.0 sec for 6 retries.
95 // Therefore in 60 sec, we could observe 4, 5, or 6 retries.
96 EXPECT_GE(enrollment_screen->num_retries_, 4);
97 EXPECT_LE(enrollment_screen->num_retries_, 6);
98
99 // Required for proper destruction of EnrollmentScreen.
100 TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
101 }
102
103 TEST_F(EnrollmentScreenUnitTest, DoesNotRetryOnTopOfUser) {
104 TestingBrowserProcess::DeleteInstance();
105 TestingBrowserProcess::CreateInstance();
106
107 // Create EnrollmentScreen.
108 std::unique_ptr<EnrollmentScreen> enrollment_screen(
109 new EnrollmentScreen(&mock_delegate, &mock_actor));
110 enrollment_screen->SetParameters(
111 enrollment_config,
112 static_cast<pairing_chromeos::ControllerPairingController*>(
113 &fake_controller));
xiyuan 2017/02/01 23:01:52 Line 104-113 repeats for every test case. Can they
kumarniranjan 2017/02/03 22:53:20 Yes. Done. I also need a separate function SetUpEn
114
115 // Define behavior of EnterpriseEnrollmentHelperMock to always fail
116 // enrollment.
117 EnterpriseEnrollmentHelperMock::should_enroll = false;
118
119 // Start zero-touch enrollment.
120 enrollment_screen->Show();
121
122 // Fast forward time by 45 seconds.
123 runner.task_runner()->FastForwardBy(base::TimeDelta::FromSeconds(45));
124
125 // Simulate the user clicking the retry button.
126 enrollment_screen->OnRetry();
127
128 // Fast forward time by another 15 seconds.
129 runner.task_runner()->FastForwardBy(base::TimeDelta::FromSeconds(15));
130
131 // Check that the number of retries is still 4-6.
132 EXPECT_GE(enrollment_screen->num_retries_, 4);
133 EXPECT_LE(enrollment_screen->num_retries_, 6);
134
135 // Required for proper destruction of EnrollmentScreen.
136 TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
137 }
138
139 TEST_F(EnrollmentScreenUnitTest, DoesNotRetryAfterSuccess) {
140 TestingBrowserProcess::DeleteInstance();
141 TestingBrowserProcess::CreateInstance();
142
143 // Create EnrollmentScreen.
144 std::unique_ptr<EnrollmentScreen> enrollment_screen(
145 new EnrollmentScreen(&mock_delegate, &mock_actor));
146 enrollment_screen->SetParameters(
147 enrollment_config,
148 static_cast<pairing_chromeos::ControllerPairingController*>(
149 &fake_controller));
150
151 // Define behavior of EnterpriseEnrollmentHelperMock to successfully enroll.
152 EnterpriseEnrollmentHelperMock::should_enroll = true;
153
154 // Start zero-touch enrollment.
155 enrollment_screen->Show();
156
157 // Fast forward time by 1 minute.
158 runner.task_runner()->FastForwardBy(base::TimeDelta::FromMinutes(1));
159
160 // Check that we do not retry.
161 EXPECT_TRUE(enrollment_screen->num_retries_ == 0);
162
163 // Required for proper destruction of EnrollmentScreen.
164 TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
165 }
166 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698