| OLD | NEW | 
|    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/scoped_temp_dir.h" |    8 #include "base/scoped_temp_dir.h" | 
|    9 #include "base/task.h" |    9 #include "base/task.h" | 
|   10 #include "chrome/browser/safe_browsing/client_side_detection_host.h" |   10 #include "chrome/browser/safe_browsing/client_side_detection_host.h" | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   42 const bool kFalse = false; |   42 const bool kFalse = false; | 
|   43 const bool kTrue = true; |   43 const bool kTrue = true; | 
|   44 } |   44 } | 
|   45  |   45  | 
|   46 namespace safe_browsing { |   46 namespace safe_browsing { | 
|   47  |   47  | 
|   48 MATCHER_P(EqualsProto, other, "") { |   48 MATCHER_P(EqualsProto, other, "") { | 
|   49   return other.SerializeAsString() == arg.SerializeAsString(); |   49   return other.SerializeAsString() == arg.SerializeAsString(); | 
|   50 } |   50 } | 
|   51  |   51  | 
|   52 ACTION(QuitUIMessageLoop) { |  | 
|   53   EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |  | 
|   54   MessageLoopForUI::current()->Quit(); |  | 
|   55 } |  | 
|   56  |  | 
|   57 class MockClientSideDetectionService : public ClientSideDetectionService { |   52 class MockClientSideDetectionService : public ClientSideDetectionService { | 
|   58  public: |   53  public: | 
|   59   explicit MockClientSideDetectionService(const FilePath& model_path) |   54   explicit MockClientSideDetectionService(const FilePath& model_path) | 
|   60       : ClientSideDetectionService(model_path, NULL) {} |   55       : ClientSideDetectionService(model_path, NULL) {} | 
|   61   virtual ~MockClientSideDetectionService() {}; |   56   virtual ~MockClientSideDetectionService() {}; | 
|   62  |   57  | 
|   63   MOCK_METHOD2(SendClientReportPhishingRequest, |   58   MOCK_METHOD2(SendClientReportPhishingRequest, | 
|   64                void(ClientPhishingRequest*, |   59                void(ClientPhishingRequest*, | 
|   65                     ClientReportPhishingRequestCallback*)); |   60                     ClientReportPhishingRequestCallback*)); | 
|   66   MOCK_CONST_METHOD1(IsPrivateIPAddress, bool(const std::string&)); |   61   MOCK_CONST_METHOD1(IsPrivateIPAddress, bool(const std::string&)); | 
| (...skipping 29 matching lines...) Expand all  Loading... | 
|   96  |   91  | 
|   97 class MockTestingProfile : public TestingProfile { |   92 class MockTestingProfile : public TestingProfile { | 
|   98  public: |   93  public: | 
|   99   MockTestingProfile() {} |   94   MockTestingProfile() {} | 
|  100   virtual ~MockTestingProfile() {} |   95   virtual ~MockTestingProfile() {} | 
|  101  |   96  | 
|  102   MOCK_METHOD0(IsOffTheRecord, bool()); |   97   MOCK_METHOD0(IsOffTheRecord, bool()); | 
|  103 }; |   98 }; | 
|  104  |   99  | 
|  105 // Helper function which quits the UI message loop from the IO message loop. |  100 // Helper function which quits the UI message loop from the IO message loop. | 
|  106 void QuitUIMessageLoopFromIO() { |  101 void QuitUIMessageLoop() { | 
|  107   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |  102   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 
|  108   BrowserThread::PostTask(BrowserThread::UI, |  103   BrowserThread::PostTask(BrowserThread::UI, | 
|  109                           FROM_HERE, |  104                           FROM_HERE, | 
|  110                           new MessageLoop::QuitTask()); |  105                           new MessageLoop::QuitTask()); | 
|  111 } |  106 } | 
|  112  |  107  | 
|  113 class ClientSideDetectionHostTest : public TabContentsWrapperTestHarness { |  108 class ClientSideDetectionHostTest : public TabContentsWrapperTestHarness { | 
|  114  public: |  109  public: | 
|  115   virtual void SetUp() { |  110   virtual void SetUp() { | 
|  116     // Set custom profile object so that we can mock calls to IsOffTheRecord. |  111     // Set custom profile object so that we can mock calls to IsOffTheRecord. | 
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  148   void OnDetectedPhishingSite(const std::string& verdict_str) { |  143   void OnDetectedPhishingSite(const std::string& verdict_str) { | 
|  149     csd_host_->OnDetectedPhishingSite(verdict_str); |  144     csd_host_->OnDetectedPhishingSite(verdict_str); | 
|  150   } |  145   } | 
|  151  |  146  | 
|  152   void FlushIOMessageLoop() { |  147   void FlushIOMessageLoop() { | 
|  153     // If there was a message posted on the IO thread to display the |  148     // If there was a message posted on the IO thread to display the | 
|  154     // interstitial page we know that it would have been posted before |  149     // interstitial page we know that it would have been posted before | 
|  155     // we put the quit message there. |  150     // we put the quit message there. | 
|  156     BrowserThread::PostTask(BrowserThread::IO, |  151     BrowserThread::PostTask(BrowserThread::IO, | 
|  157                             FROM_HERE, |  152                             FROM_HERE, | 
|  158                             NewRunnableFunction(&QuitUIMessageLoopFromIO)); |  153                             NewRunnableFunction(&QuitUIMessageLoop)); | 
|  159     MessageLoop::current()->Run(); |  154     MessageLoop::current()->Run(); | 
|  160   } |  155   } | 
|  161  |  156  | 
|  162   void ExpectPreClassificationChecks(const GURL& url, |  157   void ExpectPreClassificationChecks(const GURL& url, | 
|  163                                      const bool* is_private, |  158                                      const bool* is_private, | 
|  164                                      const bool* is_incognito, |  159                                      const bool* is_incognito, | 
|  165                                      const bool* match_csd_whitelist, |  160                                      const bool* match_csd_whitelist, | 
|  166                                      const bool* get_valid_cached_result, |  161                                      const bool* get_valid_cached_result, | 
|  167                                      const bool* is_in_cache, |  162                                      const bool* is_in_cache, | 
|  168                                      const bool* over_report_limit) { |  163                                      const bool* over_report_limit) { | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  225   // Case 1: client thinks the page is phishing.  The server does not agree. |  220   // Case 1: client thinks the page is phishing.  The server does not agree. | 
|  226   // No interstitial is shown. |  221   // No interstitial is shown. | 
|  227   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; |  222   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; | 
|  228   ClientPhishingRequest verdict; |  223   ClientPhishingRequest verdict; | 
|  229   verdict.set_url("http://phishingurl.com/"); |  224   verdict.set_url("http://phishingurl.com/"); | 
|  230   verdict.set_client_score(1.0f); |  225   verdict.set_client_score(1.0f); | 
|  231   verdict.set_is_phishing(true); |  226   verdict.set_is_phishing(true); | 
|  232  |  227  | 
|  233   EXPECT_CALL(*csd_service_, |  228   EXPECT_CALL(*csd_service_, | 
|  234               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) |  229               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) | 
|  235       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb), QuitUIMessageLoop())); |  230       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); | 
|  236   OnDetectedPhishingSite(verdict.SerializeAsString()); |  231   OnDetectedPhishingSite(verdict.SerializeAsString()); | 
|  237   MessageLoop::current()->Run(); |  | 
|  238   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); |  232   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | 
|  239   ASSERT_TRUE(cb); |  233   ASSERT_TRUE(cb); | 
|  240  |  234  | 
|  241   // Make sure DoDisplayBlockingPage is not going to be called. |  235   // Make sure DoDisplayBlockingPage is not going to be called. | 
|  242   EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0); |  236   EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0); | 
|  243   cb->Run(GURL(verdict.url()), false); |  237   cb->Run(GURL(verdict.url()), false); | 
|  244   delete cb; |  238   delete cb; | 
|  245   MessageLoop::current()->RunAllPending(); |  239   MessageLoop::current()->RunAllPending(); | 
|  246   EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); |  240   EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); | 
|  247 } |  241 } | 
|  248  |  242  | 
|  249 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteDisabled) { |  243 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteDisabled) { | 
|  250   // Case 2: client thinks the page is phishing and so does the server but |  244   // Case 2: client thinks the page is phishing and so does the server but | 
|  251   // showing the interstitial is disabled => no interstitial is shown. |  245   // showing the interstitial is disabled => no interstitial is shown. | 
|  252   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; |  246   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; | 
|  253   ClientPhishingRequest verdict; |  247   ClientPhishingRequest verdict; | 
|  254   verdict.set_url("http://phishingurl.com/"); |  248   verdict.set_url("http://phishingurl.com/"); | 
|  255   verdict.set_client_score(1.0f); |  249   verdict.set_client_score(1.0f); | 
|  256   verdict.set_is_phishing(true); |  250   verdict.set_is_phishing(true); | 
|  257  |  251  | 
|  258   EXPECT_CALL(*csd_service_, |  252   EXPECT_CALL(*csd_service_, | 
|  259               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) |  253               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) | 
|  260       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb), QuitUIMessageLoop())); |  254       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); | 
|  261   OnDetectedPhishingSite(verdict.SerializeAsString()); |  255   OnDetectedPhishingSite(verdict.SerializeAsString()); | 
|  262   MessageLoop::current()->Run(); |  | 
|  263   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); |  256   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | 
|  264   ASSERT_TRUE(cb); |  257   ASSERT_TRUE(cb); | 
|  265  |  258  | 
|  266   // Make sure DoDisplayBlockingPage is not going to be called. |  259   // Make sure DoDisplayBlockingPage is not going to be called. | 
|  267   EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0); |  260   EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)).Times(0); | 
|  268   cb->Run(GURL(verdict.url()), false); |  261   cb->Run(GURL(verdict.url()), false); | 
|  269   delete cb; |  262   delete cb; | 
|  270   MessageLoop::current()->RunAllPending(); |  263   MessageLoop::current()->RunAllPending(); | 
|  271   EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); |  264   EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); | 
|  272 } |  265 } | 
|  273  |  266  | 
|  274 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteShowInterstitial) { |  267 TEST_F(ClientSideDetectionHostTest, OnDetectedPhishingSiteShowInterstitial) { | 
|  275   // Case 3: client thinks the page is phishing and so does the server. |  268   // Case 3: client thinks the page is phishing and so does the server. | 
|  276   // We show an interstitial. |  269   // We show an interstitial. | 
|  277   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; |  270   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; | 
|  278   GURL phishing_url("http://phishingurl.com/"); |  271   GURL phishing_url("http://phishingurl.com/"); | 
|  279   ClientPhishingRequest verdict; |  272   ClientPhishingRequest verdict; | 
|  280   verdict.set_url(phishing_url.spec()); |  273   verdict.set_url(phishing_url.spec()); | 
|  281   verdict.set_client_score(1.0f); |  274   verdict.set_client_score(1.0f); | 
|  282   verdict.set_is_phishing(true); |  275   verdict.set_is_phishing(true); | 
|  283  |  276  | 
|  284   EXPECT_CALL(*csd_service_, |  277   EXPECT_CALL(*csd_service_, | 
|  285               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) |  278               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) | 
|  286       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb), QuitUIMessageLoop())); |  279       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); | 
|  287   OnDetectedPhishingSite(verdict.SerializeAsString()); |  280   OnDetectedPhishingSite(verdict.SerializeAsString()); | 
|  288   MessageLoop::current()->Run(); |  | 
|  289   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); |  281   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | 
|  290   ASSERT_TRUE(cb); |  282   ASSERT_TRUE(cb); | 
|  291  |  283  | 
|  292   SafeBrowsingService::UnsafeResource resource; |  284   SafeBrowsingService::UnsafeResource resource; | 
|  293   EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)) |  285   EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)) | 
|  294       .WillOnce(SaveArg<0>(&resource)); |  286       .WillOnce(SaveArg<0>(&resource)); | 
|  295   cb->Run(phishing_url, true); |  287   cb->Run(phishing_url, true); | 
|  296   delete cb; |  288   delete cb; | 
|  297  |  289  | 
|  298   MessageLoop::current()->RunAllPending(); |  290   MessageLoop::current()->RunAllPending(); | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
|  329   // a single interstitial is shown for the second URL. |  321   // a single interstitial is shown for the second URL. | 
|  330   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; |  322   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb; | 
|  331   GURL phishing_url("http://phishingurl.com/"); |  323   GURL phishing_url("http://phishingurl.com/"); | 
|  332   ClientPhishingRequest verdict; |  324   ClientPhishingRequest verdict; | 
|  333   verdict.set_url(phishing_url.spec()); |  325   verdict.set_url(phishing_url.spec()); | 
|  334   verdict.set_client_score(1.0f); |  326   verdict.set_client_score(1.0f); | 
|  335   verdict.set_is_phishing(true); |  327   verdict.set_is_phishing(true); | 
|  336  |  328  | 
|  337   EXPECT_CALL(*csd_service_, |  329   EXPECT_CALL(*csd_service_, | 
|  338               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) |  330               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) | 
|  339       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb), QuitUIMessageLoop())); |  331       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb))); | 
|  340   OnDetectedPhishingSite(verdict.SerializeAsString()); |  332   OnDetectedPhishingSite(verdict.SerializeAsString()); | 
|  341   MessageLoop::current()->Run(); |  | 
|  342   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); |  333   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | 
|  343   ASSERT_TRUE(cb); |  334   ASSERT_TRUE(cb); | 
|  344   GURL other_phishing_url("http://other_phishing_url.com/bla"); |  335   GURL other_phishing_url("http://other_phishing_url.com/bla"); | 
|  345   ExpectPreClassificationChecks(other_phishing_url, &kFalse, &kFalse, &kFalse, |  336   ExpectPreClassificationChecks(other_phishing_url, &kFalse, &kFalse, &kFalse, | 
|  346                                 &kFalse, &kFalse, &kFalse); |  337                                 &kFalse, &kFalse, &kFalse); | 
|  347   // We navigate away.  The callback cb should be revoked. |  338   // We navigate away.  The callback cb should be revoked. | 
|  348   NavigateAndCommit(other_phishing_url); |  339   NavigateAndCommit(other_phishing_url); | 
|  349   // Wait for the pre-classification checks to finish for other_phishing_url. |  340   // Wait for the pre-classification checks to finish for other_phishing_url. | 
|  350   WaitAndCheckPreClassificationChecks(); |  341   WaitAndCheckPreClassificationChecks(); | 
|  351  |  342  | 
|  352   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb_other; |  343   ClientSideDetectionService::ClientReportPhishingRequestCallback* cb_other; | 
|  353   verdict.set_url(other_phishing_url.spec()); |  344   verdict.set_url(other_phishing_url.spec()); | 
|  354   verdict.set_client_score(0.8f); |  345   verdict.set_client_score(0.8f); | 
|  355   EXPECT_CALL(*csd_service_, |  346   EXPECT_CALL(*csd_service_, | 
|  356               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) |  347               SendClientReportPhishingRequest(Pointee(EqualsProto(verdict)), _)) | 
|  357       .WillOnce(DoAll(DeleteArg<0>(), |  348       .WillOnce(DoAll(DeleteArg<0>(), SaveArg<1>(&cb_other))); | 
|  358                       SaveArg<1>(&cb_other), |  | 
|  359                       QuitUIMessageLoop())); |  | 
|  360   OnDetectedPhishingSite(verdict.SerializeAsString()); |  349   OnDetectedPhishingSite(verdict.SerializeAsString()); | 
|  361   MessageLoop::current()->Run(); |  | 
|  362   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); |  350   EXPECT_TRUE(Mock::VerifyAndClear(csd_service_.get())); | 
|  363   ASSERT_TRUE(cb_other); |  351   ASSERT_TRUE(cb_other); | 
|  364  |  352  | 
|  365   // We expect that the interstitial is shown for the second phishing URL and |  353   // We expect that the interstitial is shown for the second phishing URL and | 
|  366   // not for the first phishing URL. |  354   // not for the first phishing URL. | 
|  367   SafeBrowsingService::UnsafeResource resource; |  355   SafeBrowsingService::UnsafeResource resource; | 
|  368   EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)) |  356   EXPECT_CALL(*sb_service_, DoDisplayBlockingPage(_)) | 
|  369       .WillOnce(SaveArg<0>(&resource)); |  357       .WillOnce(SaveArg<0>(&resource)); | 
|  370  |  358  | 
|  371   cb->Run(phishing_url, true);  // Should have no effect. |  359   cb->Run(phishing_url, true);  // Should have no effect. | 
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  580   EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); |  568   EXPECT_TRUE(Mock::VerifyAndClear(sb_service_.get())); | 
|  581   EXPECT_EQ(url, resource.url); |  569   EXPECT_EQ(url, resource.url); | 
|  582   EXPECT_EQ(url, resource.original_url); |  570   EXPECT_EQ(url, resource.original_url); | 
|  583   delete resource.client; |  571   delete resource.client; | 
|  584   msg = process()->sink().GetFirstMessageMatching( |  572   msg = process()->sink().GetFirstMessageMatching( | 
|  585       SafeBrowsingMsg_StartPhishingDetection::ID); |  573       SafeBrowsingMsg_StartPhishingDetection::ID); | 
|  586   ASSERT_FALSE(msg); |  574   ASSERT_FALSE(msg); | 
|  587 } |  575 } | 
|  588  |  576  | 
|  589 }  // namespace safe_browsing |  577 }  // namespace safe_browsing | 
| OLD | NEW |