configuration.cc 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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/feature_engagement/public/configuration.h"
  5. #include <string>
  6. #include "base/notreached.h"
  7. #include "third_party/abseil-cpp/absl/types/optional.h"
  8. namespace feature_engagement {
  9. namespace {
  10. std::ostream& operator<<(std::ostream& os, const SessionRateImpact::Type type) {
  11. switch (type) {
  12. case SessionRateImpact::Type::ALL:
  13. return os << "ALL";
  14. case SessionRateImpact::Type::NONE:
  15. return os << "NONE";
  16. case SessionRateImpact::Type::EXPLICIT:
  17. return os << "EXPLICIT";
  18. default:
  19. // All cases should be covered.
  20. NOTREACHED();
  21. return os;
  22. }
  23. }
  24. } // namespace
  25. Comparator::Comparator() : type(ANY), value(0) {}
  26. Comparator::Comparator(ComparatorType type, uint32_t value)
  27. : type(type), value(value) {}
  28. Comparator::~Comparator() = default;
  29. bool Comparator::MeetsCriteria(uint32_t v) const {
  30. switch (type) {
  31. case ANY:
  32. return true;
  33. case LESS_THAN:
  34. return v < value;
  35. case GREATER_THAN:
  36. return v > value;
  37. case LESS_THAN_OR_EQUAL:
  38. return v <= value;
  39. case GREATER_THAN_OR_EQUAL:
  40. return v >= value;
  41. case EQUAL:
  42. return v == value;
  43. case NOT_EQUAL:
  44. return v != value;
  45. default:
  46. // All cases should be covered.
  47. NOTREACHED();
  48. return false;
  49. }
  50. }
  51. std::ostream& operator<<(std::ostream& os, const Comparator& comparator) {
  52. switch (comparator.type) {
  53. case ANY:
  54. return os << "ANY";
  55. case LESS_THAN:
  56. return os << "<" << comparator.value;
  57. case GREATER_THAN:
  58. return os << ">" << comparator.value;
  59. case LESS_THAN_OR_EQUAL:
  60. return os << "<=" << comparator.value;
  61. case GREATER_THAN_OR_EQUAL:
  62. return os << ">=" << comparator.value;
  63. case EQUAL:
  64. return os << "==" << comparator.value;
  65. case NOT_EQUAL:
  66. return os << "!=" << comparator.value;
  67. default:
  68. // All cases should be covered.
  69. NOTREACHED();
  70. return os;
  71. }
  72. }
  73. EventConfig::EventConfig() : window(0), storage(0) {}
  74. EventConfig::EventConfig(const std::string& name,
  75. Comparator comparator,
  76. uint32_t window,
  77. uint32_t storage)
  78. : name(name), comparator(comparator), window(window), storage(storage) {}
  79. EventConfig::~EventConfig() = default;
  80. std::ostream& operator<<(std::ostream& os, const EventConfig& event_config) {
  81. return os << "{ name: " << event_config.name
  82. << ", comparator: " << event_config.comparator
  83. << ", window: " << event_config.window
  84. << ", storage: " << event_config.storage << " }";
  85. }
  86. SessionRateImpact::SessionRateImpact() : type(SessionRateImpact::Type::ALL) {}
  87. SessionRateImpact::SessionRateImpact(const SessionRateImpact& other) = default;
  88. SessionRateImpact::~SessionRateImpact() = default;
  89. BlockedBy::BlockedBy() = default;
  90. BlockedBy::BlockedBy(const BlockedBy& other) = default;
  91. BlockedBy::~BlockedBy() = default;
  92. Blocking::Blocking() = default;
  93. Blocking::Blocking(const Blocking& other) = default;
  94. Blocking::~Blocking() = default;
  95. SnoozeParams::SnoozeParams() = default;
  96. SnoozeParams::SnoozeParams(const SnoozeParams& other) = default;
  97. SnoozeParams::~SnoozeParams() = default;
  98. std::ostream& operator<<(std::ostream& os, const SessionRateImpact& impact) {
  99. os << "{ type: " << impact.type << ", affected_features: ";
  100. if (!impact.affected_features.has_value())
  101. return os << "NO VALUE }";
  102. os << "[";
  103. bool first = true;
  104. for (const auto& affected_feature : impact.affected_features.value()) {
  105. if (first) {
  106. first = false;
  107. os << affected_feature;
  108. } else {
  109. os << ", " << affected_feature;
  110. }
  111. }
  112. return os << "] }";
  113. }
  114. bool operator==(const SessionRateImpact& lhs, const SessionRateImpact& rhs) {
  115. return std::tie(lhs.type, lhs.affected_features) ==
  116. std::tie(rhs.type, rhs.affected_features);
  117. }
  118. bool operator==(const BlockedBy& lhs, const BlockedBy& rhs) {
  119. return std::tie(lhs.type, lhs.affected_features) ==
  120. std::tie(rhs.type, rhs.affected_features);
  121. }
  122. FeatureConfig::FeatureConfig() : valid(false) {}
  123. FeatureConfig::FeatureConfig(const FeatureConfig& other) = default;
  124. FeatureConfig::~FeatureConfig() = default;
  125. bool operator==(const Comparator& lhs, const Comparator& rhs) {
  126. return std::tie(lhs.type, lhs.value) == std::tie(rhs.type, rhs.value);
  127. }
  128. bool operator<(const Comparator& lhs, const Comparator& rhs) {
  129. return std::tie(lhs.type, lhs.value) < std::tie(rhs.type, rhs.value);
  130. }
  131. bool operator==(const EventConfig& lhs, const EventConfig& rhs) {
  132. return std::tie(lhs.name, lhs.comparator, lhs.window, lhs.storage) ==
  133. std::tie(rhs.name, rhs.comparator, rhs.window, rhs.storage);
  134. }
  135. bool operator!=(const EventConfig& lhs, const EventConfig& rhs) {
  136. return !(lhs == rhs);
  137. }
  138. bool operator<(const EventConfig& lhs, const EventConfig& rhs) {
  139. return std::tie(lhs.name, lhs.comparator, lhs.window, lhs.storage) <
  140. std::tie(rhs.name, rhs.comparator, rhs.window, rhs.storage);
  141. }
  142. bool operator==(const FeatureConfig& lhs, const FeatureConfig& rhs) {
  143. return std::tie(lhs.valid, lhs.used, lhs.trigger, lhs.event_configs,
  144. lhs.session_rate, lhs.availability) ==
  145. std::tie(rhs.valid, rhs.used, rhs.trigger, rhs.event_configs,
  146. rhs.session_rate, rhs.availability);
  147. }
  148. std::ostream& operator<<(std::ostream& os,
  149. const FeatureConfig& feature_config) {
  150. os << "{ valid: " << feature_config.valid << ", used: " << feature_config.used
  151. << ", trigger: " << feature_config.trigger << ", event_configs: [";
  152. bool first = true;
  153. for (const auto& event_config : feature_config.event_configs) {
  154. if (first) {
  155. first = false;
  156. os << event_config;
  157. } else {
  158. os << ", " << event_config;
  159. }
  160. }
  161. return os << "], session_rate: " << feature_config.session_rate
  162. << ", availability: " << feature_config.availability << " }";
  163. }
  164. } // namespace feature_engagement