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 "chrome/browser/history/history_backend.h" | 5 #include "chrome/browser/history/history_backend.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 #include <set> | 8 #include <set> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 rows.push_back(*row3); | 82 rows.push_back(*row3); |
83 | 83 |
84 base::Time visit_time; | 84 base::Time visit_time; |
85 history::RedirectList redirects; | 85 history::RedirectList redirects; |
86 for (const auto& row : rows) { | 86 for (const auto& row : rows) { |
87 observer->OnURLVisited( | 87 observer->OnURLVisited( |
88 nullptr, ui::PAGE_TRANSITION_LINK, row, redirects, visit_time); | 88 nullptr, ui::PAGE_TRANSITION_LINK, row, redirects, visit_time); |
89 } | 89 } |
90 } | 90 } |
91 | 91 |
| 92 void SimulateNotificationURLsModified(history::HistoryServiceObserver* observer, |
| 93 const history::URLRow* row1, |
| 94 const history::URLRow* row2, |
| 95 const history::URLRow* row3) { |
| 96 history::URLRows rows; |
| 97 rows.push_back(*row1); |
| 98 if (row2) |
| 99 rows.push_back(*row2); |
| 100 if (row3) |
| 101 rows.push_back(*row3); |
| 102 |
| 103 observer->OnURLsModified(nullptr, rows); |
| 104 } |
| 105 |
92 } // namespace | 106 } // namespace |
93 | 107 |
94 namespace history { | 108 namespace history { |
95 | 109 |
96 class HistoryBackendTestBase; | 110 class HistoryBackendTestBase; |
97 | 111 |
98 // This must be a separate object since HistoryBackend manages its lifetime. | 112 // This must be a separate object since HistoryBackend manages its lifetime. |
99 // This just forwards the messages we're interested in to the test object. | 113 // This just forwards the messages we're interested in to the test object. |
100 class HistoryBackendTestDelegate : public HistoryBackend::Delegate { | 114 class HistoryBackendTestDelegate : public HistoryBackend::Delegate { |
101 public: | 115 public: |
102 explicit HistoryBackendTestDelegate(HistoryBackendTestBase* test) | 116 explicit HistoryBackendTestDelegate(HistoryBackendTestBase* test) |
103 : test_(test) {} | 117 : test_(test) {} |
104 | 118 |
105 void NotifyProfileError(sql::InitStatus init_status) override {} | 119 void NotifyProfileError(sql::InitStatus init_status) override {} |
106 void SetInMemoryBackend(scoped_ptr<InMemoryHistoryBackend> backend) override; | 120 void SetInMemoryBackend(scoped_ptr<InMemoryHistoryBackend> backend) override; |
107 void NotifyAddVisit(const BriefVisitInfo& info) override {} | 121 void NotifyAddVisit(const BriefVisitInfo& info) override {} |
108 void NotifyFaviconChanged(const std::set<GURL>& urls) override; | 122 void NotifyFaviconChanged(const std::set<GURL>& urls) override; |
109 void NotifyURLVisited(ui::PageTransition transition, | 123 void NotifyURLVisited(ui::PageTransition transition, |
110 const URLRow& row, | 124 const URLRow& row, |
111 const RedirectList& redirects, | 125 const RedirectList& redirects, |
112 base::Time visit_time) override; | 126 base::Time visit_time) override; |
| 127 void NotifyURLsModified(const URLRows& changed_urls) override; |
113 void BroadcastNotifications(int type, | 128 void BroadcastNotifications(int type, |
114 scoped_ptr<HistoryDetails> details) override; | 129 scoped_ptr<HistoryDetails> details) override; |
115 void DBLoaded() override; | 130 void DBLoaded() override; |
116 | 131 |
117 private: | 132 private: |
118 // Not owned by us. | 133 // Not owned by us. |
119 HistoryBackendTestBase* test_; | 134 HistoryBackendTestBase* test_; |
120 | 135 |
121 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestDelegate); | 136 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestDelegate); |
122 }; | 137 }; |
123 | 138 |
124 class HistoryBackendTestBase : public testing::Test { | 139 class HistoryBackendTestBase : public testing::Test { |
125 public: | 140 public: |
126 typedef std::vector<std::pair<int, HistoryDetails*> > NotificationList; | 141 typedef std::vector<std::pair<int, HistoryDetails*> > NotificationList; |
127 typedef std::vector<std::pair<ui::PageTransition, URLRow>> URLVisitedList; | 142 typedef std::vector<std::pair<ui::PageTransition, URLRow>> URLVisitedList; |
| 143 typedef std::vector<URLRows> URLsModifiedList; |
128 | 144 |
129 HistoryBackendTestBase() | 145 HistoryBackendTestBase() |
130 : loaded_(false), | 146 : loaded_(false), |
131 favicon_changed_notifications_(0), | 147 favicon_changed_notifications_(0), |
132 ui_thread_(content::BrowserThread::UI, &message_loop_) {} | 148 ui_thread_(content::BrowserThread::UI, &message_loop_) {} |
133 | 149 |
134 ~HistoryBackendTestBase() override { | 150 ~HistoryBackendTestBase() override { |
135 STLDeleteValues(&broadcasted_notifications_); | 151 STLDeleteValues(&broadcasted_notifications_); |
136 } | 152 } |
137 | 153 |
138 protected: | 154 protected: |
139 int favicon_changed_notifications() const { | 155 int favicon_changed_notifications() const { |
140 return favicon_changed_notifications_; | 156 return favicon_changed_notifications_; |
141 } | 157 } |
142 | 158 |
143 void ClearFaviconChangedNotificationCounter() { | 159 void ClearFaviconChangedNotificationCounter() { |
144 favicon_changed_notifications_ = 0; | 160 favicon_changed_notifications_ = 0; |
145 } | 161 } |
146 | 162 |
147 int num_url_visited_notifications() const { | 163 int num_url_visited_notifications() const { |
148 return url_visited_notifications_.size(); | 164 return url_visited_notifications_.size(); |
149 } | 165 } |
150 | 166 |
151 const URLVisitedList& url_visited_notifications() const { | 167 const URLVisitedList& url_visited_notifications() const { |
152 return url_visited_notifications_; | 168 return url_visited_notifications_; |
153 } | 169 } |
154 | 170 |
| 171 int num_urls_modified_notifications() const { |
| 172 return urls_modified_notifications_.size(); |
| 173 } |
| 174 |
| 175 const URLsModifiedList& urls_modified_notifications() const { |
| 176 return urls_modified_notifications_; |
| 177 } |
| 178 |
155 int num_broadcasted_notifications() const { | 179 int num_broadcasted_notifications() const { |
156 return broadcasted_notifications_.size(); | 180 return broadcasted_notifications_.size(); |
157 } | 181 } |
158 | 182 |
159 const NotificationList& broadcasted_notifications() const { | 183 const NotificationList& broadcasted_notifications() const { |
160 return broadcasted_notifications_; | 184 return broadcasted_notifications_; |
161 } | 185 } |
162 | 186 |
163 void ClearBroadcastedNotifications() { | 187 void ClearBroadcastedNotifications() { |
164 url_visited_notifications_.clear(); | 188 url_visited_notifications_.clear(); |
| 189 urls_modified_notifications_.clear(); |
165 STLDeleteValues(&broadcasted_notifications_); | 190 STLDeleteValues(&broadcasted_notifications_); |
166 } | 191 } |
167 | 192 |
168 base::FilePath test_dir() { | 193 base::FilePath test_dir() { |
169 return test_dir_; | 194 return test_dir_; |
170 } | 195 } |
171 | 196 |
172 void NotifyFaviconChanged(const std::set<GURL>& changed_favicons) { | 197 void NotifyFaviconChanged(const std::set<GURL>& changed_favicons) { |
173 ++favicon_changed_notifications_; | 198 ++favicon_changed_notifications_; |
174 } | 199 } |
175 | 200 |
176 void NotifyURLVisited(ui::PageTransition transition, | 201 void NotifyURLVisited(ui::PageTransition transition, |
177 const URLRow& row, | 202 const URLRow& row, |
178 const RedirectList& redirects, | 203 const RedirectList& redirects, |
179 base::Time visit_time) { | 204 base::Time visit_time) { |
| 205 // Send the notifications directly to the in-memory database. |
| 206 mem_backend_->OnURLVisited(nullptr, transition, row, redirects, visit_time); |
180 url_visited_notifications_.push_back(std::make_pair(transition, row)); | 207 url_visited_notifications_.push_back(std::make_pair(transition, row)); |
181 } | 208 } |
182 | 209 |
| 210 void NotifyURLsModified(const URLRows& changed_urls) { |
| 211 // Send the notifications directly to the in-memory database. |
| 212 mem_backend_->OnURLsModified(nullptr, changed_urls); |
| 213 urls_modified_notifications_.push_back(changed_urls); |
| 214 } |
| 215 |
183 void BroadcastNotifications(int type, scoped_ptr<HistoryDetails> details) { | 216 void BroadcastNotifications(int type, scoped_ptr<HistoryDetails> details) { |
184 // Send the notifications directly to the in-memory database. | 217 // Send the notifications directly to the in-memory database. |
185 content::Details<HistoryDetails> det(details.get()); | 218 content::Details<HistoryDetails> det(details.get()); |
186 mem_backend_->Observe( | 219 mem_backend_->Observe( |
187 type, content::Source<HistoryBackendTestBase>(NULL), det); | 220 type, content::Source<HistoryBackendTestBase>(NULL), det); |
188 | 221 |
189 // The backend passes ownership of the details pointer to us. | 222 // The backend passes ownership of the details pointer to us. |
190 broadcasted_notifications_.push_back( | 223 broadcasted_notifications_.push_back( |
191 std::make_pair(type, details.release())); | 224 std::make_pair(type, details.release())); |
192 } | 225 } |
(...skipping 28 matching lines...) Expand all Loading... |
221 } | 254 } |
222 | 255 |
223 void SetInMemoryBackend(scoped_ptr<InMemoryHistoryBackend> backend) { | 256 void SetInMemoryBackend(scoped_ptr<InMemoryHistoryBackend> backend) { |
224 mem_backend_.swap(backend); | 257 mem_backend_.swap(backend); |
225 } | 258 } |
226 | 259 |
227 // The types and details of notifications which were broadcasted. | 260 // The types and details of notifications which were broadcasted. |
228 NotificationList broadcasted_notifications_; | 261 NotificationList broadcasted_notifications_; |
229 int favicon_changed_notifications_; | 262 int favicon_changed_notifications_; |
230 URLVisitedList url_visited_notifications_; | 263 URLVisitedList url_visited_notifications_; |
| 264 URLsModifiedList urls_modified_notifications_; |
231 | 265 |
232 base::MessageLoop message_loop_; | 266 base::MessageLoop message_loop_; |
233 base::FilePath test_dir_; | 267 base::FilePath test_dir_; |
234 content::TestBrowserThread ui_thread_; | 268 content::TestBrowserThread ui_thread_; |
235 | 269 |
236 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestBase); | 270 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTestBase); |
237 }; | 271 }; |
238 | 272 |
239 void HistoryBackendTestDelegate::SetInMemoryBackend( | 273 void HistoryBackendTestDelegate::SetInMemoryBackend( |
240 scoped_ptr<InMemoryHistoryBackend> backend) { | 274 scoped_ptr<InMemoryHistoryBackend> backend) { |
241 test_->SetInMemoryBackend(backend.Pass()); | 275 test_->SetInMemoryBackend(backend.Pass()); |
242 } | 276 } |
243 | 277 |
244 void HistoryBackendTestDelegate::NotifyFaviconChanged( | 278 void HistoryBackendTestDelegate::NotifyFaviconChanged( |
245 const std::set<GURL>& changed_favicons) { | 279 const std::set<GURL>& changed_favicons) { |
246 test_->NotifyFaviconChanged(changed_favicons); | 280 test_->NotifyFaviconChanged(changed_favicons); |
247 } | 281 } |
248 | 282 |
249 void HistoryBackendTestDelegate::NotifyURLVisited(ui::PageTransition transition, | 283 void HistoryBackendTestDelegate::NotifyURLVisited(ui::PageTransition transition, |
250 const URLRow& row, | 284 const URLRow& row, |
251 const RedirectList& redirects, | 285 const RedirectList& redirects, |
252 base::Time visit_time) { | 286 base::Time visit_time) { |
253 test_->NotifyURLVisited(transition, row, redirects, visit_time); | 287 test_->NotifyURLVisited(transition, row, redirects, visit_time); |
254 } | 288 } |
255 | 289 |
| 290 void HistoryBackendTestDelegate::NotifyURLsModified( |
| 291 const URLRows& changed_urls) { |
| 292 test_->NotifyURLsModified(changed_urls); |
| 293 } |
| 294 |
256 void HistoryBackendTestDelegate::BroadcastNotifications( | 295 void HistoryBackendTestDelegate::BroadcastNotifications( |
257 int type, | 296 int type, |
258 scoped_ptr<HistoryDetails> details) { | 297 scoped_ptr<HistoryDetails> details) { |
259 test_->BroadcastNotifications(type, details.Pass()); | 298 test_->BroadcastNotifications(type, details.Pass()); |
260 } | 299 } |
261 | 300 |
262 void HistoryBackendTestDelegate::DBLoaded() { | 301 void HistoryBackendTestDelegate::DBLoaded() { |
263 test_->loaded_ = true; | 302 test_->loaded_ = true; |
264 } | 303 } |
265 | 304 |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
418 | 457 |
419 private: | 458 private: |
420 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTest); | 459 DISALLOW_COPY_AND_ASSIGN(HistoryBackendTest); |
421 }; | 460 }; |
422 | 461 |
423 class InMemoryHistoryBackendTest : public HistoryBackendTestBase { | 462 class InMemoryHistoryBackendTest : public HistoryBackendTestBase { |
424 public: | 463 public: |
425 InMemoryHistoryBackendTest() {} | 464 InMemoryHistoryBackendTest() {} |
426 ~InMemoryHistoryBackendTest() override {} | 465 ~InMemoryHistoryBackendTest() override {} |
427 | 466 |
428 // Public so that the method can be bound in test fixture using | 467 protected: |
429 // base::Bind(&InMemoryHistoryBackendTest::SimulateNotification, ...). | |
430 void SimulateNotification(int type, | 468 void SimulateNotification(int type, |
431 const URLRow* row1, | 469 const URLRow* row1, |
432 const URLRow* row2 = NULL, | 470 const URLRow* row2 = NULL, |
433 const URLRow* row3 = NULL) { | 471 const URLRow* row3 = NULL) { |
| 472 DCHECK(type == chrome::NOTIFICATION_HISTORY_URLS_DELETED); |
| 473 |
434 URLRows rows; | 474 URLRows rows; |
435 rows.push_back(*row1); | 475 rows.push_back(*row1); |
436 if (row2) rows.push_back(*row2); | 476 if (row2) rows.push_back(*row2); |
437 if (row3) rows.push_back(*row3); | 477 if (row3) rows.push_back(*row3); |
438 | 478 |
439 if (type == chrome::NOTIFICATION_HISTORY_URLS_MODIFIED) { | 479 scoped_ptr<URLsDeletedDetails> details(new URLsDeletedDetails()); |
440 scoped_ptr<URLsModifiedDetails> details(new URLsModifiedDetails()); | 480 details->rows = rows; |
441 details->changed_urls.swap(rows); | 481 BroadcastNotifications(type, details.Pass()); |
442 BroadcastNotifications(type, details.Pass()); | |
443 } else if (type == chrome::NOTIFICATION_HISTORY_URLS_DELETED) { | |
444 scoped_ptr<URLsDeletedDetails> details(new URLsDeletedDetails()); | |
445 details->rows = rows; | |
446 BroadcastNotifications(type, details.Pass()); | |
447 } else { | |
448 NOTREACHED(); | |
449 } | |
450 } | 482 } |
451 | 483 |
452 protected: | |
453 size_t GetNumberOfMatchingSearchTerms(const int keyword_id, | 484 size_t GetNumberOfMatchingSearchTerms(const int keyword_id, |
454 const base::string16& prefix) { | 485 const base::string16& prefix) { |
455 std::vector<KeywordSearchTermVisit> matching_terms; | 486 std::vector<KeywordSearchTermVisit> matching_terms; |
456 mem_backend_->db()->GetMostRecentKeywordSearchTerms( | 487 mem_backend_->db()->GetMostRecentKeywordSearchTerms( |
457 keyword_id, prefix, 1, &matching_terms); | 488 keyword_id, prefix, 1, &matching_terms); |
458 return matching_terms.size(); | 489 return matching_terms.size(); |
459 } | 490 } |
460 | 491 |
461 static URLRow CreateTestTypedURL() { | 492 static URLRow CreateTestTypedURL() { |
462 URLRow url_row(GURL("https://www.google.com/")); | 493 URLRow url_row(GURL("https://www.google.com/")); |
(...skipping 449 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
912 URLRow stored_row1, stored_row2, stored_row3, stored_row4; | 943 URLRow stored_row1, stored_row2, stored_row3, stored_row4; |
913 EXPECT_NE(0, backend_->db_->GetRowForURL(row1.url(), &stored_row1)); | 944 EXPECT_NE(0, backend_->db_->GetRowForURL(row1.url(), &stored_row1)); |
914 EXPECT_NE(0, backend_->db_->GetRowForURL(row2.url(), &stored_row2)); | 945 EXPECT_NE(0, backend_->db_->GetRowForURL(row2.url(), &stored_row2)); |
915 EXPECT_NE(0, backend_->db_->GetRowForURL(row3.url(), &stored_row3)); | 946 EXPECT_NE(0, backend_->db_->GetRowForURL(row3.url(), &stored_row3)); |
916 EXPECT_EQ(0, backend_->db_->GetRowForURL(row4.url(), &stored_row4)); | 947 EXPECT_EQ(0, backend_->db_->GetRowForURL(row4.url(), &stored_row4)); |
917 | 948 |
918 // Ensure that a notification was fired for both typed and non-typed URLs. | 949 // Ensure that a notification was fired for both typed and non-typed URLs. |
919 // Further verify that the IDs in the notification are set to those that are | 950 // Further verify that the IDs in the notification are set to those that are |
920 // in effect in the main database. The InMemoryHistoryBackend relies on this | 951 // in effect in the main database. The InMemoryHistoryBackend relies on this |
921 // for caching. | 952 // for caching. |
922 ASSERT_EQ(1u, broadcasted_notifications().size()); | 953 ASSERT_EQ(1, num_urls_modified_notifications()); |
923 ASSERT_EQ(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, | |
924 broadcasted_notifications()[0].first); | |
925 const URLsModifiedDetails* details = static_cast<const URLsModifiedDetails*>( | |
926 broadcasted_notifications()[0].second); | |
927 EXPECT_EQ(3u, details->changed_urls.size()); | |
928 | 954 |
929 URLRows::const_iterator it_row1 = std::find_if( | 955 const URLRows& changed_urls = urls_modified_notifications()[0]; |
930 details->changed_urls.begin(), | 956 EXPECT_EQ(3u, changed_urls.size()); |
931 details->changed_urls.end(), | 957 |
932 history::URLRow::URLRowHasURL(row1.url())); | 958 URLRows::const_iterator it_row1 = |
933 ASSERT_NE(details->changed_urls.end(), it_row1); | 959 std::find_if(changed_urls.begin(), |
| 960 changed_urls.end(), |
| 961 history::URLRow::URLRowHasURL(row1.url())); |
| 962 ASSERT_NE(changed_urls.end(), it_row1); |
934 EXPECT_EQ(stored_row1.id(), it_row1->id()); | 963 EXPECT_EQ(stored_row1.id(), it_row1->id()); |
935 | 964 |
936 URLRows::const_iterator it_row2 = std::find_if( | 965 URLRows::const_iterator it_row2 = |
937 details->changed_urls.begin(), | 966 std::find_if(changed_urls.begin(), |
938 details->changed_urls.end(), | 967 changed_urls.end(), |
939 history::URLRow::URLRowHasURL(row2.url())); | 968 history::URLRow::URLRowHasURL(row2.url())); |
940 ASSERT_NE(details->changed_urls.end(), it_row2); | 969 ASSERT_NE(changed_urls.end(), it_row2); |
941 EXPECT_EQ(stored_row2.id(), it_row2->id()); | 970 EXPECT_EQ(stored_row2.id(), it_row2->id()); |
942 | 971 |
943 URLRows::const_iterator it_row3 = std::find_if( | 972 URLRows::const_iterator it_row3 = |
944 details->changed_urls.begin(), | 973 std::find_if(changed_urls.begin(), |
945 details->changed_urls.end(), | 974 changed_urls.end(), |
946 history::URLRow::URLRowHasURL(row3.url())); | 975 history::URLRow::URLRowHasURL(row3.url())); |
947 ASSERT_NE(details->changed_urls.end(), it_row3); | 976 ASSERT_NE(changed_urls.end(), it_row3); |
948 EXPECT_EQ(stored_row3.id(), it_row3->id()); | 977 EXPECT_EQ(stored_row3.id(), it_row3->id()); |
949 } | 978 } |
950 | 979 |
951 TEST_F(HistoryBackendTest, UpdateURLs) { | 980 TEST_F(HistoryBackendTest, UpdateURLs) { |
952 ASSERT_TRUE(backend_.get()); | 981 ASSERT_TRUE(backend_.get()); |
953 | 982 |
954 // Add three pages directly to the database. | 983 // Add three pages directly to the database. |
955 URLRow row1(GURL("https://news.google.com/")); | 984 URLRow row1(GURL("https://news.google.com/")); |
956 row1.set_visit_count(1); | 985 row1.set_visit_count(1); |
957 row1.set_last_visit(Time::Now()); | 986 row1.set_last_visit(Time::Now()); |
(...skipping 30 matching lines...) Expand all Loading... |
988 | 1017 |
989 URLRow stored_row1, stored_row3; | 1018 URLRow stored_row1, stored_row3; |
990 EXPECT_NE(0, backend_->db_->GetRowForURL(row1.url(), &stored_row1)); | 1019 EXPECT_NE(0, backend_->db_->GetRowForURL(row1.url(), &stored_row1)); |
991 EXPECT_NE(0, backend_->db_->GetRowForURL(row3.url(), &stored_row3)); | 1020 EXPECT_NE(0, backend_->db_->GetRowForURL(row3.url(), &stored_row3)); |
992 EXPECT_EQ(altered_row1.visit_count(), stored_row1.visit_count()); | 1021 EXPECT_EQ(altered_row1.visit_count(), stored_row1.visit_count()); |
993 EXPECT_EQ(altered_row3.visit_count(), stored_row3.visit_count()); | 1022 EXPECT_EQ(altered_row3.visit_count(), stored_row3.visit_count()); |
994 | 1023 |
995 // Ensure that a notification was fired, and further verify that the IDs in | 1024 // Ensure that a notification was fired, and further verify that the IDs in |
996 // the notification are set to those that are in effect in the main database. | 1025 // the notification are set to those that are in effect in the main database. |
997 // The InMemoryHistoryBackend relies on this for caching. | 1026 // The InMemoryHistoryBackend relies on this for caching. |
998 ASSERT_EQ(1u, broadcasted_notifications().size()); | 1027 ASSERT_EQ(1, num_urls_modified_notifications()); |
999 ASSERT_EQ(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, | 1028 |
1000 broadcasted_notifications()[0].first); | 1029 const URLRows& changed_urls = urls_modified_notifications()[0]; |
1001 const URLsModifiedDetails* details = static_cast<const URLsModifiedDetails*>( | 1030 EXPECT_EQ(2u, changed_urls.size()); |
1002 broadcasted_notifications()[0].second); | |
1003 EXPECT_EQ(2u, details->changed_urls.size()); | |
1004 | 1031 |
1005 URLRows::const_iterator it_row1 = | 1032 URLRows::const_iterator it_row1 = |
1006 std::find_if(details->changed_urls.begin(), | 1033 std::find_if(changed_urls.begin(), |
1007 details->changed_urls.end(), | 1034 changed_urls.end(), |
1008 history::URLRow::URLRowHasURL(row1.url())); | 1035 history::URLRow::URLRowHasURL(row1.url())); |
1009 ASSERT_NE(details->changed_urls.end(), it_row1); | 1036 ASSERT_NE(changed_urls.end(), it_row1); |
1010 EXPECT_EQ(altered_row1.id(), it_row1->id()); | 1037 EXPECT_EQ(altered_row1.id(), it_row1->id()); |
1011 EXPECT_EQ(altered_row1.visit_count(), it_row1->visit_count()); | 1038 EXPECT_EQ(altered_row1.visit_count(), it_row1->visit_count()); |
1012 | 1039 |
1013 URLRows::const_iterator it_row3 = | 1040 URLRows::const_iterator it_row3 = |
1014 std::find_if(details->changed_urls.begin(), | 1041 std::find_if(changed_urls.begin(), |
1015 details->changed_urls.end(), | 1042 changed_urls.end(), |
1016 history::URLRow::URLRowHasURL(row3.url())); | 1043 history::URLRow::URLRowHasURL(row3.url())); |
1017 ASSERT_NE(details->changed_urls.end(), it_row3); | 1044 ASSERT_NE(changed_urls.end(), it_row3); |
1018 EXPECT_EQ(altered_row3.id(), it_row3->id()); | 1045 EXPECT_EQ(altered_row3.id(), it_row3->id()); |
1019 EXPECT_EQ(altered_row3.visit_count(), it_row3->visit_count()); | 1046 EXPECT_EQ(altered_row3.visit_count(), it_row3->visit_count()); |
1020 } | 1047 } |
1021 | 1048 |
1022 // This verifies that a notification is fired. In-depth testing of logic should | 1049 // This verifies that a notification is fired. In-depth testing of logic should |
1023 // be done in HistoryTest.SetTitle. | 1050 // be done in HistoryTest.SetTitle. |
1024 TEST_F(HistoryBackendTest, SetPageTitleFiresNotificationWithCorrectDetails) { | 1051 TEST_F(HistoryBackendTest, SetPageTitleFiresNotificationWithCorrectDetails) { |
1025 const char kTestUrlTitle[] = "Google Search"; | 1052 const char kTestUrlTitle[] = "Google Search"; |
1026 | 1053 |
1027 ASSERT_TRUE(backend_.get()); | 1054 ASSERT_TRUE(backend_.get()); |
(...skipping 12 matching lines...) Expand all Loading... |
1040 backend_->AddPagesWithDetails(rows, history::SOURCE_BROWSED); | 1067 backend_->AddPagesWithDetails(rows, history::SOURCE_BROWSED); |
1041 | 1068 |
1042 ClearBroadcastedNotifications(); | 1069 ClearBroadcastedNotifications(); |
1043 backend_->SetPageTitle(row2.url(), base::UTF8ToUTF16(kTestUrlTitle)); | 1070 backend_->SetPageTitle(row2.url(), base::UTF8ToUTF16(kTestUrlTitle)); |
1044 | 1071 |
1045 // Ensure that a notification was fired, and further verify that the IDs in | 1072 // Ensure that a notification was fired, and further verify that the IDs in |
1046 // the notification are set to those that are in effect in the main database. | 1073 // the notification are set to those that are in effect in the main database. |
1047 // The InMemoryHistoryBackend relies on this for caching. | 1074 // The InMemoryHistoryBackend relies on this for caching. |
1048 URLRow stored_row2; | 1075 URLRow stored_row2; |
1049 EXPECT_TRUE(backend_->GetURL(row2.url(), &stored_row2)); | 1076 EXPECT_TRUE(backend_->GetURL(row2.url(), &stored_row2)); |
1050 ASSERT_EQ(1u, broadcasted_notifications().size()); | 1077 ASSERT_EQ(1, num_urls_modified_notifications()); |
1051 ASSERT_EQ(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, | 1078 |
1052 broadcasted_notifications()[0].first); | 1079 const URLRows& changed_urls = urls_modified_notifications()[0]; |
1053 const URLsModifiedDetails* details = static_cast<const URLsModifiedDetails*>( | 1080 ASSERT_EQ(1u, changed_urls.size()); |
1054 broadcasted_notifications()[0].second); | 1081 EXPECT_EQ(base::UTF8ToUTF16(kTestUrlTitle), changed_urls[0].title()); |
1055 ASSERT_EQ(1u, details->changed_urls.size()); | 1082 EXPECT_EQ(stored_row2.id(), changed_urls[0].id()); |
1056 EXPECT_EQ(base::UTF8ToUTF16(kTestUrlTitle), details->changed_urls[0].title()); | |
1057 EXPECT_EQ(stored_row2.id(), details->changed_urls[0].id()); | |
1058 } | 1083 } |
1059 | 1084 |
1060 // There's no importer on Android. | 1085 // There's no importer on Android. |
1061 #if !defined(OS_ANDROID) | 1086 #if !defined(OS_ANDROID) |
1062 TEST_F(HistoryBackendTest, ImportedFaviconsTest) { | 1087 TEST_F(HistoryBackendTest, ImportedFaviconsTest) { |
1063 // Setup test data - two Urls in the history, one with favicon assigned and | 1088 // Setup test data - two Urls in the history, one with favicon assigned and |
1064 // one without. | 1089 // one without. |
1065 GURL favicon_url1("http://www.google.com/favicon.ico"); | 1090 GURL favicon_url1("http://www.google.com/favicon.ico"); |
1066 std::vector<unsigned char> data; | 1091 std::vector<unsigned char> data; |
1067 data.push_back('1'); | 1092 data.push_back('1'); |
(...skipping 2018 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3086 // The in-memory database should stop caching the first URLRow, and start | 3111 // The in-memory database should stop caching the first URLRow, and start |
3087 // caching the second URLRow. | 3112 // caching the second URLRow. |
3088 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row1.url(), &cached_row1)); | 3113 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row1.url(), &cached_row1)); |
3089 EXPECT_NE(0, mem_backend_->db()->GetRowForURL(row2.url(), &cached_row2)); | 3114 EXPECT_NE(0, mem_backend_->db()->GetRowForURL(row2.url(), &cached_row2)); |
3090 EXPECT_EQ(row2.id(), cached_row2.id()); | 3115 EXPECT_EQ(row2.id(), cached_row2.id()); |
3091 EXPECT_EQ(base::UTF8ToUTF16(kTestNonTypedURLAlternativeTitle), | 3116 EXPECT_EQ(base::UTF8ToUTF16(kTestNonTypedURLAlternativeTitle), |
3092 cached_row2.title()); | 3117 cached_row2.title()); |
3093 } | 3118 } |
3094 | 3119 |
3095 TEST_F(InMemoryHistoryBackendTest, OnURLsModified) { | 3120 TEST_F(InMemoryHistoryBackendTest, OnURLsModified) { |
3096 TestAddingAndChangingURLRows( | 3121 TestAddingAndChangingURLRows(base::Bind( |
3097 base::Bind(&InMemoryHistoryBackendTest::SimulateNotification, | 3122 &SimulateNotificationURLsModified, base::Unretained(mem_backend_.get()))); |
3098 base::Unretained(this), | |
3099 chrome::NOTIFICATION_HISTORY_URLS_MODIFIED)); | |
3100 } | 3123 } |
3101 | 3124 |
3102 TEST_F(InMemoryHistoryBackendTest, OnURLsVisisted) { | 3125 TEST_F(InMemoryHistoryBackendTest, OnURLsVisisted) { |
3103 TestAddingAndChangingURLRows(base::Bind( | 3126 TestAddingAndChangingURLRows(base::Bind( |
3104 &SimulateNotificationURLVisited, base::Unretained(mem_backend_.get()))); | 3127 &SimulateNotificationURLVisited, base::Unretained(mem_backend_.get()))); |
3105 } | 3128 } |
3106 | 3129 |
3107 TEST_F(InMemoryHistoryBackendTest, OnURLsDeletedPiecewise) { | 3130 TEST_F(InMemoryHistoryBackendTest, OnURLsDeletedPiecewise) { |
3108 // Add two typed and one non-typed URLRow to the in-memory database. | 3131 // Add two typed and one non-typed URLRow to the in-memory database. |
3109 URLRow row1(CreateTestTypedURL()); | 3132 URLRow row1(CreateTestTypedURL()); |
3110 URLRow row2(CreateAnotherTestTypedURL()); | 3133 URLRow row2(CreateAnotherTestTypedURL()); |
3111 URLRow row3(CreateTestNonTypedURL()); | 3134 URLRow row3(CreateTestNonTypedURL()); |
3112 SimulateNotification(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, | 3135 SimulateNotificationURLsModified(mem_backend_.get(), &row1, &row2, &row3); |
3113 &row1, &row2, &row3); | |
3114 | 3136 |
3115 // Notify the in-memory database that the second typed URL and the non-typed | 3137 // Notify the in-memory database that the second typed URL and the non-typed |
3116 // URL has been deleted. | 3138 // URL has been deleted. |
3117 SimulateNotification(chrome::NOTIFICATION_HISTORY_URLS_DELETED, | 3139 SimulateNotification(chrome::NOTIFICATION_HISTORY_URLS_DELETED, |
3118 &row2, &row3); | 3140 &row2, &row3); |
3119 | 3141 |
3120 // Expect that the first typed URL remains intact, the second typed URL is | 3142 // Expect that the first typed URL remains intact, the second typed URL is |
3121 // correctly removed, and the non-typed URL does not magically appear. | 3143 // correctly removed, and the non-typed URL does not magically appear. |
3122 URLRow cached_row1; | 3144 URLRow cached_row1; |
3123 EXPECT_NE(0, mem_backend_->db()->GetRowForURL(row1.url(), &cached_row1)); | 3145 EXPECT_NE(0, mem_backend_->db()->GetRowForURL(row1.url(), &cached_row1)); |
3124 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row2.url(), NULL)); | 3146 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row2.url(), NULL)); |
3125 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row3.url(), NULL)); | 3147 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row3.url(), NULL)); |
3126 EXPECT_EQ(row1.id(), cached_row1.id()); | 3148 EXPECT_EQ(row1.id(), cached_row1.id()); |
3127 } | 3149 } |
3128 | 3150 |
3129 TEST_F(InMemoryHistoryBackendTest, OnURLsDeletedEnMasse) { | 3151 TEST_F(InMemoryHistoryBackendTest, OnURLsDeletedEnMasse) { |
3130 // Add two typed and one non-typed URLRow to the in-memory database. | 3152 // Add two typed and one non-typed URLRow to the in-memory database. |
3131 URLRow row1(CreateTestTypedURL()); | 3153 URLRow row1(CreateTestTypedURL()); |
3132 URLRow row2(CreateAnotherTestTypedURL()); | 3154 URLRow row2(CreateAnotherTestTypedURL()); |
3133 URLRow row3(CreateTestNonTypedURL()); | 3155 URLRow row3(CreateTestNonTypedURL()); |
3134 SimulateNotification(chrome::NOTIFICATION_HISTORY_URLS_MODIFIED, | 3156 SimulateNotificationURLsModified(mem_backend_.get(), &row1, &row2, &row3); |
3135 &row1, &row2, &row3); | |
3136 | 3157 |
3137 // Now notify the in-memory database that all history has been deleted. | 3158 // Now notify the in-memory database that all history has been deleted. |
3138 scoped_ptr<URLsDeletedDetails> details(new URLsDeletedDetails()); | 3159 scoped_ptr<URLsDeletedDetails> details(new URLsDeletedDetails()); |
3139 details->all_history = true; | 3160 details->all_history = true; |
3140 BroadcastNotifications(chrome::NOTIFICATION_HISTORY_URLS_DELETED, | 3161 BroadcastNotifications(chrome::NOTIFICATION_HISTORY_URLS_DELETED, |
3141 details.Pass()); | 3162 details.Pass()); |
3142 | 3163 |
3143 // Expect that everything goes away. | 3164 // Expect that everything goes away. |
3144 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row1.url(), NULL)); | 3165 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row1.url(), NULL)); |
3145 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row2.url(), NULL)); | 3166 EXPECT_EQ(0, mem_backend_->db()->GetRowForURL(row2.url(), NULL)); |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3253 // Verify that the second term is no longer returned as result, and also check | 3274 // Verify that the second term is no longer returned as result, and also check |
3254 // at the low level that it is gone for good. The term corresponding to the | 3275 // at the low level that it is gone for good. The term corresponding to the |
3255 // first URLRow should not be affected. | 3276 // first URLRow should not be affected. |
3256 EXPECT_EQ(1u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term1)); | 3277 EXPECT_EQ(1u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term1)); |
3257 EXPECT_EQ(0u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term2)); | 3278 EXPECT_EQ(0u, GetNumberOfMatchingSearchTerms(kTestKeywordId, term2)); |
3258 EXPECT_TRUE(mem_backend_->db()->GetKeywordSearchTermRow(row1.id(), NULL)); | 3279 EXPECT_TRUE(mem_backend_->db()->GetKeywordSearchTermRow(row1.id(), NULL)); |
3259 EXPECT_FALSE(mem_backend_->db()->GetKeywordSearchTermRow(row2.id(), NULL)); | 3280 EXPECT_FALSE(mem_backend_->db()->GetKeywordSearchTermRow(row2.id(), NULL)); |
3260 } | 3281 } |
3261 | 3282 |
3262 } // namespace history | 3283 } // namespace history |
OLD | NEW |