blob: dea4d18332ef5e4cffab0092da285b59e82ca140 [file] [log] [blame]
[email protected]bda8e362014-03-24 18:21:031// 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
ttuttle280a73d2014-11-13 21:38:047#include <algorithm>
8#include <cstring>
[email protected]bda8e362014-03-24 18:21:039#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]b5c2b742014-06-14 22:21:4214#include "base/test/test_simple_task_runner.h"
[email protected]bda8e362014-03-24 18:21:0315#include "components/domain_reliability/test_util.h"
[email protected]d7599122014-05-24 03:37:2316#include "net/base/load_flags.h"
ttuttle280a73d2014-11-13 21:38:0417#include "net/http/http_response_headers.h"
[email protected]bda8e362014-03-24 18:21:0318#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
24namespace domain_reliability {
[email protected]563dc4762014-05-11 00:43:4925namespace {
[email protected]bda8e362014-03-24 18:21:0326
ttuttle280a73d2014-11-13 21:38:0427const char *kReportJSON = "{}";
28const char *kUploadURL = "https://example/upload";
29
[email protected]bda8e362014-03-24 18:21:0330class DomainReliabilityUploaderTest : public testing::Test {
31 protected:
32 DomainReliabilityUploaderTest()
[email protected]b5c2b742014-06-14 22:21:4233 : network_task_runner_(new base::TestSimpleTaskRunner()),
[email protected]bda8e362014-03-24 18:21:0334 url_request_context_getter_(new net::TestURLRequestContextGetter(
[email protected]b5c2b742014-06-14 22:21:4235 network_task_runner_)),
[email protected]bda8e362014-03-24 18:21:0336 uploader_(DomainReliabilityUploader::Create(
ttuttle280a73d2014-11-13 21:38:0437 &time_, url_request_context_getter_)) {
ttuttlefa8427f92014-08-25 19:38:0338 uploader_->set_discard_uploads(false);
39 }
[email protected]bda8e362014-03-24 18:21:0340
[email protected]84d2a492014-05-09 22:18:5041 DomainReliabilityUploader::UploadCallback MakeUploadCallback(size_t index) {
[email protected]bda8e362014-03-24 18:21:0342 return base::Bind(&DomainReliabilityUploaderTest::OnUploadComplete,
43 base::Unretained(this),
44 index);
45 }
46
ttuttle280a73d2014-11-13 21:38:0447 void OnUploadComplete(size_t index,
48 const DomainReliabilityUploader::UploadResult& result) {
[email protected]bda8e362014-03-24 18:21:0349 EXPECT_FALSE(upload_complete_[index]);
50 upload_complete_[index] = true;
ttuttle280a73d2014-11-13 21:38:0451 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]bda8e362014-03-24 18:21:0387 }
88
[email protected]b5c2b742014-06-14 22:21:4289 scoped_refptr<base::TestSimpleTaskRunner> network_task_runner_;
[email protected]bda8e362014-03-24 18:21:0390 net::TestURLFetcherFactory url_fetcher_factory_;
91 scoped_refptr<net::TestURLRequestContextGetter> url_request_context_getter_;
ttuttle280a73d2014-11-13 21:38:0492 MockTime time_;
[email protected]bda8e362014-03-24 18:21:0393 scoped_ptr<DomainReliabilityUploader> uploader_;
94
[email protected]84d2a492014-05-09 22:18:5095 // Whether the upload callback was called for a particular collector index.
96 std::map<size_t, bool> upload_complete_;
ttuttle280a73d2014-11-13 21:38:0497 // The result of the last completed upload for a particular collector index.
98 std::map<size_t, DomainReliabilityUploader::UploadResult> upload_result_;
[email protected]bda8e362014-03-24 18:21:0399};
100
101TEST_F(DomainReliabilityUploaderTest, Create) {
ttuttle280a73d2014-11-13 21:38:04102 SimulateNoUploadRequest();
[email protected]bda8e362014-03-24 18:21:03103}
104
105TEST_F(DomainReliabilityUploaderTest, SuccessfulUpload) {
ttuttle280a73d2014-11-13 21:38:04106 SimulateUpload();
107 SimulateUploadRequest();
[email protected]bda8e362014-03-24 18:21:03108 EXPECT_FALSE(upload_complete_[0]);
ttuttle280a73d2014-11-13 21:38:04109 SimulateUploadResponse(200, "HTTP/1.1 200 OK\n\n");
[email protected]bda8e362014-03-24 18:21:03110 EXPECT_TRUE(upload_complete_[0]);
ttuttle280a73d2014-11-13 21:38:04111 EXPECT_TRUE(upload_result_[0].is_success());
[email protected]bda8e362014-03-24 18:21:03112}
113
114TEST_F(DomainReliabilityUploaderTest, FailedUpload) {
ttuttle280a73d2014-11-13 21:38:04115 SimulateUpload();
116 SimulateUploadRequest();
[email protected]bda8e362014-03-24 18:21:03117 EXPECT_FALSE(upload_complete_[0]);
ttuttle280a73d2014-11-13 21:38:04118 SimulateUploadResponse(500, "HTTP/1.1 500 Blargh\n\n");
[email protected]bda8e362014-03-24 18:21:03119 EXPECT_TRUE(upload_complete_[0]);
ttuttle280a73d2014-11-13 21:38:04120 EXPECT_TRUE(upload_result_[0].is_failure());
121}
122
123TEST_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]bda8e362014-03-24 18:21:03131}
132
ttuttlefa8427f92014-08-25 19:38:03133TEST_F(DomainReliabilityUploaderTest, DiscardedUpload) {
ttuttlefa8427f92014-08-25 19:38:03134 uploader_->set_discard_uploads(true);
ttuttle280a73d2014-11-13 21:38:04135 SimulateUpload();
136 SimulateNoUploadRequest();
ttuttlefa8427f92014-08-25 19:38:03137}
138
[email protected]563dc4762014-05-11 00:43:49139} // namespace
[email protected]bda8e362014-03-24 18:21:03140} // namespace domain_reliability