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 "base/command_line.h" | |
6 #include "base/lazy_instance.h" | |
7 #include "base/logging.h" | |
8 #include "base/message_loop/message_loop.h" | |
9 #include "base/run_loop.h" | |
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; | |
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( | |
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 { | |
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; | |
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; | |
65 }; | |
66 | |
67 TEST_F(EnrollmentScreenUnitTest, Retries) { | |
68 TestingBrowserProcess::DeleteInstance(); | |
69 TestingBrowserProcess::CreateInstance(); | |
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*>( | |
77 &fake_controller)); | |
78 | |
79 // Define behavior of EnterpriseEnrollmentHelperMock to always fail | |
80 // enrollment. | |
81 EnterpriseEnrollmentHelperMock::should_enroll = false; | |
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_TRUE(enrollment_screen->num_retries_ >= 4 || | |
can Skylar cook
2017/02/01 00:47:47
`&&` ?
kumarniranjan
2017/02/01 02:32:17
Done.
| |
97 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)); | |
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_TRUE(enrollment_screen->num_retries_ >= 4 && | |
can Skylar cook
2017/02/01 00:47:47
Does EXPECT_TRUE() print the original argument wit
kumarniranjan
2017/02/01 02:32:17
Thanks for the suggestion. I will try these from n
| |
133 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 | |
OLD | NEW |