OLD | NEW |
---|---|
(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 "chrome/browser/chromeos/login/enrollment/enrollment_screen.h" | |
6 #include "base/bind.h" | |
7 #include "base/command_line.h" | |
8 #include "base/message_loop/message_loop.h" | |
9 #include "base/test/scoped_mock_time_message_loop_task_runner.h" | |
10 #include "base/threading/thread_task_runner_handle.h" | |
11 #include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper. h" | |
12 #include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_ mock.h" | |
13 #include "chrome/browser/chromeos/login/enrollment/mock_enrollment_screen.h" | |
14 #include "chrome/browser/chromeos/login/screens/mock_base_screen_delegate.h" | |
15 #include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h" | |
16 #include "chrome/browser/chromeos/policy/enrollment_config.h" | |
17 #include "chrome/test/base/testing_browser_process.h" | |
xiyuan
2017/02/06 23:46:05
This can also be removed now.
kumarniranjan
2017/02/07 21:26:00
I can't remove it because of
TestingBrowserProcess
xiyuan
2017/02/07 21:29:10
Acknowledged.
| |
18 #include "chromeos/chromeos_switches.h" | |
19 #include "chromeos/dbus/dbus_thread_manager.h" | |
20 #include "components/pairing/fake_controller_pairing_controller.h" | |
21 #include "testing/gtest/include/gtest/gtest.h" | |
22 | |
23 using testing::AnyNumber; | |
24 using testing::Invoke; | |
25 | |
26 namespace chromeos { | |
27 | |
28 class EnrollmentScreenUnitTest : public testing::Test { | |
29 public: | |
30 EnrollmentScreenUnitTest() : fake_controller_("") { | |
31 enrollment_config_.mode = policy::EnrollmentConfig::MODE_ATTESTATION_FORCED; | |
32 enrollment_config_.auth_mechanism = | |
33 policy::EnrollmentConfig::AUTH_MECHANISM_ATTESTATION; | |
34 } | |
35 | |
36 // Closure passed to EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock | |
37 // which creates the EnterpriseEnrollmentHelperMock object that will | |
38 // eventually be tied to the EnrollmentScreen. It also sets up the | |
39 // appropriate expectations for testing with the Google Mock framework. | |
40 template <bool should_enroll> | |
41 static EnterpriseEnrollmentHelper* MockEnrollmentHelperCreator( | |
42 EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer, | |
43 const policy::EnrollmentConfig& enrollment_config, | |
44 const std::string& enrolling_user_domain) { | |
45 EnterpriseEnrollmentHelperMock* mock = | |
46 new EnterpriseEnrollmentHelperMock(status_consumer); | |
47 if (should_enroll) { | |
48 EXPECT_CALL(*mock, EnrollUsingAttestation()) | |
49 .Times(AnyNumber()) | |
50 .WillRepeatedly(Invoke( | |
51 mock, | |
52 &EnterpriseEnrollmentHelperMock::SimulateEnrollmentSuccess)); | |
53 } else { | |
54 EXPECT_CALL(*mock, EnrollUsingAttestation()) | |
55 .Times(AnyNumber()) | |
56 .WillRepeatedly(Invoke( | |
57 mock, | |
58 &EnterpriseEnrollmentHelperMock::SimulateEnrollmentFailure)); | |
59 } | |
60 return mock; | |
61 } | |
62 | |
63 // Creates the EnrollmentScreen and sets required parameters. | |
64 void SetUpEnrollmentScreen() { | |
65 enrollment_screen_.reset( | |
66 new EnrollmentScreen(&mock_delegate_, &mock_actor_)); | |
67 enrollment_screen_->SetParameters(enrollment_config_, &fake_controller_); | |
68 } | |
69 | |
70 // Fast forwards time by the specified amount. | |
71 void FastForwardTime(base::TimeDelta time) { | |
72 runner_.task_runner()->FastForwardBy(time); | |
73 } | |
74 | |
75 // testing::Test: | |
76 void SetUp() override { | |
77 // Initialize the thread manager. | |
78 DBusThreadManager::Initialize(); | |
79 | |
80 // Configure the browser to use Hands-Off Enrollment. | |
81 base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( | |
82 switches::kEnterpriseEnableZeroTouchEnrollment, "hands-off"); | |
83 } | |
84 | |
85 void TearDown() override { DBusThreadManager::Shutdown(); } | |
86 | |
87 protected: | |
88 // A pointer to the EnrollmentScreen. | |
89 std::unique_ptr<EnrollmentScreen> enrollment_screen_; | |
90 | |
91 private: | |
92 // Replace main thread's task runner with a mock for duration of test. | |
93 base::MessageLoop loop_; | |
94 base::ScopedMockTimeMessageLoopTaskRunner runner_; | |
95 | |
96 // Objects required by the EnrollmentScreen that can be re-used. | |
97 policy::EnrollmentConfig enrollment_config_; | |
98 pairing_chromeos::FakeControllerPairingController fake_controller_; | |
99 MockBaseScreenDelegate mock_delegate_; | |
100 MockEnrollmentScreenActor mock_actor_; | |
101 | |
102 DISALLOW_COPY_AND_ASSIGN(EnrollmentScreenUnitTest); | |
103 }; | |
104 | |
105 TEST_F(EnrollmentScreenUnitTest, Retries) { | |
106 // Define behavior of EnterpriseEnrollmentHelperMock to always fail | |
107 // enrollment. | |
108 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock( | |
109 &EnrollmentScreenUnitTest::MockEnrollmentHelperCreator<false>); | |
110 | |
111 SetUpEnrollmentScreen(); | |
112 | |
113 // Remove jitter to enable deterministic testing. | |
114 enrollment_screen_->retry_policy_.jitter_factor = 0; | |
115 | |
116 // Start zero-touch enrollment. | |
117 enrollment_screen_->Show(); | |
118 | |
119 // Fast forward time by 1 minute. | |
120 FastForwardTime(base::TimeDelta::FromMinutes(1)); | |
121 | |
122 // Check that we have retried 4 times. | |
123 EXPECT_EQ(enrollment_screen_->num_retries_, 4); | |
124 | |
125 // Required for proper destruction of EnrollmentScreen. | |
126 TestingBrowserProcess::GetGlobal()->SetShuttingDown(true); | |
xiyuan
2017/02/07 21:29:10
Move to EnrollmentScreenUnitTest::TearDown since a
| |
127 } | |
128 | |
129 TEST_F(EnrollmentScreenUnitTest, DoesNotRetryOnTopOfUser) { | |
130 // Define behavior of EnterpriseEnrollmentHelperMock to always fail | |
131 // enrollment. | |
132 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock( | |
133 &EnrollmentScreenUnitTest::MockEnrollmentHelperCreator<false>); | |
134 | |
135 SetUpEnrollmentScreen(); | |
136 | |
137 // Remove jitter to enable deterministic testing. | |
138 enrollment_screen_->retry_policy_.jitter_factor = 0; | |
139 | |
140 // Start zero-touch enrollment. | |
141 enrollment_screen_->Show(); | |
142 | |
143 // Schedule user retry button click after 30 sec. | |
144 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( | |
145 FROM_HERE, base::Bind(&EnrollmentScreen::OnRetry, | |
146 enrollment_screen_->weak_ptr_factory_.GetWeakPtr()), | |
147 base::TimeDelta::FromSeconds(30)); | |
148 | |
149 // Fast forward time by 1 minute. | |
150 FastForwardTime(base::TimeDelta::FromMinutes(1)); | |
151 | |
152 // Check that the number of retries is still 4. | |
153 EXPECT_EQ(enrollment_screen_->num_retries_, 4); | |
154 | |
155 // Required for proper destruction of EnrollmentScreen. | |
156 TestingBrowserProcess::GetGlobal()->SetShuttingDown(true); | |
157 } | |
158 | |
159 TEST_F(EnrollmentScreenUnitTest, DoesNotRetryAfterSuccess) { | |
160 // Define behavior of EnterpriseEnrollmentHelperMock to successfully enroll. | |
161 EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock( | |
162 &EnrollmentScreenUnitTest::MockEnrollmentHelperCreator<true>); | |
163 | |
164 SetUpEnrollmentScreen(); | |
165 | |
166 // Start zero-touch enrollment. | |
167 enrollment_screen_->Show(); | |
168 | |
169 // Fast forward time by 1 minute. | |
170 FastForwardTime(base::TimeDelta::FromMinutes(1)); | |
171 | |
172 // Check that we do not retry. | |
173 EXPECT_EQ(enrollment_screen_->num_retries_, 0); | |
174 | |
175 // Required for proper destruction of EnrollmentScreen. | |
176 TestingBrowserProcess::GetGlobal()->SetShuttingDown(true); | |
177 } | |
178 } // namespace chromeos | |
OLD | NEW |