[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 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/uploader.h" |
| 6 | |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 7 | #include <algorithm> |
| 8 | #include <cstring> |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 9 | #include <map> |
| 10 | |
| 11 | #include "base/bind.h" |
| 12 | #include "base/memory/scoped_ptr.h" |
| 13 | #include "base/message_loop/message_loop_proxy.h" |
[email protected] | b5c2b74 | 2014-06-14 22:21:42 | [diff] [blame] | 14 | #include "base/test/test_simple_task_runner.h" |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 15 | #include "components/domain_reliability/test_util.h" |
[email protected] | d759912 | 2014-05-24 03:37:23 | [diff] [blame] | 16 | #include "net/base/load_flags.h" |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 17 | #include "net/http/http_response_headers.h" |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 18 | #include "net/url_request/test_url_fetcher_factory.h" |
| 19 | #include "net/url_request/url_fetcher_delegate.h" |
| 20 | #include "net/url_request/url_request_context_getter.h" |
| 21 | #include "net/url_request/url_request_test_util.h" |
| 22 | #include "testing/gtest/include/gtest/gtest.h" |
| 23 | |
| 24 | namespace domain_reliability { |
[email protected] | 563dc476 | 2014-05-11 00:43:49 | [diff] [blame] | 25 | namespace { |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 26 | |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 27 | const char *kReportJSON = "{}"; |
| 28 | const char *kUploadURL = "https://example/upload"; |
| 29 | |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 30 | class DomainReliabilityUploaderTest : public testing::Test { |
| 31 | protected: |
| 32 | DomainReliabilityUploaderTest() |
[email protected] | b5c2b74 | 2014-06-14 22:21:42 | [diff] [blame] | 33 | : network_task_runner_(new base::TestSimpleTaskRunner()), |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 34 | url_request_context_getter_(new net::TestURLRequestContextGetter( |
[email protected] | b5c2b74 | 2014-06-14 22:21:42 | [diff] [blame] | 35 | network_task_runner_)), |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 36 | uploader_(DomainReliabilityUploader::Create( |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 37 | &time_, url_request_context_getter_)) { |
ttuttle | fa8427f9 | 2014-08-25 19:38:03 | [diff] [blame] | 38 | uploader_->set_discard_uploads(false); |
| 39 | } |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 40 | |
[email protected] | 84d2a49 | 2014-05-09 22:18:50 | [diff] [blame] | 41 | DomainReliabilityUploader::UploadCallback MakeUploadCallback(size_t index) { |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 42 | return base::Bind(&DomainReliabilityUploaderTest::OnUploadComplete, |
| 43 | base::Unretained(this), |
| 44 | index); |
| 45 | } |
| 46 | |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 47 | void OnUploadComplete(size_t index, |
| 48 | const DomainReliabilityUploader::UploadResult& result) { |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 49 | EXPECT_FALSE(upload_complete_[index]); |
| 50 | upload_complete_[index] = true; |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 51 | upload_result_[index] = result; |
| 52 | } |
| 53 | |
| 54 | void SimulateUpload() { |
| 55 | uploader_->UploadReport(kReportJSON, |
| 56 | GURL(kUploadURL), |
| 57 | MakeUploadCallback(0)); |
| 58 | } |
| 59 | |
| 60 | void SimulateUploadRequest() { |
| 61 | net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 62 | EXPECT_TRUE(fetcher); |
| 63 | |
| 64 | EXPECT_EQ(kReportJSON, fetcher->upload_data()); |
| 65 | EXPECT_EQ(GURL(kUploadURL), fetcher->GetOriginalURL()); |
| 66 | EXPECT_TRUE(fetcher->GetLoadFlags() & net::LOAD_DO_NOT_SAVE_COOKIES); |
| 67 | EXPECT_TRUE(fetcher->GetLoadFlags() & net::LOAD_DO_NOT_SEND_COOKIES); |
| 68 | |
| 69 | fetcher->set_url(GURL(kUploadURL)); |
| 70 | } |
| 71 | |
| 72 | void SimulateNoUploadRequest() { |
| 73 | net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 74 | EXPECT_FALSE(fetcher); |
| 75 | } |
| 76 | |
| 77 | void SimulateUploadResponse(int response_code, const char* headers) { |
| 78 | net::TestURLFetcher* fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| 79 | EXPECT_TRUE(fetcher); |
| 80 | |
| 81 | fetcher->set_status(net::URLRequestStatus()); |
| 82 | fetcher->set_response_code(response_code); |
| 83 | fetcher->set_response_headers(new net::HttpResponseHeaders( |
| 84 | net::HttpUtil::AssembleRawHeaders(headers, strlen(headers)))); |
| 85 | fetcher->SetResponseString(""); |
| 86 | fetcher->delegate()->OnURLFetchComplete(fetcher); |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 87 | } |
| 88 | |
[email protected] | b5c2b74 | 2014-06-14 22:21:42 | [diff] [blame] | 89 | scoped_refptr<base::TestSimpleTaskRunner> network_task_runner_; |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 90 | net::TestURLFetcherFactory url_fetcher_factory_; |
| 91 | scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_; |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 92 | MockTime time_; |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 93 | scoped_ptr<DomainReliabilityUploader> uploader_; |
| 94 | |
[email protected] | 84d2a49 | 2014-05-09 22:18:50 | [diff] [blame] | 95 | // Whether the upload callback was called for a particular collector index. |
| 96 | std::map<size_t, bool> upload_complete_; |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 97 | // The result of the last completed upload for a particular collector index. |
| 98 | std::map<size_t, DomainReliabilityUploader::UploadResult> upload_result_; |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 99 | }; |
| 100 | |
| 101 | TEST_F(DomainReliabilityUploaderTest, Create) { |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 102 | SimulateNoUploadRequest(); |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 103 | } |
| 104 | |
| 105 | TEST_F(DomainReliabilityUploaderTest, SuccessfulUpload) { |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 106 | SimulateUpload(); |
| 107 | SimulateUploadRequest(); |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 108 | EXPECT_FALSE(upload_complete_[0]); |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 109 | SimulateUploadResponse(200, "HTTP/1.1 200 OK\n\n"); |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 110 | EXPECT_TRUE(upload_complete_[0]); |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 111 | EXPECT_TRUE(upload_result_[0].is_success()); |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 112 | } |
| 113 | |
| 114 | TEST_F(DomainReliabilityUploaderTest, FailedUpload) { |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 115 | SimulateUpload(); |
| 116 | SimulateUploadRequest(); |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 117 | EXPECT_FALSE(upload_complete_[0]); |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 118 | SimulateUploadResponse(500, "HTTP/1.1 500 Blargh\n\n"); |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 119 | EXPECT_TRUE(upload_complete_[0]); |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 120 | EXPECT_TRUE(upload_result_[0].is_failure()); |
| 121 | } |
| 122 | |
| 123 | TEST_F(DomainReliabilityUploaderTest, RetryAfterUpload) { |
| 124 | SimulateUpload(); |
| 125 | SimulateUploadRequest(); |
| 126 | EXPECT_FALSE(upload_complete_[0]); |
| 127 | SimulateUploadResponse(503, "HTTP/1.1 503 Ugh\nRetry-After: 3600\n\n"); |
| 128 | EXPECT_TRUE(upload_complete_[0]); |
| 129 | EXPECT_TRUE(upload_result_[0].is_retry_after()); |
| 130 | EXPECT_EQ(base::TimeDelta::FromSeconds(3600), upload_result_[0].retry_after); |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 131 | } |
| 132 | |
ttuttle | fa8427f9 | 2014-08-25 19:38:03 | [diff] [blame] | 133 | TEST_F(DomainReliabilityUploaderTest, DiscardedUpload) { |
ttuttle | fa8427f9 | 2014-08-25 19:38:03 | [diff] [blame] | 134 | uploader_->set_discard_uploads(true); |
ttuttle | 280a73d | 2014-11-13 21:38:04 | [diff] [blame^] | 135 | SimulateUpload(); |
| 136 | SimulateNoUploadRequest(); |
ttuttle | fa8427f9 | 2014-08-25 19:38:03 | [diff] [blame] | 137 | } |
| 138 | |
[email protected] | 563dc476 | 2014-05-11 00:43:49 | [diff] [blame] | 139 | } // namespace |
[email protected] | bda8e36 | 2014-03-24 18:21:03 | [diff] [blame] | 140 | } // namespace domain_reliability |