config.cc revision a02191e04bc25c4935f804f2c080ae28663d096d
1// Copyright 2014 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
5#include "components/domain_reliability/config.h"
6
7#include "base/json/json_reader.h"
8#include "base/json/json_value_converter.h"
9#include "base/rand_util.h"
10#include "base/strings/string_util.h"
11
12namespace {
13
14bool ConvertURL(const base::StringPiece& string_piece, GURL* url) {
15  *url = GURL(string_piece.as_string());
16  return url->is_valid();
17}
18
19bool IsValidSampleRate(double p) { return p >= 0.0 && p <= 1.0; }
20
21}  // namespace
22
23namespace domain_reliability {
24
25DomainReliabilityConfig::Resource::Resource() {}
26
27DomainReliabilityConfig::Resource::~Resource() {}
28
29bool DomainReliabilityConfig::Resource::MatchesUrlString(
30    const std::string& url_string) const {
31  ScopedVector<std::string>::const_iterator it;
32
33  for (it = url_patterns.begin(); it != url_patterns.end(); it++) {
34    if (MatchPattern(url_string, **it))
35      return true;
36  }
37
38  return false;
39}
40
41bool DomainReliabilityConfig::Resource::DecideIfShouldReportRequest(
42    bool success) const {
43  double sample_rate = success ? success_sample_rate : failure_sample_rate;
44  return base::RandDouble() < sample_rate;
45}
46
47// static
48void DomainReliabilityConfig::Resource::RegisterJSONConverter(
49    base::JSONValueConverter<DomainReliabilityConfig::Resource>* converter) {
50  converter->RegisterStringField("resource_name", &Resource::name);
51  converter->RegisterRepeatedString("url_patterns", &Resource::url_patterns);
52  converter->RegisterDoubleField("success_sample_rate",
53                                 &Resource::success_sample_rate);
54  converter->RegisterDoubleField("failure_sample_rate",
55                                 &Resource::failure_sample_rate);
56}
57
58bool DomainReliabilityConfig::Resource::IsValid() const {
59  return !name.empty() && !url_patterns.empty() &&
60      IsValidSampleRate(success_sample_rate) &&
61      IsValidSampleRate(failure_sample_rate);
62}
63
64DomainReliabilityConfig::Collector::Collector() {}
65
66DomainReliabilityConfig::Collector::~Collector() {}
67
68// static
69void DomainReliabilityConfig::Collector::RegisterJSONConverter(
70    base::JSONValueConverter<DomainReliabilityConfig::Collector>* converter) {
71  converter->RegisterCustomField<GURL>("upload_url", &Collector::upload_url,
72                                       &ConvertURL);
73}
74
75bool DomainReliabilityConfig::Collector::IsValid() const {
76  return upload_url.is_valid();
77}
78
79DomainReliabilityConfig::DomainReliabilityConfig() : valid_until(0.0) {}
80
81DomainReliabilityConfig::~DomainReliabilityConfig() {}
82
83// static
84scoped_ptr<const DomainReliabilityConfig> DomainReliabilityConfig::FromJSON(
85    const base::StringPiece& json) {
86  base::Value* value = base::JSONReader::Read(json);
87  if (!value)
88    return scoped_ptr<const DomainReliabilityConfig>();
89
90  DomainReliabilityConfig* config = new DomainReliabilityConfig();
91  base::JSONValueConverter<DomainReliabilityConfig> converter;
92  if (!converter.Convert(*value, config)) {
93    return scoped_ptr<const DomainReliabilityConfig>();
94  }
95
96  if (!config->IsValid())
97    return scoped_ptr<const DomainReliabilityConfig>();
98
99  return scoped_ptr<const DomainReliabilityConfig>(config);
100}
101
102bool DomainReliabilityConfig::IsValid() const {
103  if (valid_until == 0.0 || domain.empty() || resources.empty() ||
104      collectors.empty()) {
105    return false;
106  }
107
108  for (size_t i = 0; i < resources.size(); ++i) {
109    if (!resources[i]->IsValid())
110      return false;
111  }
112
113  for (size_t i = 0; i < collectors.size(); ++i) {
114    if (!collectors[i]->IsValid())
115      return false;
116  }
117
118  return true;
119}
120
121bool DomainReliabilityConfig::IsExpired(base::Time now) const {
122  return now < base::Time::FromDoubleT(valid_until);
123}
124
125int DomainReliabilityConfig::GetResourceIndexForUrl(const GURL& url) const {
126  const std::string& url_string = url.spec();
127
128  for (size_t i = 0; i < resources.size(); ++i) {
129    if (resources[i]->MatchesUrlString(url_string))
130      return static_cast<int>(i);
131  }
132
133  return -1;
134}
135
136// static
137void DomainReliabilityConfig::RegisterJSONConverter(
138    base::JSONValueConverter<DomainReliabilityConfig>* converter) {
139  converter->RegisterStringField("config_version",
140                                 &DomainReliabilityConfig::version);
141  converter->RegisterDoubleField("config_valid_until",
142                                 &DomainReliabilityConfig::valid_until);
143  converter->RegisterStringField("monitored_domain",
144                                 &DomainReliabilityConfig::domain);
145  converter->RegisterRepeatedMessage("monitored_resources",
146                                     &DomainReliabilityConfig::resources);
147  converter->RegisterRepeatedMessage("collectors",
148                                     &DomainReliabilityConfig::collectors);
149}
150
151}  // namespace domain_reliability
152