| Index: chrome/browser/chromeos/login/enrollment/enrollment_screen_unittest.cc
|
| diff --git a/chrome/browser/chromeos/login/enrollment/enrollment_screen_unittest.cc b/chrome/browser/chromeos/login/enrollment/enrollment_screen_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..8af24fced43ea7e2dfe66fef9c97b8ec4595e0aa
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/login/enrollment/enrollment_screen_unittest.cc
|
| @@ -0,0 +1,166 @@
|
| +// Copyright (c) 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/command_line.h"
|
| +#include "base/lazy_instance.h"
|
| +#include "base/logging.h"
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/test/scoped_mock_time_message_loop_task_runner.h"
|
| +#include "chrome/browser/chromeos/login/enrollment/enrollment_screen.h"
|
| +#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper.h"
|
| +#include "chrome/browser/chromeos/login/enrollment/enterprise_enrollment_helper_mock.h"
|
| +#include "chrome/browser/chromeos/login/enrollment/mock_enrollment_screen.h"
|
| +#include "chrome/browser/chromeos/login/screens/mock_base_screen_delegate.h"
|
| +#include "chrome/browser/chromeos/policy/device_cloud_policy_manager_chromeos.h"
|
| +#include "chrome/browser/chromeos/policy/enrollment_config.h"
|
| +#include "chrome/test/base/testing_browser_process.h"
|
| +#include "chromeos/chromeos_switches.h"
|
| +#include "chromeos/dbus/dbus_thread_manager.h"
|
| +#include "components/pairing/fake_controller_pairing_controller.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using testing::AnyNumber;
|
| +using testing::Invoke;
|
| +
|
| +namespace chromeos {
|
| +
|
| +class EnrollmentScreenUnitTest : public testing::Test {
|
| + public:
|
| + EnrollmentScreenUnitTest() : fake_controller("") {
|
| + enrollment_config.mode = policy::EnrollmentConfig::MODE_ATTESTATION_FORCED;
|
| + enrollment_config.auth_mechanism =
|
| + policy::EnrollmentConfig::AUTH_MECHANISM_ATTESTATION;
|
| + }
|
| +
|
| + static EnterpriseEnrollmentHelper* mock_enrollment_helper_creator(
|
| + EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer,
|
| + const policy::EnrollmentConfig& enrollment_config,
|
| + const std::string& enrolling_user_domain) {
|
| + return new EnterpriseEnrollmentHelperMock(status_consumer);
|
| + }
|
| +
|
| + void SetUp() override {
|
| + DBusThreadManager::Initialize();
|
| + EnterpriseEnrollmentHelper::SetupEnrollmentHelperMock(
|
| + &EnrollmentScreenUnitTest::mock_enrollment_helper_creator);
|
| + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII(
|
| + switches::kEnterpriseEnableZeroTouchEnrollment, "hands-off");
|
| + }
|
| +
|
| + void TearDown() override { DBusThreadManager::Shutdown(); }
|
| +
|
| + static bool should_enroll;
|
| +
|
| + // Replace main thread's task runner with a mock for duration of test.
|
| + base::MessageLoop loop;
|
| + base::ScopedMockTimeMessageLoopTaskRunner runner;
|
| +
|
| + // Objects required by EnrollmentScreen that can be re-used.
|
| + policy::EnrollmentConfig enrollment_config;
|
| + pairing_chromeos::FakeControllerPairingController fake_controller;
|
| + MockBaseScreenDelegate mock_delegate;
|
| + MockEnrollmentScreenActor mock_actor;
|
| +};
|
| +
|
| +TEST_F(EnrollmentScreenUnitTest, Retries) {
|
| + TestingBrowserProcess::DeleteInstance();
|
| + TestingBrowserProcess::CreateInstance();
|
| +
|
| + // Create EnrollmentScreen.
|
| + std::unique_ptr<EnrollmentScreen> enrollment_screen(
|
| + new EnrollmentScreen(&mock_delegate, &mock_actor));
|
| + enrollment_screen->SetParameters(
|
| + enrollment_config,
|
| + static_cast<pairing_chromeos::ControllerPairingController*>(
|
| + &fake_controller));
|
| +
|
| + // Define behavior of EnterpriseEnrollmentHelperMock to always fail
|
| + // enrollment.
|
| + EnterpriseEnrollmentHelperMock::should_enroll = false;
|
| +
|
| + // Start zero-touch enrollment.
|
| + enrollment_screen->Show();
|
| +
|
| + // Fast forward time by 1 minute.
|
| + runner.task_runner()->FastForwardBy(base::TimeDelta::FromMinutes(1));
|
| +
|
| + // Check that we have retried 4 to 6 times.
|
| + // It is not an exact number due to the 10% jitter in each retry delay.
|
| + // Since these delays multiply exponentially, the jitter leads to
|
| + // significant differences in time taken after a few retries.
|
| + // For instance, it takes 26.5-39.5 sec for 4 retries,
|
| + // 39.8-69.1 sec for 5 retries, and 57.8-118.0 sec for 6 retries.
|
| + // Therefore in 60 sec, we could observe 4, 5, or 6 retries.
|
| + EXPECT_TRUE(enrollment_screen->num_retries_ >= 4 ||
|
| + enrollment_screen->num_retries_ <= 6);
|
| +
|
| + // Required for proper destruction of EnrollmentScreen.
|
| + TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
|
| +}
|
| +
|
| +TEST_F(EnrollmentScreenUnitTest, DoesNotRetryOnTopOfUser) {
|
| + TestingBrowserProcess::DeleteInstance();
|
| + TestingBrowserProcess::CreateInstance();
|
| +
|
| + // Create EnrollmentScreen.
|
| + std::unique_ptr<EnrollmentScreen> enrollment_screen(
|
| + new EnrollmentScreen(&mock_delegate, &mock_actor));
|
| + enrollment_screen->SetParameters(
|
| + enrollment_config,
|
| + static_cast<pairing_chromeos::ControllerPairingController*>(
|
| + &fake_controller));
|
| +
|
| + // Define behavior of EnterpriseEnrollmentHelperMock to always fail
|
| + // enrollment.
|
| + EnterpriseEnrollmentHelperMock::should_enroll = false;
|
| +
|
| + // Start zero-touch enrollment.
|
| + enrollment_screen->Show();
|
| +
|
| + // Fast forward time by 45 seconds.
|
| + runner.task_runner()->FastForwardBy(base::TimeDelta::FromSeconds(45));
|
| +
|
| + // Simulate the user clicking the retry button.
|
| + enrollment_screen->OnRetry();
|
| +
|
| + // Fast forward time by another 15 seconds.
|
| + runner.task_runner()->FastForwardBy(base::TimeDelta::FromSeconds(15));
|
| +
|
| + // Check that the number of retries is still 4-6.
|
| + EXPECT_TRUE(enrollment_screen->num_retries_ >= 4 &&
|
| + enrollment_screen->num_retries_ <= 6);
|
| +
|
| + // Required for proper destruction of EnrollmentScreen.
|
| + TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
|
| +}
|
| +
|
| +TEST_F(EnrollmentScreenUnitTest, DoesNotRetryAfterSuccess) {
|
| + TestingBrowserProcess::DeleteInstance();
|
| + TestingBrowserProcess::CreateInstance();
|
| +
|
| + // Create EnrollmentScreen.
|
| + std::unique_ptr<EnrollmentScreen> enrollment_screen(
|
| + new EnrollmentScreen(&mock_delegate, &mock_actor));
|
| + enrollment_screen->SetParameters(
|
| + enrollment_config,
|
| + static_cast<pairing_chromeos::ControllerPairingController*>(
|
| + &fake_controller));
|
| +
|
| + // Define behavior of EnterpriseEnrollmentHelperMock to successfully enroll.
|
| + EnterpriseEnrollmentHelperMock::should_enroll = true;
|
| +
|
| + // Start zero-touch enrollment.
|
| + enrollment_screen->Show();
|
| +
|
| + // Fast forward time by 1 minute.
|
| + runner.task_runner()->FastForwardBy(base::TimeDelta::FromMinutes(1));
|
| +
|
| + // Check that we do not retry.
|
| + EXPECT_TRUE(enrollment_screen->num_retries_ == 0);
|
| +
|
| + // Required for proper destruction of EnrollmentScreen.
|
| + TestingBrowserProcess::GetGlobal()->SetShuttingDown(true);
|
| +}
|
| +} // namespace chromeos
|
|
|