monitor_unittest.cc revision 0de6073388f4e2780db8536178b129cd8f6ab386
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/monitor.h"
6
7#include <map>
8#include <string>
9#include <vector>
10
11#include "base/bind.h"
12#include "base/memory/scoped_ptr.h"
13#include "base/message_loop/message_loop_proxy.h"
14#include "components/domain_reliability/baked_in_configs.h"
15#include "components/domain_reliability/beacon.h"
16#include "components/domain_reliability/config.h"
17#include "components/domain_reliability/test_util.h"
18#include "content/public/test/test_browser_thread_bundle.h"
19#include "net/base/load_flags.h"
20#include "net/url_request/url_request_context_getter.h"
21#include "net/url_request/url_request_status.h"
22#include "net/url_request/url_request_test_util.h"
23#include "testing/gtest/include/gtest/gtest.h"
24
25namespace domain_reliability {
26
27typedef std::vector<DomainReliabilityBeacon> BeaconVector;
28
29class DomainReliabilityMonitorTest : public testing::Test {
30 protected:
31  typedef DomainReliabilityMonitor::RequestInfo RequestInfo;
32
33  DomainReliabilityMonitorTest()
34      : bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
35        url_request_context_getter_(new net::TestURLRequestContextGetter(
36            base::MessageLoopProxy::current())),
37        time_(new MockTime()),
38        monitor_(url_request_context_getter_->GetURLRequestContext(),
39                 "test-reporter",
40                 scoped_ptr<MockableTime>(time_)),
41        context_(monitor_.AddContextForTesting(CreateConfig())) {}
42
43  static scoped_ptr<const DomainReliabilityConfig> CreateConfig() {
44    DomainReliabilityConfig* config = new DomainReliabilityConfig();
45
46    DomainReliabilityConfig::Resource* resource;
47
48    resource = new DomainReliabilityConfig::Resource();
49    resource->name = "always_report";
50    resource->url_patterns.push_back(
51        new std::string("http://example/always_report"));
52    resource->success_sample_rate = 1.0;
53    resource->failure_sample_rate = 1.0;
54    EXPECT_TRUE(resource->IsValid());
55    config->resources.push_back(resource);
56
57    resource = new DomainReliabilityConfig::Resource();
58    resource->name = "never_report";
59    resource->url_patterns.push_back(
60        new std::string("http://example/never_report"));
61    resource->success_sample_rate = 0.0;
62    resource->failure_sample_rate = 0.0;
63    EXPECT_TRUE(resource->IsValid());
64    config->resources.push_back(resource);
65
66    DomainReliabilityConfig::Collector* collector;
67    collector = new DomainReliabilityConfig::Collector();
68    collector->upload_url = GURL("https://example/upload");
69    EXPECT_TRUE(collector->IsValid());
70    config->collectors.push_back(collector);
71
72    config->version = "1";
73    config->valid_until = 1234567890.0;
74    config->domain = "example";
75    EXPECT_TRUE(config->IsValid());
76
77    return scoped_ptr<const DomainReliabilityConfig>(config);
78  }
79
80  RequestInfo MakeRequestInfo() {
81    RequestInfo request;
82    request.status = net::URLRequestStatus();
83    request.response_code = 200;
84    request.was_cached = false;
85    request.load_flags = 0;
86    request.is_upload = false;
87    return request;
88  }
89
90  bool CheckNoBeacons(size_t index) {
91    BeaconVector beacons;
92    unsigned successful, failed;
93    context_->GetQueuedDataForTesting(index, &beacons, &successful, &failed);
94    return beacons.empty() && successful == 0 && failed == 0;
95  }
96
97  void OnRequestLegComplete(const RequestInfo& info) {
98    monitor_.OnRequestLegComplete(info);
99  }
100
101  content::TestBrowserThreadBundle bundle_;
102  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
103  MockTime* time_;
104  DomainReliabilityMonitor monitor_;
105  DomainReliabilityContext* context_;
106  DomainReliabilityMonitor::RequestInfo request_;
107};
108
109TEST_F(DomainReliabilityMonitorTest, Create) {
110  EXPECT_TRUE(CheckNoBeacons(0));
111  EXPECT_TRUE(CheckNoBeacons(1));
112}
113
114TEST_F(DomainReliabilityMonitorTest, NoContextRequest) {
115  RequestInfo request = MakeRequestInfo();
116  request.url = GURL("http://no-context/");
117  OnRequestLegComplete(request);
118
119  EXPECT_TRUE(CheckNoBeacons(0));
120  EXPECT_TRUE(CheckNoBeacons(1));
121}
122
123TEST_F(DomainReliabilityMonitorTest, ContextRequest) {
124  RequestInfo request = MakeRequestInfo();
125  request.url = GURL("http://example/always_report");
126  OnRequestLegComplete(request);
127
128  BeaconVector beacons;
129  context_->GetQueuedDataForTesting(0, &beacons, NULL, NULL);
130  EXPECT_EQ(1u, beacons.size());
131  EXPECT_TRUE(CheckNoBeacons(1));
132}
133
134TEST_F(DomainReliabilityMonitorTest, ContextRequestWithDoNotSendCookies) {
135  RequestInfo request = MakeRequestInfo();
136  request.url = GURL("http://example/always_report");
137  request.load_flags = net::LOAD_DO_NOT_SEND_COOKIES;
138  OnRequestLegComplete(request);
139
140  EXPECT_TRUE(CheckNoBeacons(0));
141  EXPECT_TRUE(CheckNoBeacons(1));
142}
143
144TEST_F(DomainReliabilityMonitorTest, ContextRequestThatIsUpload) {
145  RequestInfo request = MakeRequestInfo();
146  request.url = GURL("http://example/always_report");
147  request.is_upload = true;
148  OnRequestLegComplete(request);
149
150  EXPECT_TRUE(CheckNoBeacons(0));
151  EXPECT_TRUE(CheckNoBeacons(1));
152}
153
154TEST_F(DomainReliabilityMonitorTest, AddBakedInConfigs) {
155  // AddBakedInConfigs DCHECKs that the baked-in configs parse correctly, so
156  // this unittest will fail if someone tries to add an invalid config to the
157  // source tree.
158  monitor_.AddBakedInConfigs();
159
160  // Count the number of baked-in configs.
161  size_t num_baked_in_configs = 0;
162  for (const char* const* p = kBakedInJsonConfigs; *p; ++p)
163    ++num_baked_in_configs;
164
165  // The monitor should have contexts for all of the baked-in configs, plus the
166  // test one added in the test constructor.
167  EXPECT_EQ(num_baked_in_configs + 1, monitor_.contexts_size_for_testing());
168}
169
170}  // namespace domain_reliability
171