// Copyright 2020 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import <memory>

#import "base/command_line.h"
#import "base/files/file_path.h"
#import "base/files/scoped_temp_dir.h"
#import "base/functional/bind.h"
#import "base/path_service.h"
#import "base/run_loop.h"
#import "components/policy/core/browser/policy_pref_mapping_test.h"
#import "components/policy/core/common/mock_configuration_policy_provider.h"
#import "components/policy/core/common/policy_map.h"
#import "components/policy/policy_constants.h"
#import "ios/chrome/browser/policy/model/enterprise_policy_test_helper.h"
#import "ios/chrome/browser/shared/model/paths/paths.h"
#import "ios/chrome/browser/shared/model/prefs/pref_names.h"
#import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h"
#import "ios/web/public/test/web_task_environment.h"
#import "testing/gmock/include/gmock/gmock.h"
#import "testing/gtest/include/gtest/gtest.h"
#import "testing/gtest_mac.h"
#import "testing/platform_test.h"

namespace {

class PolicyTest : public PlatformTest {
 public:
  void SetUp() override {
    PlatformTest::SetUp();

    ASSERT_TRUE(state_directory_.CreateUniqueTempDir());
    enterprise_policy_helper_ = std::make_unique<EnterprisePolicyTestHelper>(
        state_directory_.GetPath());
    ASSERT_TRUE(enterprise_policy_helper_->GetProfile());

    // Multiple tests use policy/pref_mapping, so compute its path
    // once.
    base::FilePath test_data_directory;
    ASSERT_TRUE(
        base::PathService::Get(ios::DIR_TEST_DATA, &test_data_directory));
    test_case_dir_ = test_data_directory.Append(FILE_PATH_LITERAL("policy"))
                         .Append(FILE_PATH_LITERAL("pref_mapping"));
  }

 protected:
  // Temporary directory to hold preference files.
  base::ScopedTempDir state_directory_;

  // The task environment for this test.
  web::WebTaskEnvironment task_environment_{
      web::WebTaskEnvironment::MainThreadType::IO};

  // Enterprise policy boilerplate configuration.
  std::unique_ptr<EnterprisePolicyTestHelper> enterprise_policy_helper_;

  // The path to components/policy/test/data/pref_mapping/.
  base::FilePath test_case_dir_;
};

}  // namespace

TEST_F(PolicyTest, AllPoliciesHaveATestCase) {
  policy::VerifyAllPoliciesHaveATestCase(test_case_dir_);
}

TEST_F(PolicyTest, PolicyToPrefMappings) {
  policy::VerifyPolicyToPrefMappings(
      test_case_dir_, enterprise_policy_helper_->GetLocalState(),
      enterprise_policy_helper_->GetProfile()->GetPrefs(),
      /* signin_profile_prefs= */ nullptr,
      enterprise_policy_helper_->GetPolicyProvider());
}
