| OLD | NEW |
| 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 <algorithm> | 5 #include <algorithm> |
| 6 #include <fstream> | 6 #include <fstream> |
| 7 | 7 |
| 8 #include "base/auto_reset.h" | 8 #include "base/auto_reset.h" |
| 9 #include "base/files/file_path.h" | 9 #include "base/files/file_path.h" |
| 10 #include "base/files/file_util.h" | 10 #include "base/files/file_util.h" |
| 11 #include "base/files/scoped_temp_dir.h" | 11 #include "base/files/scoped_temp_dir.h" |
| 12 #include "base/i18n/case_conversion.h" | 12 #include "base/i18n/case_conversion.h" |
| 13 #include "base/path_service.h" | 13 #include "base/path_service.h" |
| 14 #include "base/run_loop.h" | 14 #include "base/run_loop.h" |
| 15 #include "base/strings/string16.h" | 15 #include "base/strings/string16.h" |
| 16 #include "base/strings/string_util.h" | 16 #include "base/strings/string_util.h" |
| 17 #include "base/strings/stringprintf.h" |
| 17 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
| 18 #include "chrome/browser/autocomplete/in_memory_url_index.h" | 19 #include "chrome/browser/autocomplete/in_memory_url_index.h" |
| 19 #include "chrome/browser/autocomplete/url_index_private_data.h" | 20 #include "chrome/browser/autocomplete/url_index_private_data.h" |
| 20 #include "chrome/browser/bookmarks/bookmark_model_factory.h" | 21 #include "chrome/browser/bookmarks/bookmark_model_factory.h" |
| 21 #include "chrome/browser/history/history_service_factory.h" | 22 #include "chrome/browser/history/history_service_factory.h" |
| 22 #include "chrome/common/chrome_paths.h" | 23 #include "chrome/common/chrome_paths.h" |
| 23 #include "chrome/test/base/history_index_restore_observer.h" | 24 #include "chrome/test/base/history_index_restore_observer.h" |
| 24 #include "chrome/test/base/testing_profile.h" | 25 #include "chrome/test/base/testing_profile.h" |
| 25 #include "components/bookmarks/test/bookmark_test_helpers.h" | 26 #include "components/bookmarks/test/bookmark_test_helpers.h" |
| 26 #include "components/history/core/browser/history_backend.h" | 27 #include "components/history/core/browser/history_backend.h" |
| 27 #include "components/history/core/browser/history_database.h" | 28 #include "components/history/core/browser/history_database.h" |
| 28 #include "components/history/core/browser/history_service.h" | 29 #include "components/history/core/browser/history_service.h" |
| 29 #include "components/omnibox/in_memory_url_index_types.h" | 30 #include "components/omnibox/in_memory_url_index_types.h" |
| 31 #include "content/public/browser/browser_thread.h" |
| 30 #include "content/public/test/test_browser_thread_bundle.h" | 32 #include "content/public/test/test_browser_thread_bundle.h" |
| 31 #include "sql/transaction.h" | 33 #include "sql/transaction.h" |
| 32 #include "testing/gtest/include/gtest/gtest.h" | 34 #include "testing/gtest/include/gtest/gtest.h" |
| 33 | 35 |
| 34 using base::ASCIIToUTF16; | 36 using base::ASCIIToUTF16; |
| 35 | 37 |
| 36 // The test version of the history url database table ('url') is contained in | 38 // The test version of the history url database table ('url') is contained in |
| 37 // a database file created from a text file('url_history_provider_test.db.txt'). | 39 // a database file created from a text file('url_history_provider_test.db.txt'). |
| 38 // The only difference between this table and a live 'urls' table from a | 40 // The only difference between this table and a live 'urls' table from a |
| 39 // profile is that the last_visit_time column in the test table contains a | 41 // profile is that the last_visit_time column in the test table contains a |
| 40 // number specifying the number of days relative to 'today' to which the | 42 // number specifying the number of days relative to 'today' to which the |
| 41 // absolute time should be set during the test setup stage. | 43 // absolute time should be set during the test setup stage. |
| 42 // | 44 // |
| 43 // The format of the test database text file is of a SQLite .dump file. | 45 // The format of the test database text file is of a SQLite .dump file. |
| 44 // Note that only lines whose first character is an upper-case letter are | 46 // Note that only lines whose first character is an upper-case letter are |
| 45 // processed when creating the test database. | 47 // processed when creating the test database. |
| 46 | 48 |
| 47 namespace { | 49 namespace { |
| 48 const size_t kInvalid = base::string16::npos; | 50 const size_t kInvalid = base::string16::npos; |
| 49 const size_t kMaxMatches = 3; | 51 const size_t kMaxMatches = 3; |
| 50 const char kTestLanguages[] = "en,ja,hi,zh"; | 52 const char kTestLanguages[] = "en,ja,hi,zh"; |
| 53 const char kClientWhitelistedScheme[] = "xyz"; |
| 51 | 54 |
| 52 // Helper function to set lower case |lower_string| and |lower_terms| (words | 55 // Helper function to set lower case |lower_string| and |lower_terms| (words |
| 53 // list) based on supplied |search_string| and |cursor_position|. If | 56 // list) based on supplied |search_string| and |cursor_position|. If |
| 54 // |cursor_position| is set and useful (not at either end of the string), allow | 57 // |cursor_position| is set and useful (not at either end of the string), allow |
| 55 // the |search_string| to be broken at |cursor_position|. We do this by | 58 // the |search_string| to be broken at |cursor_position|. We do this by |
| 56 // pretending there's a space where the cursor is. |lower_terms| are obtained by | 59 // pretending there's a space where the cursor is. |lower_terms| are obtained by |
| 57 // splitting the |lower_string| on whitespace into tokens. | 60 // splitting the |lower_string| on whitespace into tokens. |
| 58 void StringToTerms(const char* search_string, | 61 void StringToTerms(const char* search_string, |
| 59 size_t cursor_position, | 62 size_t cursor_position, |
| 60 base::string16* lower_string, | 63 base::string16* lower_string, |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 129 sql::Connection& GetDB(); | 132 sql::Connection& GetDB(); |
| 130 | 133 |
| 131 // Pass-through functions to simplify our friendship with InMemoryURLIndex. | 134 // Pass-through functions to simplify our friendship with InMemoryURLIndex. |
| 132 URLIndexPrivateData* GetPrivateData() const; | 135 URLIndexPrivateData* GetPrivateData() const; |
| 133 base::CancelableTaskTracker* GetPrivateDataTracker() const; | 136 base::CancelableTaskTracker* GetPrivateDataTracker() const; |
| 134 void ClearPrivateData(); | 137 void ClearPrivateData(); |
| 135 void set_history_dir(const base::FilePath& dir_path); | 138 void set_history_dir(const base::FilePath& dir_path); |
| 136 bool GetCacheFilePath(base::FilePath* file_path) const; | 139 bool GetCacheFilePath(base::FilePath* file_path) const; |
| 137 void PostRestoreFromCacheFileTask(); | 140 void PostRestoreFromCacheFileTask(); |
| 138 void PostSaveToCacheFileTask(); | 141 void PostSaveToCacheFileTask(); |
| 139 const std::set<std::string>& scheme_whitelist(); | 142 const SchemeSet& scheme_whitelist(); |
| 140 | 143 |
| 141 | 144 |
| 142 // Pass-through functions to simplify our friendship with URLIndexPrivateData. | 145 // Pass-through functions to simplify our friendship with URLIndexPrivateData. |
| 143 bool UpdateURL(const history::URLRow& row); | 146 bool UpdateURL(const history::URLRow& row); |
| 144 bool DeleteURL(const GURL& url); | 147 bool DeleteURL(const GURL& url); |
| 145 | 148 |
| 146 // Data verification helper functions. | 149 // Data verification helper functions. |
| 147 void ExpectPrivateDataNotEmpty(const URLIndexPrivateData& data); | 150 void ExpectPrivateDataNotEmpty(const URLIndexPrivateData& data); |
| 148 void ExpectPrivateDataEmpty(const URLIndexPrivateData& data); | 151 void ExpectPrivateDataEmpty(const URLIndexPrivateData& data); |
| 149 void ExpectPrivateDataEqual(const URLIndexPrivateData& expected, | 152 void ExpectPrivateDataEqual(const URLIndexPrivateData& expected, |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 } | 192 } |
| 190 | 193 |
| 191 void InMemoryURLIndexTest::PostRestoreFromCacheFileTask() { | 194 void InMemoryURLIndexTest::PostRestoreFromCacheFileTask() { |
| 192 url_index_->PostRestoreFromCacheFileTask(); | 195 url_index_->PostRestoreFromCacheFileTask(); |
| 193 } | 196 } |
| 194 | 197 |
| 195 void InMemoryURLIndexTest::PostSaveToCacheFileTask() { | 198 void InMemoryURLIndexTest::PostSaveToCacheFileTask() { |
| 196 url_index_->PostSaveToCacheFileTask(); | 199 url_index_->PostSaveToCacheFileTask(); |
| 197 } | 200 } |
| 198 | 201 |
| 199 const std::set<std::string>& InMemoryURLIndexTest::scheme_whitelist() { | 202 const SchemeSet& InMemoryURLIndexTest::scheme_whitelist() { |
| 200 return url_index_->scheme_whitelist(); | 203 return url_index_->scheme_whitelist(); |
| 201 } | 204 } |
| 202 | 205 |
| 203 bool InMemoryURLIndexTest::UpdateURL(const history::URLRow& row) { | 206 bool InMemoryURLIndexTest::UpdateURL(const history::URLRow& row) { |
| 204 return GetPrivateData()->UpdateURL(history_service_, | 207 return GetPrivateData()->UpdateURL(history_service_, |
| 205 row, | 208 row, |
| 206 url_index_->languages_, | 209 url_index_->languages_, |
| 207 url_index_->scheme_whitelist_, | 210 url_index_->scheme_whitelist_, |
| 208 GetPrivateDataTracker()); | 211 GetPrivateDataTracker()); |
| 209 } | 212 } |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 314 base::FilePath::StringType InMemoryURLIndexTest::TestDBName() const { | 317 base::FilePath::StringType InMemoryURLIndexTest::TestDBName() const { |
| 315 return FILE_PATH_LITERAL("url_history_provider_test.db.txt"); | 318 return FILE_PATH_LITERAL("url_history_provider_test.db.txt"); |
| 316 } | 319 } |
| 317 | 320 |
| 318 bool InMemoryURLIndexTest::InitializeInMemoryURLIndexInSetUp() const { | 321 bool InMemoryURLIndexTest::InitializeInMemoryURLIndexInSetUp() const { |
| 319 return true; | 322 return true; |
| 320 } | 323 } |
| 321 | 324 |
| 322 void InMemoryURLIndexTest::InitializeInMemoryURLIndex() { | 325 void InMemoryURLIndexTest::InitializeInMemoryURLIndex() { |
| 323 DCHECK(!url_index_); | 326 DCHECK(!url_index_); |
| 324 url_index_.reset(new InMemoryURLIndex(nullptr, history_service_, | 327 |
| 325 base::FilePath(), kTestLanguages)); | 328 SchemeSet client_schemes_to_whitelist; |
| 329 client_schemes_to_whitelist.insert(kClientWhitelistedScheme); |
| 330 url_index_.reset(new InMemoryURLIndex( |
| 331 nullptr, history_service_, content::BrowserThread::GetBlockingPool(), |
| 332 base::FilePath(), kTestLanguages, client_schemes_to_whitelist)); |
| 326 url_index_->Init(); | 333 url_index_->Init(); |
| 327 url_index_->RebuildFromHistory(history_database_); | 334 url_index_->RebuildFromHistory(history_database_); |
| 328 } | 335 } |
| 329 | 336 |
| 330 void InMemoryURLIndexTest::CheckTerm( | 337 void InMemoryURLIndexTest::CheckTerm( |
| 331 const URLIndexPrivateData::SearchTermCacheMap& cache, | 338 const URLIndexPrivateData::SearchTermCacheMap& cache, |
| 332 base::string16 term) const { | 339 base::string16 term) const { |
| 333 URLIndexPrivateData::SearchTermCacheMap::const_iterator cache_iter( | 340 URLIndexPrivateData::SearchTermCacheMap::const_iterator cache_iter( |
| 334 cache.find(term)); | 341 cache.find(term)); |
| 335 ASSERT_TRUE(cache.end() != cache_iter) | 342 ASSERT_TRUE(cache.end() != cache_iter) |
| (...skipping 599 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 935 history::URLRows deleted_rows; | 942 history::URLRows deleted_rows; |
| 936 deleted_rows.push_back(matches[0].url_info); | 943 deleted_rows.push_back(matches[0].url_info); |
| 937 url_index_->OnURLsDeleted(nullptr, false, false, deleted_rows, | 944 url_index_->OnURLsDeleted(nullptr, false, false, deleted_rows, |
| 938 std::set<GURL>()); | 945 std::set<GURL>()); |
| 939 EXPECT_TRUE(url_index_->HistoryItemsForTerms(ASCIIToUTF16("DrudgeReport"), | 946 EXPECT_TRUE(url_index_->HistoryItemsForTerms(ASCIIToUTF16("DrudgeReport"), |
| 940 base::string16::npos, | 947 base::string16::npos, |
| 941 kMaxMatches).empty()); | 948 kMaxMatches).empty()); |
| 942 } | 949 } |
| 943 | 950 |
| 944 TEST_F(InMemoryURLIndexTest, WhitelistedURLs) { | 951 TEST_F(InMemoryURLIndexTest, WhitelistedURLs) { |
| 952 std::string client_whitelisted_url = |
| 953 base::StringPrintf("%s://foo", kClientWhitelistedScheme); |
| 945 struct TestData { | 954 struct TestData { |
| 946 const std::string url_spec; | 955 const std::string url_spec; |
| 947 const bool expected_is_whitelisted; | 956 const bool expected_is_whitelisted; |
| 948 } data[] = { | 957 } data[] = { |
| 949 // URLs with whitelisted schemes. | 958 // URLs with whitelisted schemes. |
| 950 { "about:histograms", true }, | 959 { "about:histograms", true }, |
| 951 { "chrome://settings", true }, | |
| 952 { "file://localhost/Users/joeschmoe/sekrets", true }, | 960 { "file://localhost/Users/joeschmoe/sekrets", true }, |
| 953 { "ftp://public.mycompany.com/myfile.txt", true }, | 961 { "ftp://public.mycompany.com/myfile.txt", true }, |
| 954 { "http://www.google.com/translate", true }, | 962 { "http://www.google.com/translate", true }, |
| 955 { "https://www.gmail.com/", true }, | 963 { "https://www.gmail.com/", true }, |
| 956 { "mailto:support@google.com", true }, | 964 { "mailto:support@google.com", true }, |
| 965 { client_whitelisted_url, true }, |
| 957 // URLs with unacceptable schemes. | 966 // URLs with unacceptable schemes. |
| 958 { "aaa://www.dummyhost.com;frammy", false }, | 967 { "aaa://www.dummyhost.com;frammy", false }, |
| 959 { "aaas://www.dummyhost.com;frammy", false }, | 968 { "aaas://www.dummyhost.com;frammy", false }, |
| 960 { "acap://suzie@somebody.com", false }, | 969 { "acap://suzie@somebody.com", false }, |
| 961 { "cap://cal.example.com/Company/Holidays", false }, | 970 { "cap://cal.example.com/Company/Holidays", false }, |
| 962 { "cid:foo4*foo1@bar.net", false }, | 971 { "cid:foo4*foo1@bar.net", false }, |
| 963 { "crid://example.com/foobar", false }, | 972 { "crid://example.com/foobar", false }, |
| 964 { "data:image/png;base64,iVBORw0KGgoAAAANSUhE=", false }, | 973 { "data:image/png;base64,iVBORw0KGgoAAAANSUhE=", false }, |
| 965 { "dict://dict.org/d:shortcake:", false }, | 974 { "dict://dict.org/d:shortcake:", false }, |
| 966 { "dns://192.168.1.1/ftp.example.org?type=A", false }, | 975 { "dns://192.168.1.1/ftp.example.org?type=A", false }, |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1008 { "tftp://example.com/mystartupfile", false }, | 1017 { "tftp://example.com/mystartupfile", false }, |
| 1009 { "tip://123.123.123.123/?urn:xopen:xid", false }, | 1018 { "tip://123.123.123.123/?urn:xopen:xid", false }, |
| 1010 { "tv:nbc.com", false }, | 1019 { "tv:nbc.com", false }, |
| 1011 { "urn:foo:A123,456", false }, | 1020 { "urn:foo:A123,456", false }, |
| 1012 { "vemmi://zeus.mctel.fr/demo", false }, | 1021 { "vemmi://zeus.mctel.fr/demo", false }, |
| 1013 { "wais://www.mydomain.net:8765/mydatabase", false }, | 1022 { "wais://www.mydomain.net:8765/mydatabase", false }, |
| 1014 { "xmpp:node@example.com", false }, | 1023 { "xmpp:node@example.com", false }, |
| 1015 { "xmpp://guest@example.com", false }, | 1024 { "xmpp://guest@example.com", false }, |
| 1016 }; | 1025 }; |
| 1017 | 1026 |
| 1018 const std::set<std::string>& whitelist(scheme_whitelist()); | 1027 const SchemeSet& whitelist(scheme_whitelist()); |
| 1019 for (size_t i = 0; i < arraysize(data); ++i) { | 1028 for (size_t i = 0; i < arraysize(data); ++i) { |
| 1020 GURL url(data[i].url_spec); | 1029 GURL url(data[i].url_spec); |
| 1021 EXPECT_EQ(data[i].expected_is_whitelisted, | 1030 EXPECT_EQ(data[i].expected_is_whitelisted, |
| 1022 URLIndexPrivateData::URLSchemeIsWhitelisted(url, whitelist)); | 1031 URLIndexPrivateData::URLSchemeIsWhitelisted(url, whitelist)); |
| 1023 } | 1032 } |
| 1024 } | 1033 } |
| 1025 | 1034 |
| 1026 TEST_F(InMemoryURLIndexTest, ReadVisitsFromHistory) { | 1035 TEST_F(InMemoryURLIndexTest, ReadVisitsFromHistory) { |
| 1027 const HistoryInfoMap& history_info_map = GetPrivateData()->history_info_map_; | 1036 const HistoryInfoMap& history_info_map = GetPrivateData()->history_info_map_; |
| 1028 | 1037 |
| (...skipping 278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1307 bool GetCacheFilePath(base::FilePath* file_path) const; | 1316 bool GetCacheFilePath(base::FilePath* file_path) const; |
| 1308 | 1317 |
| 1309 content::TestBrowserThreadBundle thread_bundle_; | 1318 content::TestBrowserThreadBundle thread_bundle_; |
| 1310 base::ScopedTempDir temp_dir_; | 1319 base::ScopedTempDir temp_dir_; |
| 1311 scoped_ptr<InMemoryURLIndex> url_index_; | 1320 scoped_ptr<InMemoryURLIndex> url_index_; |
| 1312 }; | 1321 }; |
| 1313 | 1322 |
| 1314 void InMemoryURLIndexCacheTest::SetUp() { | 1323 void InMemoryURLIndexCacheTest::SetUp() { |
| 1315 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 1324 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 1316 base::FilePath path(temp_dir_.path()); | 1325 base::FilePath path(temp_dir_.path()); |
| 1317 url_index_.reset( | 1326 url_index_.reset(new InMemoryURLIndex( |
| 1318 new InMemoryURLIndex(nullptr, nullptr, path, kTestLanguages)); | 1327 nullptr, nullptr, content::BrowserThread::GetBlockingPool(), path, |
| 1328 kTestLanguages, SchemeSet())); |
| 1319 } | 1329 } |
| 1320 | 1330 |
| 1321 void InMemoryURLIndexCacheTest::TearDown() { | 1331 void InMemoryURLIndexCacheTest::TearDown() { |
| 1322 if (url_index_) | 1332 if (url_index_) |
| 1323 url_index_->Shutdown(); | 1333 url_index_->Shutdown(); |
| 1324 } | 1334 } |
| 1325 | 1335 |
| 1326 void InMemoryURLIndexCacheTest::set_history_dir( | 1336 void InMemoryURLIndexCacheTest::set_history_dir( |
| 1327 const base::FilePath& dir_path) { | 1337 const base::FilePath& dir_path) { |
| 1328 return url_index_->set_history_dir(dir_path); | 1338 return url_index_->set_history_dir(dir_path); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1343 ASSERT_TRUE(GetCacheFilePath(&full_file_path)); | 1353 ASSERT_TRUE(GetCacheFilePath(&full_file_path)); |
| 1344 std::vector<base::FilePath::StringType> actual_parts; | 1354 std::vector<base::FilePath::StringType> actual_parts; |
| 1345 full_file_path.GetComponents(&actual_parts); | 1355 full_file_path.GetComponents(&actual_parts); |
| 1346 ASSERT_EQ(expected_parts.size(), actual_parts.size()); | 1356 ASSERT_EQ(expected_parts.size(), actual_parts.size()); |
| 1347 size_t count = expected_parts.size(); | 1357 size_t count = expected_parts.size(); |
| 1348 for (size_t i = 0; i < count; ++i) | 1358 for (size_t i = 0; i < count; ++i) |
| 1349 EXPECT_EQ(expected_parts[i], actual_parts[i]); | 1359 EXPECT_EQ(expected_parts[i], actual_parts[i]); |
| 1350 // Must clear the history_dir_ to satisfy the dtor's DCHECK. | 1360 // Must clear the history_dir_ to satisfy the dtor's DCHECK. |
| 1351 set_history_dir(base::FilePath()); | 1361 set_history_dir(base::FilePath()); |
| 1352 } | 1362 } |
| OLD | NEW |