Index: chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc |
diff --git a/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc b/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e683fd7b4dbd5c8283100f9c4000a404ed4340b8 |
--- /dev/null |
+++ b/chrome/browser/safe_browsing/browser_feature_extractor_unittest.cc |
@@ -0,0 +1,163 @@ |
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/browser/safe_browsing/browser_feature_extractor.h" |
+ |
+#include <map> |
+#include <string> |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "base/message_loop.h" |
+#include "base/time.h" |
+#include "chrome/common/safe_browsing/csd.pb.h" |
+#include "chrome/browser/history/history.h" |
+#include "chrome/browser/history/history_backend.h" |
+#include "chrome/browser/profiles/profile.h" |
+#include "chrome/test/testing_profile.h" |
+#include "content/browser/browser_thread.h" |
+#include "content/browser/renderer_host/test_render_view_host.h" |
+#include "content/browser/tab_contents/tab_contents.h" |
+#include "content/browser/tab_contents/test_tab_contents.h" |
+#include "googleurl/src/gurl.h" |
+#include "testing/gmock/include/gmock/gmock.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace safe_browsing { |
+class BrowserFeatureExtractorTest : public RenderViewHostTestHarness { |
+ protected: |
+ BrowserFeatureExtractorTest() |
+ : ui_thread_(BrowserThread::UI, &message_loop_) { |
+ } |
+ |
+ virtual void SetUp() { |
+ RenderViewHostTestHarness::SetUp(); |
+ profile_->CreateHistoryService(true /* delete_file */, false /* no_db */); |
+ extractor_.reset(new BrowserFeatureExtractor(contents())); |
+ num_pending_ = 0; |
+ } |
+ |
+ virtual void TearDown() { |
+ extractor_.reset(); |
+ profile_->DestroyHistoryService(); |
+ RenderViewHostTestHarness::TearDown(); |
+ ASSERT_EQ(0, num_pending_); |
+ } |
+ |
+ HistoryService* history_service() { |
+ return profile_->GetHistoryService(Profile::EXPLICIT_ACCESS); |
+ } |
+ |
+ bool ExtractFeatures(ClientPhishingRequest* request) { |
+ StartExtractFeatures(request); |
+ MessageLoop::current()->Run(); |
+ EXPECT_EQ(1U, success_.count(request)); |
+ return success_.count(request) ? success_[request] : false; |
+ } |
+ |
+ void StartExtractFeatures(ClientPhishingRequest* request) { |
+ success_.erase(request); |
+ ++num_pending_; |
+ extractor_->ExtractFeatures( |
+ request, |
+ NewCallback(this, |
+ &BrowserFeatureExtractorTest::ExtractFeaturesDone)); |
+ } |
+ |
+ BrowserThread ui_thread_; |
+ int num_pending_; |
+ scoped_ptr<BrowserFeatureExtractor> extractor_; |
+ std::map<ClientPhishingRequest*, bool> success_; |
+ |
+ private: |
+ void ExtractFeaturesDone(bool success, ClientPhishingRequest* request) { |
+ ASSERT_EQ(0U, success_.count(request)); |
+ success_[request] = success; |
+ if (--num_pending_ == 0) { |
+ MessageLoop::current()->Quit(); |
+ } |
+ } |
+}; |
+ |
+TEST_F(BrowserFeatureExtractorTest, UrlNotInHistory) { |
+ ClientPhishingRequest request; |
+ request.set_url("http://www.google.com/"); |
+ request.set_client_score(0.5); |
+ EXPECT_FALSE(ExtractFeatures(&request)); |
+} |
+ |
+TEST_F(BrowserFeatureExtractorTest, RequestNotInitialized) { |
+ ClientPhishingRequest request; |
+ request.set_url("http://www.google.com/"); |
+ // Request is missing the score value. |
+ EXPECT_FALSE(ExtractFeatures(&request)); |
+} |
+ |
+TEST_F(BrowserFeatureExtractorTest, UrlInHistory) { |
+ history_service()->AddPage(GURL("http://www.foo.com/bar.html"), |
+ history::SOURCE_BROWSED); |
+ history_service()->AddPage(GURL("https://www.foo.com/gaa.html"), |
+ history::SOURCE_BROWSED); // same host HTTPS. |
+ history_service()->AddPage(GURL("http://www.foo.com/gaa.html"), |
+ history::SOURCE_BROWSED); // same host HTTP. |
+ history_service()->AddPage(GURL("http://bar.foo.com/gaa.html"), |
+ history::SOURCE_BROWSED); // different host. |
+ history_service()->AddPage(GURL("http://www.foo.com/bar.html?a=b"), |
+ base::Time::Now() - base::TimeDelta::FromHours(23), |
+ NULL, 0, GURL(), PageTransition::LINK, |
+ history::RedirectList(), history::SOURCE_BROWSED, |
+ false); |
+ history_service()->AddPage(GURL("http://www.foo.com/bar.html"), |
+ base::Time::Now() - base::TimeDelta::FromHours(25), |
+ NULL, 0, GURL(), PageTransition::TYPED, |
+ history::RedirectList(), history::SOURCE_BROWSED, |
+ false); |
+ history_service()->AddPage(GURL("https://www.foo.com/goo.html"), |
+ base::Time::Now() - base::TimeDelta::FromDays(5), |
+ NULL, 0, GURL(), PageTransition::TYPED, |
+ history::RedirectList(), history::SOURCE_BROWSED, |
+ false); |
+ |
+ ClientPhishingRequest request; |
+ request.set_url("http://www.foo.com/bar.html"); |
+ request.set_client_score(0.5); |
+ EXPECT_TRUE(ExtractFeatures(&request)); |
+ std::map<std::string, double> features; |
+ for (int i = 0; i < request.non_model_feature_map_size(); ++i) { |
+ const ClientPhishingRequest::Feature& feature = |
+ request.non_model_feature_map(i); |
+ EXPECT_EQ(0U, features.count(feature.name())); |
+ features[feature.name()] = feature.value(); |
+ } |
+ EXPECT_EQ(8U, features.size()); |
+ EXPECT_DOUBLE_EQ(2.0, features[features::kUrlHistoryVisitCount]); |
+ EXPECT_DOUBLE_EQ(1.0, |
+ features[features::kUrlHistoryVisitCountMoreThan24hAgo]); |
+ EXPECT_DOUBLE_EQ(1.0, features[features::kUrlHistoryTypedCount]); |
+ EXPECT_DOUBLE_EQ(1.0, features[features::kUrlHistoryLinkCount]); |
+ EXPECT_DOUBLE_EQ(4.0, features[features::kHttpHostVisitCount]); |
+ EXPECT_DOUBLE_EQ(2.0, features[features::kHttpsHostVisitCount]); |
+ EXPECT_DOUBLE_EQ(1.0, features[features::kFirstHttpHostVisitMoreThan24hAgo]); |
+ EXPECT_DOUBLE_EQ(1.0, features[features::kFirstHttpsHostVisitMoreThan24hAgo]); |
+} |
+ |
+TEST_F(BrowserFeatureExtractorTest, MultipleRequestsAtOnce) { |
+ history_service()->AddPage(GURL("http://www.foo.com/bar.html"), |
+ history::SOURCE_BROWSED); |
+ ClientPhishingRequest request; |
+ request.set_url("http://www.foo.com/bar.html"); |
+ request.set_client_score(0.5); |
+ StartExtractFeatures(&request); |
+ |
+ ClientPhishingRequest request2; |
+ request2.set_url("http://www.foo.com/goo.html"); |
+ request2.set_client_score(1.0); |
+ StartExtractFeatures(&request2); |
+ |
+ MessageLoop::current()->Run(); |
+ EXPECT_TRUE(success_[&request]); |
+ // Success is false because the second URL is not in the history and we are |
+ // not able to distinguish between a missing URL in the history and an error. |
+ EXPECT_FALSE(success_[&request2]); |
+} |
+} // namespace safe_browsing |