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..bb53c260a4f99b18c6af25eac0634a577830bbd7 |
--- /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" |
xiyuan
2017/02/01 23:01:51
nit: unused ?
kumarniranjan
2017/02/03 22:53:20
It was unused. I deleted it. Thanks for catching t
|
+#include "base/logging.h" |
xiyuan
2017/02/01 23:01:51
nit: unused ?
kumarniranjan
2017/02/03 22:53:21
Deleted
|
+#include "base/message_loop/message_loop.h" |
+#include "base/run_loop.h" |
xiyuan
2017/02/01 23:01:51
nit: unused ?
kumarniranjan
2017/02/03 22:53:20
Deleted
|
+#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; |
xiyuan
2017/02/01 23:01:51
Are these used?
kumarniranjan
2017/02/03 22:53:20
Yes
|
+ |
+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( |
xiyuan
2017/02/01 23:01:51
Move into anonymous namespace for static method wh
kumarniranjan
2017/02/03 22:53:20
Done.
|
+ EnterpriseEnrollmentHelper::EnrollmentStatusConsumer* status_consumer, |
+ const policy::EnrollmentConfig& enrollment_config, |
+ const std::string& enrolling_user_domain) { |
+ return new EnterpriseEnrollmentHelperMock(status_consumer); |
+ } |
+ |
+ void SetUp() override { |
xiyuan
2017/02/01 23:01:51
nit: Add a comment for overridden interface/class
kumarniranjan
2017/02/03 22:53:20
Done.
|
+ 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; |
xiyuan
2017/02/01 23:01:51
Is this used anywhere?
kumarniranjan
2017/02/03 22:53:20
No. Deleted now.
|
+ |
+ // 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; |
xiyuan
2017/02/01 23:01:52
Name of a class member var should end with "_"
kumarniranjan
2017/02/03 22:53:20
Done.
|
+}; |
+ |
+TEST_F(EnrollmentScreenUnitTest, Retries) { |
+ TestingBrowserProcess::DeleteInstance(); |
+ TestingBrowserProcess::CreateInstance(); |
xiyuan
2017/02/01 23:01:51
Why do we need to DeleteInstance then CreateInstan
kumarniranjan
2017/02/03 22:53:20
We want to replace the standard BrowserProcess wit
|
+ |
+ // Create EnrollmentScreen. |
+ std::unique_ptr<EnrollmentScreen> enrollment_screen( |
+ new EnrollmentScreen(&mock_delegate, &mock_actor)); |
+ enrollment_screen->SetParameters( |
+ enrollment_config, |
+ static_cast<pairing_chromeos::ControllerPairingController*>( |
xiyuan
2017/02/01 23:01:51
Is static_cast necessary?
kumarniranjan
2017/02/03 22:53:21
Actually, it is not needed.
|
+ &fake_controller)); |
+ |
+ // Define behavior of EnterpriseEnrollmentHelperMock to always fail |
+ // enrollment. |
+ EnterpriseEnrollmentHelperMock::should_enroll = false; |
xiyuan
2017/02/01 23:01:51
Can we avoid using static (or any global state) fo
kumarniranjan
2017/02/03 22:53:20
Yes. Done.
|
+ |
+ // 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_GE(enrollment_screen->num_retries_, 4); |
+ EXPECT_LE(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)); |
xiyuan
2017/02/01 23:01:52
Line 104-113 repeats for every test case. Can they
kumarniranjan
2017/02/03 22:53:20
Yes. Done. I also need a separate function SetUpEn
|
+ |
+ // 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_GE(enrollment_screen->num_retries_, 4); |
+ EXPECT_LE(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 |