OLD | NEW |
---|---|
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/context.h" | 5 #include "components/domain_reliability/context.h" |
6 | 6 |
7 #include <map> | 7 #include <map> |
8 #include <string> | 8 #include <string> |
9 | 9 |
10 #include "base/bind.h" | 10 #include "base/bind.h" |
11 #include "base/memory/scoped_ptr.h" | 11 #include "base/memory/scoped_ptr.h" |
12 #include "components/domain_reliability/beacon.h" | 12 #include "components/domain_reliability/beacon.h" |
13 #include "components/domain_reliability/dispatcher.h" | 13 #include "components/domain_reliability/dispatcher.h" |
14 #include "components/domain_reliability/scheduler.h" | 14 #include "components/domain_reliability/scheduler.h" |
15 #include "components/domain_reliability/test_util.h" | 15 #include "components/domain_reliability/test_util.h" |
16 #include "components/domain_reliability/uploader.h" | 16 #include "components/domain_reliability/uploader.h" |
17 #include "net/base/net_errors.h" | 17 #include "net/base/net_errors.h" |
18 #include "net/url_request/url_request_test_util.h" | 18 #include "net/url_request/url_request_test_util.h" |
19 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
20 | 20 |
21 namespace domain_reliability { | 21 namespace domain_reliability { |
22 namespace { | 22 namespace { |
23 | 23 |
24 typedef std::vector<DomainReliabilityBeacon> BeaconVector; | 24 typedef std::vector<const DomainReliabilityBeacon*> BeaconVector; |
25 | 25 |
26 DomainReliabilityBeacon MakeBeacon(MockableTime* time) { | 26 scoped_ptr<DomainReliabilityBeacon> MakeBeacon(MockableTime* time) { |
27 DomainReliabilityBeacon beacon; | 27 scoped_ptr<DomainReliabilityBeacon> beacon(new DomainReliabilityBeacon()); |
28 beacon.domain = "localhost"; | 28 beacon->url = GURL("https://localhost/"); |
29 beacon.status = "ok"; | 29 beacon->status = "tcp.connection_reset"; |
30 beacon.chrome_error = net::OK; | 30 beacon->chrome_error = net::ERR_CONNECTION_RESET; |
31 beacon.server_ip = "127.0.0.1"; | 31 beacon->server_ip = "127.0.0.1"; |
32 beacon.was_proxied = false; | 32 beacon->was_proxied = false; |
33 beacon.protocol = "HTTP"; | 33 beacon->protocol = "HTTP"; |
34 beacon.http_response_code = 200; | 34 beacon->http_response_code = -1; |
35 beacon.elapsed = base::TimeDelta::FromMilliseconds(250); | 35 beacon->elapsed = base::TimeDelta::FromMilliseconds(250); |
36 beacon.start_time = time->NowTicks() - beacon.elapsed; | 36 beacon->start_time = time->NowTicks() - beacon->elapsed; |
37 return beacon; | 37 return beacon.Pass(); |
38 } | 38 } |
39 | 39 |
40 class DomainReliabilityContextTest : public testing::Test { | 40 class DomainReliabilityContextTest : public testing::Test { |
41 protected: | 41 protected: |
42 DomainReliabilityContextTest() | 42 DomainReliabilityContextTest() |
43 : last_network_change_time_(time_.NowTicks()), | 43 : last_network_change_time_(time_.NowTicks()), |
44 dispatcher_(&time_), | 44 dispatcher_(&time_), |
45 params_(MakeTestSchedulerParams()), | 45 params_(MakeTestSchedulerParams()), |
46 uploader_(base::Bind(&DomainReliabilityContextTest::OnUploadRequest, | 46 uploader_(base::Bind(&DomainReliabilityContextTest::OnUploadRequest, |
47 base::Unretained(this))), | 47 base::Unretained(this))), |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
82 upload_callback_.Run(result); | 82 upload_callback_.Run(result); |
83 upload_pending_ = false; | 83 upload_pending_ = false; |
84 } | 84 } |
85 | 85 |
86 bool CheckNoBeacons() { | 86 bool CheckNoBeacons() { |
87 BeaconVector beacons; | 87 BeaconVector beacons; |
88 context_.GetQueuedBeaconsForTesting(&beacons); | 88 context_.GetQueuedBeaconsForTesting(&beacons); |
89 return beacons.empty(); | 89 return beacons.empty(); |
90 } | 90 } |
91 | 91 |
92 bool CheckCounts(size_t index, | |
93 unsigned expected_successful, | |
94 unsigned expected_failed) { | |
95 unsigned successful, failed; | |
96 context_.GetRequestCountsForTesting(index, &successful, &failed); | |
97 return successful == expected_successful && failed == expected_failed; | |
98 } | |
99 | |
100 MockTime time_; | 92 MockTime time_; |
101 base::TimeTicks last_network_change_time_; | 93 base::TimeTicks last_network_change_time_; |
102 DomainReliabilityDispatcher dispatcher_; | 94 DomainReliabilityDispatcher dispatcher_; |
103 DomainReliabilityScheduler::Params params_; | 95 DomainReliabilityScheduler::Params params_; |
104 MockUploader uploader_; | 96 MockUploader uploader_; |
105 std::string upload_reporter_string_; | 97 std::string upload_reporter_string_; |
106 DomainReliabilityContext context_; | 98 DomainReliabilityContext context_; |
107 | 99 |
108 private: | 100 private: |
109 void OnUploadRequest( | 101 void OnUploadRequest( |
110 const std::string& report_json, | 102 const std::string& report_json, |
111 const GURL& upload_url, | 103 const GURL& upload_url, |
112 const DomainReliabilityUploader::UploadCallback& callback) { | 104 const DomainReliabilityUploader::UploadCallback& callback) { |
113 DCHECK(!upload_pending_); | 105 DCHECK(!upload_pending_); |
114 upload_report_ = report_json; | 106 upload_report_ = report_json; |
115 upload_url_ = upload_url; | 107 upload_url_ = upload_url; |
116 upload_callback_ = callback; | 108 upload_callback_ = callback; |
117 upload_pending_ = true; | 109 upload_pending_ = true; |
118 } | 110 } |
119 | 111 |
120 bool upload_pending_; | 112 bool upload_pending_; |
121 std::string upload_report_; | 113 std::string upload_report_; |
122 GURL upload_url_; | 114 GURL upload_url_; |
123 DomainReliabilityUploader::UploadCallback upload_callback_; | 115 DomainReliabilityUploader::UploadCallback upload_callback_; |
124 }; | 116 }; |
125 | 117 |
126 TEST_F(DomainReliabilityContextTest, Create) { | 118 TEST_F(DomainReliabilityContextTest, Create) { |
127 EXPECT_TRUE(CheckNoBeacons()); | 119 EXPECT_TRUE(CheckNoBeacons()); |
128 EXPECT_TRUE(CheckCounts(0, 0, 0)); | |
129 EXPECT_TRUE(CheckCounts(1, 0, 0)); | |
130 } | 120 } |
131 | 121 |
132 TEST_F(DomainReliabilityContextTest, NoResource) { | 122 TEST_F(DomainReliabilityContextTest, Report) { |
133 GURL url("http://example/no_resource"); | 123 context_.OnBeacon(MakeBeacon(&time_)); |
134 DomainReliabilityBeacon beacon = MakeBeacon(&time_); | |
135 context_.OnBeacon(url, beacon); | |
136 | |
137 EXPECT_TRUE(CheckNoBeacons()); | |
138 EXPECT_TRUE(CheckCounts(0, 0, 0)); | |
139 EXPECT_TRUE(CheckCounts(1, 0, 0)); | |
140 } | |
141 | |
142 TEST_F(DomainReliabilityContextTest, NeverReport) { | |
143 GURL url("http://example/never_report"); | |
144 DomainReliabilityBeacon beacon = MakeBeacon(&time_); | |
145 context_.OnBeacon(url, beacon); | |
146 | |
147 EXPECT_TRUE(CheckNoBeacons()); | |
148 EXPECT_TRUE(CheckCounts(0, 0, 0)); | |
149 EXPECT_TRUE(CheckCounts(1, 1, 0)); | |
150 } | |
151 | |
152 TEST_F(DomainReliabilityContextTest, AlwaysReport) { | |
153 GURL url("http://example/always_report"); | |
154 DomainReliabilityBeacon beacon = MakeBeacon(&time_); | |
155 context_.OnBeacon(url, beacon); | |
156 | 124 |
157 BeaconVector beacons; | 125 BeaconVector beacons; |
158 context_.GetQueuedBeaconsForTesting(&beacons); | 126 context_.GetQueuedBeaconsForTesting(&beacons); |
159 EXPECT_EQ(1u, beacons.size()); | 127 EXPECT_EQ(1u, beacons.size()); |
160 EXPECT_TRUE(CheckCounts(0, 1, 0)); | |
161 EXPECT_TRUE(CheckCounts(1, 0, 0)); | |
162 } | 128 } |
163 | 129 |
164 TEST_F(DomainReliabilityContextTest, ReportUpload) { | 130 TEST_F(DomainReliabilityContextTest, Upload) { |
165 GURL url("http://example/always_report"); | 131 context_.OnBeacon(MakeBeacon(&time_)); |
166 DomainReliabilityBeacon beacon = MakeBeacon(&time_); | |
167 context_.OnBeacon(url, beacon); | |
168 | 132 |
169 BeaconVector beacons; | 133 BeaconVector beacons; |
170 context_.GetQueuedBeaconsForTesting(&beacons); | 134 context_.GetQueuedBeaconsForTesting(&beacons); |
171 EXPECT_EQ(1u, beacons.size()); | 135 EXPECT_EQ(1u, beacons.size()); |
172 EXPECT_TRUE(CheckCounts(0, 1, 0)); | |
173 EXPECT_TRUE(CheckCounts(1, 0, 0)); | |
174 | 136 |
137 // TODO(ttuttle): Update string. | |
davidben
2015/10/20 23:35:54
(What's this mean?)
Deprecated (see juliatuttle)
2015/10/26 19:08:41
Whoops, must've left it from before.
| |
175 // N.B.: Assumes max_delay is 5 minutes. | 138 // N.B.: Assumes max_delay is 5 minutes. |
176 const char* kExpectedReport = "{" | 139 const char* kExpectedReport = "{" |
177 "\"config_version\":\"1\"," | 140 "\"entries\":[" |
178 "\"entries\":[{\"domain\":\"localhost\"," | 141 "{\"failure_data\":{\"custom_error\":\"net::ERR_CONNECTION_RESET\"}," |
179 "\"http_response_code\":200,\"network_changed\":false," | 142 "\"network_changed\":false,\"protocol\":\"HTTP\"," |
180 "\"protocol\":\"HTTP\",\"request_age_ms\":300250," | 143 "\"request_age_ms\":300250,\"request_elapsed_ms\":250," |
181 "\"request_elapsed_ms\":250,\"resource\":\"always_report\"," | 144 "\"server_ip\":\"127.0.0.1\",\"status\":\"tcp.connection_reset\"," |
182 "\"server_ip\":\"127.0.0.1\",\"status\":\"ok\"," | 145 "\"url\":\"https://localhost/\",\"was_proxied\":false}]," |
183 "\"was_proxied\":false}]," | 146 "\"reporter\":\"test-reporter\"}"; |
184 "\"reporter\":\"test-reporter\"," | |
185 "\"resources\":[{\"failed_requests\":0,\"name\":\"always_report\"," | |
186 "\"successful_requests\":1}]}"; | |
187 | 147 |
188 time_.Advance(max_delay()); | 148 time_.Advance(max_delay()); |
189 EXPECT_TRUE(upload_pending()); | 149 EXPECT_TRUE(upload_pending()); |
190 EXPECT_EQ(kExpectedReport, upload_report()); | 150 EXPECT_EQ(kExpectedReport, upload_report()); |
191 EXPECT_EQ(GURL("https://exampleuploader/upload"), upload_url()); | 151 EXPECT_EQ(GURL("https://exampleuploader/upload"), upload_url()); |
192 | 152 |
193 DomainReliabilityUploader::UploadResult result; | 153 DomainReliabilityUploader::UploadResult result; |
194 result.status = DomainReliabilityUploader::UploadResult::SUCCESS; | 154 result.status = DomainReliabilityUploader::UploadResult::SUCCESS; |
195 CallUploadCallback(result); | 155 CallUploadCallback(result); |
196 | 156 |
197 EXPECT_TRUE(CheckNoBeacons()); | 157 EXPECT_TRUE(CheckNoBeacons()); |
198 EXPECT_TRUE(CheckCounts(0, 0, 0)); | |
199 EXPECT_TRUE(CheckCounts(1, 0, 0)); | |
200 } | 158 } |
201 | 159 |
202 TEST_F(DomainReliabilityContextTest, ReportUpload_NetworkChanged) { | 160 // TODO(ttuttle): Add beacon_unittest.cc to test serialization. |
davidben
2015/10/20 23:35:54
What happened to this test? (I still see a network
Deprecated (see juliatuttle)
2015/10/26 19:08:41
I must've had a good reason for removing it at the
| |
203 GURL url("http://example/always_report"); | |
204 DomainReliabilityBeacon beacon = MakeBeacon(&time_); | |
205 context_.OnBeacon(url, beacon); | |
206 | |
207 BeaconVector beacons; | |
208 context_.GetQueuedBeaconsForTesting(&beacons); | |
209 EXPECT_EQ(1u, beacons.size()); | |
210 EXPECT_TRUE(CheckCounts(0, 1, 0)); | |
211 EXPECT_TRUE(CheckCounts(1, 0, 0)); | |
212 | |
213 // N.B.: Assumes max_delay is 5 minutes. | |
214 const char* kExpectedReport = "{" | |
215 "\"config_version\":\"1\"," | |
216 "\"entries\":[{\"domain\":\"localhost\"," | |
217 "\"http_response_code\":200,\"network_changed\":true," | |
218 "\"protocol\":\"HTTP\",\"request_age_ms\":300250," | |
219 "\"request_elapsed_ms\":250,\"resource\":\"always_report\"," | |
220 "\"server_ip\":\"127.0.0.1\",\"status\":\"ok\"," | |
221 "\"was_proxied\":false}]," | |
222 "\"reporter\":\"test-reporter\"," | |
223 "\"resources\":[{\"failed_requests\":0,\"name\":\"always_report\"," | |
224 "\"successful_requests\":1}]}"; | |
225 | |
226 // Simulate a network change after the request but before the upload. | |
227 last_network_change_time_ = time_.NowTicks(); | |
228 time_.Advance(max_delay()); | |
229 | |
230 EXPECT_TRUE(upload_pending()); | |
231 EXPECT_EQ(kExpectedReport, upload_report()); | |
232 EXPECT_EQ(GURL("https://exampleuploader/upload"), upload_url()); | |
233 | |
234 DomainReliabilityUploader::UploadResult result; | |
235 result.status = DomainReliabilityUploader::UploadResult::SUCCESS; | |
236 CallUploadCallback(result); | |
237 | |
238 EXPECT_TRUE(CheckNoBeacons()); | |
239 EXPECT_TRUE(CheckCounts(0, 0, 0)); | |
240 EXPECT_TRUE(CheckCounts(1, 0, 0)); | |
241 } | |
242 | 161 |
243 } // namespace | 162 } // namespace |
244 } // namespace domain_reliability | 163 } // namespace domain_reliability |
OLD | NEW |