blob: b300abf74a04e372e5dd40ac1e4bddedcb81a226 [file] [log] [blame]
// Copyright 2018 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/search/url_validity_checker_impl.h"
#include "base/files/file_util.h"
#include "base/path_service.h"
#include "base/run_loop.h"
#include "base/test/bind_test_util.h"
#include "base/test/mock_callback.h"
#include "base/test/scoped_task_environment.h"
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
#include "services/network/test/test_url_loader_factory.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
using ::testing::_;
class UrlValidityCheckerImplTest : public testing::Test {
protected:
UrlValidityCheckerImplTest()
: scoped_task_environment_(
base::test::ScopedTaskEnvironment::MainThreadType::MOCK_TIME),
test_shared_loader_factory_(
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
&test_url_loader_factory_)),
url_checker_(test_shared_loader_factory_,
scoped_task_environment_.GetMockTickClock()) {}
~UrlValidityCheckerImplTest() override {}
void SetUp() override {
test_shared_loader_factory_ =
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
url_loader_factory());
}
UrlValidityCheckerImpl* url_checker() { return &url_checker_; }
network::TestURLLoaderFactory* url_loader_factory() {
return &test_url_loader_factory_;
}
base::test::ScopedTaskEnvironment scoped_task_environment_;
private:
network::TestURLLoaderFactory test_url_loader_factory_;
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
UrlValidityCheckerImpl url_checker_;
DISALLOW_COPY_AND_ASSIGN(UrlValidityCheckerImplTest);
};
TEST_F(UrlValidityCheckerImplTest, DoesUrlResolve_OnSuccess) {
const GURL kUrl("https://www.foo.com");
const int kTimeAdvance = 10;
base::TimeDelta expected_duration =
base::TimeDelta::FromSeconds(kTimeAdvance);
network::ResourceResponseHead response;
response.headers = new net::HttpResponseHeaders(
"HTTP/1.1 200 OK\nContent-type: text/html\n\n");
url_loader_factory()->SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
scoped_task_environment_.FastForwardBy(expected_duration);
url_loader_factory()->AddResponse(
request.url, response, std::string(),
network::URLLoaderCompletionStatus(net::OK));
}));
base::MockCallback<UrlValidityChecker::UrlValidityCheckerCallback>
callback_ok;
EXPECT_CALL(callback_ok, Run(true, expected_duration));
url_checker()->DoesUrlResolve(kUrl, TRAFFIC_ANNOTATION_FOR_TESTS,
callback_ok.Get());
scoped_task_environment_.RunUntilIdle();
response.headers =
new net::HttpResponseHeaders("HTTP/1.1 204 No Content\r\n\r\n");
base::MockCallback<UrlValidityChecker::UrlValidityCheckerCallback>
callback_no_content;
EXPECT_CALL(callback_no_content, Run(true, expected_duration));
url_checker()->DoesUrlResolve(kUrl, TRAFFIC_ANNOTATION_FOR_TESTS,
callback_no_content.Get());
scoped_task_environment_.RunUntilIdle();
}
TEST_F(UrlValidityCheckerImplTest, DoesUrlResolve_OnFailure) {
const GURL kUrl("https://www.foo.com");
const int kTimeAdvance = 20;
base::TimeDelta expected_duration =
base::TimeDelta::FromSeconds(kTimeAdvance);
url_loader_factory()->SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
scoped_task_environment_.FastForwardBy(expected_duration);
url_loader_factory()->AddResponse(
request.url, network::ResourceResponseHead(), std::string(),
network::URLLoaderCompletionStatus(net::ERR_FAILED));
}));
base::MockCallback<UrlValidityChecker::UrlValidityCheckerCallback> callback;
EXPECT_CALL(callback, Run(false, expected_duration));
url_checker()->DoesUrlResolve(kUrl, TRAFFIC_ANNOTATION_FOR_TESTS,
callback.Get());
scoped_task_environment_.RunUntilIdle();
}
TEST_F(UrlValidityCheckerImplTest, DoesUrlResolve_OnRedirect) {
const GURL kUrl("https://www.foo.com");
const GURL kRedirectUrl("https://www.foo2.com");
const int kTimeAdvance = 30;
base::TimeDelta expected_duration =
base::TimeDelta::FromSeconds(kTimeAdvance);
net::RedirectInfo redirect_info;
redirect_info.status_code = 301;
redirect_info.new_url = kRedirectUrl;
network::TestURLLoaderFactory::Redirects redirects{
{redirect_info, network::ResourceResponseHead()}};
url_loader_factory()->SetInterceptor(
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
scoped_task_environment_.FastForwardBy(expected_duration);
url_loader_factory()->AddResponse(
request.url, network::ResourceResponseHead(), std::string(),
network::URLLoaderCompletionStatus(), redirects);
}));
base::MockCallback<UrlValidityChecker::UrlValidityCheckerCallback> callback;
EXPECT_CALL(callback, Run(true, expected_duration));
url_checker()->DoesUrlResolve(kUrl, TRAFFIC_ANNOTATION_FOR_TESTS,
callback.Get());
scoped_task_environment_.RunUntilIdle();
}
TEST_F(UrlValidityCheckerImplTest, DoesUrlResolve_OnTimeout) {
const GURL kUrl("https://www.foo.com");
base::MockCallback<UrlValidityChecker::UrlValidityCheckerCallback> callback;
EXPECT_CALL(callback, Run(false, _));
url_checker()->DoesUrlResolve(kUrl, TRAFFIC_ANNOTATION_FOR_TESTS,
callback.Get());
scoped_task_environment_.FastForwardBy(base::TimeDelta::FromSeconds(20));
scoped_task_environment_.RunUntilIdle();
}