Chromium Code Reviews| Index: components/offline_pages/core/prefetch/prefetch_request_fetcher_unittest.cc |
| diff --git a/components/offline_pages/core/prefetch/prefetch_request_fetcher_unittest.cc b/components/offline_pages/core/prefetch/prefetch_request_fetcher_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..e499d4aee04b11f84852f36b2b732ffcdfa28b5b |
| --- /dev/null |
| +++ b/components/offline_pages/core/prefetch/prefetch_request_fetcher_unittest.cc |
| @@ -0,0 +1,132 @@ |
| +// Copyright 2017 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "components/offline_pages/core/prefetch/prefetch_request_fetcher.h" |
| + |
| +#include "base/message_loop/message_loop.h" |
| +#include "base/test/mock_callback.h" |
| +#include "net/http/http_status_code.h" |
| +#include "net/url_request/test_url_fetcher_factory.h" |
| +#include "net/url_request/url_request_status.h" |
| +#include "net/url_request/url_request_test_util.h" |
| +#include "testing/gmock/include/gmock/gmock.h" |
| +#include "testing/gtest/include/gtest/gtest.h" |
| +#include "url/gurl.h" |
| + |
| +using testing::_; |
| +using testing::DoAll; |
| +using testing::Eq; |
| +using testing::SaveArg; |
| + |
| +namespace offline_prefetch { |
| + |
| +namespace { |
| +const GURL kTestUrl("http://example.com"); |
| +const char kTestMessage[] = "Testing"; |
| +} // namespace |
| + |
| +class PrefetchRequestFetcherTest : public testing::Test { |
| + public: |
| + PrefetchRequestFetcherTest() |
| + : request_context_(new net::TestURLRequestContextGetter( |
| + base::ThreadTaskRunnerHandle::Get())) {} |
| + |
| + void RespondWithNetError(int net_error); |
| + void RespondWithHttpError(int http_error); |
| + void RespondWithData(const std::string& data); |
| + |
| + protected: |
| + base::MessageLoop message_loop_; |
| + net::TestURLFetcherFactory url_fetcher_factory_; |
| + scoped_refptr<net::TestURLRequestContextGetter> request_context_; |
| +}; |
| + |
| +void PrefetchRequestFetcherTest::RespondWithNetError(int net_error) { |
| + net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| + DCHECK(url_fetcher); |
| + url_fetcher->set_status(net::URLRequestStatus::FromError(net_error)); |
| + url_fetcher->SetResponseString(""); |
| + url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| +} |
| + |
| +void PrefetchRequestFetcherTest::RespondWithHttpError(int http_error) { |
| + net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| + DCHECK(url_fetcher); |
| + url_fetcher->set_status(net::URLRequestStatus()); |
| + url_fetcher->set_response_code(http_error); |
| + url_fetcher->SetResponseString(""); |
| + url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| +} |
| + |
| +void PrefetchRequestFetcherTest::RespondWithData(const std::string& data) { |
| + net::TestURLFetcher* url_fetcher = url_fetcher_factory_.GetFetcherByID(0); |
| + DCHECK(url_fetcher); |
| + url_fetcher->set_status(net::URLRequestStatus()); |
| + url_fetcher->set_response_code(net::HTTP_OK); |
| + url_fetcher->SetResponseString(data); |
| + url_fetcher->delegate()->OnURLFetchComplete(url_fetcher); |
| +} |
| + |
| +TEST_F(PrefetchRequestFetcherTest, ErrorFoRetryingWithoutBackoff) { |
| + base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; |
|
dewittj
2017/05/02 21:16:35
Looks like these tests follow a common form:
* Mak
jianli
2017/05/02 22:23:10
Done.
|
| + std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( |
| + kTestUrl, kTestMessage, request_context_, callback.Get())); |
| + |
| + PrefetchRequestFetcher::Status status; |
| + std::string data; |
| + EXPECT_CALL(callback, Run(_, _)) |
| + .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); |
| + RespondWithNetError(net::ERR_INTERNET_DISCONNECTED); |
| + |
| + EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITHOUT_BACKOFF, |
| + status); |
| + EXPECT_TRUE(data.empty()); |
| +} |
| + |
| +TEST_F(PrefetchRequestFetcherTest, ErrorFoRetryingWithBackoff) { |
| + base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; |
| + std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( |
| + kTestUrl, kTestMessage, request_context_, callback.Get())); |
| + |
| + PrefetchRequestFetcher::Status status; |
| + std::string data; |
| + EXPECT_CALL(callback, Run(_, _)) |
| + .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); |
| + RespondWithHttpError(net::HTTP_SERVICE_UNAVAILABLE); |
| + |
| + EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, status); |
| + EXPECT_TRUE(data.empty()); |
| +} |
| + |
| +TEST_F(PrefetchRequestFetcherTest, SuspendError) { |
| + base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; |
| + std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( |
| + kTestUrl, kTestMessage, request_context_, callback.Get())); |
| + |
| + PrefetchRequestFetcher::Status status; |
| + std::string data; |
| + EXPECT_CALL(callback, Run(_, _)) |
| + .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); |
| + RespondWithHttpError(net::HTTP_NOT_IMPLEMENTED); |
| + |
| + EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_SUSPEND, status); |
| + EXPECT_TRUE(data.empty()); |
| +} |
| + |
| +TEST_F(PrefetchRequestFetcherTest, EmptyResponse) { |
| + base::MockCallback<PrefetchRequestFetcher::FinishedCallback> callback; |
| + std::unique_ptr<PrefetchRequestFetcher> fetcher(new PrefetchRequestFetcher( |
| + kTestUrl, kTestMessage, request_context_, callback.Get())); |
| + |
| + PrefetchRequestFetcher::Status status; |
| + std::string data; |
| + EXPECT_CALL(callback, Run(_, _)) |
| + .WillOnce(DoAll(SaveArg<0>(&status), SaveArg<1>(&data))); |
| + RespondWithData(""); |
| + |
| + EXPECT_EQ(PrefetchRequestFetcher::Status::SHOULD_RETRY_WITH_BACKOFF, status); |
| + EXPECT_TRUE(data.empty()); |
| +} |
| + |
| +} // namespace offline_prefetch |