Skip to content

Commit f39c9f7

Browse files
author
Kristi Park
committed
[Merge M71] Initialize test UrlValidityChecker in InstantService and simplify UrlValidityChecker testing
Fix crashes caused by |url_checker_for_testing_| not being initialized properly. Additionally, construct UrlValidityChecker with NoDestructor instead of a global LazyInstance. We prefer to leak singletons to avoid unnecessary work at shutdown. Also simplify UrlValidityChecker by passing TickClock, which provides cleaner timeout and duration testing. Bug: 894742 Change-Id: I468f76e07dc6f551a8515d8416d0c67f5f2035a1 Reviewed-on: https://chromium-review.googlesource.com/c/1277959 Commit-Queue: Kristi Park <[email protected]> Reviewed-by: Mathieu Perreault <[email protected]> Cr-Original-Commit-Position: refs/heads/master@{#599377}(cherry picked from commit 8c7eeb6) Reviewed-on: https://chromium-review.googlesource.com/c/1284063 Reviewed-by: Kristi Park <[email protected]> Cr-Commit-Position: refs/branch-heads/3578@{#54} Cr-Branched-From: 4226ddf-refs/heads/master@{#599034}
1 parent 2220d68 commit f39c9f7

8 files changed

+33
-59
lines changed

chrome/browser/search/instant_service.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ void InstantService::OnDoesUrlResolveComplete(
485485
const GURL& url,
486486
chrome::mojom::EmbeddedSearch::DoesUrlResolveCallback callback,
487487
bool resolves,
488-
const base::TimeDelta& duration) {
488+
base::TimeDelta duration) {
489489
bool timeout = false;
490490
if (!resolves) {
491491
// Internally update the default "https" scheme to "http" if UI dialog has
@@ -819,7 +819,7 @@ void InstantService::FallbackToDefaultThemeInfo() {
819819
UrlValidityChecker* InstantService::GetUrlValidityChecker() {
820820
if (url_checker_for_testing_ != nullptr)
821821
return url_checker_for_testing_;
822-
return UrlValidityCheckerFactory::GetInstance();
822+
return UrlValidityCheckerFactory::GetUrlValidityChecker();
823823
}
824824

825825
// static

chrome/browser/search/instant_service.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ class InstantService : public KeyedService,
165165
const GURL& url,
166166
chrome::mojom::EmbeddedSearch::DoesUrlResolveCallback callback,
167167
bool resolves,
168-
const base::TimeDelta& duration);
168+
base::TimeDelta duration);
169169

170170
// content::NotificationObserver:
171171
void Observe(int type,
@@ -231,7 +231,7 @@ class InstantService : public KeyedService,
231231
std::unique_ptr<SearchProviderObserver> search_provider_observer_;
232232

233233
// Test UrlValidityChecker used for testing.
234-
UrlValidityChecker* url_checker_for_testing_;
234+
UrlValidityChecker* url_checker_for_testing_ = nullptr;
235235

236236
PrefChangeRegistrar pref_change_registrar_;
237237

chrome/browser/search/url_validity_checker_factory.cc

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,21 +6,22 @@
66

77
#include <memory>
88

9+
#include "base/time/default_tick_clock.h"
910
#include "chrome/browser/browser_process.h"
1011
#include "chrome/browser/net/system_network_context_manager.h"
1112
#include "content/public/browser/browser_thread.h"
1213
#include "services/network/public/cpp/shared_url_loader_factory.h"
1314

1415
// static
15-
UrlValidityChecker* UrlValidityCheckerFactory::GetInstance() {
16+
UrlValidityChecker* UrlValidityCheckerFactory::GetUrlValidityChecker() {
1617
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
17-
static base::LazyInstance<UrlValidityCheckerFactory>::DestructorAtExit
18-
instance = LAZY_INSTANCE_INITIALIZER;
19-
return &(instance.Get().url_validity_checker_);
18+
static base::NoDestructor<UrlValidityCheckerImpl> checker(
19+
g_browser_process->system_network_context_manager()
20+
->GetSharedURLLoaderFactory(),
21+
base::DefaultTickClock::GetInstance());
22+
return checker.get();
2023
}
2124

22-
UrlValidityCheckerFactory::UrlValidityCheckerFactory()
23-
: url_validity_checker_(g_browser_process->system_network_context_manager()
24-
->GetSharedURLLoaderFactory()) {}
25+
UrlValidityCheckerFactory::UrlValidityCheckerFactory() = default;
2526

26-
UrlValidityCheckerFactory::~UrlValidityCheckerFactory() {}
27+
UrlValidityCheckerFactory::~UrlValidityCheckerFactory() = default;

chrome/browser/search/url_validity_checker_factory.h

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,22 @@
55
#ifndef CHROME_BROWSER_SEARCH_URL_VALIDITY_CHECKER_FACTORY_H_
66
#define CHROME_BROWSER_SEARCH_URL_VALIDITY_CHECKER_FACTORY_H_
77

8-
#include "base/lazy_instance.h"
98
#include "base/macros.h"
9+
#include "base/no_destructor.h"
1010
#include "components/search/url_validity_checker_impl.h"
1111

1212
// Singleton that owns a single UrlValidityCheckerImpl instance. Should only be
1313
// called from the UI thread.
1414
class UrlValidityCheckerFactory {
1515
public:
16-
static UrlValidityChecker* GetInstance();
16+
static UrlValidityChecker* GetUrlValidityChecker();
1717

1818
private:
19-
friend struct base::LazyInstanceTraitsBase<UrlValidityCheckerFactory>;
19+
friend class base::NoDestructor<UrlValidityCheckerFactory>;
2020

2121
UrlValidityCheckerFactory();
2222
~UrlValidityCheckerFactory();
2323

24-
// The only instance that exists.
25-
UrlValidityCheckerImpl url_validity_checker_;
26-
2724
DISALLOW_COPY_AND_ASSIGN(UrlValidityCheckerFactory);
2825
};
2926

components/search/url_validity_checker.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ class UrlValidityChecker {
1515
// The callback invoked when the request completes. Returns true if the
1616
// response was |valid| and the request |duration|.
1717
using UrlValidityCheckerCallback =
18-
base::OnceCallback<void(bool valid, const base::TimeDelta& duration)>;
18+
base::OnceCallback<void(bool valid, base::TimeDelta duration)>;
1919

2020
virtual ~UrlValidityChecker() = default;
2121

components/search/url_validity_checker_impl.cc

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -41,9 +41,9 @@ struct UrlValidityCheckerImpl::PendingRequest {
4141
};
4242

4343
UrlValidityCheckerImpl::UrlValidityCheckerImpl(
44-
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory)
45-
: url_loader_factory_(url_loader_factory),
46-
clock_(base::DefaultTickClock::GetInstance()) {}
44+
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
45+
const base::TickClock* tick_clock)
46+
: url_loader_factory_(std::move(url_loader_factory)), clock_(tick_clock) {}
4747

4848
UrlValidityCheckerImpl::~UrlValidityCheckerImpl() = default;
4949

@@ -56,8 +56,9 @@ void UrlValidityCheckerImpl::DoesUrlResolve(
5656
resource_request->method = "HEAD";
5757
resource_request->allow_credentials = false;
5858

59-
auto request_iter = pending_requests_.emplace(
60-
pending_requests_.begin(), url, NowTicks(), clock_, std::move(callback));
59+
auto request_iter = pending_requests_.emplace(pending_requests_.begin(), url,
60+
clock_->NowTicks(), clock_,
61+
std::move(callback));
6162
request_iter->loader = network::SimpleURLLoader::Create(
6263
std::move(resource_request), traffic_annotation);
6364
// Don't follow redirects to prevent leaking URL data to HTTP sites.
@@ -94,13 +95,8 @@ void UrlValidityCheckerImpl::OnSimpleLoaderComplete(
9495
void UrlValidityCheckerImpl::OnSimpleLoaderHandler(
9596
std::list<PendingRequest>::iterator request_iter,
9697
bool valid) {
97-
base::TimeDelta elapsed_time = NowTicks() - request_iter->time_created;
98+
base::TimeDelta elapsed_time =
99+
clock_->NowTicks() - request_iter->time_created;
98100
std::move(request_iter->callback).Run(valid, elapsed_time);
99101
pending_requests_.erase(request_iter);
100102
}
101-
102-
base::TimeTicks UrlValidityCheckerImpl::NowTicks() const {
103-
if (!time_ticks_for_testing_.is_null())
104-
return time_ticks_for_testing_;
105-
return base::TimeTicks::Now();
106-
}

components/search/url_validity_checker_impl.h

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -30,19 +30,15 @@ class SharedURLLoaderFactory;
3030

3131
class UrlValidityCheckerImpl : public UrlValidityChecker {
3232
public:
33-
explicit UrlValidityCheckerImpl(
34-
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory);
33+
UrlValidityCheckerImpl(
34+
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory,
35+
const base::TickClock* tick_clock);
3536
~UrlValidityCheckerImpl() override;
3637

3738
void DoesUrlResolve(const GURL& url,
3839
net::NetworkTrafficAnnotationTag traffic_annotation,
3940
UrlValidityCheckerCallback callback) override;
4041

41-
// Used for testing.
42-
void SetTimeTicksForTesting(const base::TimeTicks& time_ticks) {
43-
time_ticks_for_testing_ = time_ticks;
44-
}
45-
4642
private:
4743
struct PendingRequest;
4844

@@ -62,17 +58,11 @@ class UrlValidityCheckerImpl : public UrlValidityChecker {
6258
void OnSimpleLoaderHandler(std::list<PendingRequest>::iterator request_iter,
6359
bool valid);
6460

65-
// Returns base::TimeTicks::Now() or the test TimeTicks if not null.
66-
base::TimeTicks NowTicks() const;
67-
6861
// Stores any ongoing network requests. Once a request is completed, it is
6962
// deleted from the list.
7063
std::list<PendingRequest> pending_requests_;
7164
scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_;
7265

73-
// Test time ticks used for testing.
74-
base::TimeTicks time_ticks_for_testing_;
75-
7666
// Non-owned pointer to TickClock. Used for request timeouts.
7767
const base::TickClock* const clock_;
7868

components/search/url_validity_checker_impl_unittest.cc

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
#include "base/test/bind_test_util.h"
1111
#include "base/test/mock_callback.h"
1212
#include "base/test/scoped_task_environment.h"
13-
#include "base/test/simple_test_tick_clock.h"
1413
#include "net/traffic_annotation/network_traffic_annotation_test_helper.h"
1514
#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h"
1615
#include "services/network/test/test_url_loader_factory.h"
@@ -27,18 +26,15 @@ class UrlValidityCheckerImplTest : public testing::Test {
2726
test_shared_loader_factory_(
2827
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
2928
&test_url_loader_factory_)),
30-
url_checker_(test_shared_loader_factory_) {
31-
// Start |clock_| at non-zero.
32-
clock_.Advance(base::TimeDelta::FromSeconds(1));
33-
}
29+
url_checker_(test_shared_loader_factory_,
30+
scoped_task_environment_.GetMockTickClock()) {}
3431

3532
~UrlValidityCheckerImplTest() override {}
3633

3734
void SetUp() override {
3835
test_shared_loader_factory_ =
3936
base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>(
4037
url_loader_factory());
41-
url_checker()->SetTimeTicksForTesting(clock_.NowTicks());
4238
}
4339

4440
UrlValidityCheckerImpl* url_checker() { return &url_checker_; }
@@ -47,18 +43,12 @@ class UrlValidityCheckerImplTest : public testing::Test {
4743
return &test_url_loader_factory_;
4844
}
4945

50-
void AdvanceClock(const base::TimeDelta& delta) {
51-
clock_.Advance(delta);
52-
url_checker()->SetTimeTicksForTesting(clock_.NowTicks());
53-
}
54-
5546
base::test::ScopedTaskEnvironment scoped_task_environment_;
5647

5748
private:
5849
network::TestURLLoaderFactory test_url_loader_factory_;
5950
scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_;
6051

61-
base::SimpleTestTickClock clock_;
6252
UrlValidityCheckerImpl url_checker_;
6353

6454
DISALLOW_COPY_AND_ASSIGN(UrlValidityCheckerImplTest);
@@ -75,7 +65,7 @@ TEST_F(UrlValidityCheckerImplTest, DoesUrlResolve_OnSuccess) {
7565
"HTTP/1.1 200 OK\nContent-type: text/html\n\n");
7666
url_loader_factory()->SetInterceptor(
7767
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
78-
AdvanceClock(expected_duration);
68+
scoped_task_environment_.FastForwardBy(expected_duration);
7969
url_loader_factory()->AddResponse(
8070
request.url, response, std::string(),
8171
network::URLLoaderCompletionStatus(net::OK));
@@ -107,7 +97,7 @@ TEST_F(UrlValidityCheckerImplTest, DoesUrlResolve_OnFailure) {
10797

10898
url_loader_factory()->SetInterceptor(
10999
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
110-
AdvanceClock(expected_duration);
100+
scoped_task_environment_.FastForwardBy(expected_duration);
111101
url_loader_factory()->AddResponse(
112102
request.url, network::ResourceResponseHead(), std::string(),
113103
network::URLLoaderCompletionStatus(net::ERR_FAILED));
@@ -134,7 +124,7 @@ TEST_F(UrlValidityCheckerImplTest, DoesUrlResolve_OnRedirect) {
134124
{redirect_info, network::ResourceResponseHead()}};
135125
url_loader_factory()->SetInterceptor(
136126
base::BindLambdaForTesting([&](const network::ResourceRequest& request) {
137-
AdvanceClock(expected_duration);
127+
scoped_task_environment_.FastForwardBy(expected_duration);
138128
url_loader_factory()->AddResponse(
139129
request.url, network::ResourceResponseHead(), std::string(),
140130
network::URLLoaderCompletionStatus(), redirects);

0 commit comments

Comments
 (0)