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

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

Issue 42553002: Mostly integrate new malware IP blacklist with the csd client. When (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 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 | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "chrome/browser/safe_browsing/browser_feature_extractor.h" 5 #include "chrome/browser/safe_browsing/browser_feature_extractor.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h" 12 #include "base/message_loop/message_loop.h"
13 #include "base/strings/stringprintf.h" 13 #include "base/strings/stringprintf.h"
14 #include "base/time/time.h" 14 #include "base/time/time.h"
15 #include "chrome/browser/history/history_backend.h" 15 #include "chrome/browser/history/history_backend.h"
16 #include "chrome/browser/history/history_service.h" 16 #include "chrome/browser/history/history_service.h"
17 #include "chrome/browser/history/history_service_factory.h" 17 #include "chrome/browser/history/history_service_factory.h"
18 #include "chrome/browser/profiles/profile.h" 18 #include "chrome/browser/profiles/profile.h"
19 #include "chrome/browser/safe_browsing/browser_features.h" 19 #include "chrome/browser/safe_browsing/browser_features.h"
20 #include "chrome/browser/safe_browsing/client_side_detection_service.h" 20 #include "chrome/browser/safe_browsing/client_side_detection_host.h"
21 #include "chrome/browser/safe_browsing/ui_manager.h" 21 #include "chrome/browser/safe_browsing/ui_manager.h"
22 #include "chrome/common/safe_browsing/csd.pb.h" 22 #include "chrome/common/safe_browsing/csd.pb.h"
23 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 23 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
24 #include "chrome/test/base/testing_profile.h" 24 #include "chrome/test/base/testing_profile.h"
25 #include "content/public/browser/navigation_controller.h" 25 #include "content/public/browser/navigation_controller.h"
26 #include "content/public/browser/web_contents.h" 26 #include "content/public/browser/web_contents.h"
27 #include "content/public/common/page_transition_types.h" 27 #include "content/public/common/page_transition_types.h"
28 #include "content/public/common/referrer.h" 28 #include "content/public/common/referrer.h"
29 #include "content/public/test/test_browser_thread.h" 29 #include "content/public/test/test_browser_thread.h"
30 #include "content/public/test/web_contents_tester.h" 30 #include "content/public/test/web_contents_tester.h"
31 #include "testing/gmock/include/gmock/gmock.h" 31 #include "testing/gmock/include/gmock/gmock.h"
32 #include "testing/gtest/include/gtest/gtest.h" 32 #include "testing/gtest/include/gtest/gtest.h"
33 #include "url/gurl.h" 33 #include "url/gurl.h"
34 34
35 using content::BrowserThread;
35 using content::WebContentsTester; 36 using content::WebContentsTester;
37
38 using testing::DoAll;
36 using testing::Return; 39 using testing::Return;
37 using testing::StrictMock; 40 using testing::StrictMock;
38 41
39 namespace safe_browsing { 42 namespace safe_browsing {
43
40 namespace { 44 namespace {
41 class MockClientSideDetectionService : public ClientSideDetectionService { 45 class MockClientSideDetectionHost : public ClientSideDetectionHost {
42 public: 46 public:
43 MockClientSideDetectionService() : ClientSideDetectionService(NULL) {} 47 MockClientSideDetectionHost() {}
44 virtual ~MockClientSideDetectionService() {}; 48 virtual ~MockClientSideDetectionHost() {};
45 49
46 MOCK_CONST_METHOD1(IsBadIpAddress, bool(const std::string&)); 50 MOCK_METHOD1(IsBadIpAddress, bool(const std::string&));
47 }; 51 };
48 } // namespace 52 } // namespace
49 53
50 class BrowserFeatureExtractorTest : public ChromeRenderViewHostTestHarness { 54 class BrowserFeatureExtractorTest : public ChromeRenderViewHostTestHarness {
51 protected: 55 protected:
52 virtual void SetUp() { 56 virtual void SetUp() {
53 ChromeRenderViewHostTestHarness::SetUp(); 57 ChromeRenderViewHostTestHarness::SetUp();
54 ASSERT_TRUE(profile()->CreateHistoryService( 58 ASSERT_TRUE(profile()->CreateHistoryService(
55 true /* delete_file */, false /* no_db */)); 59 true /* delete_file */, false /* no_db */));
56 service_.reset(new StrictMock<MockClientSideDetectionService>()); 60 host_.reset(new StrictMock<MockClientSideDetectionHost>());
57 extractor_.reset( 61 extractor_.reset(
58 new BrowserFeatureExtractor(web_contents(), service_.get())); 62 new BrowserFeatureExtractor(web_contents(), host_.get()));
59 num_pending_ = 0; 63 num_pending_ = 0;
60 browse_info_.reset(new BrowseInfo); 64 browse_info_.reset(new BrowseInfo);
61 } 65 }
62 66
63 virtual void TearDown() { 67 virtual void TearDown() {
64 extractor_.reset(); 68 extractor_.reset();
65 profile()->DestroyHistoryService(); 69 profile()->DestroyHistoryService();
66 ChromeRenderViewHostTestHarness::TearDown(); 70 ChromeRenderViewHostTestHarness::TearDown();
67 ASSERT_EQ(0, num_pending_); 71 ASSERT_EQ(0, num_pending_);
68 } 72 }
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 std::map<std::string, double>* features) { 135 std::map<std::string, double>* features) {
132 for (int i = 0; i < request.non_model_feature_map_size(); ++i) { 136 for (int i = 0; i < request.non_model_feature_map_size(); ++i) {
133 const ClientPhishingRequest::Feature& feature = 137 const ClientPhishingRequest::Feature& feature =
134 request.non_model_feature_map(i); 138 request.non_model_feature_map(i);
135 EXPECT_EQ(0U, features->count(feature.name())); 139 EXPECT_EQ(0U, features->count(feature.name()));
136 (*features)[feature.name()] = feature.value(); 140 (*features)[feature.name()] = feature.value();
137 } 141 }
138 } 142 }
139 143
140 void ExtractMalwareFeatures(ClientMalwareRequest* request) { 144 void ExtractMalwareFeatures(ClientMalwareRequest* request) {
145 StartExtractMalwareFeatures(request);
146 base::MessageLoopForUI::current()->Run();
147 EXPECT_EQ(1U, success_.count(request));
148 EXPECT_TRUE(success_[request]);
149 }
150
151 void StartExtractMalwareFeatures(ClientMalwareRequest* request) {
152 success_.erase(request);
153 ++num_pending_;
141 extractor_->ExtractMalwareFeatures( 154 extractor_->ExtractMalwareFeatures(
142 browse_info_.get(), request); 155 *browse_info_,
156 request,
157 base::Bind(&BrowserFeatureExtractorTest::ExtractMalwareFeaturesDone,
158 base::Unretained(this)));
143 } 159 }
144 160
145 void GetMalwareFeatureMap( 161 void GetMalwareFeatureMap(
146 const ClientMalwareRequest& request, 162 const ClientMalwareRequest& request,
147 std::map<std::string, std::set<std::string> >* features) { 163 std::map<std::string, std::set<std::string> >* features) {
148 for (int i = 0; i < request.feature_map_size(); ++i) { 164 for (int i = 0; i < request.feature_map_size(); ++i) {
149 const ClientMalwareRequest::Feature& feature = 165 const ClientMalwareRequest::Feature& feature =
150 request.feature_map(i); 166 request.feature_map(i);
151 EXPECT_EQ(0U, features->count(feature.name())); 167 EXPECT_EQ(0U, features->count(feature.name()));
152 std::set<std::string> meta_infos; 168 std::set<std::string> meta_infos;
153 for (int j = 0; j < feature.metainfo_size(); ++j) { 169 for (int j = 0; j < feature.metainfo_size(); ++j) {
154 meta_infos.insert(feature.metainfo(j)); 170 meta_infos.insert(feature.metainfo(j));
155 } 171 }
156 (*features)[feature.name()] = meta_infos; 172 (*features)[feature.name()] = meta_infos;
157 } 173 }
158 } 174 }
159 175
160 int num_pending_; 176 int num_pending_; // Number of pending feature extractions.
161 scoped_ptr<BrowserFeatureExtractor> extractor_; 177 scoped_ptr<BrowserFeatureExtractor> extractor_;
162 std::map<ClientPhishingRequest*, bool> success_; 178 std::map<void*, bool> success_;
163 scoped_ptr<BrowseInfo> browse_info_; 179 scoped_ptr<BrowseInfo> browse_info_;
164 scoped_ptr<MockClientSideDetectionService> service_; 180 scoped_ptr<StrictMock<MockClientSideDetectionHost> > host_;
165 181
166 private: 182 private:
167 void ExtractFeaturesDone(bool success, ClientPhishingRequest* request) { 183 void ExtractFeaturesDone(bool success, ClientPhishingRequest* request) {
168 ASSERT_EQ(0U, success_.count(request)); 184 ASSERT_EQ(0U, success_.count(request));
169 success_[request] = success; 185 success_[request] = success;
170 if (--num_pending_ == 0) { 186 if (--num_pending_ == 0) {
171 base::MessageLoop::current()->Quit(); 187 base::MessageLoop::current()->Quit();
172 } 188 }
173 } 189 }
190
191 void ExtractMalwareFeaturesDone(bool success, ClientMalwareRequest* request) {
192 EXPECT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
193 ASSERT_EQ(0U, success_.count(request));
194 success_[request] = success;
195 if (--num_pending_ == 0) {
196 base::MessageLoopForUI::current()->Quit();
197 }
198 }
174 }; 199 };
175 200
176 TEST_F(BrowserFeatureExtractorTest, UrlNotInHistory) { 201 TEST_F(BrowserFeatureExtractorTest, UrlNotInHistory) {
177 ClientPhishingRequest request; 202 ClientPhishingRequest request;
178 SimpleNavigateAndCommit(GURL("http://www.google.com")); 203 SimpleNavigateAndCommit(GURL("http://www.google.com"));
179 request.set_url("http://www.google.com/"); 204 request.set_url("http://www.google.com/");
180 request.set_client_score(0.5); 205 request.set_client_score(0.5);
181 EXPECT_FALSE(ExtractFeatures(&request)); 206 EXPECT_FALSE(ExtractFeatures(&request));
182 } 207 }
183 208
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 request.set_url("http://www.baz.com/"); 498 request.set_url("http://www.baz.com/");
474 request.set_client_score(0.5); 499 request.set_client_score(0.5);
475 redirect_chain.clear(); 500 redirect_chain.clear();
476 redirect_chain.push_back(GURL("https://bankofamerica.com")); 501 redirect_chain.push_back(GURL("https://bankofamerica.com"));
477 redirect_chain.push_back(GURL("http://www.baz.com/")); 502 redirect_chain.push_back(GURL("http://www.baz.com/"));
478 SetRedirectChain(redirect_chain, true); 503 SetRedirectChain(redirect_chain, true);
479 NavigateAndCommit(GURL("http://www.baz.com"), 504 NavigateAndCommit(GURL("http://www.baz.com"),
480 GURL("https://bankofamerica.com"), 505 GURL("https://bankofamerica.com"),
481 content::PAGE_TRANSITION_GENERATED); 506 content::PAGE_TRANSITION_GENERATED);
482 507
483 std::set<std::string> urls;
484 urls.insert("http://test.com");
485 browse_info_->ips.insert(std::make_pair("193.5.163.8", urls));
486 browse_info_->ips.insert(std::make_pair("23.94.78.1", urls));
487 EXPECT_CALL(*service_, IsBadIpAddress("193.5.163.8")).WillOnce(Return(true));
488 EXPECT_CALL(*service_, IsBadIpAddress("23.94.78.1")).WillOnce(Return(false));
489
490 EXPECT_TRUE(ExtractFeatures(&request)); 508 EXPECT_TRUE(ExtractFeatures(&request));
491 features.clear(); 509 features.clear();
492 GetFeatureMap(request, &features); 510 GetFeatureMap(request, &features);
493 511
494 EXPECT_EQ(1.0, 512 EXPECT_EQ(1.0,
495 features[base::StringPrintf("%s[0]=%s", 513 features[base::StringPrintf("%s[0]=%s",
496 features::kRedirect, 514 features::kRedirect,
497 features::kSecureRedirectValue)]); 515 features::kSecureRedirectValue)]);
498 EXPECT_EQ(1.0, features[features::kHasSSLReferrer]); 516 EXPECT_EQ(1.0, features[features::kHasSSLReferrer]);
499 EXPECT_EQ(5.0, features[features::kPageTransitionType]); 517 EXPECT_EQ(5.0, features[features::kPageTransitionType]);
500 // Should not have redirect or host features. 518 // Should not have redirect or host features.
501 EXPECT_EQ(0U, 519 EXPECT_EQ(0U,
502 features.count(base::StringPrintf("%s%s", 520 features.count(base::StringPrintf("%s%s",
503 features::kHostPrefix, 521 features::kHostPrefix,
504 features::kPageTransitionType))); 522 features::kPageTransitionType)));
505 EXPECT_EQ(0U, 523 EXPECT_EQ(0U,
506 features.count(base::StringPrintf("%s%s", 524 features.count(base::StringPrintf("%s%s",
507 features::kHostPrefix, 525 features::kHostPrefix,
508 features::kIsFirstNavigation))); 526 features::kIsFirstNavigation)));
509 EXPECT_EQ(5.0, features[features::kPageTransitionType]); 527 EXPECT_EQ(5.0, features[features::kPageTransitionType]);
510 EXPECT_EQ(1.0, features[std::string(features::kBadIpFetch) + "193.5.163.8"]);
511 EXPECT_FALSE(features.count(std::string(features::kBadIpFetch) +
512 "23.94.78.1"));
513 } 528 }
514 529
515 TEST_F(BrowserFeatureExtractorTest, SafeBrowsingFeatures) { 530 TEST_F(BrowserFeatureExtractorTest, SafeBrowsingFeatures) {
516 SimpleNavigateAndCommit(GURL("http://www.foo.com/malware.html")); 531 SimpleNavigateAndCommit(GURL("http://www.foo.com/malware.html"));
517 ClientPhishingRequest request; 532 ClientPhishingRequest request;
518 request.set_url("http://www.foo.com/malware.html"); 533 request.set_url("http://www.foo.com/malware.html");
519 request.set_client_score(0.5); 534 request.set_client_score(0.5);
520 535
521 browse_info_->unsafe_resource.reset( 536 browse_info_->unsafe_resource.reset(
522 new SafeBrowsingUIManager::UnsafeResource); 537 new SafeBrowsingUIManager::UnsafeResource);
(...skipping 22 matching lines...) Expand all
545 request.set_url("http://www.foo.com/"); 560 request.set_url("http://www.foo.com/");
546 561
547 std::set<std::string> bad_urls; 562 std::set<std::string> bad_urls;
548 bad_urls.insert("http://bad.com"); 563 bad_urls.insert("http://bad.com");
549 bad_urls.insert("http://evil.com"); 564 bad_urls.insert("http://evil.com");
550 browse_info_->ips.insert(std::make_pair("193.5.163.8", bad_urls)); 565 browse_info_->ips.insert(std::make_pair("193.5.163.8", bad_urls));
551 browse_info_->ips.insert(std::make_pair("92.92.92.92", bad_urls)); 566 browse_info_->ips.insert(std::make_pair("92.92.92.92", bad_urls));
552 std::set<std::string> good_urls; 567 std::set<std::string> good_urls;
553 good_urls.insert("http://ok.com"); 568 good_urls.insert("http://ok.com");
554 browse_info_->ips.insert(std::make_pair("23.94.78.1", good_urls)); 569 browse_info_->ips.insert(std::make_pair("23.94.78.1", good_urls));
555 EXPECT_CALL(*service_, IsBadIpAddress("193.5.163.8")).WillOnce(Return(true)); 570 EXPECT_CALL(*host_, IsBadIpAddress("193.5.163.8")).WillOnce(Return(true));
556 EXPECT_CALL(*service_, IsBadIpAddress("92.92.92.92")).WillOnce(Return(true)); 571 EXPECT_CALL(*host_, IsBadIpAddress("92.92.92.92")).WillOnce(Return(true));
557 EXPECT_CALL(*service_, IsBadIpAddress("23.94.78.1")).WillOnce(Return(false)); 572 EXPECT_CALL(*host_, IsBadIpAddress("23.94.78.1")).WillOnce(Return(false));
558 573
559 ExtractMalwareFeatures(&request); 574 ExtractMalwareFeatures(&request);
560 std::map<std::string, std::set<std::string> > features; 575 std::map<std::string, std::set<std::string> > features;
561 GetMalwareFeatureMap(request, &features); 576 GetMalwareFeatureMap(request, &features);
562 577
563 EXPECT_EQ(2U, features.size()); 578 EXPECT_EQ(2U, features.size());
564 std::string feature_name = base::StringPrintf("%s%s", features::kBadIpFetch, 579 std::string feature_name = base::StringPrintf("%s%s", features::kBadIpFetch,
565 "193.5.163.8"); 580 "193.5.163.8");
566 EXPECT_TRUE(features.count(feature_name)); 581 EXPECT_TRUE(features.count(feature_name));
567 std::set<std::string> urls = features[feature_name]; 582 std::set<std::string> urls = features[feature_name];
(...skipping 17 matching lines...) Expand all
585 bad_urls.insert("http://bad.com"); 600 bad_urls.insert("http://bad.com");
586 std::vector<std::string> ips; 601 std::vector<std::string> ips;
587 for (int i = 0; i < 7; ++i) { // Add 7 ips 602 for (int i = 0; i < 7; ++i) { // Add 7 ips
588 std::string ip = base::StringPrintf("%d.%d.%d.%d", i, i, i, i); 603 std::string ip = base::StringPrintf("%d.%d.%d.%d", i, i, i, i);
589 ips.push_back(ip); 604 ips.push_back(ip);
590 browse_info_->ips.insert(std::make_pair(ip, bad_urls)); 605 browse_info_->ips.insert(std::make_pair(ip, bad_urls));
591 } 606 }
592 607
593 // First ip is good, then check the next 5 bad ips. 608 // First ip is good, then check the next 5 bad ips.
594 // Not check the 7th as reached limit. 609 // Not check the 7th as reached limit.
595 EXPECT_CALL(*service_, IsBadIpAddress(ips[0])).WillOnce(Return(false)); 610 EXPECT_CALL(*host_, IsBadIpAddress(ips[0])).WillOnce(Return(false));
596 for (int i = 1; i < 6; ++i) { 611 for (int i = 1; i < 6; ++i) {
597 EXPECT_CALL(*service_, IsBadIpAddress(ips[i])).WillOnce(Return(true)); 612 EXPECT_CALL(*host_, IsBadIpAddress(ips[i])).WillOnce(Return(true));
598 } 613 }
599 614
600 ExtractMalwareFeatures(&request); 615 ExtractMalwareFeatures(&request);
601 std::map<std::string, std::set<std::string> > features; 616 std::map<std::string, std::set<std::string> > features;
602 GetMalwareFeatureMap(request, &features); 617 GetMalwareFeatureMap(request, &features);
603 618
604 // Only keep 5 ips. 619 // Only keep 5 ips.
605 EXPECT_EQ(5U, features.size()); 620 EXPECT_EQ(5U, features.size());
606 } 621 }
607 622
608 } // namespace safe_browsing 623 } // namespace safe_browsing
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698