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