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

Side by Side Diff: chrome/browser/safe_browsing/client_side_detection_host_unittest.cc

Issue 8573018: Convert to base::Callback in safe_browsing client-side-detection code. (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Don't call Run() on null callbacks. Created 9 years, 1 month 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
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "base/file_path.h" 5 #include "base/file_path.h"
6 #include "base/memory/ref_counted.h" 6 #include "base/memory/ref_counted.h"
7 #include "base/memory/scoped_ptr.h" 7 #include "base/memory/scoped_ptr.h"
8 #include "base/task.h" 8 #include "base/task.h"
9 #include "chrome/browser/safe_browsing/browser_feature_extractor.h" 9 #include "chrome/browser/safe_browsing/browser_feature_extractor.h"
10 #include "chrome/browser/safe_browsing/client_side_detection_host.h" 10 #include "chrome/browser/safe_browsing/client_side_detection_host.h"
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 // (ClientPhishingRequest) which is passed to SendClientReportPhishingRequest 50 // (ClientPhishingRequest) which is passed to SendClientReportPhishingRequest
51 // has the expected fields set. Note: we can't simply compare the protocol 51 // has the expected fields set. Note: we can't simply compare the protocol
52 // buffer strings because the BrowserFeatureExtractor might add features to the 52 // buffer strings because the BrowserFeatureExtractor might add features to the
53 // verdict object before calling SendClientReportPhishingRequest. 53 // verdict object before calling SendClientReportPhishingRequest.
54 MATCHER_P(PartiallyEqualVerdict, other, "") { 54 MATCHER_P(PartiallyEqualVerdict, other, "") {
55 return (other.url() == arg.url() && 55 return (other.url() == arg.url() &&
56 other.client_score() == arg.client_score() && 56 other.client_score() == arg.client_score() &&
57 other.is_phishing() == arg.is_phishing()); 57 other.is_phishing() == arg.is_phishing());
58 } 58 }
59 59
60 // Test that the callback is NULL when the verdict is not phishing.
61 MATCHER(CallbackIsNull, "") {
62 return arg.is_null();
63 }
64
60 ACTION(QuitUIMessageLoop) { 65 ACTION(QuitUIMessageLoop) {
61 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); 66 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
62 MessageLoopForUI::current()->Quit(); 67 MessageLoopForUI::current()->Quit();
63 } 68 }
64 69
65 // It's kind of insane that InvokeArgument doesn't work with callbacks, but it 70 // It's kind of insane that InvokeArgument doesn't work with callbacks, but it
66 // doesn't seem like it. 71 // doesn't seem like it.
67 ACTION_TEMPLATE(InvokeCallbackArgument, 72 ACTION_TEMPLATE(InvokeCallbackArgument,
68 HAS_1_TEMPLATE_PARAMS(int, k), 73 HAS_1_TEMPLATE_PARAMS(int, k),
69 AND_2_VALUE_PARAMS(p0, p1)) { 74 AND_2_VALUE_PARAMS(p0, p1)) {
70 ::std::tr1::get<k>(args)->Run(p0, p1); 75 ::std::tr1::get<k>(args).Run(p0, p1);
71 // This is an old callback, so it needs to be deleted explicitly.
72 delete ::std::tr1::get<k>(args);
73 } 76 }
74 77
75 class MockClientSideDetectionService : public ClientSideDetectionService { 78 class MockClientSideDetectionService : public ClientSideDetectionService {
76 public: 79 public:
77 MockClientSideDetectionService() : ClientSideDetectionService(NULL) {} 80 MockClientSideDetectionService() : ClientSideDetectionService(NULL) {}
78 virtual ~MockClientSideDetectionService() {}; 81 virtual ~MockClientSideDetectionService() {};
79 82
80 MOCK_METHOD2(SendClientReportPhishingRequest, 83 MOCK_METHOD2(SendClientReportPhishingRequest,
81 void(ClientPhishingRequest*, 84 void(ClientPhishingRequest*,
82 ClientReportPhishingRequestCallback*)); 85 const ClientReportPhishingRequestCallback&));
83 MOCK_CONST_METHOD1(IsPrivateIPAddress, bool(const std::string&)); 86 MOCK_CONST_METHOD1(IsPrivateIPAddress, bool(const std::string&));
84 MOCK_METHOD2(GetValidCachedResult, bool(const GURL&, bool*)); 87 MOCK_METHOD2(GetValidCachedResult, bool(const GURL&, bool*));
85 MOCK_METHOD1(IsInCache, bool(const GURL&)); 88 MOCK_METHOD1(IsInCache, bool(const GURL&));
86 MOCK_METHOD0(OverReportLimit, bool()); 89 MOCK_METHOD0(OverReportLimit, bool());
87 90
88 private: 91 private:
89 DISALLOW_COPY_AND_ASSIGN(MockClientSideDetectionService); 92 DISALLOW_COPY_AND_ASSIGN(MockClientSideDetectionService);
90 }; 93 };
91 94
92 class MockSafeBrowsingService : public SafeBrowsingService { 95 class MockSafeBrowsingService : public SafeBrowsingService {
(...skipping 27 matching lines...) Expand all
120 }; 123 };
121 124
122 class MockBrowserFeatureExtractor : public BrowserFeatureExtractor { 125 class MockBrowserFeatureExtractor : public BrowserFeatureExtractor {
123 public: 126 public:
124 explicit MockBrowserFeatureExtractor( 127 explicit MockBrowserFeatureExtractor(
125 TabContents* tab, 128 TabContents* tab,
126 ClientSideDetectionService* service) 129 ClientSideDetectionService* service)
127 : BrowserFeatureExtractor(tab, service) {} 130 : BrowserFeatureExtractor(tab, service) {}
128 virtual ~MockBrowserFeatureExtractor() {} 131 virtual ~MockBrowserFeatureExtractor() {}
129 132
130 MOCK_METHOD3(ExtractFeatures, void(const BrowseInfo* info, 133 MOCK_METHOD3(ExtractFeatures,
131 ClientPhishingRequest*, 134 void(const BrowseInfo* info,
132 BrowserFeatureExtractor::DoneCallback*)); 135 ClientPhishingRequest*,
136 const BrowserFeatureExtractor::DoneCallback&));
133 }; 137 };
134 138
135 // Helper function which quits the UI message loop from the IO message loop. 139 // Helper function which quits the UI message loop from the IO message loop.
136 void QuitUIMessageLoopFromIO() { 140 void QuitUIMessageLoopFromIO() {
137 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 141 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
138 BrowserThread::PostTask(BrowserThread::UI, 142 BrowserThread::PostTask(BrowserThread::UI,
139 FROM_HERE, 143 FROM_HERE,
140 new MessageLoop::QuitTask()); 144 new MessageLoop::QuitTask());
141 } 145 }
142 } // namespace 146 } // namespace
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
188 void OnPhishingDetectionDone(const std::string& verdict_str) { 192 void OnPhishingDetectionDone(const std::string& verdict_str) {
189 csd_host_->OnPhishingDetectionDone(verdict_str); 193 csd_host_->OnPhishingDetectionDone(verdict_str);
190 } 194 }
191 195
192 void FlushIOMessageLoop() { 196 void FlushIOMessageLoop() {
193 // If there was a message posted on the IO thread to display the 197 // If there was a message posted on the IO thread to display the
194 // interstitial page we know that it would have been posted before 198 // interstitial page we know that it would have been posted before
195 // we put the quit message there. 199 // we put the quit message there.
196 BrowserThread::PostTask(BrowserThread::IO, 200 BrowserThread::PostTask(BrowserThread::IO,
197 FROM_HERE, 201 FROM_HERE,
198 NewRunnableFunction(&QuitUIMessageLoopFromIO)); 202 base::Bind(&QuitUIMessageLoopFromIO));
199 MessageLoop::current()->Run(); 203 MessageLoop::current()->Run();
200 } 204 }
201 205
202 void ExpectPreClassificationChecks(const GURL& url, 206 void ExpectPreClassificationChecks(const GURL& url,
203 const bool* is_private, 207 const bool* is_private,
204 const bool* is_incognito, 208 const bool* is_incognito,
205 const bool* match_csd_whitelist, 209 const bool* match_csd_whitelist,
206 const bool* get_valid_cached_result, 210 const bool* get_valid_cached_result,
207 const bool* is_in_cache, 211 const bool* is_in_cache,
208 const bool* over_report_limit) { 212 const bool* over_report_limit) {
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 } 313 }
310 314
311 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneNotPhishing) { 315 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneNotPhishing) {
312 // Case 1: client thinks the page is phishing. The server does not agree. 316 // Case 1: client thinks the page is phishing. The server does not agree.
313 // No interstitial is shown. 317 // No interstitial is shown.
314 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 318 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
315 contents(), 319 contents(),
316 csd_service_.get()); 320 csd_service_.get());
317 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 321 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
318 322
319 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; 323 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
320 ClientPhishingRequest verdict; 324 ClientPhishingRequest verdict;
321 verdict.set_url("http://phishingurl.com/"); 325 verdict.set_url("http://phishingurl.com/");
322 verdict.set_client_score(1.0f); 326 verdict.set_client_score(1.0f);
323 verdict.set_is_phishing(true); 327 verdict.set_is_phishing(true);
324 328
325 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 329 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
326 .WillOnce(DoAll(DeleteArg<1>(), 330 .WillOnce(DoAll(DeleteArg<1>(),
327 InvokeCallbackArgument<2>(true, &verdict))); 331 InvokeCallbackArgument<2>(true, &verdict)));
328 EXPECT_CALL(*csd_service_, 332 EXPECT_CALL(*csd_service_,
329 SendClientReportPhishingRequest( 333 SendClientReportPhishingRequest(
330 Pointee(PartiallyEqualVerdict(verdict)), _)) 334 Pointee(PartiallyEqualVerdict(verdict)), _))
331 .WillOnce(SaveArg<1>(&cb)); 335 .WillOnce(SaveArg<1>(&cb));
332 OnPhishingDetectionDone(verdict.SerializeAsString()); 336 OnPhishingDetectionDone(verdict.SerializeAsString());
333 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 337 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
334 ASSERT_TRUE(cb); 338 ASSERT_FALSE(cb.is_null());
335 339
336 // Make sure DoDisplayBlockingPage is not going to be called. 340 // Make sure DoDisplayBlockingPage is not going to be called.
337 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0); 341 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0);
338 cb->Run(GURL(verdict.url()), false); 342 cb.Run(GURL(verdict.url()), false);
339 delete cb;
340 MessageLoop::current()->RunAllPending(); 343 MessageLoop::current()->RunAllPending();
341 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 344 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
342 } 345 }
343 346
344 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneDisabled) { 347 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneDisabled) {
345 // Case 2: client thinks the page is phishing and so does the server but 348 // Case 2: client thinks the page is phishing and so does the server but
346 // showing the interstitial is disabled => no interstitial is shown. 349 // showing the interstitial is disabled => no interstitial is shown.
347 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 350 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
348 contents(), 351 contents(),
349 csd_service_.get()); 352 csd_service_.get());
350 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 353 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
351 354
352 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; 355 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
353 ClientPhishingRequest verdict; 356 ClientPhishingRequest verdict;
354 verdict.set_url("http://phishingurl.com/"); 357 verdict.set_url("http://phishingurl.com/");
355 verdict.set_client_score(1.0f); 358 verdict.set_client_score(1.0f);
356 verdict.set_is_phishing(true); 359 verdict.set_is_phishing(true);
357 360
358 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 361 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
359 .WillOnce(DoAll(DeleteArg<1>(), 362 .WillOnce(DoAll(DeleteArg<1>(),
360 InvokeCallbackArgument<2>(true, &verdict))); 363 InvokeCallbackArgument<2>(true, &verdict)));
361 EXPECT_CALL(*csd_service_, 364 EXPECT_CALL(*csd_service_,
362 SendClientReportPhishingRequest( 365 SendClientReportPhishingRequest(
363 Pointee(PartiallyEqualVerdict(verdict)), _)) 366 Pointee(PartiallyEqualVerdict(verdict)), _))
364 .WillOnce(SaveArg<1>(&cb)); 367 .WillOnce(SaveArg<1>(&cb));
365 OnPhishingDetectionDone(verdict.SerializeAsString()); 368 OnPhishingDetectionDone(verdict.SerializeAsString());
366 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 369 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
367 ASSERT_TRUE(cb); 370 ASSERT_FALSE(cb.is_null());
368 371
369 // Make sure DoDisplayBlockingPage is not going to be called. 372 // Make sure DoDisplayBlockingPage is not going to be called.
370 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0); 373 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0);
371 cb->Run(GURL(verdict.url()), false); 374 cb.Run(GURL(verdict.url()), false);
372 delete cb;
373 MessageLoop::current()->RunAllPending(); 375 MessageLoop::current()->RunAllPending();
374 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 376 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
375 } 377 }
376 378
377 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneShowInterstitial) { 379 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneShowInterstitial) {
378 // Case 3: client thinks the page is phishing and so does the server. 380 // Case 3: client thinks the page is phishing and so does the server.
379 // We show an interstitial. 381 // We show an interstitial.
380 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 382 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
381 contents(), 383 contents(),
382 csd_service_.get()); 384 csd_service_.get());
383 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 385 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
384 386
385 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; 387 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
386 GURL phishing_url("http://phishingurl.com/"); 388 GURL phishing_url("http://phishingurl.com/");
387 ClientPhishingRequest verdict; 389 ClientPhishingRequest verdict;
388 verdict.set_url(phishing_url.spec()); 390 verdict.set_url(phishing_url.spec());
389 verdict.set_client_score(1.0f); 391 verdict.set_client_score(1.0f);
390 verdict.set_is_phishing(true); 392 verdict.set_is_phishing(true);
391 393
392 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 394 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
393 .WillOnce(DoAll(DeleteArg<1>(), 395 .WillOnce(DoAll(DeleteArg<1>(),
394 InvokeCallbackArgument<2>(true, &verdict))); 396 InvokeCallbackArgument<2>(true, &verdict)));
395 EXPECT_CALL(*csd_service_, 397 EXPECT_CALL(*csd_service_,
396 SendClientReportPhishingRequest( 398 SendClientReportPhishingRequest(
397 Pointee(PartiallyEqualVerdict(verdict)), _)) 399 Pointee(PartiallyEqualVerdict(verdict)), _))
398 .WillOnce(SaveArg<1>(&cb)); 400 .WillOnce(SaveArg<1>(&cb));
399 OnPhishingDetectionDone(verdict.SerializeAsString()); 401 OnPhishingDetectionDone(verdict.SerializeAsString());
400 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 402 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
401 ASSERT_TRUE(cb); 403 ASSERT_FALSE(cb.is_null());
402 404
403 SafeBrowsingService::UnsafeResource resource; 405 SafeBrowsingService::UnsafeResource resource;
404 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)) 406 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_))
405 .WillOnce(SaveArg<0>(&resource)); 407 .WillOnce(SaveArg<0>(&resource));
406 cb->Run(phishing_url, true); 408 cb.Run(phishing_url, true);
407 delete cb;
408 409
409 MessageLoop::current()->RunAllPending(); 410 MessageLoop::current()->RunAllPending();
410 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 411 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
411 EXPECT_EQ(phishing_url, resource.url); 412 EXPECT_EQ(phishing_url, resource.url);
412 EXPECT_EQ(phishing_url, resource.original_url); 413 EXPECT_EQ(phishing_url, resource.original_url);
413 EXPECT_FALSE(resource.is_subresource); 414 EXPECT_FALSE(resource.is_subresource);
414 EXPECT_EQ(SafeBrowsingService::CLIENT_SIDE_PHISHING_URL, 415 EXPECT_EQ(SafeBrowsingService::CLIENT_SIDE_PHISHING_URL,
415 resource.threat_type); 416 resource.threat_type);
416 EXPECT_EQ(contents()->GetRenderProcessHost()->GetID(), 417 EXPECT_EQ(contents()->GetRenderProcessHost()->GetID(),
417 resource.render_process_host_id); 418 resource.render_process_host_id);
418 EXPECT_EQ(contents()->render_view_host()->routing_id(), 419 EXPECT_EQ(contents()->render_view_host()->routing_id(),
419 resource.render_view_id); 420 resource.render_view_id);
420 421
421 // Make sure the client object will be deleted. 422 // Make sure the client object will be deleted.
422 BrowserThread::PostTask( 423 BrowserThread::PostTask(
423 BrowserThread::IO, 424 BrowserThread::IO,
424 FROM_HERE, 425 FROM_HERE,
425 NewRunnableMethod( 426 base::Bind(&MockSafeBrowsingService::InvokeOnBlockingPageComplete,
426 sb_service_.get(), 427 sb_service_.get(), resource.client));
427 &MockSafeBrowsingService::InvokeOnBlockingPageComplete,
428 resource.client));
429 // Since the CsdClient object will be deleted on the UI thread I need 428 // Since the CsdClient object will be deleted on the UI thread I need
430 // to run the UI message loop. Post a task to stop the UI message loop 429 // to run the UI message loop. Post a task to stop the UI message loop
431 // after the client object destructor is called. 430 // after the client object destructor is called.
432 FlushIOMessageLoop(); 431 FlushIOMessageLoop();
433 } 432 }
434 433
435 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneMultiplePings) { 434 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneMultiplePings) {
436 // Case 4 & 5: client thinks a page is phishing then navigates to 435 // Case 4 & 5: client thinks a page is phishing then navigates to
437 // another page which is also considered phishing by the client 436 // another page which is also considered phishing by the client
438 // before the server responds with a verdict. After a while the 437 // before the server responds with a verdict. After a while the
439 // server responds for both requests with a phishing verdict. Only 438 // server responds for both requests with a phishing verdict. Only
440 // a single interstitial is shown for the second URL. 439 // a single interstitial is shown for the second URL.
441 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 440 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
442 contents(), 441 contents(),
443 csd_service_.get()); 442 csd_service_.get());
444 SetFeatureExtractor(mock_extractor); // The host class takes ownership. 443 SetFeatureExtractor(mock_extractor); // The host class takes ownership.
445 444
446 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; 445 ClientSideDetectionService::ClientReportPhishingRequestCallback cb;
447 GURL phishing_url("http://phishingurl.com/"); 446 GURL phishing_url("http://phishingurl.com/");
448 ClientPhishingRequest verdict; 447 ClientPhishingRequest verdict;
449 verdict.set_url(phishing_url.spec()); 448 verdict.set_url(phishing_url.spec());
450 verdict.set_client_score(1.0f); 449 verdict.set_client_score(1.0f);
451 verdict.set_is_phishing(true); 450 verdict.set_is_phishing(true);
452 451
453 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _)) 452 EXPECT_CALL(*mock_extractor, ExtractFeatures(_, _, _))
454 .WillOnce(DoAll(DeleteArg<1>(), 453 .WillOnce(DoAll(DeleteArg<1>(),
455 InvokeCallbackArgument<2>(true, &verdict))); 454 InvokeCallbackArgument<2>(true, &verdict)));
456 EXPECT_CALL(*csd_service_, 455 EXPECT_CALL(*csd_service_,
457 SendClientReportPhishingRequest( 456 SendClientReportPhishingRequest(
458 Pointee(PartiallyEqualVerdict(verdict)), _)) 457 Pointee(PartiallyEqualVerdict(verdict)), _))
459 .WillOnce(SaveArg<1>(&cb)); 458 .WillOnce(SaveArg<1>(&cb));
460 OnPhishingDetectionDone(verdict.SerializeAsString()); 459 OnPhishingDetectionDone(verdict.SerializeAsString());
461 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 460 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
462 ASSERT_TRUE(cb); 461 ASSERT_FALSE(cb.is_null());
463 462
464 // Set this back to a normal browser feature extractor since we're using 463 // Set this back to a normal browser feature extractor since we're using
465 // NavigateAndCommit() and it's easier to use the real thing than setting up 464 // NavigateAndCommit() and it's easier to use the real thing than setting up
466 // mock expectations. 465 // mock expectations.
467 SetFeatureExtractor(new BrowserFeatureExtractor(contents(), 466 SetFeatureExtractor(new BrowserFeatureExtractor(contents(),
468 csd_service_.get())); 467 csd_service_.get()));
469 GURL other_phishing_url("http://other_phishing_url.com/bla"); 468 GURL other_phishing_url("http://other_phishing_url.com/bla");
470 ExpectPreClassificationChecks(other_phishing_url, &kFalse, &kFalse, &kFalse, 469 ExpectPreClassificationChecks(other_phishing_url, &kFalse, &kFalse, &kFalse,
471 &kFalse, &kFalse, &kFalse); 470 &kFalse, &kFalse, &kFalse);
472 // We navigate away. The callback cb should be revoked. 471 // We navigate away. The callback cb should be revoked.
473 NavigateAndCommit(other_phishing_url); 472 NavigateAndCommit(other_phishing_url);
474 // Wait for the pre-classification checks to finish for other_phishing_url. 473 // Wait for the pre-classification checks to finish for other_phishing_url.
475 WaitAndCheckPreClassificationChecks(); 474 WaitAndCheckPreClassificationChecks();
476 475
477 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb_other; 476 ClientSideDetectionService::ClientReportPhishingRequestCallback cb_other;
478 verdict.set_url(other_phishing_url.spec()); 477 verdict.set_url(other_phishing_url.spec());
479 verdict.set_client_score(0.8f); 478 verdict.set_client_score(0.8f);
480 EXPECT_CALL(*csd_service_, 479 EXPECT_CALL(*csd_service_,
481 SendClientReportPhishingRequest( 480 SendClientReportPhishingRequest(
482 Pointee(PartiallyEqualVerdict(verdict)), _)) 481 Pointee(PartiallyEqualVerdict(verdict)), _))
483 .WillOnce(DoAll(DeleteArg<0>(), 482 .WillOnce(DoAll(DeleteArg<0>(),
484 SaveArg<1>(&cb_other), 483 SaveArg<1>(&cb_other),
485 QuitUIMessageLoop())); 484 QuitUIMessageLoop()));
486 std::vector<GURL> redirect_chain; 485 std::vector<GURL> redirect_chain;
487 redirect_chain.push_back(other_phishing_url); 486 redirect_chain.push_back(other_phishing_url);
488 SetRedirectChain(redirect_chain); 487 SetRedirectChain(redirect_chain);
489 OnPhishingDetectionDone(verdict.SerializeAsString()); 488 OnPhishingDetectionDone(verdict.SerializeAsString());
490 MessageLoop::current()->Run(); 489 MessageLoop::current()->Run();
491 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 490 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
492 ASSERT_TRUE(cb_other); 491 ASSERT_FALSE(cb_other.is_null());
493 492
494 // We expect that the interstitial is shown for the second phishing URL and 493 // We expect that the interstitial is shown for the second phishing URL and
495 // not for the first phishing URL. 494 // not for the first phishing URL.
496 SafeBrowsingService::UnsafeResource resource; 495 SafeBrowsingService::UnsafeResource resource;
497 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)) 496 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_))
498 .WillOnce(SaveArg<0>(&resource)); 497 .WillOnce(SaveArg<0>(&resource));
499 498
500 cb->Run(phishing_url, true); // Should have no effect. 499 cb.Run(phishing_url, true); // Should have no effect.
501 delete cb; 500 cb_other.Run(other_phishing_url, true); // Should show interstitial.
502 cb_other->Run(other_phishing_url, true); // Should show interstitial.
503 delete cb_other;
504 501
505 MessageLoop::current()->RunAllPending(); 502 MessageLoop::current()->RunAllPending();
506 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 503 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
507 EXPECT_EQ(other_phishing_url, resource.url); 504 EXPECT_EQ(other_phishing_url, resource.url);
508 EXPECT_EQ(other_phishing_url, resource.original_url); 505 EXPECT_EQ(other_phishing_url, resource.original_url);
509 EXPECT_FALSE(resource.is_subresource); 506 EXPECT_FALSE(resource.is_subresource);
510 EXPECT_EQ(SafeBrowsingService::CLIENT_SIDE_PHISHING_URL, 507 EXPECT_EQ(SafeBrowsingService::CLIENT_SIDE_PHISHING_URL,
511 resource.threat_type); 508 resource.threat_type);
512 EXPECT_EQ(contents()->GetRenderProcessHost()->GetID(), 509 EXPECT_EQ(contents()->GetRenderProcessHost()->GetID(),
513 resource.render_process_host_id); 510 resource.render_process_host_id);
514 EXPECT_EQ(contents()->render_view_host()->routing_id(), 511 EXPECT_EQ(contents()->render_view_host()->routing_id(),
515 resource.render_view_id); 512 resource.render_view_id);
516 513
517 // Make sure the client object will be deleted. 514 // Make sure the client object will be deleted.
518 BrowserThread::PostTask( 515 BrowserThread::PostTask(
519 BrowserThread::IO, 516 BrowserThread::IO,
520 FROM_HERE, 517 FROM_HERE,
521 NewRunnableMethod( 518 base::Bind(&MockSafeBrowsingService::InvokeOnBlockingPageComplete,
522 sb_service_.get(), 519 sb_service_.get(), resource.client));
523 &MockSafeBrowsingService::InvokeOnBlockingPageComplete,
524 resource.client));
525 // Since the CsdClient object will be deleted on the UI thread I need 520 // Since the CsdClient object will be deleted on the UI thread I need
526 // to run the UI message loop. Post a task to stop the UI message loop 521 // to run the UI message loop. Post a task to stop the UI message loop
527 // after the client object destructor is called. 522 // after the client object destructor is called.
528 FlushIOMessageLoop(); 523 FlushIOMessageLoop();
529 } 524 }
530 525
531 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneVerdictNotPhishing) { 526 TEST_F(ClientSideDetectionHostTest, OnPhishingDetectionDoneVerdictNotPhishing) {
532 // Case 6: renderer sends a verdict string that isn't phishing. 527 // Case 6: renderer sends a verdict string that isn't phishing.
533 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor( 528 MockBrowserFeatureExtractor* mock_extractor = new MockBrowserFeatureExtractor(
534 contents(), 529 contents(),
(...skipping 22 matching lines...) Expand all
557 552
558 // First we have to navigate to the URL to set the unique page ID. 553 // First we have to navigate to the URL to set the unique page ID.
559 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse, 554 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kFalse,
560 &kFalse, &kFalse); 555 &kFalse, &kFalse);
561 NavigateAndCommit(url); 556 NavigateAndCommit(url);
562 WaitAndCheckPreClassificationChecks(); 557 WaitAndCheckPreClassificationChecks();
563 SetUnsafeResourceToCurrent(); 558 SetUnsafeResourceToCurrent();
564 559
565 EXPECT_CALL(*csd_service_, 560 EXPECT_CALL(*csd_service_,
566 SendClientReportPhishingRequest( 561 SendClientReportPhishingRequest(
567 Pointee(PartiallyEqualVerdict(verdict)), IsNull())) 562 Pointee(PartiallyEqualVerdict(verdict)), CallbackIsNull()))
568 .WillOnce(DoAll(DeleteArg<0>(), QuitUIMessageLoop())); 563 .WillOnce(DoAll(DeleteArg<0>(), QuitUIMessageLoop()));
569 std::vector<GURL> redirect_chain; 564 std::vector<GURL> redirect_chain;
570 redirect_chain.push_back(url); 565 redirect_chain.push_back(url);
571 SetRedirectChain(redirect_chain); 566 SetRedirectChain(redirect_chain);
572 OnPhishingDetectionDone(verdict.SerializeAsString()); 567 OnPhishingDetectionDone(verdict.SerializeAsString());
573 MessageLoop::current()->Run(); 568 MessageLoop::current()->Run();
574 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 569 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
575 } 570 }
576 571
577 TEST_F(ClientSideDetectionHostTest, NavigationCancelsShouldClassifyUrl) { 572 TEST_F(ClientSideDetectionHostTest, NavigationCancelsShouldClassifyUrl) {
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 737 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
743 EXPECT_EQ(url, resource.url); 738 EXPECT_EQ(url, resource.url);
744 EXPECT_EQ(url, resource.original_url); 739 EXPECT_EQ(url, resource.original_url);
745 delete resource.client; 740 delete resource.client;
746 msg = process()->sink().GetFirstMessageMatching( 741 msg = process()->sink().GetFirstMessageMatching(
747 SafeBrowsingMsg_StartPhishingDetection::ID); 742 SafeBrowsingMsg_StartPhishingDetection::ID);
748 ASSERT_FALSE(msg); 743 ASSERT_FALSE(msg);
749 } 744 }
750 745
751 } // namespace safe_browsing 746 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698