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

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

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

Powered by Google App Engine
This is Rietveld 408576698