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