Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(98)

Side by Side Diff: components/domain_reliability/monitor_unittest.cc

Issue 267633002: Domain Reliability: Don't send proxy address, other fixes (Closed) Base URL: http://git.chromium.org/chromium/src.git@domrel_security
Patch Set: Fix mis-commit Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/domain_reliability/monitor.h" 5 #include "components/domain_reliability/monitor.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/bind.h" 11 #include "base/bind.h"
12 #include "base/memory/scoped_ptr.h" 12 #include "base/memory/scoped_ptr.h"
13 #include "base/message_loop/message_loop_proxy.h" 13 #include "base/message_loop/message_loop_proxy.h"
14 #include "components/domain_reliability/baked_in_configs.h" 14 #include "components/domain_reliability/baked_in_configs.h"
15 #include "components/domain_reliability/beacon.h" 15 #include "components/domain_reliability/beacon.h"
16 #include "components/domain_reliability/config.h" 16 #include "components/domain_reliability/config.h"
17 #include "components/domain_reliability/test_util.h" 17 #include "components/domain_reliability/test_util.h"
18 #include "content/public/test/test_browser_thread_bundle.h" 18 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "net/base/host_port_pair.h"
19 #include "net/base/load_flags.h" 20 #include "net/base/load_flags.h"
21 #include "net/http/http_response_headers.h"
22 #include "net/http/http_util.h"
20 #include "net/url_request/url_request_context_getter.h" 23 #include "net/url_request/url_request_context_getter.h"
21 #include "net/url_request/url_request_status.h" 24 #include "net/url_request/url_request_status.h"
22 #include "net/url_request/url_request_test_util.h" 25 #include "net/url_request/url_request_test_util.h"
23 #include "testing/gtest/include/gtest/gtest.h" 26 #include "testing/gtest/include/gtest/gtest.h"
24 27
25 namespace domain_reliability { 28 namespace domain_reliability {
26 29
30 namespace {
31
27 typedef std::vector<DomainReliabilityBeacon> BeaconVector; 32 typedef std::vector<DomainReliabilityBeacon> BeaconVector;
28 33
34 static const size_t kAlwaysReportIndex = 0u;
35 static const size_t kNeverReportIndex = 1u;
36
37 scoped_refptr<net::HttpResponseHeaders> MakeHttpResponseHeaders(
38 const std::string& headers) {
39 return scoped_refptr<net::HttpResponseHeaders>(
40 new net::HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders(
41 headers.c_str(), headers.length())));
42 }
43
44 static scoped_ptr<const DomainReliabilityConfig> MakeConfig() {
45 DomainReliabilityConfig* config = new DomainReliabilityConfig();
46
47 DomainReliabilityConfig::Resource* resource;
48
49 resource = new DomainReliabilityConfig::Resource();
50 resource->name = "always_report";
51 resource->url_patterns.push_back(
52 new std::string("http://example/always_report"));
53 resource->success_sample_rate = 1.0;
54 resource->failure_sample_rate = 1.0;
55 EXPECT_TRUE(resource->IsValid());
56 config->resources.push_back(resource);
57
58 resource = new DomainReliabilityConfig::Resource();
59 resource->name = "never_report";
60 resource->url_patterns.push_back(
61 new std::string("http://example/never_report"));
62 resource->success_sample_rate = 0.0;
63 resource->failure_sample_rate = 0.0;
64 EXPECT_TRUE(resource->IsValid());
65 config->resources.push_back(resource);
66
67 DomainReliabilityConfig::Collector* collector;
68 collector = new DomainReliabilityConfig::Collector();
69 collector->upload_url = GURL("https://example/upload");
70 EXPECT_TRUE(collector->IsValid());
71 config->collectors.push_back(collector);
72
73 config->version = "1";
74 config->valid_until = 1234567890.0;
75 config->domain = "example";
76 EXPECT_TRUE(config->IsValid());
77
78 return scoped_ptr<const DomainReliabilityConfig>(config);
79 }
80
81 } // namespace
82
29 class DomainReliabilityMonitorTest : public testing::Test { 83 class DomainReliabilityMonitorTest : public testing::Test {
30 protected: 84 protected:
31 typedef DomainReliabilityMonitor::RequestInfo RequestInfo; 85 typedef DomainReliabilityMonitor::RequestInfo RequestInfo;
32 86
33 DomainReliabilityMonitorTest() 87 DomainReliabilityMonitorTest()
34 : bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP), 88 : bundle_(content::TestBrowserThreadBundle::IO_MAINLOOP),
35 url_request_context_getter_(new net::TestURLRequestContextGetter( 89 url_request_context_getter_(new net::TestURLRequestContextGetter(
36 base::MessageLoopProxy::current())), 90 base::MessageLoopProxy::current())),
37 time_(new MockTime()), 91 time_(new MockTime()),
38 monitor_(url_request_context_getter_->GetURLRequestContext(), 92 monitor_(url_request_context_getter_->GetURLRequestContext(),
39 "test-reporter", 93 "test-reporter",
40 scoped_ptr<MockableTime>(time_)), 94 scoped_ptr<MockableTime>(time_)),
41 context_(monitor_.AddContextForTesting(CreateConfig())) {} 95 context_(monitor_.AddContextForTesting(MakeConfig())) {}
42 96
43 static scoped_ptr<const DomainReliabilityConfig> CreateConfig() { 97 static RequestInfo MakeRequestInfo() {
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; 98 RequestInfo request;
82 request.status = net::URLRequestStatus(); 99 request.status = net::URLRequestStatus();
83 request.response_code = 200; 100 request.status.set_status(net::URLRequestStatus::SUCCESS);
84 request.was_cached = false; 101 request.status.set_error(net::OK);
102 request.response_info.socket_address =
103 net::HostPortPair::FromString("12.34.56.78:80");
104 request.response_info.headers = MakeHttpResponseHeaders(
105 "HTTP/1.1 200 OK\n\n");
106 request.response_info.network_accessed = true;
107 request.response_info.was_fetched_via_proxy = false;
85 request.load_flags = 0; 108 request.load_flags = 0;
86 request.is_upload = false; 109 request.is_upload = false;
87 return request; 110 return request;
88 } 111 }
89 112
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) { 113 void OnRequestLegComplete(const RequestInfo& info) {
98 monitor_.OnRequestLegComplete(info); 114 monitor_.OnRequestLegComplete(info);
99 } 115 }
100 116
117 size_t CountPendingBeacons(size_t index) {
118 BeaconVector beacons;
119 context_->GetQueuedDataForTesting(index, &beacons, NULL, NULL);
120 return beacons.size();
121 }
122
123 bool CheckRequestCounts(size_t index,
124 uint32 expected_successful,
125 uint32 expected_failed) {
126 uint32 successful, failed;
127 context_->GetQueuedDataForTesting(index, NULL, &successful, &failed);
128 EXPECT_EQ(expected_successful, successful);
129 EXPECT_EQ(expected_failed, failed);
130 return expected_successful == successful && expected_failed == failed;
131 }
132
101 content::TestBrowserThreadBundle bundle_; 133 content::TestBrowserThreadBundle bundle_;
102 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_; 134 scoped_refptr<net::URLRequestContextGetter> url_request_context_getter_;
103 MockTime* time_; 135 MockTime* time_;
104 DomainReliabilityMonitor monitor_; 136 DomainReliabilityMonitor monitor_;
105 DomainReliabilityContext* context_; 137 DomainReliabilityContext* context_;
106 DomainReliabilityMonitor::RequestInfo request_; 138 DomainReliabilityMonitor::RequestInfo request_;
107 }; 139 };
108 140
141 namespace {
142
109 TEST_F(DomainReliabilityMonitorTest, Create) { 143 TEST_F(DomainReliabilityMonitorTest, Create) {
110 EXPECT_TRUE(CheckNoBeacons(0)); 144 EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex));
111 EXPECT_TRUE(CheckNoBeacons(1)); 145 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u));
146 EXPECT_EQ(0u, CountPendingBeacons(kNeverReportIndex));
147 EXPECT_TRUE(CheckRequestCounts(kNeverReportIndex, 0u, 0u));
112 } 148 }
113 149
114 TEST_F(DomainReliabilityMonitorTest, NoContextRequest) { 150 TEST_F(DomainReliabilityMonitorTest, NoContext) {
115 RequestInfo request = MakeRequestInfo(); 151 RequestInfo request = MakeRequestInfo();
116 request.url = GURL("http://no-context/"); 152 request.url = GURL("http://no-context/");
117 OnRequestLegComplete(request); 153 OnRequestLegComplete(request);
118 154
119 EXPECT_TRUE(CheckNoBeacons(0)); 155 EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex));
120 EXPECT_TRUE(CheckNoBeacons(1)); 156 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u));
157 EXPECT_EQ(0u, CountPendingBeacons(kNeverReportIndex));
158 EXPECT_TRUE(CheckRequestCounts(kNeverReportIndex, 0u, 0u));
121 } 159 }
122 160
123 TEST_F(DomainReliabilityMonitorTest, ContextRequest) { 161 TEST_F(DomainReliabilityMonitorTest, NotReported) {
162 RequestInfo request = MakeRequestInfo();
163 request.url = GURL("http://example/never_report");
164 OnRequestLegComplete(request);
165
166 EXPECT_EQ(0u, CountPendingBeacons(kNeverReportIndex));
167 EXPECT_TRUE(CheckRequestCounts(kNeverReportIndex, 1u, 0u));
168 }
169
170 TEST_F(DomainReliabilityMonitorTest, Failure) {
171 RequestInfo request = MakeRequestInfo();
172 request.url = GURL("http://example/always_report");
173 request.status.set_status(net::URLRequestStatus::FAILED);
174 request.status.set_error(net::ERR_CONNECTION_RESET);
175 OnRequestLegComplete(request);
176
177 EXPECT_EQ(1u, CountPendingBeacons(kAlwaysReportIndex));
178 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 1u));
179 }
180
181 TEST_F(DomainReliabilityMonitorTest, NotReportedFailure) {
182 RequestInfo request = MakeRequestInfo();
183 request.url = GURL("http://example/never_report");
184 request.status.set_status(net::URLRequestStatus::FAILED);
185 request.status.set_error(net::ERR_CONNECTION_RESET);
186 OnRequestLegComplete(request);
187
188 EXPECT_EQ(0u, CountPendingBeacons(kNeverReportIndex));
189 EXPECT_TRUE(CheckRequestCounts(kNeverReportIndex, 0u, 1u));
190 }
191
192 TEST_F(DomainReliabilityMonitorTest, Request) {
124 RequestInfo request = MakeRequestInfo(); 193 RequestInfo request = MakeRequestInfo();
125 request.url = GURL("http://example/always_report"); 194 request.url = GURL("http://example/always_report");
126 OnRequestLegComplete(request); 195 OnRequestLegComplete(request);
127 196
128 BeaconVector beacons; 197 EXPECT_EQ(1u, CountPendingBeacons(kAlwaysReportIndex));
129 context_->GetQueuedDataForTesting(0, &beacons, NULL, NULL); 198 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 1u, 0u));
130 EXPECT_EQ(1u, beacons.size());
131 EXPECT_TRUE(CheckNoBeacons(1));
132 } 199 }
133 200
134 TEST_F(DomainReliabilityMonitorTest, ContextRequestWithDoNotSendCookies) { 201 // Make sure the monitor does not log requests that did not access the network.
202 TEST_F(DomainReliabilityMonitorTest, DidNotAccessNetwork) {
203 RequestInfo request = MakeRequestInfo();
204 request.url = GURL("http://example/always_report");
205 request.response_info.network_accessed = false;
206 OnRequestLegComplete(request);
207
208 EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex));
209 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u));
210 }
211
212 // Make sure the monitor does not log requests that don't send cookies.
213 TEST_F(DomainReliabilityMonitorTest, DoNotSendCookies) {
135 RequestInfo request = MakeRequestInfo(); 214 RequestInfo request = MakeRequestInfo();
136 request.url = GURL("http://example/always_report"); 215 request.url = GURL("http://example/always_report");
137 request.load_flags = net::LOAD_DO_NOT_SEND_COOKIES; 216 request.load_flags = net::LOAD_DO_NOT_SEND_COOKIES;
138 OnRequestLegComplete(request); 217 OnRequestLegComplete(request);
139 218
140 EXPECT_TRUE(CheckNoBeacons(0)); 219 EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex));
141 EXPECT_TRUE(CheckNoBeacons(1)); 220 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u));
142 } 221 }
143 222
144 TEST_F(DomainReliabilityMonitorTest, ContextRequestThatIsUpload) { 223 // Make sure the monitor does not log upload requests.
224 TEST_F(DomainReliabilityMonitorTest, IsUpload) {
145 RequestInfo request = MakeRequestInfo(); 225 RequestInfo request = MakeRequestInfo();
146 request.url = GURL("http://example/always_report"); 226 request.url = GURL("http://example/always_report");
147 request.is_upload = true; 227 request.is_upload = true;
148 OnRequestLegComplete(request); 228 OnRequestLegComplete(request);
149 229
150 EXPECT_TRUE(CheckNoBeacons(0)); 230 EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex));
151 EXPECT_TRUE(CheckNoBeacons(1)); 231 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u));
232 }
233
234 // Make sure the monitor does not log a network-local error.
235 TEST_F(DomainReliabilityMonitorTest, LocalError) {
236 RequestInfo request = MakeRequestInfo();
237 request.url = GURL("http://example/always_report");
238 request.status.set_status(net::URLRequestStatus::FAILED);
239 request.status.set_error(net::ERR_PROXY_CONNECTION_FAILED);
240 OnRequestLegComplete(request);
241
242 EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex));
243 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u));
244 }
245
246 // Make sure the monitor does not log the proxy's IP if one was used.
247 TEST_F(DomainReliabilityMonitorTest, WasFetchedViaProxy) {
248 RequestInfo request = MakeRequestInfo();
249 request.url = GURL("http://example/always_report");
250 request.response_info.socket_address =
251 net::HostPortPair::FromString("127.0.0.1:3128");
252 request.response_info.was_fetched_via_proxy = true;
253 OnRequestLegComplete(request);
254
255 EXPECT_EQ(1u, CountPendingBeacons(kAlwaysReportIndex));
256 EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 1u, 0u));
257
258 BeaconVector beacons;
259 context_->GetQueuedDataForTesting(kAlwaysReportIndex, &beacons, NULL, NULL);
260 EXPECT_TRUE(beacons[0].server_ip.empty());
152 } 261 }
153 262
154 TEST_F(DomainReliabilityMonitorTest, AddBakedInConfigs) { 263 TEST_F(DomainReliabilityMonitorTest, AddBakedInConfigs) {
155 // AddBakedInConfigs DCHECKs that the baked-in configs parse correctly, so 264 // 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 265 // this unittest will fail if someone tries to add an invalid config to the
157 // source tree. 266 // source tree.
158 monitor_.AddBakedInConfigs(); 267 monitor_.AddBakedInConfigs();
159 268
160 // Count the number of baked-in configs. 269 // Count the number of baked-in configs.
161 size_t num_baked_in_configs = 0; 270 size_t num_baked_in_configs = 0;
162 for (const char* const* p = kBakedInJsonConfigs; *p; ++p) 271 for (const char* const* p = kBakedInJsonConfigs; *p; ++p)
163 ++num_baked_in_configs; 272 ++num_baked_in_configs;
164 273
165 // The monitor should have contexts for all of the baked-in configs, plus the 274 // The monitor should have contexts for all of the baked-in configs, plus the
166 // test one added in the test constructor. 275 // test one added in the test constructor.
167 EXPECT_EQ(num_baked_in_configs + 1, monitor_.contexts_size_for_testing()); 276 EXPECT_EQ(num_baked_in_configs + 1, monitor_.contexts_size_for_testing());
168 } 277 }
169 278
279 } // namespace
280
170 } // namespace domain_reliability 281 } // namespace domain_reliability
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698