| Index: chrome/browser/chromeos/policy/active_directory_policy_manager_unittest.cc
|
| diff --git a/chrome/browser/chromeos/policy/active_directory_policy_manager_unittest.cc b/chrome/browser/chromeos/policy/active_directory_policy_manager_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..d473ca4b9a58d37d91406b6869381a83718a6c6f
|
| --- /dev/null
|
| +++ b/chrome/browser/chromeos/policy/active_directory_policy_manager_unittest.cc
|
| @@ -0,0 +1,432 @@
|
| +// Copyright 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 "chrome/browser/chromeos/policy/active_directory_policy_manager.h"
|
| +
|
| +#include <memory>
|
| +#include <string>
|
| +#include <utility>
|
| +
|
| +#include "base/bind.h"
|
| +#include "base/logging.h"
|
| +#include "base/memory/ptr_util.h"
|
| +#include "base/run_loop.h"
|
| +#include "base/test/scoped_task_environment.h"
|
| +#include "base/threading/thread_task_runner_handle.h"
|
| +#include "base/time/time.h"
|
| +#include "chromeos/dbus/auth_policy_client.h"
|
| +#include "chromeos/dbus/dbus_thread_manager.h"
|
| +#include "components/policy/core/common/cloud/mock_cloud_policy_store.h"
|
| +#include "components/policy/core/common/schema_registry.h"
|
| +#include "components/signin/core/account_id/account_id.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace {
|
| +
|
| +class TestAuthPolicyClient : public chromeos::AuthPolicyClient {
|
| + public:
|
| + void Init(dbus::Bus* bus) override { NOTIMPLEMENTED(); }
|
| +
|
| + void JoinAdDomain(const std::string& machine_name,
|
| + const std::string& user_principal_name,
|
| + int password_fd,
|
| + JoinCallback callback) override {
|
| + NOTIMPLEMENTED();
|
| + }
|
| +
|
| + void AuthenticateUser(const std::string& user_principal_name,
|
| + const std::string& object_guid,
|
| + int password_fd,
|
| + AuthCallback callback) override {
|
| + NOTIMPLEMENTED();
|
| + }
|
| +
|
| + void GetUserStatus(const std::string& object_guid,
|
| + GetUserStatusCallback callback) override {
|
| + NOTIMPLEMENTED();
|
| + }
|
| +
|
| + void RefreshDevicePolicy(RefreshPolicyCallback callback) override {
|
| + NOTIMPLEMENTED();
|
| + }
|
| +
|
| + void RefreshUserPolicy(const AccountId& account_id,
|
| + RefreshPolicyCallback callback) override {
|
| + base::ThreadTaskRunnerHandle::Get()->PostTask(
|
| + FROM_HERE, base::BindOnce(std::move(callback),
|
| + refresh_user_policy_callback_success_));
|
| + }
|
| +
|
| + void SetRefreshUserPolicyCallbackSuccess(bool success) {
|
| + refresh_user_policy_callback_success_ = success;
|
| + }
|
| +
|
| + private:
|
| + bool refresh_user_policy_callback_success_ = true;
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +namespace policy {
|
| +
|
| +// Note that session exit is asynchronous and thus ActiveDirectoryPolicyManager
|
| +// still needs to react reasonably to events happening after session exit has
|
| +// been fired.
|
| +class ActiveDirectoryPolicyManagerTest : public testing::Test {
|
| + public:
|
| + ActiveDirectoryPolicyManagerTest() {
|
| + auto mock_client_unique_ptr = base::MakeUnique<TestAuthPolicyClient>();
|
| + mock_client_ = mock_client_unique_ptr.get();
|
| + chromeos::DBusThreadManager::GetSetterForTesting()->SetAuthPolicyClient(
|
| + std::move(mock_client_unique_ptr));
|
| + }
|
| +
|
| + ~ActiveDirectoryPolicyManagerTest() override {
|
| + EXPECT_EQ(session_exit_expected_, session_exited_);
|
| + policy_manager_->Shutdown();
|
| + }
|
| +
|
| + protected:
|
| + // Expect that session exit will be called below. (Must only be called once.)
|
| + void ExpectSessionExit() {
|
| + ASSERT_FALSE(session_exit_expected_);
|
| + EXPECT_FALSE(session_exited_);
|
| + session_exit_expected_ = true;
|
| + }
|
| +
|
| + // Expect that session exit has been called above. (Must only be called after
|
| + // ExpectSessionExit().)
|
| + void ExpectSessionExited() {
|
| + ASSERT_TRUE(session_exit_expected_);
|
| + EXPECT_TRUE(session_exited_);
|
| + }
|
| +
|
| + // Closure to exit the session.
|
| + void ExitSession() {
|
| + EXPECT_TRUE(session_exit_expected_);
|
| + session_exited_ = true;
|
| + }
|
| +
|
| + bool session_exited_ = false;
|
| + bool session_exit_expected_ = false;
|
| +
|
| + // To be handed over to ActiveDirectoryPolicyManager.
|
| + base::OnceClosure exit_session_{
|
| + base::BindOnce(&ActiveDirectoryPolicyManagerTest::ExitSession,
|
| + base::Unretained(this))};
|
| +
|
| + // To be handed over to ActiveDirectoryPolicyManager ...
|
| + std::unique_ptr<MockCloudPolicyStore> mock_store_unique_ptr_{
|
| + base::MakeUnique<MockCloudPolicyStore>()};
|
| +
|
| + // ... but keeping a non-owned pointer.
|
| + MockCloudPolicyStore* mock_store_{mock_store_unique_ptr_.get()};
|
| +
|
| + // Owned by DBusThreadManager.
|
| + TestAuthPolicyClient* mock_client_;
|
| +
|
| + SchemaRegistry schema_registry_;
|
| +
|
| + // Initialized by the individual tests but owned by the test class so that it
|
| + // can be shut down automatically after the test has run.
|
| + std::unique_ptr<ActiveDirectoryPolicyManager> policy_manager_;
|
| +
|
| + private:
|
| + base::test::ScopedTaskEnvironment scoped_task_environment_;
|
| +};
|
| +
|
| +TEST_F(ActiveDirectoryPolicyManagerTest, DontWait) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"), base::TimeDelta(),
|
| + std::move(exit_session_), std::move(mock_store_unique_ptr_));
|
| + EXPECT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to fail.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(false);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Simulate failed store load. Initialization is reported complete at this
|
| + // point.
|
| + mock_store_->NotifyStoreError();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Process reply for mock policy fetch.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Simulate failed store load.
|
| + mock_store_->NotifyStoreError();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +// If the initial fetch timeout is infinite, initialization is only complete
|
| +// after policy has been fetched and after that has been loaded.
|
| +TEST_F(ActiveDirectoryPolicyManagerTest,
|
| + WaitInfinite_LoadSuccess_FetchSuccess) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"), base::TimeDelta::Max(),
|
| + std::move(exit_session_), std::move(mock_store_unique_ptr_));
|
| + ASSERT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to succeed.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(true);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->policy_ = base::MakeUnique<enterprise_management::PolicyData>();
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Process reply for mock policy fetch.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Simulate successful store load. At this point initialization is complete.
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +// If the initial fetch timeout is infinite, initialization does not complete if
|
| +// load after fetch fails.
|
| +TEST_F(ActiveDirectoryPolicyManagerTest,
|
| + WaitInfinite_LoadSuccess_FetchSuccess_LoadFail) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"), base::TimeDelta::Max(),
|
| + std::move(exit_session_), std::move(mock_store_unique_ptr_));
|
| + ASSERT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to succeed.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(true);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->policy_ = base::MakeUnique<enterprise_management::PolicyData>();
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Process reply for mock policy fetch.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + ExpectSessionExit();
|
| +
|
| + // Simulate failed store load.
|
| + mock_store_->NotifyStoreError();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + ExpectSessionExited();
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +// If the initial fetch timeout is infinite, failure in policy fetch prevents
|
| +// initialization from finishing, ever.
|
| +TEST_F(ActiveDirectoryPolicyManagerTest, WaitInfinite_LoadSuccess_FetchFail) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"), base::TimeDelta::Max(),
|
| + std::move(exit_session_), std::move(mock_store_unique_ptr_));
|
| + ASSERT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to fail.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(false);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->policy_ = base::MakeUnique<enterprise_management::PolicyData>();
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + ExpectSessionExit();
|
| +
|
| + // Process reply for mock policy fetch.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + ExpectSessionExited();
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +// If the initial fetch timeout is not infinite, we're in best-effort mode but
|
| +// still require the policy load to succeed so that there's *some* policy
|
| +// present (though possibly outdated).
|
| +TEST_F(ActiveDirectoryPolicyManagerTest, WaitFinite_LoadSuccess_FetchFail) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"),
|
| + base::TimeDelta::FromDays(365), std::move(exit_session_),
|
| + std::move(mock_store_unique_ptr_));
|
| + ASSERT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to fail.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(false);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->policy_ = base::MakeUnique<enterprise_management::PolicyData>();
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Process reply for mock policy fetch. At this point initialization is
|
| + // complete (we have waited for the fetch but now that we know it has failed
|
| + // we continue).
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +// If the initial fetch timeout is not infinite, we're in best-effort mode but
|
| +// still require the policy load to succeed so that there's *some* policy
|
| +// present (though possibly outdated). Here the sequence is inverted: Fetch
|
| +// returns before load.
|
| +TEST_F(ActiveDirectoryPolicyManagerTest, WaitFinite_FetchFail_LoadSuccess) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"),
|
| + base::TimeDelta::FromDays(365), std::move(exit_session_),
|
| + std::move(mock_store_unique_ptr_));
|
| + ASSERT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to fail.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(false);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| +
|
| + // Process reply for mock policy fetch.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->policy_ = base::MakeUnique<enterprise_management::PolicyData>();
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +// If the initial fetch timeout is not infinite, we're in best-effort mode but
|
| +// if we can't load existing policy from disk we have to give up.
|
| +TEST_F(ActiveDirectoryPolicyManagerTest, WaitFinite_LoadFail_FetchFail) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"),
|
| + base::TimeDelta::FromDays(365), std::move(exit_session_),
|
| + std::move(mock_store_unique_ptr_));
|
| + ASSERT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to fail.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(false);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| +
|
| + // Simulate failed store load.
|
| + mock_store_->NotifyStoreError();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + ExpectSessionExit();
|
| +
|
| + // Process reply for mock policy fetch.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + ExpectSessionExited();
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->policy_ = base::MakeUnique<enterprise_management::PolicyData>();
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +// If the initial fetch timeout is not infinite, we're in best-effort mode and
|
| +// upon timeout initialization is complete if any policy could be loaded from
|
| +// disk.
|
| +TEST_F(ActiveDirectoryPolicyManagerTest, WaitFinite_LoadSuccess_FetchTimeout) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"),
|
| + base::TimeDelta::FromDays(365), std::move(exit_session_),
|
| + std::move(mock_store_unique_ptr_));
|
| + ASSERT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to fail.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(false);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->policy_ = base::MakeUnique<enterprise_management::PolicyData>();
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Simulate policy fetch timeout.
|
| + policy_manager_->ForceTimeoutForTest();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Process reply for mock policy fetch.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Simulate failed store load.
|
| + mock_store_->NotifyStoreError();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +// If the initial fetch timeout is not infinite, we're in best-effort mode but
|
| +// without a successful policy load we still can't continue.
|
| +TEST_F(ActiveDirectoryPolicyManagerTest, WaitFinite_LoadTimeout_FetchTimeout) {
|
| + policy_manager_ = ActiveDirectoryPolicyManager::CreateForUserPolicy(
|
| + AccountId::AdFromUserEmailObjGuid("bla", "ble"),
|
| + base::TimeDelta::FromDays(365), std::move(exit_session_),
|
| + std::move(mock_store_unique_ptr_));
|
| + ASSERT_TRUE(policy_manager_);
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Configure mock policy fetch to fail.
|
| + mock_client_->SetRefreshUserPolicyCallbackSuccess(false);
|
| +
|
| + // Trigger mock policy fetch from authpolicyd.
|
| + policy_manager_->Init(&schema_registry_);
|
| +
|
| + ExpectSessionExit();
|
| +
|
| + // Simulate policy fetch timeout.
|
| + policy_manager_->ForceTimeoutForTest();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + ExpectSessionExited();
|
| +
|
| + // Process reply for mock policy fetch.
|
| + base::RunLoop().RunUntilIdle();
|
| + EXPECT_FALSE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +
|
| + // Simulate successful store load.
|
| + mock_store_->policy_ = base::MakeUnique<enterprise_management::PolicyData>();
|
| + mock_store_->NotifyStoreLoaded();
|
| + EXPECT_TRUE(policy_manager_->IsInitializationComplete(POLICY_DOMAIN_CHROME));
|
| +}
|
| +
|
| +} // namespace policy
|
|
|