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

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

Issue 2977033002: Mixed Licenses Enrollment (Closed)
Patch Set: Fix last nit Created 3 years, 4 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
1 // Copyright (c) 2017 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h" 5 #include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
6 #include "base/bind.h" 6 #include "base/bind.h"
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/message_loop/message_loop.h" 9 #include "base/message_loop/message_loop.h"
10 #include "base/test/scoped_mock_time_message_loop_task_runner.h" 10 #include "base/test/scoped_mock_time_message_loop_task_runner.h"
(...skipping 11 matching lines...) Expand all
22 #include "testing/gtest/include/gtest/gtest.h" 22 #include "testing/gtest/include/gtest/gtest.h"
23 23
24 using testing::_; 24 using testing::_;
25 using testing::AnyNumber; 25 using testing::AnyNumber;
26 using testing::Invoke; 26 using testing::Invoke;
27 27
28 namespace chromeos { 28 namespace chromeos {
29 29
30 class EnrollmentScreenUnitTest : public testing::Test { 30 class EnrollmentScreenUnitTest : public testing::Test {
31 public: 31 public:
32 EnrollmentScreenUnitTest() : fake_controller_("") { 32 EnrollmentScreenUnitTest() : fake_controller_("") {}
33 enrollment_config_.mode = policy::EnrollmentConfig::MODE_ATTESTATION_FORCED; 33
34 enrollment_config_.auth_mechanism = 34 // Creates the EnrollmentScreen and sets required parameters.
35 policy::EnrollmentConfig::AUTH_MECHANISM_ATTESTATION; 35 virtual void SetUpEnrollmentScreen() {
36 enrollment_screen_.reset(
37 new EnrollmentScreen(&mock_delegate_, &mock_view_));
38 enrollment_screen_->SetParameters(enrollment_config_, &fake_controller_);
36 } 39 }
37 40
41 // Fast forwards time by the specified amount.
42 void FastForwardTime(base::TimeDelta time) {
43 runner_.task_runner()->FastForwardBy(time);
44 }
45
46 MockBaseScreenDelegate* GetBaseScreenDelegate() { return &mock_delegate_; }
47 MockEnrollmentScreenView* GetMockScreenView() { return &mock_view_; }
48
49 // testing::Test:
50 void SetUp() override {
51 // Initialize the thread manager.
52 DBusThreadManager::Initialize();
53 }
54
55 void TearDown() override {
56 TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
57 DBusThreadManager::Shutdown();
58 }
59
60 protected:
61 std::unique_ptr<EnrollmentScreen> enrollment_screen_;
62
63 policy::EnrollmentConfig enrollment_config_;
64
65 private:
66 // Replace main thread's task runner with a mock for duration of test.
67 base::MessageLoop loop_;
68 base::ScopedMockTimeMessageLoopTaskRunner runner_;
69
70 // Objects required by the EnrollmentScreen that can be re-used.
71 pairing_chromeos::FakeControllerPairingController fake_controller_;
72 MockBaseScreenDelegate mock_delegate_;
73 MockEnrollmentScreenView mock_view_;
74
75 DISALLOW_COPY_AND_ASSIGN(EnrollmentScreenUnitTest);
76 };
77
78 class ZeroTouchEnrollmentScreenUnitTest : public EnrollmentScreenUnitTest {
79 public:
80 ZeroTouchEnrollmentScreenUnitTest() = default;
81
38 // Closure passed to EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock 82 // Closure passed to EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock
39 // which creates the EnterpriseEnrollmentHelperMock object that will 83 // which creates the EnterpriseEnrollmentHelperMock object that will
40 // eventually be tied to the EnrollmentScreen. It also sets up the 84 // eventually be tied to the EnrollmentScreen. It also sets up the
41 // appropriate expectations for testing with the Google Mock framework. 85 // appropriate expectations for testing with the Google Mock framework.
42 // The template parameter should_enroll indicates whether or not 86 // The template parameter should_enroll indicates whether or not
43 // the EnterpriseEnrollmentHelper should be mocked to successfully enroll. 87 // the EnterpriseEnrollmentHelper should be mocked to successfully enroll.
44 template <bool should_enroll> 88 template <bool should_enroll>
45 static EnterpriseEnrollmentHelper* MockEnrollmentHelperCreator( 89 static EnterpriseEnrollmentHelper* MockEnrollmentHelperCreator(
46 EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer, 90 EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer,
47 const policy::EnrollmentConfig& enrollment_config, 91 const policy::EnrollmentConfig& enrollment_config,
(...skipping 19 matching lines...) Expand all
67 .Times(AnyNumber()) 111 .Times(AnyNumber())
68 .WillRepeatedly(Invoke([mock]() { 112 .WillRepeatedly(Invoke([mock]() {
69 mock->status_consumer()->OnEnrollmentError( 113 mock->status_consumer()->OnEnrollmentError(
70 policy::EnrollmentStatus::ForStatus( 114 policy::EnrollmentStatus::ForStatus(
71 policy::EnrollmentStatus::REGISTRATION_FAILED)); 115 policy::EnrollmentStatus::REGISTRATION_FAILED));
72 })); 116 }));
73 } 117 }
74 return mock; 118 return mock;
75 } 119 }
76 120
77 // Creates the EnrollmentScreen and sets required parameters. 121 void SetUpEnrollmentScreen() override {
78 void SetUpEnrollmentScreen() { 122 enrollment_config_.mode = policy::EnrollmentConfig::MODE_ATTESTATION_FORCED;
79 enrollment_screen_.reset( 123 enrollment_config_.auth_mechanism =
80 new EnrollmentScreen(&mock_delegate_, &mock_view_)); 124 policy::EnrollmentConfig::AUTH_MECHANISM_ATTESTATION;
81 enrollment_screen_->SetParameters(enrollment_config_, &fake_controller_); 125 EnrollmentScreenUnitTest::SetUpEnrollmentScreen();
82 } 126 }
83 127
84 // Fast forwards time by the specified amount.
85 void FastForwardTime(base::TimeDelta time) {
86 runner_.task_runner()->FastForwardBy(time);
87 }
88
89 MockBaseScreenDelegate* GetBaseScreenDelegate() { return &mock_delegate_; }
90
91 // testing::Test: 128 // testing::Test:
92 void SetUp() override { 129 void SetUp() override {
93 // Initialize the thread manager. 130 EnrollmentScreenUnitTest::SetUp();
94 DBusThreadManager::Initialize();
95 131
96 // Configure the browser to use Hands-Off Enrollment. 132 // Configure the browser to use Hands-Off Enrollment.
97 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( 133 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
98 switches::kEnterpriseEnableZeroTouchEnrollment, "hands-off"); 134 switches::kEnterpriseEnableZeroTouchEnrollment, "hands-off");
99 } 135 }
100 136
101 void TearDown() override {
102 TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
103 DBusThreadManager::Shutdown();
104 }
105
106 protected:
107 // A pointer to the EnrollmentScreen.
108 std::unique_ptr<EnrollmentScreen> enrollment_screen_;
109
110 private: 137 private:
111 // Replace main thread's task runner with a mock for duration of test. 138 DISALLOW_COPY_AND_ASSIGN(ZeroTouchEnrollmentScreenUnitTest);
112 base::MessageLoop loop_;
113 base::ScopedMockTimeMessageLoopTaskRunner runner_;
114
115 // Objects required by the EnrollmentScreen that can be re-used.
116 policy::EnrollmentConfig enrollment_config_;
117 pairing_chromeos::FakeControllerPairingController fake_controller_;
118 MockBaseScreenDelegate mock_delegate_;
119 MockEnrollmentScreenView mock_view_;
120
121 DISALLOW_COPY_AND_ASSIGN(EnrollmentScreenUnitTest);
122 }; 139 };
123 140
124 TEST_F(EnrollmentScreenUnitTest, Retries) { 141 TEST_F(ZeroTouchEnrollmentScreenUnitTest, Retries) {
125 // Define behavior of EnterpriseEnrollmentHelperMock to always fail 142 // Define behavior of EnterpriseEnrollmentHelperMock to always fail
126 // enrollment. 143 // enrollment.
127 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock( 144 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
128 &EnrollmentScreenUnitTest::MockEnrollmentHelperCreator<false>); 145 &ZeroTouchEnrollmentScreenUnitTest::MockEnrollmentHelperCreator<false>);
129 146
130 SetUpEnrollmentScreen(); 147 SetUpEnrollmentScreen();
131 148
132 // Remove jitter to enable deterministic testing. 149 // Remove jitter to enable deterministic testing.
133 enrollment_screen_->retry_policy_.jitter_factor = 0; 150 enrollment_screen_->retry_policy_.jitter_factor = 0;
134 151
135 // Start zero-touch enrollment. 152 // Start zero-touch enrollment.
136 enrollment_screen_->Show(); 153 enrollment_screen_->Show();
137 154
138 // Fast forward time by 1 minute. 155 // Fast forward time by 1 minute.
139 FastForwardTime(base::TimeDelta::FromMinutes(1)); 156 FastForwardTime(base::TimeDelta::FromMinutes(1));
140 157
141 // Check that we have retried 4 times. 158 // Check that we have retried 4 times.
142 EXPECT_EQ(enrollment_screen_->num_retries_, 4); 159 EXPECT_EQ(enrollment_screen_->num_retries_, 4);
143 } 160 }
144 161
145 TEST_F(EnrollmentScreenUnitTest, DoesNotRetryOnTopOfUser) { 162 TEST_F(ZeroTouchEnrollmentScreenUnitTest, DoesNotRetryOnTopOfUser) {
146 // Define behavior of EnterpriseEnrollmentHelperMock to always fail 163 // Define behavior of EnterpriseEnrollmentHelperMock to always fail
147 // enrollment. 164 // enrollment.
148 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock( 165 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
149 &EnrollmentScreenUnitTest::MockEnrollmentHelperCreator<false>); 166 &ZeroTouchEnrollmentScreenUnitTest::MockEnrollmentHelperCreator<false>);
150 167
151 SetUpEnrollmentScreen(); 168 SetUpEnrollmentScreen();
152 169
153 // Remove jitter to enable deterministic testing. 170 // Remove jitter to enable deterministic testing.
154 enrollment_screen_->retry_policy_.jitter_factor = 0; 171 enrollment_screen_->retry_policy_.jitter_factor = 0;
155 172
156 // Start zero-touch enrollment. 173 // Start zero-touch enrollment.
157 enrollment_screen_->Show(); 174 enrollment_screen_->Show();
158 175
159 // Schedule user retry button click after 30 sec. 176 // Schedule user retry button click after 30 sec.
160 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( 177 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(
161 FROM_HERE, 178 FROM_HERE,
162 base::BindOnce(&EnrollmentScreen::OnRetry, 179 base::BindOnce(&EnrollmentScreen::OnRetry,
163 enrollment_screen_->weak_ptr_factory_.GetWeakPtr()), 180 enrollment_screen_->weak_ptr_factory_.GetWeakPtr()),
164 base::TimeDelta::FromSeconds(30)); 181 base::TimeDelta::FromSeconds(30));
165 182
166 // Fast forward time by 1 minute. 183 // Fast forward time by 1 minute.
167 FastForwardTime(base::TimeDelta::FromMinutes(1)); 184 FastForwardTime(base::TimeDelta::FromMinutes(1));
168 185
169 // Check that the number of retries is still 4. 186 // Check that the number of retries is still 4.
170 EXPECT_EQ(enrollment_screen_->num_retries_, 4); 187 EXPECT_EQ(enrollment_screen_->num_retries_, 4);
171 } 188 }
172 189
173 TEST_F(EnrollmentScreenUnitTest, DoesNotRetryAfterSuccess) { 190 TEST_F(ZeroTouchEnrollmentScreenUnitTest, DoesNotRetryAfterSuccess) {
174 // Define behavior of EnterpriseEnrollmentHelperMock to successfully enroll. 191 // Define behavior of EnterpriseEnrollmentHelperMock to successfully enroll.
175 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock( 192 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
176 &EnrollmentScreenUnitTest::MockEnrollmentHelperCreator<true>); 193 &ZeroTouchEnrollmentScreenUnitTest::MockEnrollmentHelperCreator<true>);
177 194
178 SetUpEnrollmentScreen(); 195 SetUpEnrollmentScreen();
179 196
180 // Start zero-touch enrollment. 197 // Start zero-touch enrollment.
181 enrollment_screen_->Show(); 198 enrollment_screen_->Show();
182 199
183 // Fast forward time by 1 minute. 200 // Fast forward time by 1 minute.
184 FastForwardTime(base::TimeDelta::FromMinutes(1)); 201 FastForwardTime(base::TimeDelta::FromMinutes(1));
185 202
186 // Check that we do not retry. 203 // Check that we do not retry.
187 EXPECT_EQ(enrollment_screen_->num_retries_, 0); 204 EXPECT_EQ(enrollment_screen_->num_retries_, 0);
188 } 205 }
189 206
190 TEST_F(EnrollmentScreenUnitTest, FinishesEnrollmentFlow) { 207 TEST_F(ZeroTouchEnrollmentScreenUnitTest, FinishesEnrollmentFlow) {
191 // Define behavior of EnterpriseEnrollmentHelperMock to successfully enroll. 208 // Define behavior of EnterpriseEnrollmentHelperMock to successfully enroll.
192 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock( 209 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
193 &EnrollmentScreenUnitTest::MockEnrollmentHelperCreator<true>); 210 &ZeroTouchEnrollmentScreenUnitTest::MockEnrollmentHelperCreator<true>);
194 211
195 SetUpEnrollmentScreen(); 212 SetUpEnrollmentScreen();
196 213
197 // Set up expectation for BaseScreenDelegate::OnExit to be called 214 // Set up expectation for BaseScreenDelegate::OnExit to be called
198 // with BaseScreenDelegate::ENTERPRISE_ENROLLMENT_COMPLETED 215 // with BaseScreenDelegate::ENTERPRISE_ENROLLMENT_COMPLETED
199 // This is how we check that the code finishes and cleanly exits 216 // This is how we check that the code finishes and cleanly exits
200 // the enterprise enrollment flow. 217 // the enterprise enrollment flow.
201 EXPECT_CALL(*GetBaseScreenDelegate(), 218 EXPECT_CALL(*GetBaseScreenDelegate(),
202 OnExit(_, ScreenExitCode::ENTERPRISE_ENROLLMENT_COMPLETED, _)) 219 OnExit(_, ScreenExitCode::ENTERPRISE_ENROLLMENT_COMPLETED, _))
203 .Times(1); 220 .Times(1);
204 221
205 // Start zero-touch enrollment. 222 // Start zero-touch enrollment.
206 enrollment_screen_->Show(); 223 enrollment_screen_->Show();
207 } 224 }
225
226 class MultiLicenseEnrollmentScreenUnitTest : public EnrollmentScreenUnitTest {
227 public:
228 MultiLicenseEnrollmentScreenUnitTest() = default;
229
230 void SetUpEnrollmentScreen() override {
231 enrollment_config_.mode = policy::EnrollmentConfig::MODE_MANUAL;
232 enrollment_config_.auth_mechanism =
233 policy::EnrollmentConfig::AUTH_MECHANISM_INTERACTIVE;
234 EnrollmentScreenUnitTest::SetUpEnrollmentScreen();
235 }
236
237 static EnterpriseEnrollmentHelper* MockEnrollmentHelperCreator(
238 EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer,
239 const policy::EnrollmentConfig& enrollment_config,
240 const std::string& enrolling_user_domain) {
241 EnterpriseEnrollmentHelperMock* mock =
242 new EnterpriseEnrollmentHelperMock(status_consumer);
243 EXPECT_CALL(*mock, EnrollUsingAuthCode(_, _))
244 .Times(AnyNumber())
245 .WillRepeatedly(Invoke([mock](const std::string&, bool) {
246 EnrollmentLicenseMap licenses;
247 static_cast<EnrollmentScreen*>(mock->status_consumer())
248 ->OnMultipleLicensesAvailable(licenses);
249 }));
250 EXPECT_CALL(*mock, UseLicenseType(::policy::LicenseType::ANNUAL)).Times(1);
251
252 return mock;
253 }
254
255 private:
256 DISALLOW_COPY_AND_ASSIGN(MultiLicenseEnrollmentScreenUnitTest);
257 };
258
259 // Sign in and check that selected license type is propagated correctly.
260 TEST_F(MultiLicenseEnrollmentScreenUnitTest, TestLicenseSelection) {
261 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
262 &MultiLicenseEnrollmentScreenUnitTest::MockEnrollmentHelperCreator);
263
264 EXPECT_CALL(*GetMockScreenView(), SetParameters(_, _)).Times(1);
265
266 SetUpEnrollmentScreen();
267
268 EXPECT_CALL(*GetMockScreenView(), Show()).Times(1);
269 EXPECT_CALL(*GetMockScreenView(), ShowSigninScreen()).Times(1);
270
271 // Start enrollment.
272 enrollment_screen_->Show();
273
274 // Once at login, once after picking license type.
275
276 EXPECT_CALL(*GetMockScreenView(), ShowEnrollmentSpinnerScreen()).Times(2);
277 EXPECT_CALL(*GetMockScreenView(), ShowLicenseTypeSelectionScreen(_)).Times(1);
278
279 enrollment_screen_->OnLoginDone("user@domain.com", "oauth");
280 enrollment_screen_->OnLicenseTypeSelected("annual");
281 }
282
208 } // namespace chromeos 283 } // namespace chromeos
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698