test_hints_component_creator.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "components/optimization_guide/core/test_hints_component_creator.h"
  5. #include <memory>
  6. #include "base/base64.h"
  7. #include "base/files/file_util.h"
  8. #include "base/strings/string_number_conversions.h"
  9. #include "base/threading/thread_restrictions.h"
  10. #include "base/version.h"
  11. #include "components/optimization_guide/core/bloom_filter.h"
  12. #include "components/optimization_guide/core/optimization_hints_component_update_listener.h"
  13. #include "testing/gtest/include/gtest/gtest.h"
  14. namespace {
  15. std::string GetDefaultHintVersionString() {
  16. optimization_guide::proto::Version hint_version;
  17. hint_version.mutable_generation_timestamp()->set_seconds(123);
  18. hint_version.set_hint_source(
  19. optimization_guide::proto::HINT_SOURCE_OPTIMIZATION_HINTS_COMPONENT);
  20. std::string hint_version_string;
  21. hint_version.SerializeToString(&hint_version_string);
  22. base::Base64Encode(hint_version_string, &hint_version_string);
  23. return hint_version_string;
  24. }
  25. } // namespace
  26. namespace optimization_guide {
  27. namespace testing {
  28. TestHintsComponentCreator::TestHintsComponentCreator()
  29. : scoped_temp_dir_(std::make_unique<base::ScopedTempDir>()),
  30. next_component_version_(1) {}
  31. TestHintsComponentCreator::~TestHintsComponentCreator() {
  32. base::ScopedAllowBlockingForTesting allow_blocking;
  33. scoped_temp_dir_.reset();
  34. }
  35. optimization_guide::HintsComponentInfo
  36. TestHintsComponentCreator::CreateHintsComponentInfoWithPageHints(
  37. optimization_guide::proto::OptimizationType optimization_type,
  38. const std::vector<std::string>& page_hint_hosts,
  39. const std::string& page_pattern) {
  40. optimization_guide::proto::Configuration config;
  41. for (const auto& page_hint_site : page_hint_hosts) {
  42. optimization_guide::proto::Hint* hint = config.add_hints();
  43. hint->set_key(page_hint_site);
  44. hint->set_key_representation(optimization_guide::proto::HOST);
  45. hint->set_version(GetDefaultHintVersionString());
  46. optimization_guide::proto::PageHint* page_hint = hint->add_page_hints();
  47. page_hint->set_page_pattern(page_pattern);
  48. optimization_guide::proto::Optimization* optimization =
  49. page_hint->add_allowlisted_optimizations();
  50. optimization->set_optimization_type(optimization_type);
  51. }
  52. // Always stick something with no hint version in here.
  53. optimization_guide::proto::Hint* no_version_hint = config.add_hints();
  54. no_version_hint->set_key("noversion.com");
  55. no_version_hint->set_key_representation(optimization_guide::proto::HOST);
  56. no_version_hint->add_page_hints()->set_page_pattern("*");
  57. // Always stick something with a bad hint version in here.
  58. optimization_guide::proto::Hint* bad_version_hint = config.add_hints();
  59. bad_version_hint->set_key("badversion.com");
  60. bad_version_hint->set_key_representation(optimization_guide::proto::HOST);
  61. bad_version_hint->set_version("notaversion");
  62. bad_version_hint->add_page_hints()->set_page_pattern("*");
  63. // Always stick an allowlist optimization filter in here.
  64. optimization_guide::BloomFilter allowlist_bloom_filter(7, 511);
  65. allowlist_bloom_filter.Add("allowedhost.com");
  66. std::string allowlist_bloom_filter_data(
  67. reinterpret_cast<const char*>(&allowlist_bloom_filter.bytes()[0]),
  68. allowlist_bloom_filter.bytes().size());
  69. optimization_guide::proto::OptimizationFilter* allowlist_optimization_filter =
  70. config.add_optimization_allowlists();
  71. allowlist_optimization_filter->set_optimization_type(
  72. optimization_guide::proto::LITE_PAGE_REDIRECT);
  73. allowlist_optimization_filter->mutable_bloom_filter()->set_num_hash_functions(
  74. 7);
  75. allowlist_optimization_filter->mutable_bloom_filter()->set_num_bits(511);
  76. allowlist_optimization_filter->mutable_bloom_filter()->set_data(
  77. allowlist_bloom_filter_data);
  78. // Always stick a blocklist optimization filter in here.
  79. optimization_guide::BloomFilter blocklist_bloom_filter(7, 511);
  80. blocklist_bloom_filter.Add("blockedhost.com");
  81. std::string blocklist_bloom_filter_data(
  82. reinterpret_cast<const char*>(&blocklist_bloom_filter.bytes()[0]),
  83. blocklist_bloom_filter.bytes().size());
  84. optimization_guide::proto::OptimizationFilter* blocklist_optimization_filter =
  85. config.add_optimization_blocklists();
  86. blocklist_optimization_filter->set_optimization_type(
  87. optimization_guide::proto::FAST_HOST_HINTS);
  88. blocklist_optimization_filter->mutable_bloom_filter()->set_num_hash_functions(
  89. 7);
  90. blocklist_optimization_filter->mutable_bloom_filter()->set_num_bits(511);
  91. blocklist_optimization_filter->mutable_bloom_filter()->set_data(
  92. blocklist_bloom_filter_data);
  93. return WriteConfigToFileAndReturnHintsComponentInfo(config);
  94. }
  95. base::FilePath TestHintsComponentCreator::GetFilePath(
  96. std::string file_path_suffix) {
  97. base::ScopedAllowBlockingForTesting allow_blocking;
  98. EXPECT_TRUE(scoped_temp_dir_->IsValid() ||
  99. scoped_temp_dir_->CreateUniqueTempDir());
  100. return scoped_temp_dir_->GetPath().AppendASCII(file_path_suffix);
  101. }
  102. void TestHintsComponentCreator::WriteConfigToFile(
  103. const base::FilePath& file_path,
  104. const optimization_guide::proto::Configuration& config) {
  105. base::ScopedAllowBlockingForTesting allow_blocking;
  106. std::string serialized_config;
  107. ASSERT_TRUE(config.SerializeToString(&serialized_config));
  108. ASSERT_EQ(static_cast<int32_t>(serialized_config.length()),
  109. base::WriteFile(file_path, serialized_config.data(),
  110. serialized_config.length()));
  111. }
  112. optimization_guide::HintsComponentInfo
  113. TestHintsComponentCreator::WriteConfigToFileAndReturnHintsComponentInfo(
  114. const optimization_guide::proto::Configuration& config) {
  115. std::string version_string = base::NumberToString(next_component_version_++);
  116. base::FilePath file_path = GetFilePath(version_string);
  117. WriteConfigToFile(file_path, config);
  118. return optimization_guide::HintsComponentInfo(base::Version(version_string),
  119. file_path);
  120. }
  121. } // namespace testing
  122. } // namespace optimization_guide