| 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 |