Index: components/domain_reliability/monitor_unittest.cc |
diff --git a/components/domain_reliability/monitor_unittest.cc b/components/domain_reliability/monitor_unittest.cc |
index 1366f8df6da77a8094ae8b7acd7866f4bc38dbdf..b0b9e9d8f7ca27ed560b425b23c64732744f84df 100644 |
--- a/components/domain_reliability/monitor_unittest.cc |
+++ b/components/domain_reliability/monitor_unittest.cc |
@@ -16,7 +16,10 @@ |
#include "components/domain_reliability/config.h" |
#include "components/domain_reliability/test_util.h" |
#include "content/public/test/test_browser_thread_bundle.h" |
+#include "net/base/host_port_pair.h" |
#include "net/base/load_flags.h" |
+#include "net/http/http_response_headers.h" |
+#include "net/http/http_util.h" |
#include "net/url_request/url_request_context_getter.h" |
#include "net/url_request/url_request_status.h" |
#include "net/url_request/url_request_test_util.h" |
@@ -24,8 +27,59 @@ |
namespace domain_reliability { |
+namespace { |
+ |
typedef std::vector<DomainReliabilityBeacon> BeaconVector; |
+static const size_t kAlwaysReportIndex = 0u; |
+static const size_t kNeverReportIndex = 1u; |
+ |
+scoped_refptr<net::HttpResponseHeaders> MakeHttpResponseHeaders( |
+ const std::string& headers) { |
+ return scoped_refptr<net::HttpResponseHeaders>( |
+ new net::HttpResponseHeaders(net::HttpUtil::AssembleRawHeaders( |
+ headers.c_str(), headers.length()))); |
+} |
+ |
+static scoped_ptr<const DomainReliabilityConfig> MakeConfig() { |
+ DomainReliabilityConfig* config = new DomainReliabilityConfig(); |
+ |
+ DomainReliabilityConfig::Resource* resource; |
+ |
+ resource = new DomainReliabilityConfig::Resource(); |
+ resource->name = "always_report"; |
+ resource->url_patterns.push_back( |
+ new std::string("http://example/always_report")); |
+ resource->success_sample_rate = 1.0; |
+ resource->failure_sample_rate = 1.0; |
+ EXPECT_TRUE(resource->IsValid()); |
+ config->resources.push_back(resource); |
+ |
+ resource = new DomainReliabilityConfig::Resource(); |
+ resource->name = "never_report"; |
+ resource->url_patterns.push_back( |
+ new std::string("http://example/never_report")); |
+ resource->success_sample_rate = 0.0; |
+ resource->failure_sample_rate = 0.0; |
+ EXPECT_TRUE(resource->IsValid()); |
+ config->resources.push_back(resource); |
+ |
+ DomainReliabilityConfig::Collector* collector; |
+ collector = new DomainReliabilityConfig::Collector(); |
+ collector->upload_url = GURL("https://example/upload"); |
+ EXPECT_TRUE(collector->IsValid()); |
+ config->collectors.push_back(collector); |
+ |
+ config->version = "1"; |
+ config->valid_until = 1234567890.0; |
+ config->domain = "example"; |
+ EXPECT_TRUE(config->IsValid()); |
+ |
+ return scoped_ptr<const DomainReliabilityConfig>(config); |
+} |
+ |
+} // namespace |
+ |
class DomainReliabilityMonitorTest : public testing::Test { |
protected: |
typedef DomainReliabilityMonitor::RequestInfo RequestInfo; |
@@ -38,64 +92,42 @@ class DomainReliabilityMonitorTest : public testing::Test { |
monitor_(url_request_context_getter_->GetURLRequestContext(), |
"test-reporter", |
scoped_ptr<MockableTime>(time_)), |
- context_(monitor_.AddContextForTesting(CreateConfig())) {} |
- |
- static scoped_ptr<const DomainReliabilityConfig> CreateConfig() { |
- DomainReliabilityConfig* config = new DomainReliabilityConfig(); |
- |
- DomainReliabilityConfig::Resource* resource; |
- |
- resource = new DomainReliabilityConfig::Resource(); |
- resource->name = "always_report"; |
- resource->url_patterns.push_back( |
- new std::string("http://example/always_report")); |
- resource->success_sample_rate = 1.0; |
- resource->failure_sample_rate = 1.0; |
- EXPECT_TRUE(resource->IsValid()); |
- config->resources.push_back(resource); |
- |
- resource = new DomainReliabilityConfig::Resource(); |
- resource->name = "never_report"; |
- resource->url_patterns.push_back( |
- new std::string("http://example/never_report")); |
- resource->success_sample_rate = 0.0; |
- resource->failure_sample_rate = 0.0; |
- EXPECT_TRUE(resource->IsValid()); |
- config->resources.push_back(resource); |
- |
- DomainReliabilityConfig::Collector* collector; |
- collector = new DomainReliabilityConfig::Collector(); |
- collector->upload_url = GURL("https://example/upload"); |
- EXPECT_TRUE(collector->IsValid()); |
- config->collectors.push_back(collector); |
- |
- config->version = "1"; |
- config->valid_until = 1234567890.0; |
- config->domain = "example"; |
- EXPECT_TRUE(config->IsValid()); |
- |
- return scoped_ptr<const DomainReliabilityConfig>(config); |
- } |
+ context_(monitor_.AddContextForTesting(MakeConfig())) {} |
- RequestInfo MakeRequestInfo() { |
+ static RequestInfo MakeRequestInfo() { |
RequestInfo request; |
request.status = net::URLRequestStatus(); |
- request.response_code = 200; |
- request.was_cached = false; |
+ request.status.set_status(net::URLRequestStatus::SUCCESS); |
+ request.status.set_error(net::OK); |
+ request.response_info.socket_address = |
+ net::HostPortPair::FromString("12.34.56.78:80"); |
+ request.response_info.headers = MakeHttpResponseHeaders( |
+ "HTTP/1.1 200 OK\n\n"); |
+ request.response_info.network_accessed = true; |
+ request.response_info.was_fetched_via_proxy = false; |
request.load_flags = 0; |
request.is_upload = false; |
return request; |
} |
- bool CheckNoBeacons(size_t index) { |
+ void OnRequestLegComplete(const RequestInfo& info) { |
+ monitor_.OnRequestLegComplete(info); |
+ } |
+ |
+ size_t CountPendingBeacons(size_t index) { |
BeaconVector beacons; |
- unsigned successful, failed; |
- context_->GetQueuedDataForTesting(index, &beacons, &successful, &failed); |
- return beacons.empty() && successful == 0 && failed == 0; |
+ context_->GetQueuedDataForTesting(index, &beacons, NULL, NULL); |
+ return beacons.size(); |
} |
- void OnRequestLegComplete(const RequestInfo& info) { |
- monitor_.OnRequestLegComplete(info); |
+ bool CheckRequestCounts(size_t index, |
+ uint32 expected_successful, |
+ uint32 expected_failed) { |
+ uint32 successful, failed; |
+ context_->GetQueuedDataForTesting(index, NULL, &successful, &failed); |
+ EXPECT_EQ(expected_successful, successful); |
+ EXPECT_EQ(expected_failed, failed); |
+ return expected_successful == successful && expected_failed == failed; |
} |
content::TestBrowserThreadBundle bundle_; |
@@ -106,49 +138,138 @@ class DomainReliabilityMonitorTest : public testing::Test { |
DomainReliabilityMonitor::RequestInfo request_; |
}; |
+namespace { |
+ |
TEST_F(DomainReliabilityMonitorTest, Create) { |
- EXPECT_TRUE(CheckNoBeacons(0)); |
- EXPECT_TRUE(CheckNoBeacons(1)); |
+ EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u)); |
+ EXPECT_EQ(0u, CountPendingBeacons(kNeverReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kNeverReportIndex, 0u, 0u)); |
} |
-TEST_F(DomainReliabilityMonitorTest, NoContextRequest) { |
+TEST_F(DomainReliabilityMonitorTest, NoContext) { |
RequestInfo request = MakeRequestInfo(); |
request.url = GURL("http://no-context/"); |
OnRequestLegComplete(request); |
- EXPECT_TRUE(CheckNoBeacons(0)); |
- EXPECT_TRUE(CheckNoBeacons(1)); |
+ EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u)); |
+ EXPECT_EQ(0u, CountPendingBeacons(kNeverReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kNeverReportIndex, 0u, 0u)); |
+} |
+ |
+TEST_F(DomainReliabilityMonitorTest, NotReported) { |
+ RequestInfo request = MakeRequestInfo(); |
+ request.url = GURL("http://example/never_report"); |
+ OnRequestLegComplete(request); |
+ |
+ EXPECT_EQ(0u, CountPendingBeacons(kNeverReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kNeverReportIndex, 1u, 0u)); |
} |
-TEST_F(DomainReliabilityMonitorTest, ContextRequest) { |
+TEST_F(DomainReliabilityMonitorTest, NetworkFailure) { |
RequestInfo request = MakeRequestInfo(); |
request.url = GURL("http://example/always_report"); |
+ request.status.set_status(net::URLRequestStatus::FAILED); |
+ request.status.set_error(net::ERR_CONNECTION_RESET); |
+ request.response_info.headers = NULL; |
OnRequestLegComplete(request); |
- BeaconVector beacons; |
- context_->GetQueuedDataForTesting(0, &beacons, NULL, NULL); |
- EXPECT_EQ(1u, beacons.size()); |
- EXPECT_TRUE(CheckNoBeacons(1)); |
+ EXPECT_EQ(1u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 1u)); |
} |
-TEST_F(DomainReliabilityMonitorTest, ContextRequestWithDoNotSendCookies) { |
+TEST_F(DomainReliabilityMonitorTest, ServerFailure) { |
+ RequestInfo request = MakeRequestInfo(); |
+ request.url = GURL("http://example/always_report"); |
+ request.response_info.headers = |
+ MakeHttpResponseHeaders("HTTP/1.1 500 :(\n\n"); |
+ OnRequestLegComplete(request); |
+ |
+ EXPECT_EQ(1u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 1u)); |
+} |
+ |
+TEST_F(DomainReliabilityMonitorTest, NotReportedFailure) { |
+ RequestInfo request = MakeRequestInfo(); |
+ request.url = GURL("http://example/never_report"); |
+ request.status.set_status(net::URLRequestStatus::FAILED); |
+ request.status.set_error(net::ERR_CONNECTION_RESET); |
+ OnRequestLegComplete(request); |
+ |
+ EXPECT_EQ(0u, CountPendingBeacons(kNeverReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kNeverReportIndex, 0u, 1u)); |
+} |
+ |
+TEST_F(DomainReliabilityMonitorTest, Request) { |
+ RequestInfo request = MakeRequestInfo(); |
+ request.url = GURL("http://example/always_report"); |
+ OnRequestLegComplete(request); |
+ |
+ EXPECT_EQ(1u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 1u, 0u)); |
+} |
+ |
+// Make sure the monitor does not log requests that did not access the network. |
+TEST_F(DomainReliabilityMonitorTest, DidNotAccessNetwork) { |
+ RequestInfo request = MakeRequestInfo(); |
+ request.url = GURL("http://example/always_report"); |
+ request.response_info.network_accessed = false; |
+ OnRequestLegComplete(request); |
+ |
+ EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u)); |
+} |
+ |
+// Make sure the monitor does not log requests that don't send cookies. |
+TEST_F(DomainReliabilityMonitorTest, DoNotSendCookies) { |
RequestInfo request = MakeRequestInfo(); |
request.url = GURL("http://example/always_report"); |
request.load_flags = net::LOAD_DO_NOT_SEND_COOKIES; |
OnRequestLegComplete(request); |
- EXPECT_TRUE(CheckNoBeacons(0)); |
- EXPECT_TRUE(CheckNoBeacons(1)); |
+ EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u)); |
} |
-TEST_F(DomainReliabilityMonitorTest, ContextRequestThatIsUpload) { |
+// Make sure the monitor does not log upload requests. |
+TEST_F(DomainReliabilityMonitorTest, IsUpload) { |
RequestInfo request = MakeRequestInfo(); |
request.url = GURL("http://example/always_report"); |
request.is_upload = true; |
OnRequestLegComplete(request); |
- EXPECT_TRUE(CheckNoBeacons(0)); |
- EXPECT_TRUE(CheckNoBeacons(1)); |
+ EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u)); |
+} |
+ |
+// Make sure the monitor does not log a network-local error. |
+TEST_F(DomainReliabilityMonitorTest, LocalError) { |
+ RequestInfo request = MakeRequestInfo(); |
+ request.url = GURL("http://example/always_report"); |
+ request.status.set_status(net::URLRequestStatus::FAILED); |
+ request.status.set_error(net::ERR_PROXY_CONNECTION_FAILED); |
+ OnRequestLegComplete(request); |
+ |
+ EXPECT_EQ(0u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 0u, 0u)); |
+} |
+ |
+// Make sure the monitor does not log the proxy's IP if one was used. |
+TEST_F(DomainReliabilityMonitorTest, WasFetchedViaProxy) { |
+ RequestInfo request = MakeRequestInfo(); |
+ request.url = GURL("http://example/always_report"); |
+ request.response_info.socket_address = |
+ net::HostPortPair::FromString("127.0.0.1:3128"); |
+ request.response_info.was_fetched_via_proxy = true; |
+ OnRequestLegComplete(request); |
+ |
+ EXPECT_EQ(1u, CountPendingBeacons(kAlwaysReportIndex)); |
+ EXPECT_TRUE(CheckRequestCounts(kAlwaysReportIndex, 1u, 0u)); |
+ |
+ BeaconVector beacons; |
+ context_->GetQueuedDataForTesting(kAlwaysReportIndex, &beacons, NULL, NULL); |
+ EXPECT_TRUE(beacons[0].server_ip.empty()); |
} |
TEST_F(DomainReliabilityMonitorTest, AddBakedInConfigs) { |
@@ -167,4 +288,6 @@ TEST_F(DomainReliabilityMonitorTest, AddBakedInConfigs) { |
EXPECT_EQ(num_baked_in_configs + 1, monitor_.contexts_size_for_testing()); |
} |
+} // namespace |
+ |
} // namespace domain_reliability |