monitor_unittest.cc revision effb81e5f8246d0db0270817048dc992db66e9fb
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/beacon.h"
15#include "components/domain_reliability/config.h"
16#include "components/domain_reliability/test_util.h"
17#include "content/public/test/test_browser_thread_bundle.h"
18#include "net/url_request/url_request_context_getter.h"
19#include "net/url_request/url_request_status.h"
20#include "net/url_request/url_request_test_util.h"
21#include "testing/gtest/include/gtest/gtest.h"
22
23namespace domain_reliability {
24
25typedef std::vector<DomainReliabilityBeacon> BeaconVector;
26
27class DomainReliabilityMonitorTest : public testing::Test {
28 protected:
29  typedef DomainReliabilityMonitor::RequestInfo RequestInfo;
30
31  DomainReliabilityMonitorTest()
32      : bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
33        url_request_context_getter_(new net::TestURLRequestContextGetter(
34            base::MessageLoopProxy::current())),
35        time_(new MockTime()),
36        monitor_(url_request_context_getter_->GetURLRequestContext(),
37                 scoped_ptr<MockableTime>(time_)),
38        context_(monitor_.AddContextForTesting(CreateConfig())) {}
39
40  static scoped_ptr<const DomainReliabilityConfig> CreateConfig() {
41    DomainReliabilityConfig* config = new DomainReliabilityConfig();
42    DomainReliabilityConfig::Resource* resource;
43
44    resource = new DomainReliabilityConfig::Resource();
45    resource->name = "always_report";
46    resource->url_patterns.push_back(
47        new std::string("http://example/always_report"));
48    resource->success_sample_rate = 1.0;
49    resource->failure_sample_rate = 1.0;
50    config->resources.push_back(resource);
51
52    resource = new DomainReliabilityConfig::Resource();
53    resource->name = "never_report";
54    resource->url_patterns.push_back(
55        new std::string("http://example/never_report"));
56    resource->success_sample_rate = 0.0;
57    resource->failure_sample_rate = 0.0;
58    config->resources.push_back(resource);
59
60    DomainReliabilityConfig::Collector* collector;
61    collector = new DomainReliabilityConfig::Collector();
62    collector->upload_url = GURL("https://example/upload");
63    config->domain = "example";
64    config->collectors.push_back(collector);
65
66    return scoped_ptr<const DomainReliabilityConfig>(config);
67  }
68
69  RequestInfo MakeRequestInfo() {
70    RequestInfo request;
71    request.status = net::URLRequestStatus();
72    request.response_code = 200;
73    request.was_cached = false;
74    return request;
75  }
76
77  bool CheckNoBeacons(int index) {
78    BeaconVector beacons;
79    int successful, failed;
80    context_->GetQueuedDataForTesting(index, &beacons, &successful, &failed);
81    return beacons.empty() && successful == 0 && failed == 0;
82  }
83
84  void OnRequestLegComplete(const RequestInfo& info) {
85    monitor_.OnRequestLegComplete(info);
86  }
87
88  content::TestBrowserThreadBundle bundle_;
89  scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
90  MockTime* time_;
91  DomainReliabilityMonitor monitor_;
92  DomainReliabilityContext* context_;
93  DomainReliabilityMonitor::RequestInfo request_;
94};
95
96TEST_F(DomainReliabilityMonitorTest, Create) {
97  EXPECT_TRUE(CheckNoBeacons(0));
98  EXPECT_TRUE(CheckNoBeacons(1));
99}
100
101TEST_F(DomainReliabilityMonitorTest, NoContextRequest) {
102  RequestInfo request = MakeRequestInfo();
103  request.url = GURL("http://no-context/");
104  OnRequestLegComplete(request);
105
106  EXPECT_TRUE(CheckNoBeacons(0));
107  EXPECT_TRUE(CheckNoBeacons(1));
108}
109
110TEST_F(DomainReliabilityMonitorTest, ContextRequest) {
111  RequestInfo request = MakeRequestInfo();
112  request.url = GURL("http://example/always_report");
113  OnRequestLegComplete(request);
114
115  BeaconVector beacons;
116  context_->GetQueuedDataForTesting(0, &beacons, NULL, NULL);
117  EXPECT_EQ(1u, beacons.size());
118  EXPECT_TRUE(CheckNoBeacons(1));
119}
120
121}  // namespace domain_reliability
122