OLD | NEW |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 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/offline_pages/core/prefetch/prefetch_request_fetcher.h" | 5 #include "components/offline_pages/core/prefetch/prefetch_request_fetcher.h" |
6 | 6 |
7 #include "base/message_loop/message_loop.h" | |
8 #include "base/test/mock_callback.h" | 7 #include "base/test/mock_callback.h" |
| 8 #include "components/offline_pages/core/prefetch/prefetch_request_test_base.h" |
| 9 #include "components/offline_pages/core/prefetch/prefetch_types.h" |
9 #include "net/http/http_status_code.h" | 10 #include "net/http/http_status_code.h" |
10 #include "net/url_request/test_url_fetcher_factory.h" | |
11 #include "net/url_request/url_request_status.h" | 11 #include "net/url_request/url_request_status.h" |
12 #include "net/url_request/url_request_test_util.h" | |
13 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 #include "url/gurl.h" | 13 #include "url/gurl.h" |
16 | 14 |
17 using testing::_; | 15 using testing::_; |
18 using testing::DoAll; | 16 using testing::DoAll; |
19 using testing::Eq; | 17 using testing::Eq; |
20 using testing::SaveArg; | 18 using testing::SaveArg; |
21 | 19 |
22 namespace offline_prefetch { | 20 namespace offline_pages { |
23 | 21 |
24 namespace { | 22 namespace { |
25 const GURL kTestUrl("http://example.com"); | 23 const GURL kTestUrl("http://example.com"); |
26 const char kTestMessage[] = "Testing"; | 24 const char kTestMessage[] = "Testing"; |
27 } // namespace | 25 } // namespace |
28 | 26 |
29 class PrefetchRequestFetcherTest : public testing::Test { | 27 class PrefetchRequestFetcherTest : public PrefetchRequestTestBase { |
30 public: | 28 public: |
31 PrefetchRequestFetcherTest() | 29 PrefetchRequestStatus RunFetcherWithNetError(net::Error net_error); |
32 : request_context_(new net::TestURLRequestContextGetter( | 30 PrefetchRequestStatus RunFetcherWithHttpError(int http_error); |
33 base::ThreadTaskRunnerHandle::Get())) {} | 31 PrefetchRequestStatus RunFetcherWithData(const std::string& response_data, |
34 | 32 std::string* data_received); |
35 PrefetchRequestFetcher::Status RunFetcherWithNetError(net::Error net_error); | |
36 PrefetchRequestFetcher::Status RunFetcherWithHttpError(int http_error); | |
37 PrefetchRequestFetcher::Status RunFetcherWithData( | |
38 const std::string& response_data, | |
39 std::string* data_received); | |
40 | |
41 private: | |
42 void RespondWithNetError(int net_error); | |
43 void RespondWithHttpError(int http_error); | |
44 void RespondWithData(const std::string& data); | |
45 | |
46 base::MessageLoop message_loop_; | |
47 net::TestURLFetcherFactory url_fetcher_factory_; | |
48 scoped_refptr<net::TestURLRequestContextGetter> request_context_; | |
49 }; | 33 }; |
50 | 34 |
51 void PrefetchRequestFetcherTest::RespondWithNetError(int net_error) { | 35 PrefetchRequestStatus PrefetchRequestFetcherTest::RunFetcherWithNetError( |
52 net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0); | 36 net::Error net_error) { |
53 DCHECK(url_fetcher); | |
54 url_fetcher->set_status(net::URLRequestStatus::FromError(net_error)); | |
55 url_fetcher->SetResponseString(""); | |
56 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | |
57 } | |
58 | |
59 void PrefetchRequestFetcherTest::RespondWithHttpError(int http_error) { | |
60 net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
61 DCHECK(url_fetcher); | |
62 url_fetcher->set_status(net::URLRequestStatus()); | |
63 url_fetcher->set_response_code(http_error); | |
64 url_fetcher->SetResponseString(""); | |
65 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | |
66 } | |
67 | |
68 void PrefetchRequestFetcherTest::RespondWithData(const std::string& data) { | |
69 net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0); | |
70 DCHECK(url_fetcher); | |
71 url_fetcher->set_status(net::URLRequestStatus()); | |
72 url_fetcher->set_response_code(net::HTTP_OK); | |
73 url_fetcher->SetResponseString(data); | |
74 url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); | |
75 } | |
76 | |
77 PrefetchRequestFetcher::Status | |
78 PrefetchRequestFetcherTest::RunFetcherWithNetError(net::Error net_error) { | |
79 base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; | 37 base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; |
80 std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( | 38 std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( |
81 kTestUrl, kTestMessage, request_context_, callback.Get())); | 39 kTestUrl, kTestMessage, request_context(), callback.Get())); |
82 | 40 |
83 PrefetchRequestFetcher::Status status; | 41 PrefetchRequestStatus status; |
84 std::string data; | 42 std::string data; |
85 EXPECT_CALL(callback, Run(_, _)) | 43 EXPECT_CALL(callback, Run(_, _)) |
86 .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); | 44 .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); |
87 RespondWithNetError(net_error); | 45 RespondWithNetError(net_error); |
88 | 46 |
89 EXPECT_TRUE(data.empty()); | 47 EXPECT_TRUE(data.empty()); |
90 return status; | 48 return status; |
91 } | 49 } |
92 | 50 |
93 PrefetchRequestFetcher::Status | 51 PrefetchRequestStatus PrefetchRequestFetcherTest::RunFetcherWithHttpError( |
94 PrefetchRequestFetcherTest::RunFetcherWithHttpError(int http_error) { | 52 int http_error) { |
95 base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; | 53 base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; |
96 std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( | 54 std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( |
97 kTestUrl, kTestMessage, request_context_, callback.Get())); | 55 kTestUrl, kTestMessage, request_context(), callback.Get())); |
98 | 56 |
99 PrefetchRequestFetcher::Status status; | 57 PrefetchRequestStatus status; |
100 std::string data; | 58 std::string data; |
101 EXPECT_CALL(callback, Run(_, _)) | 59 EXPECT_CALL(callback, Run(_, _)) |
102 .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); | 60 .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); |
103 RespondWithHttpError(http_error); | 61 RespondWithHttpError(http_error); |
104 | 62 |
105 EXPECT_TRUE(data.empty()); | 63 EXPECT_TRUE(data.empty()); |
106 return status; | 64 return status; |
107 } | 65 } |
108 | 66 |
109 PrefetchRequestFetcher::Status PrefetchRequestFetcherTest::RunFetcherWithData( | 67 PrefetchRequestStatus PrefetchRequestFetcherTest::RunFetcherWithData( |
110 const std::string& response_data, | 68 const std::string& response_data, |
111 std::string* data_received) { | 69 std::string* data_received) { |
112 base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; | 70 base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; |
113 std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( | 71 std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( |
114 kTestUrl, kTestMessage, request_context_, callback.Get())); | 72 kTestUrl, kTestMessage, request_context(), callback.Get())); |
115 | 73 |
116 PrefetchRequestFetcher::Status status; | 74 PrefetchRequestStatus status; |
117 std::string data; | 75 std::string data; |
118 EXPECT_CALL(callback, Run(_, _)) | 76 EXPECT_CALL(callback, Run(_, _)) |
119 .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); | 77 .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); |
120 RespondWithData(response_data); | 78 RespondWithData(response_data); |
121 | 79 |
122 *data_received = data; | 80 *data_received = data; |
123 return status; | 81 return status; |
124 } | 82 } |
125 | 83 |
126 TEST_F(PrefetchRequestFetcherTest, NetErrors) { | 84 TEST_F(PrefetchRequestFetcherTest, NetErrors) { |
127 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_SUSPEND, | 85 EXPECT_EQ(PrefetchRequestStatus::SHOULD_SUSPEND, |
128 RunFetcherWithNetError(net::ERR_BLOCKED_BY_ADMINISTRATOR)); | 86 RunFetcherWithNetError(net::ERR_BLOCKED_BY_ADMINISTRATOR)); |
129 | 87 |
130 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITHOUT_BACKOFF, | 88 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITHOUT_BACKOFF, |
131 RunFetcherWithNetError(net::ERR_INTERNET_DISCONNECTED)); | 89 RunFetcherWithNetError(net::ERR_INTERNET_DISCONNECTED)); |
132 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITHOUT_BACKOFF, | 90 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITHOUT_BACKOFF, |
133 RunFetcherWithNetError(net::ERR_NETWORK_CHANGED)); | 91 RunFetcherWithNetError(net::ERR_NETWORK_CHANGED)); |
134 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITHOUT_BACKOFF, | 92 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITHOUT_BACKOFF, |
135 RunFetcherWithNetError(net::ERR_CONNECTION_RESET)); | 93 RunFetcherWithNetError(net::ERR_CONNECTION_RESET)); |
136 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITHOUT_BACKOFF, | 94 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITHOUT_BACKOFF, |
137 RunFetcherWithNetError(net::ERR_CONNECTION_CLOSED)); | 95 RunFetcherWithNetError(net::ERR_CONNECTION_CLOSED)); |
138 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITHOUT_BACKOFF, | 96 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITHOUT_BACKOFF, |
139 RunFetcherWithNetError(net::ERR_CONNECTION_REFUSED)); | 97 RunFetcherWithNetError(net::ERR_CONNECTION_REFUSED)); |
140 } | 98 } |
141 | 99 |
142 TEST_F(PrefetchRequestFetcherTest, HttpErrors) { | 100 TEST_F(PrefetchRequestFetcherTest, HttpErrors) { |
143 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_SUSPEND, | 101 EXPECT_EQ(PrefetchRequestStatus::SHOULD_SUSPEND, |
144 RunFetcherWithHttpError(net::HTTP_NOT_IMPLEMENTED)); | 102 RunFetcherWithHttpError(net::HTTP_NOT_IMPLEMENTED)); |
145 | 103 |
146 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 104 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
147 RunFetcherWithHttpError(net::HTTP_BAD_REQUEST)); | 105 RunFetcherWithHttpError(net::HTTP_BAD_REQUEST)); |
148 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 106 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
149 RunFetcherWithHttpError(net::HTTP_UNAUTHORIZED)); | 107 RunFetcherWithHttpError(net::HTTP_UNAUTHORIZED)); |
150 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 108 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
151 RunFetcherWithHttpError(net::HTTP_NOT_FOUND)); | 109 RunFetcherWithHttpError(net::HTTP_NOT_FOUND)); |
152 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 110 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
153 RunFetcherWithHttpError(net::HTTP_CONFLICT)); | 111 RunFetcherWithHttpError(net::HTTP_CONFLICT)); |
154 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 112 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
155 RunFetcherWithHttpError(net::HTTP_INTERNAL_SERVER_ERROR)); | 113 RunFetcherWithHttpError(net::HTTP_INTERNAL_SERVER_ERROR)); |
156 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 114 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
157 RunFetcherWithHttpError(net::HTTP_BAD_GATEWAY)); | 115 RunFetcherWithHttpError(net::HTTP_BAD_GATEWAY)); |
158 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 116 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
159 RunFetcherWithHttpError(net::HTTP_SERVICE_UNAVAILABLE)); | 117 RunFetcherWithHttpError(net::HTTP_SERVICE_UNAVAILABLE)); |
160 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 118 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
161 RunFetcherWithHttpError(net::HTTP_GATEWAY_TIMEOUT)); | 119 RunFetcherWithHttpError(net::HTTP_GATEWAY_TIMEOUT)); |
162 } | 120 } |
163 | 121 |
164 TEST_F(PrefetchRequestFetcherTest, EmptyResponse) { | 122 TEST_F(PrefetchRequestFetcherTest, EmptyResponse) { |
165 std::string data; | 123 std::string data; |
166 EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, | 124 EXPECT_EQ(PrefetchRequestStatus::SHOULD_RETRY_WITH_BACKOFF, |
167 RunFetcherWithData("", &data)); | 125 RunFetcherWithData("", &data)); |
168 EXPECT_TRUE(data.empty()); | 126 EXPECT_TRUE(data.empty()); |
169 } | 127 } |
170 | 128 |
171 TEST_F(PrefetchRequestFetcherTest, Success) { | 129 TEST_F(PrefetchRequestFetcherTest, Success) { |
172 std::string data; | 130 std::string data; |
173 EXPECT_EQ(PrefetchRequestFetcher::Status::SUCCESS, | 131 EXPECT_EQ(PrefetchRequestStatus::SUCCESS, |
174 RunFetcherWithData("Any data.", &data)); | 132 RunFetcherWithData("Any data.", &data)); |
175 EXPECT_FALSE(data.empty()); | 133 EXPECT_FALSE(data.empty()); |
176 } | 134 } |
177 | 135 |
178 } // namespace offline_prefetch | 136 } // namespace offline_pages |
OLD | NEW |