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

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

Issue 7080034: Currently, there is a bug in the way we show the csd phishing interstitial. (Closed) Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: Address Brian's comments. Created 9 years, 6 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 | Annotate | Revision Log
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/command_line.h" 5 #include "base/command_line.h"
6 #include "base/file_path.h" 6 #include "base/file_path.h"
7 #include "base/memory/ref_counted.h" 7 #include "base/memory/ref_counted.h"
8 #include "base/memory/scoped_ptr.h" 8 #include "base/memory/scoped_ptr.h"
9 #include "base/scoped_temp_dir.h" 9 #include "base/scoped_temp_dir.h"
10 #include "base/task.h" 10 #include "base/task.h"
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
66 66
67 private: 67 private:
68 DISALLOW_COPY_AND_ASSIGN(MockClientSideDetectionService); 68 DISALLOW_COPY_AND_ASSIGN(MockClientSideDetectionService);
69 }; 69 };
70 70
71 class MockSafeBrowsingService : public SafeBrowsingService { 71 class MockSafeBrowsingService : public SafeBrowsingService {
72 public: 72 public:
73 MockSafeBrowsingService() {} 73 MockSafeBrowsingService() {}
74 virtual ~MockSafeBrowsingService() {} 74 virtual ~MockSafeBrowsingService() {}
75 75
76 MOCK_METHOD8(DisplayBlockingPage, 76 MOCK_METHOD1(DoDisplayBlockingPage, void(const UnsafeResource& resource));
77 void(const GURL&, const GURL&, const std::vector<GURL>&,
78 ResourceType::Type, UrlCheckResult, Client*, int, int));
79 MOCK_METHOD1(MatchCsdWhitelistUrl, bool(const GURL&)); 77 MOCK_METHOD1(MatchCsdWhitelistUrl, bool(const GURL&));
80 78
81 // Helper function which calls OnBlockingPageComplete for this client 79 // Helper function which calls OnBlockingPageComplete for this client
82 // object. 80 // object.
83 void InvokeOnBlockingPageComplete(SafeBrowsingService::Client* client) { 81 void InvokeOnBlockingPageComplete(SafeBrowsingService::Client* client) {
84 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); 82 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
85 DCHECK(client); 83 DCHECK(client);
86 // Note: this will delete the client object in the case of the CsdClient 84 // Note: this will delete the client object in the case of the CsdClient
87 // implementation. 85 // implementation.
88 client->OnBlockingPageComplete(false); 86 client->OnBlockingPageComplete(false);
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
235 verdict.set_client_score(1.0f); 233 verdict.set_client_score(1.0f);
236 verdict.set_is_phishing(true); 234 verdict.set_is_phishing(true);
237 235
238 EXPECT_CALL(*csd_service_, 236 EXPECT_CALL(*csd_service_,
239 SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) 237 SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _))
240 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); 238 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb)));
241 OnDetectedPhishingSite(verdict.SerializeAsString()); 239 OnDetectedPhishingSite(verdict.SerializeAsString());
242 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 240 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
243 ASSERT_TRUE(cb); 241 ASSERT_TRUE(cb);
244 242
245 // Make sure DisplayBlockingPage is not going to be called. 243 // Make sure DoDisplayBlockingPage is not going to be called.
246 EXPECT_CALL(*sb_service_, 244 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0);
247 DisplayBlockingPage(_, _, _, _, _, _, _, _)).Times(0);
248 cb->Run(GURL(verdict.url()), false); 245 cb->Run(GURL(verdict.url()), false);
249 delete cb; 246 delete cb;
250 // If there was a message posted on the IO thread to display the 247 MessageLoop::current()->RunAllPending();
251 // interstitial page we know that it would have been posted before
252 // we put the quit message there.
253 BrowserThread::PostTask(BrowserThread::IO,
254 FROM_HERE,
255 NewRunnableFunction(&QuitUIMessageLoop));
256 MessageLoop::current()->Run();
257 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 248 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
258 } 249 }
259 250
260 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteDisabled) { 251 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteDisabled) {
261 // Case 2: client thinks the page is phishing and so does the server but 252 // Case 2: client thinks the page is phishing and so does the server but
262 // showing the interstitial is disabled => no interstitial is shown. 253 // showing the interstitial is disabled => no interstitial is shown.
263 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; 254 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb;
264 ClientPhishingRequest verdict; 255 ClientPhishingRequest verdict;
265 verdict.set_url("http://phishingurl.com/"); 256 verdict.set_url("http://phishingurl.com/");
266 verdict.set_client_score(1.0f); 257 verdict.set_client_score(1.0f);
267 verdict.set_is_phishing(true); 258 verdict.set_is_phishing(true);
268 259
269 EXPECT_CALL(*csd_service_, 260 EXPECT_CALL(*csd_service_,
270 SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) 261 SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _))
271 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); 262 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb)));
272 OnDetectedPhishingSite(verdict.SerializeAsString()); 263 OnDetectedPhishingSite(verdict.SerializeAsString());
273 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 264 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
274 ASSERT_TRUE(cb); 265 ASSERT_TRUE(cb);
275 266
276 // Make sure DisplayBlockingPage is not going to be called. 267 // Make sure DoDisplayBlockingPage is not going to be called.
277 EXPECT_CALL(*sb_service_, 268 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0);
278 DisplayBlockingPage(_, _, _, _, _, _, _, _)).Times(0);
279 cb->Run(GURL(verdict.url()), false); 269 cb->Run(GURL(verdict.url()), false);
280 delete cb; 270 delete cb;
281 271 MessageLoop::current()->RunAllPending();
282 FlushIOMessageLoop();
283 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 272 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
284 } 273 }
285 274
286 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteShowInterstitial) { 275 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteShowInterstitial) {
287 // Case 3: client thinks the page is phishing and so does the server. 276 // Case 3: client thinks the page is phishing and so does the server.
288 // We show an interstitial. 277 // We show an interstitial.
289 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; 278 ClientSideDetectionService::ClientReportPhishingRequestCallback* cb;
290 GURL phishing_url("http://phishingurl.com/"); 279 GURL phishing_url("http://phishingurl.com/");
291 ClientPhishingRequest verdict; 280 ClientPhishingRequest verdict;
292 verdict.set_url(phishing_url.spec()); 281 verdict.set_url(phishing_url.spec());
293 verdict.set_client_score(1.0f); 282 verdict.set_client_score(1.0f);
294 verdict.set_is_phishing(true); 283 verdict.set_is_phishing(true);
295 284
296 CommandLine::ForCurrentProcess()->AppendSwitch( 285 CommandLine::ForCurrentProcess()->AppendSwitch(
297 switches::kEnableClientSidePhishingInterstitial); 286 switches::kEnableClientSidePhishingInterstitial);
298 287
299 EXPECT_CALL(*csd_service_, 288 EXPECT_CALL(*csd_service_,
300 SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) 289 SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _))
301 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); 290 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb)));
302 OnDetectedPhishingSite(verdict.SerializeAsString()); 291 OnDetectedPhishingSite(verdict.SerializeAsString());
303 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 292 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
304 ASSERT_TRUE(cb); 293 ASSERT_TRUE(cb);
305 294
306 SafeBrowsingService::Client* client; 295 SafeBrowsingService::UnsafeResource resource;
307 EXPECT_CALL(*sb_service_, 296 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_))
308 DisplayBlockingPage( 297 .WillOnce(SaveArg<0>(&resource));
309 phishing_url,
310 phishing_url,
311 _,
312 ResourceType::MAIN_FRAME,
313 SafeBrowsingService::CLIENT_SIDE_PHISHING_URL,
314 _ /* a CsdClient object */,
315 contents()->GetRenderProcessHost()->id(),
316 contents()->render_view_host()->routing_id()))
317 .WillOnce(SaveArg<5>(&client));
318
319 cb->Run(phishing_url, true); 298 cb->Run(phishing_url, true);
320 delete cb; 299 delete cb;
321 300
322 FlushIOMessageLoop(); 301 MessageLoop::current()->RunAllPending();
323 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 302 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
303 EXPECT_EQ(phishing_url, resource.url);
304 EXPECT_EQ(phishing_url, resource.original_url);
305 EXPECT_EQ(ResourceType::MAIN_FRAME, resource.resource_type);
306 EXPECT_EQ(SafeBrowsingService::CLIENT_SIDE_PHISHING_URL,
307 resource.threat_type);
308 EXPECT_EQ(contents()->GetRenderProcessHost()->id(),
309 resource.render_process_host_id);
310 EXPECT_EQ(contents()->render_view_host()->routing_id(),
311 resource.render_view_id);
324 312
325 // Make sure the client object will be deleted. 313 // Make sure the client object will be deleted.
326 BrowserThread::PostTask( 314 BrowserThread::PostTask(
327 BrowserThread::IO, 315 BrowserThread::IO,
328 FROM_HERE, 316 FROM_HERE,
329 NewRunnableMethod( 317 NewRunnableMethod(
330 sb_service_.get(), 318 sb_service_.get(),
331 &MockSafeBrowsingService::InvokeOnBlockingPageComplete, 319 &MockSafeBrowsingService::InvokeOnBlockingPageComplete,
332 client)); 320 resource.client));
333 // Since the CsdClient object will be deleted on the UI thread I need 321 // Since the CsdClient object will be deleted on the UI thread I need
334 // to run the UI message loop. Post a task to stop the UI message loop 322 // to run the UI message loop. Post a task to stop the UI message loop
335 // after the client object destructor is called. 323 // after the client object destructor is called.
336 FlushIOMessageLoop(); 324 FlushIOMessageLoop();
337 } 325 }
338 326
339 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteMultiplePings) { 327 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteMultiplePings) {
340 // Case 4 & 5: client thinks a page is phishing then navigates to 328 // Case 4 & 5: client thinks a page is phishing then navigates to
341 // another page which is also considered phishing by the client 329 // another page which is also considered phishing by the client
342 // before the server responds with a verdict. After a while the 330 // before the server responds with a verdict. After a while the
(...skipping 28 matching lines...) Expand all
371 verdict.set_client_score(0.8f); 359 verdict.set_client_score(0.8f);
372 EXPECT_CALL(*csd_service_, 360 EXPECT_CALL(*csd_service_,
373 SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) 361 SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _))
374 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb_other))); 362 .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb_other)));
375 OnDetectedPhishingSite(verdict.SerializeAsString()); 363 OnDetectedPhishingSite(verdict.SerializeAsString());
376 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 364 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
377 ASSERT_TRUE(cb_other); 365 ASSERT_TRUE(cb_other);
378 366
379 // We expect that the interstitial is shown for the second phishing URL and 367 // We expect that the interstitial is shown for the second phishing URL and
380 // not for the first phishing URL. 368 // not for the first phishing URL.
381 EXPECT_CALL(*sb_service_, 369 SafeBrowsingService::UnsafeResource resource;
382 DisplayBlockingPage(phishing_url, phishing_url,_, _, _, _, _, _)) 370 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_))
383 .Times(0); 371 .WillOnce(SaveArg<0>(&resource));
384 SafeBrowsingService::Client* client;
385 EXPECT_CALL(*sb_service_,
386 DisplayBlockingPage(
387 other_phishing_url,
388 other_phishing_url,
389 _,
390 ResourceType::MAIN_FRAME,
391 SafeBrowsingService::CLIENT_SIDE_PHISHING_URL,
392 _ /* a CsdClient object */,
393 contents()->GetRenderProcessHost()->id(),
394 contents()->render_view_host()->routing_id()))
395 .WillOnce(SaveArg<5>(&client));
396
397 cb->Run(phishing_url, true); // Should have no effect. 372 cb->Run(phishing_url, true); // Should have no effect.
398 delete cb; 373 delete cb;
399 cb_other->Run(other_phishing_url, true); // Should show interstitial. 374 cb_other->Run(other_phishing_url, true); // Should show interstitial.
400 delete cb_other; 375 delete cb_other;
401 376
402 FlushIOMessageLoop(); 377 MessageLoop::current()->RunAllPending();
403 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 378 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
379 EXPECT_EQ(other_phishing_url, resource.url);
380 EXPECT_EQ(other_phishing_url, resource.original_url);
381 EXPECT_EQ(ResourceType::MAIN_FRAME, resource.resource_type);
382 EXPECT_EQ(SafeBrowsingService::CLIENT_SIDE_PHISHING_URL,
383 resource.threat_type);
384 EXPECT_EQ(contents()->GetRenderProcessHost()->id(),
385 resource.render_process_host_id);
386 EXPECT_EQ(contents()->render_view_host()->routing_id(),
387 resource.render_view_id);
404 388
405 // Make sure the client object will be deleted. 389 // Make sure the client object will be deleted.
406 BrowserThread::PostTask( 390 BrowserThread::PostTask(
407 BrowserThread::IO, 391 BrowserThread::IO,
408 FROM_HERE, 392 FROM_HERE,
409 NewRunnableMethod( 393 NewRunnableMethod(
410 sb_service_.get(), 394 sb_service_.get(),
411 &MockSafeBrowsingService::InvokeOnBlockingPageComplete, 395 &MockSafeBrowsingService::InvokeOnBlockingPageComplete,
412 client)); 396 resource.client));
413 // Since the CsdClient object will be deleted on the UI thread I need 397 // Since the CsdClient object will be deleted on the UI thread I need
414 // to run the UI message loop. Post a task to stop the UI message loop 398 // to run the UI message loop. Post a task to stop the UI message loop
415 // after the client object destructor is called. 399 // after the client object destructor is called.
416 FlushIOMessageLoop(); 400 FlushIOMessageLoop();
417 } 401 }
418 402
419 TEST_F(ClientSideDetectionHostTest, NavigationCancelsShouldClassifyUrl) { 403 TEST_F(ClientSideDetectionHostTest, NavigationCancelsShouldClassifyUrl) {
420 // Test that canceling pending should classify requests works as expected. 404 // Test that canceling pending should classify requests works as expected.
421 405
422 GURL first_url("http://first.phishy.url.com"); 406 GURL first_url("http://first.phishy.url.com");
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
576 SafeBrowsingMsg_StartPhishingDetection::ID); 560 SafeBrowsingMsg_StartPhishingDetection::ID);
577 ASSERT_FALSE(msg); 561 ASSERT_FALSE(msg);
578 562
579 // If result is cached, we will try and display the blocking page directly 563 // If result is cached, we will try and display the blocking page directly
580 // with no start classification message. 564 // with no start classification message.
581 CommandLine::ForCurrentProcess()->AppendSwitch( 565 CommandLine::ForCurrentProcess()->AppendSwitch(
582 switches::kEnableClientSidePhishingInterstitial); 566 switches::kEnableClientSidePhishingInterstitial);
583 url = GURL("http://host8.com/"); 567 url = GURL("http://host8.com/");
584 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kTrue, NULL, 568 ExpectPreClassificationChecks(url, &kFalse, &kFalse, &kFalse, &kTrue, NULL,
585 NULL); 569 NULL);
586 EXPECT_CALL(*sb_service_, 570
587 DisplayBlockingPage(Eq(url), Eq(url), _, _, _, _, _, _)) 571 SafeBrowsingService::UnsafeResource resource;
588 .WillOnce(DeleteArg<5>()); 572 EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_))
573 .WillOnce(SaveArg<0>(&resource));
574
589 NavigateAndCommit(url); 575 NavigateAndCommit(url);
590 // Wait for CheckCsdWhitelist to be called on the IO thread. 576 // Wait for CheckCsdWhitelist to be called on the IO thread.
591 FlushIOMessageLoop(); 577 FlushIOMessageLoop();
592 // Wait for CheckCache() to be called on the UI thread. 578 // Wait for CheckCache() to be called on the UI thread.
593 MessageLoop::current()->RunAllPending(); 579 MessageLoop::current()->RunAllPending();
594 // Wait for DisplayBlockingPage to be called on the IO thread.
595 FlushIOMessageLoop();
596 // Now we check that all expected functions were indeed called on the two 580 // Now we check that all expected functions were indeed called on the two
597 // service objects. 581 // service objects.
598 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); 582 EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get()));
599 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); 583 EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get()));
584 EXPECT_EQ(url, resource.url);
585 EXPECT_EQ(url, resource.original_url);
586 delete resource.client;
600 msg = process()->sink().GetFirstMessageMatching( 587 msg = process()->sink().GetFirstMessageMatching(
601 SafeBrowsingMsg_StartPhishingDetection::ID); 588 SafeBrowsingMsg_StartPhishingDetection::ID);
602 ASSERT_FALSE(msg); 589 ASSERT_FALSE(msg);
603 } 590 }
604 591
605 } // namespace safe_browsing 592 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698