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

#ifndef COMPONENTS_OPTIMIZATION_GUIDE_TEST_HINTS_COMPONENT_CREATOR_H_
#define COMPONENTS_OPTIMIZATION_GUIDE_TEST_HINTS_COMPONENT_CREATOR_H_

#include <string>
#include <vector>

#include "base/files/file_path.h"
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "components/optimization_guide/optimization_guide_service.h"
#include "components/optimization_guide/proto/hints.pb.h"

namespace optimization_guide {
namespace testing {

// Experiment name used for experimental resource loading hints.
static const char kFooExperimentName[] = "foo_experiment";

// Helper class to create test OptimizationHints components for testing.
//
// All temporary files and paths are cleaned up when this instance goes out of
// scope.
class TestHintsComponentCreator {
 public:
  TestHintsComponentCreator();
  ~TestHintsComponentCreator();

  // Creates component data based on |whitelisted_host_suffixes| with page hints
  // for type |optimization_type| blocking resources specified by
  // |resource_patterns|, and returns the HintsComponentInfo for it.
  optimization_guide::HintsComponentInfo CreateHintsComponentInfoWithPageHints(
      optimization_guide::proto::OptimizationType optimization_type,
      const std::vector<std::string>& whitelisted_host_suffixes,
      const std::vector<std::string>& resource_patterns);

  // Creates component data based on |whitelisted_host_suffixes| with page hints
  // for type |optimization_type| blocking resources specified by
  // |experimental_resource_patterns|, and returns the HintsComponentInfo for
  // it. The loading hints are set as experimental with experiment name set to
  // kFooExperimentName.

  // Creates component data for testing with experimental optimizations. It
  // creates a PageHint (with page pattern "*" for each key in
  // |whitelisted_host_suffixes| that each has resource blocking patterns from
  // |experimental_resource_patterns|.
  optimization_guide::HintsComponentInfo
  CreateHintsComponentInfoWithExperimentalPageHints(
      optimization_guide::proto::OptimizationType optimization_type,
      const std::vector<std::string>& whitelisted_host_suffixes,
      const std::vector<std::string>& experimental_resource_patterns);

  // Creates component data for testing with both default and experimental
  // optimizations. It creates a PageHint (with page pattern "*" for each key in
  // |whitelisted_host_suffixes| that each has resource blocking patterns from
  // |default_resource_patterns| and |experimental_resource_patterns|. The
  // experimental hints are guarded behind experiment kFooExperimentName.
  optimization_guide::HintsComponentInfo
  CreateHintsComponentInfoWithMixPageHints(
      optimization_guide::proto::OptimizationType optimization_type,
      const std::vector<std::string>& whitelisted_host_suffixes,
      const std::vector<std::string>& experimental_resource_patterns,
      const std::vector<std::string>& default_resource_patterns);

 private:
  // Returns the scoped temp directory path with the |file_path_suffix| that is
  // valid for the lifetime of this instance.
  // The file itself will not be automatically created.
  base::FilePath GetFilePath(std::string file_path_suffix);

  // Writes a configuration of hints to the file path.
  void WriteConfigToFile(
      const base::FilePath& file_path,
      const optimization_guide::proto::Configuration& config);

  // Writes a configuration of hints to the file path and returns the
  // HintsComponentInfo for it.
  optimization_guide::HintsComponentInfo
  WriteConfigToFileAndReturnHintsComponentInfo(
      const optimization_guide::proto::Configuration& config);

  std::unique_ptr<base::ScopedTempDir> scoped_temp_dir_;
  int next_component_version_;

  DISALLOW_COPY_AND_ASSIGN(TestHintsComponentCreator);
};

}  // namespace testing
}  // namespace optimization_guide

#endif  // COMPONENTS_OPTIMIZATION_GUIDE_TEST_HINTS_COMPONENT_CREATOR_H_
