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 || |
| 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 && |
| 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 |