Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(253)

Side by Side Diff: components/safe_browsing/request_checker_unittest.cc

Issue 2876473003: [ABANDONED] [WIP] Refactor SafeBrowsingResourceThrottle in preparation for WebSocket (Closed)
Patch Set: Finish unit tests Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
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
3 // found in the LICENSE file.
4
5 #include "components/safe_browsing/request_checker.h"
6
7 #include <memory>
8 #include <set>
9 #include <string>
10 #include <utility>
11
12 #include "base/bind.h"
13 #include "base/callback.h"
14 #include "base/location.h"
15 #include "base/memory/ref_counted.h"
16 #include "base/run_loop.h"
17 #include "base/time/time.h"
18 #include "components/safe_browsing/base_ui_manager.h"
19 #include "components/safe_browsing_db/database_manager.h"
20 #include "components/safe_browsing_db/hit_report.h"
21 #include "components/safe_browsing_db/v4_protocol_manager_util.h"
22 #include "components/security_interstitials/content/unsafe_resource.h"
23 #include "content/public/browser/browser_thread.h"
24 #include "content/public/common/resource_type.h"
25 #include "content/public/test/test_browser_thread_bundle.h"
26 #include "net/base/load_flags.h"
27 #include "net/url_request/url_request.h"
28 #include "net/url_request/url_request_test_util.h"
29 #include "testing/gmock/include/gmock/gmock.h"
30 #include "testing/gtest/include/gtest/gtest.h"
31 #include "url/gurl.h"
32
33 namespace safe_browsing {
34
35 namespace {
36
37 using ::testing::ElementsAre;
38 using ::testing::InSequence;
39 using ::testing::Return;
40 using ::testing::MockFunction;
41 using ::testing::NiceMock;
42 using ::testing::SaveArg;
43 using ::testing::StrictMock;
44 using ::testing::_;
45
46 constexpr char kTestUrl[] = "test:";
47 constexpr char kTestUrl2[] = "test:2";
48 constexpr char kTestUrl3[] = "test:3";
49
50 // A checkpoint can be used to verify the relative ordering of mocked calls and
51 // real calls to the code under test.
52 typedef StrictMock<MockFunction<void(int)>> Checkpoint;
53
54 class StubUIManager : public BaseUIManager {
55 public:
56 StubUIManager() {}
57
58 // Override all the methods on the base class to eliminate all side-effects.
59 void StopOnIOThread(bool shutdown) override {}
60 void DisplayBlockingPage(const UnsafeResource& resource) override {}
61 void LogPauseDelay(base::TimeDelta time) override {}
62 void SendSerializedThreatDetails(const std::string& serialized) override {}
63 void MaybeReportSafeBrowsingHit(
64 const safe_browsing::HitReport& hit_report) override {}
65 bool IsWhitelisted(const UnsafeResource& resource) override { return false; }
66 bool IsUrlWhitelistedOrPendingForWebContents(
67 const GURL& url,
68 bool is_subresource,
69 content::NavigationEntry* entry,
70 content::WebContents* web_contents,
71 bool whitelist_only,
72 SBThreatType* threat_type) override {
73 return false;
74 }
75 void OnBlockingPageDone(const std::vector<UnsafeResource>& resources,
76 bool proceed,
77 content::WebContents* web_contents,
78 const GURL& main_frame_url) override {}
79 const std::string app_locale() const override { return "C"; }
80 history::HistoryService* history_service(
81 content::WebContents* web_contents) override {
82 return nullptr;
83 }
84 const GURL default_safe_page() const override { return GURL(); }
85
86 protected:
87 ~StubUIManager() override {}
88
89 // These should never be called. Override them anyway to be on the safe side.
90 void ReportSafeBrowsingHitOnIOThread(
91 const safe_browsing::HitReport& hit_report) override {}
92 void CreateAndSendHitReport(const UnsafeResource& resource) override {}
93 void ShowBlockingPageForResource(const UnsafeResource& resource) override {}
94 };
95
96 // RequestChecker only uses one method from UIManager, LogPauseDelay, so only
97 // mock that one.
98 class SemiMockUIManager : public StubUIManager {
99 public:
100 MOCK_METHOD1(LogPauseDelay, void(base::TimeDelta));
101
102 protected:
103 ~SemiMockUIManager() {}
104 };
105
106 class MockDelegate : public RequestChecker::Delegate {
107 public:
108 MOCK_METHOD1(MaybeDestroyPrerenderContents,
109 void(const net::URLRequest* request));
110 MOCK_CONST_METHOD1(GetWebContentsGetterForRequest,
111 WebContentsGetter(const net::URLRequest* request));
112 MOCK_METHOD2(StartDisplayingBlockingPage,
113 void(const security_interstitials::UnsafeResource& resource,
114 scoped_refptr<BaseUIManager> ui_manager));
115 MOCK_METHOD0(CancelResourceLoad, void());
116 MOCK_METHOD0(ResumeResourceRequest, void());
117 };
118
119 class MockSafeBrowsingDatabaseManager : public SafeBrowsingDatabaseManager {
120 public:
121 MOCK_METHOD1(CancelApiCheck, bool(Client* client));
122 MOCK_METHOD1(CancelCheck, void(Client* client));
123 MOCK_CONST_METHOD1(CanCheckResourceType,
124 bool(content::ResourceType resource_type));
125 MOCK_CONST_METHOD1(CanCheckUrl, bool(const GURL& url));
126 MOCK_CONST_METHOD0(ChecksAreAlwaysAsync, bool());
127 MOCK_METHOD2(CheckApiBlacklistUrl, bool(const GURL& url, Client* client));
128 MOCK_METHOD2(CheckBrowseUrl, bool(const GURL& url, Client* client));
129 MOCK_METHOD2(CheckUrlForSubresourceFilter,
130 bool(const GURL& url, Client* client));
131 MOCK_METHOD2(CheckDownloadUrl,
132 bool(const std::vector<GURL>& url_chain, Client* client));
133 MOCK_METHOD2(CheckExtensionIDs,
134 bool(const std::set<std::string>& extension_ids,
135 Client* client));
136 MOCK_METHOD2(CheckResourceUrl, bool(const GURL& url, Client* client));
137 MOCK_METHOD1(MatchCsdWhitelistUrl, bool(const GURL& url));
138 MOCK_METHOD1(MatchDownloadWhitelistString, bool(const std::string& str));
139 MOCK_METHOD1(MatchDownloadWhitelistUrl, bool(const GURL& url));
140 MOCK_METHOD1(MatchMalwareIP, bool(const std::string& ip_address));
141 MOCK_METHOD1(MatchModuleWhitelistString, bool(const std::string& str));
142 MOCK_METHOD0(GetStoresForFullHashRequests, StoresToCheck());
143 MOCK_CONST_METHOD0(GetThreatSource, ThreatSource());
144 MOCK_METHOD0(IsCsdWhitelistKillSwitchOn, bool());
145 MOCK_CONST_METHOD0(IsDownloadProtectionEnabled, bool());
146 MOCK_METHOD0(IsMalwareKillSwitchOn, bool());
147 MOCK_CONST_METHOD0(IsSupported, bool());
148 MOCK_METHOD2(StartOnIOThread,
149 void(net::URLRequestContextGetter* request_context_getter,
150 const V4ProtocolConfig& config));
151 MOCK_METHOD1(StopOnIOThread, void(bool shutdown));
152
153 protected:
154 ~MockSafeBrowsingDatabaseManager() {}
155 };
156
157 class RequestCheckerTest : public ::testing::Test {
158 protected:
159 RequestCheckerTest()
160 : request_(url_request_context_.CreateRequest(GURL(kTestUrl),
161 net::DEFAULT_PRIORITY,
162 nullptr)),
163 database_manager_(new NiceMock<MockSafeBrowsingDatabaseManager>()),
164 ui_manager_(new NiceMock<SemiMockUIManager>()),
165 delegate_(base::MakeUnique<NiceMock<MockDelegate>>()),
166 checker_(base::MakeUnique<RequestChecker>(
167 request_.get(),
168 content::RESOURCE_TYPE_SUB_RESOURCE,
169 database_manager_,
170 ui_manager_,
171 delegate_.get())) {
172 // CanCheckResourceType() is called by almost all tests so make it pass by
173 // default.
174 ON_CALL(*database_manager_, CanCheckResourceType(_))
175 .WillByDefault(Return(true));
176 }
177 ~RequestCheckerTest() override {
178 // It's possible that something could hold a reference to these objects
179 // after the framework is destroyed, so make sure mock expectations have
180 // been verified.
181 ::testing::Mock::VerifyAndClearExpectations(database_manager_.get());
182 ::testing::Mock::VerifyAndClearExpectations(ui_manager_.get());
183 }
184
185 const content::TestBrowserThreadBundle test_browser_thread_bundle_;
186 net::TestURLRequestContext url_request_context_;
187 const std::unique_ptr<net::URLRequest> request_;
188 const scoped_refptr<NiceMock<MockSafeBrowsingDatabaseManager>>
189 database_manager_;
190 const scoped_refptr<NiceMock<SemiMockUIManager>> ui_manager_;
191 const std::unique_ptr<NiceMock<MockDelegate>> delegate_;
192 std::unique_ptr<RequestChecker> checker_;
193 };
194
195 TEST_F(RequestCheckerTest, Constructs) {
196 // The framework constructor does all the work.
197 }
198
199 TEST_F(RequestCheckerTest, UncheckedResourceType) {
200 EXPECT_CALL(*database_manager_,
201 CanCheckResourceType(content::RESOURCE_TYPE_SUB_RESOURCE))
202 .WillOnce(Return(false));
203 EXPECT_EQ(RequestChecker::PROCEED_SKIPPED, checker_->CheckNewRequest());
204 }
205
206 TEST_F(RequestCheckerTest, SynchronousPass) {
207 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(true));
208 EXPECT_EQ(RequestChecker::PROCEED_SAFE, checker_->CheckNewRequest());
209 }
210
211 TEST_F(RequestCheckerTest, CorrectUrlIsPassedToDatabaseManager) {
212 EXPECT_CALL(*database_manager_, CheckBrowseUrl(GURL(kTestUrl), _))
213 .WillOnce(Return(true));
214 checker_->CheckNewRequest();
215 }
216
217 TEST_F(RequestCheckerTest, ZeroDelayIsLogged) {
218 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(true));
219 EXPECT_CALL(*ui_manager_, LogPauseDelay(base::TimeDelta()));
220 checker_->CheckNewRequest();
221 }
222
223 TEST_F(RequestCheckerTest, SyncMissAsyncProceed) {
224 Checkpoint checkpoint;
225 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
226 EXPECT_CALL(*database_manager_, ChecksAreAlwaysAsync())
227 .WillOnce(Return(false));
228 {
229 InSequence s;
230 EXPECT_CALL(checkpoint, Call(1));
231 EXPECT_CALL(*delegate_, ResumeResourceRequest());
232 }
233
234 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
235 checkpoint.Call(1);
236 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_SAFE,
237 ThreatMetadata());
238 }
239
240 TEST_F(RequestCheckerTest, SyncMissAsyncUnsafe) {
241 security_interstitials::UnsafeResource resource;
242 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
243 EXPECT_CALL(*database_manager_, ChecksAreAlwaysAsync())
244 .WillOnce(Return(false));
245 EXPECT_CALL(*delegate_, StartDisplayingBlockingPage(_, _))
246 .WillOnce(SaveArg<0>(&resource));
247 EXPECT_CALL(*delegate_, GetWebContentsGetterForRequest(request_.get()))
248 .WillOnce(Return(
249 base::Bind([]() -> content::WebContents* { return nullptr; })));
250 EXPECT_CALL(*database_manager_, GetThreatSource())
251 .WillOnce(Return(ThreatSource::LOCAL_PVER4));
252 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
253 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_URL_MALWARE,
254 ThreatMetadata());
255 EXPECT_EQ(GURL(kTestUrl), resource.url);
256 EXPECT_EQ(request_->original_url(), resource.original_url);
257 EXPECT_EQ(0u, resource.redirect_urls.size());
258 EXPECT_TRUE(resource.is_subresource);
259 EXPECT_FALSE(resource.is_subframe);
260 EXPECT_EQ(SB_THREAT_TYPE_URL_MALWARE, resource.threat_type);
261 EXPECT_EQ(ThreatMetadata(), resource.threat_metadata);
262 EXPECT_FALSE(resource.callback.is_null());
263 EXPECT_TRUE(resource.callback_thread);
264 EXPECT_EQ(nullptr, resource.web_contents_getter.Run());
265 EXPECT_EQ(ThreatSource::LOCAL_PVER4, resource.threat_source);
266 }
267
268 TEST_F(RequestCheckerTest, SyncMissAsyncUnsafeBlockBypassed) {
269 security_interstitials::UnsafeResource resource;
270 Checkpoint checkpoint;
271 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
272 EXPECT_CALL(*database_manager_, ChecksAreAlwaysAsync())
273 .WillOnce(Return(false));
274 EXPECT_CALL(*delegate_, StartDisplayingBlockingPage(_, _))
275 .WillOnce(SaveArg<0>(&resource));
276 EXPECT_CALL(*delegate_, GetWebContentsGetterForRequest(request_.get()))
277 .WillOnce(Return(
278 base::Bind([]() -> content::WebContents* { return nullptr; })));
279 EXPECT_CALL(*database_manager_, GetThreatSource())
280 .WillOnce(Return(ThreatSource::LOCAL_PVER4));
281 {
282 InSequence s;
283 EXPECT_CALL(checkpoint, Call(1));
284 EXPECT_CALL(*delegate_, ResumeResourceRequest());
285 }
286 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
287 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_URL_MALWARE,
288 ThreatMetadata());
289 checkpoint.Call(1);
290 resource.callback.Run(true);
291 }
292
293 TEST_F(RequestCheckerTest, SyncMissAsyncUnsafeBlockRejected) {
294 security_interstitials::UnsafeResource resource;
295 Checkpoint checkpoint;
296 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
297 EXPECT_CALL(*database_manager_, ChecksAreAlwaysAsync())
298 .WillOnce(Return(false));
299 EXPECT_CALL(*delegate_, StartDisplayingBlockingPage(_, _))
300 .WillOnce(SaveArg<0>(&resource));
301 EXPECT_CALL(*delegate_, GetWebContentsGetterForRequest(request_.get()))
302 .WillOnce(Return(
303 base::Bind([]() -> content::WebContents* { return nullptr; })));
304 EXPECT_CALL(*database_manager_, GetThreatSource())
305 .WillOnce(Return(ThreatSource::LOCAL_PVER4));
306 {
307 InSequence s;
308 EXPECT_CALL(checkpoint, Call(1));
309 EXPECT_CALL(*delegate_, CancelResourceLoad());
310 }
311 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
312 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_URL_MALWARE,
313 ThreatMetadata());
314 checkpoint.Call(1);
315 resource.callback.Run(false);
316 }
317
318 TEST_F(RequestCheckerTest, AlwaysAsyncSafe) {
319 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
320 EXPECT_CALL(*database_manager_, ChecksAreAlwaysAsync())
321 .WillRepeatedly(Return(true));
322 // ResumeResourceRequest() must not be called.
323 EXPECT_CALL(*delegate_, ResumeResourceRequest()).Times(0);
324 EXPECT_EQ(RequestChecker::PROCEED_ALWAYS_ASYNC, checker_->CheckNewRequest());
325 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_SAFE,
326 ThreatMetadata());
327 EXPECT_EQ(RequestChecker::PROCEED_SAFE, checker_->ShouldDeferResponse());
328 }
329
330 TEST_F(RequestCheckerTest, AlwaysAsyncLateSafe) {
331 Checkpoint checkpoint;
332 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
333 EXPECT_CALL(*database_manager_, ChecksAreAlwaysAsync())
334 .WillRepeatedly(Return(true));
335 {
336 InSequence s;
337 EXPECT_CALL(checkpoint, Call(1));
338 EXPECT_CALL(*delegate_, ResumeResourceRequest());
339 }
340 EXPECT_EQ(RequestChecker::PROCEED_ALWAYS_ASYNC, checker_->CheckNewRequest());
341 EXPECT_EQ(RequestChecker::DEFER, checker_->ShouldDeferResponse());
342 checkpoint.Call(1);
343 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_SAFE,
344 ThreatMetadata());
345 }
346
347 TEST_F(RequestCheckerTest, AlwaysAsyncUnsafe) {
348 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
349 EXPECT_CALL(*database_manager_, ChecksAreAlwaysAsync())
350 .WillRepeatedly(Return(true));
351 EXPECT_CALL(*delegate_, StartDisplayingBlockingPage(_, _));
352 EXPECT_CALL(*delegate_, GetWebContentsGetterForRequest(request_.get()))
353 .WillOnce(Return(
354 base::Bind([]() -> content::WebContents* { return nullptr; })));
355 EXPECT_CALL(*database_manager_, GetThreatSource())
356 .WillOnce(Return(ThreatSource::LOCAL_PVER4));
357 // ResumeResourceRequest() must not be called.
358 EXPECT_CALL(*delegate_, ResumeResourceRequest()).Times(0);
359 EXPECT_EQ(RequestChecker::PROCEED_ALWAYS_ASYNC, checker_->CheckNewRequest());
360 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_URL_MALWARE,
361 ThreatMetadata());
362 EXPECT_EQ(RequestChecker::DEFER, checker_->ShouldDeferResponse());
363 }
364
365 TEST_F(RequestCheckerTest, RedirectToSafeSync) {
366 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _))
367 .WillRepeatedly(Return(true));
368 EXPECT_EQ(RequestChecker::PROCEED_SAFE, checker_->CheckNewRequest());
369 EXPECT_EQ(RequestChecker::PROCEED_SAFE,
370 checker_->CheckRedirect(GURL(kTestUrl2)));
371 }
372
373 TEST_F(RequestCheckerTest, RedirectToSafeAsync) {
374 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _))
375 .WillOnce(Return(true))
376 .WillOnce(Return(false));
377 EXPECT_CALL(*delegate_, ResumeResourceRequest());
378 EXPECT_EQ(RequestChecker::PROCEED_SAFE, checker_->CheckNewRequest());
379 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckRedirect(GURL(kTestUrl2)));
380 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl2), SB_THREAT_TYPE_SAFE,
381 ThreatMetadata());
382 }
383
384 TEST_F(RequestCheckerTest, RedirectToUnsafe) {
385 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _))
386 .WillOnce(Return(true))
387 .WillOnce(Return(false));
388 EXPECT_CALL(*delegate_, StartDisplayingBlockingPage(_, _));
389 EXPECT_EQ(RequestChecker::PROCEED_SAFE, checker_->CheckNewRequest());
390 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckRedirect(GURL(kTestUrl2)));
391 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl2), SB_THREAT_TYPE_URL_MALWARE,
392 ThreatMetadata());
393 }
394
395 TEST_F(RequestCheckerTest, RedirectToSafeThenUnsafe) {
396 security_interstitials::UnsafeResource resource;
397 Checkpoint checkpoint;
398 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _))
399 .WillOnce(Return(true))
400 .WillRepeatedly(Return(false));
401 {
402 InSequence s;
403 EXPECT_CALL(checkpoint, Call(1));
404 EXPECT_CALL(*delegate_, ResumeResourceRequest());
405 EXPECT_CALL(checkpoint, Call(2));
406 EXPECT_CALL(*delegate_, StartDisplayingBlockingPage(_, _))
407 .WillOnce(SaveArg<0>(&resource));
408 }
409 EXPECT_EQ(RequestChecker::PROCEED_SAFE, checker_->CheckNewRequest());
410 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckRedirect(GURL(kTestUrl2)));
411 checkpoint.Call(1);
412 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl2), SB_THREAT_TYPE_SAFE,
413 ThreatMetadata());
414 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckRedirect(GURL(kTestUrl3)));
415 checkpoint.Call(2);
416 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl3), SB_THREAT_TYPE_URL_MALWARE,
417 ThreatMetadata());
418 EXPECT_EQ(GURL(kTestUrl3), resource.url);
419 EXPECT_EQ(GURL(kTestUrl), resource.original_url);
420 EXPECT_THAT(resource.redirect_urls,
421 ElementsAre(GURL(kTestUrl2), GURL(kTestUrl3)));
422 }
423
424 TEST_F(RequestCheckerTest, RedirectToSafeAlwaysAsync) {
425 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _))
426 .WillRepeatedly(Return(false));
427 EXPECT_CALL(*database_manager_, ChecksAreAlwaysAsync())
428 .WillRepeatedly(Return(true));
429 EXPECT_CALL(*delegate_, ResumeResourceRequest());
430 EXPECT_EQ(RequestChecker::PROCEED_ALWAYS_ASYNC, checker_->CheckNewRequest());
431 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckRedirect(GURL(kTestUrl2)));
432 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_SAFE,
433 ThreatMetadata());
434 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl2), SB_THREAT_TYPE_SAFE,
435 ThreatMetadata());
436 }
437
438 TEST_F(RequestCheckerTest, AsyncTimeout) {
439 ScopedTimeoutForTesting scoped_timeout(1);
440 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
441 EXPECT_CALL(*database_manager_, CancelCheck(_));
442 EXPECT_CALL(*delegate_, ResumeResourceRequest());
443 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
444 base::RunLoop run_loop;
445 content::BrowserThread::PostDelayedTask(content::BrowserThread::IO, FROM_HERE,
446 run_loop.QuitClosure(),
447 base::TimeDelta::FromMilliseconds(2));
448 run_loop.Run();
449 }
450
451 TEST_F(RequestCheckerTest, TimeoutIsReallyCancelled) {
452 // The test is not flaky because OnCheckBrowseUrlResult() is called
453 // synchronously, and so will always succeed in cancelling the timer before
454 // OnCheckUrlTimeout can be called asynchronously.
455 ScopedTimeoutForTesting scoped_timeout(1);
456 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
457 EXPECT_CALL(*database_manager_, CancelCheck(_)).Times(0);
458 EXPECT_CALL(*delegate_, ResumeResourceRequest());
459 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
460 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_SAFE,
461 ThreatMetadata());
462 base::RunLoop run_loop;
463 content::BrowserThread::PostDelayedTask(content::BrowserThread::IO, FROM_HERE,
464 run_loop.QuitClosure(),
465 base::TimeDelta::FromMilliseconds(2));
466 run_loop.Run();
467 // If we get here without hitting a DCHECK then the test passed.
468 }
469
470 TEST_F(RequestCheckerTest, PrefetchCancelledOnAsyncBlock) {
471 request_->SetLoadFlags(request_->load_flags() | net::LOAD_PREFETCH);
472 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
473 EXPECT_CALL(*delegate_, CancelResourceLoad());
474 // Blocking page is not displayed for prefetch / prerender.
475 EXPECT_CALL(*delegate_, StartDisplayingBlockingPage(_, _)).Times(0);
476 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
477 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_URL_MALWARE,
478 ThreatMetadata());
479 }
480
481 TEST_F(RequestCheckerTest, PrerenderContentsDestroyed) {
482 request_->SetLoadFlags(request_->load_flags() | net::LOAD_PREFETCH);
483 // Change resource type to MAIN_FRAME.
484 checker_.reset(
485 new RequestChecker(request_.get(), content::RESOURCE_TYPE_MAIN_FRAME,
486 database_manager_, ui_manager_, delegate_.get()));
487 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
488 EXPECT_CALL(*delegate_, CancelResourceLoad());
489 EXPECT_CALL(*delegate_, MaybeDestroyPrerenderContents(_));
490 EXPECT_CALL(*delegate_, StartDisplayingBlockingPage(_, _)).Times(0);
491 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
492 checker_->OnCheckBrowseUrlResult(GURL(kTestUrl), SB_THREAT_TYPE_URL_MALWARE,
493 ThreatMetadata());
494 }
495
496 TEST_F(RequestCheckerTest, CheckCancelledOnDestruction) {
497 EXPECT_CALL(*database_manager_, CheckBrowseUrl(_, _)).WillOnce(Return(false));
498 EXPECT_CALL(*database_manager_, CancelCheck(_));
499 EXPECT_EQ(RequestChecker::DEFER, checker_->CheckNewRequest());
500 checker_.reset();
501 }
502
503 } // namespace
504
505 } // namespace safe_browsing
OLDNEW
« no previous file with comments | « components/safe_browsing/request_checker.cc ('k') | components/safe_browsing/resource_throttle.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698