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 <string> | 6 #include <string> |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
10 #include "base/compiler_specific.h" | 10 #include "base/compiler_specific.h" |
11 #include "base/file_util.h" | 11 #include "base/file_util.h" |
12 #include "base/files/file_path.h" | 12 #include "base/files/file_path.h" |
13 #include "base/files/scoped_temp_dir.h" | 13 #include "base/files/scoped_temp_dir.h" |
14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
15 #include "base/path_service.h" | 15 #include "base/path_service.h" |
16 #include "base/stl_util.h" | 16 #include "base/stl_util.h" |
17 #include "base/strings/string16.h" | 17 #include "base/strings/string16.h" |
18 #include "base/strings/utf_string_conversions.h" | 18 #include "base/strings/utf_string_conversions.h" |
19 #include "chrome/browser/chrome_notification_types.h" | 19 #include "chrome/browser/chrome_notification_types.h" |
20 #include "chrome/browser/history/archived_database.h" | |
21 #include "chrome/browser/history/expire_history_backend.h" | 20 #include "chrome/browser/history/expire_history_backend.h" |
22 #include "chrome/browser/history/history_database.h" | 21 #include "chrome/browser/history/history_database.h" |
23 #include "chrome/browser/history/history_notifications.h" | 22 #include "chrome/browser/history/history_notifications.h" |
24 #include "chrome/browser/history/thumbnail_database.h" | 23 #include "chrome/browser/history/thumbnail_database.h" |
25 #include "chrome/browser/history/top_sites.h" | 24 #include "chrome/browser/history/top_sites.h" |
26 #include "chrome/common/thumbnail_score.h" | 25 #include "chrome/common/thumbnail_score.h" |
27 #include "chrome/test/base/testing_profile.h" | 26 #include "chrome/test/base/testing_profile.h" |
28 #include "chrome/tools/profiles/thumbnail-inl.h" | 27 #include "chrome/tools/profiles/thumbnail-inl.h" |
29 #include "components/bookmarks/browser/bookmark_model.h" | 28 #include "components/bookmarks/browser/bookmark_model.h" |
30 #include "components/bookmarks/browser/bookmark_utils.h" | 29 #include "components/bookmarks/browser/bookmark_utils.h" |
31 #include "components/bookmarks/test/test_bookmark_client.h" | 30 #include "components/bookmarks/test/test_bookmark_client.h" |
32 #include "content/public/test/test_browser_thread.h" | 31 #include "content/public/test/test_browser_thread.h" |
33 #include "testing/gtest/include/gtest/gtest.h" | 32 #include "testing/gtest/include/gtest/gtest.h" |
34 #include "third_party/skia/include/core/SkBitmap.h" | 33 #include "third_party/skia/include/core/SkBitmap.h" |
35 #include "ui/gfx/codec/jpeg_codec.h" | 34 #include "ui/gfx/codec/jpeg_codec.h" |
36 | 35 |
37 using base::Time; | 36 using base::Time; |
38 using base::TimeDelta; | 37 using base::TimeDelta; |
39 using base::TimeTicks; | 38 using base::TimeTicks; |
40 using content::BrowserThread; | 39 using content::BrowserThread; |
41 | 40 |
42 // Filename constants. | 41 // Filename constants. |
43 static const base::FilePath::CharType kHistoryFile[] = | 42 static const base::FilePath::CharType kHistoryFile[] = |
44 FILE_PATH_LITERAL("History"); | 43 FILE_PATH_LITERAL("History"); |
45 static const base::FilePath::CharType kArchivedHistoryFile[] = | |
46 FILE_PATH_LITERAL("Archived History"); | |
47 static const base::FilePath::CharType kThumbnailFile[] = | 44 static const base::FilePath::CharType kThumbnailFile[] = |
48 FILE_PATH_LITERAL("Thumbnails"); | 45 FILE_PATH_LITERAL("Thumbnails"); |
49 | 46 |
50 // The test must be in the history namespace for the gtest forward declarations | 47 // The test must be in the history namespace for the gtest forward declarations |
51 // to work. It also eliminates a bunch of ugly "history::". | 48 // to work. It also eliminates a bunch of ugly "history::". |
52 namespace history { | 49 namespace history { |
53 | 50 |
54 // ExpireHistoryTest ----------------------------------------------------------- | 51 // ExpireHistoryTest ----------------------------------------------------------- |
55 | 52 |
56 class ExpireHistoryTest : public testing::Test, | 53 class ExpireHistoryTest : public testing::Test, |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
105 test::TestBookmarkClient bookmark_client_; | 102 test::TestBookmarkClient bookmark_client_; |
106 scoped_ptr<BookmarkModel> bookmark_model_; | 103 scoped_ptr<BookmarkModel> bookmark_model_; |
107 | 104 |
108 base::MessageLoopForUI message_loop_; | 105 base::MessageLoopForUI message_loop_; |
109 content::TestBrowserThread ui_thread_; | 106 content::TestBrowserThread ui_thread_; |
110 content::TestBrowserThread db_thread_; | 107 content::TestBrowserThread db_thread_; |
111 | 108 |
112 ExpireHistoryBackend expirer_; | 109 ExpireHistoryBackend expirer_; |
113 | 110 |
114 scoped_ptr<HistoryDatabase> main_db_; | 111 scoped_ptr<HistoryDatabase> main_db_; |
115 scoped_ptr<ArchivedDatabase> archived_db_; | |
116 scoped_ptr<ThumbnailDatabase> thumb_db_; | 112 scoped_ptr<ThumbnailDatabase> thumb_db_; |
117 TestingProfile profile_; | 113 TestingProfile profile_; |
118 scoped_refptr<TopSites> top_sites_; | 114 scoped_refptr<TopSites> top_sites_; |
119 | 115 |
120 // Time at the beginning of the test, so everybody agrees what "now" is. | 116 // Time at the beginning of the test, so everybody agrees what "now" is. |
121 const Time now_; | 117 const Time now_; |
122 | 118 |
123 // Notifications intended to be broadcast, we can check these values to make | 119 // Notifications intended to be broadcast, we can check these values to make |
124 // sure that the deletor is doing the correct broadcasts. We own the details | 120 // sure that the deletor is doing the correct broadcasts. We own the details |
125 // pointers. | 121 // pointers. |
126 typedef std::vector< std::pair<int, HistoryDetails*> > | 122 typedef std::vector< std::pair<int, HistoryDetails*> > |
127 NotificationList; | 123 NotificationList; |
128 NotificationList notifications_; | 124 NotificationList notifications_; |
129 | 125 |
130 private: | 126 private: |
131 virtual void SetUp() { | 127 virtual void SetUp() { |
132 ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir()); | 128 ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir()); |
133 | 129 |
134 base::FilePath history_name = path().Append(kHistoryFile); | 130 base::FilePath history_name = path().Append(kHistoryFile); |
135 main_db_.reset(new HistoryDatabase); | 131 main_db_.reset(new HistoryDatabase); |
136 if (main_db_->Init(history_name) != sql::INIT_OK) | 132 if (main_db_->Init(history_name) != sql::INIT_OK) |
137 main_db_.reset(); | 133 main_db_.reset(); |
138 | 134 |
139 base::FilePath archived_name = path().Append(kArchivedHistoryFile); | |
140 archived_db_.reset(new ArchivedDatabase); | |
141 if (!archived_db_->Init(archived_name)) | |
142 archived_db_.reset(); | |
143 | |
144 base::FilePath thumb_name = path().Append(kThumbnailFile); | 135 base::FilePath thumb_name = path().Append(kThumbnailFile); |
145 thumb_db_.reset(new ThumbnailDatabase); | 136 thumb_db_.reset(new ThumbnailDatabase); |
146 if (thumb_db_->Init(thumb_name) != sql::INIT_OK) | 137 if (thumb_db_->Init(thumb_name) != sql::INIT_OK) |
147 thumb_db_.reset(); | 138 thumb_db_.reset(); |
148 | 139 |
149 expirer_.SetDatabases(main_db_.get(), archived_db_.get(), thumb_db_.get()); | 140 expirer_.SetDatabases(main_db_.get(), thumb_db_.get()); |
150 profile_.CreateTopSites(); | 141 profile_.CreateTopSites(); |
151 profile_.BlockUntilTopSitesLoaded(); | 142 profile_.BlockUntilTopSitesLoaded(); |
152 top_sites_ = profile_.GetTopSites(); | 143 top_sites_ = profile_.GetTopSites(); |
153 } | 144 } |
154 | 145 |
155 virtual void TearDown() { | 146 virtual void TearDown() { |
156 top_sites_ = NULL; | 147 top_sites_ = NULL; |
157 | 148 |
158 ClearLastNotifications(); | 149 ClearLastNotifications(); |
159 | 150 |
160 expirer_.SetDatabases(NULL, NULL, NULL); | 151 expirer_.SetDatabases(NULL, NULL); |
161 | 152 |
162 main_db_.reset(); | 153 main_db_.reset(); |
163 archived_db_.reset(); | |
164 thumb_db_.reset(); | 154 thumb_db_.reset(); |
165 } | 155 } |
166 | 156 |
167 // BroadcastNotificationDelegate: | 157 // BroadcastNotificationDelegate: |
168 virtual void BroadcastNotifications( | 158 virtual void BroadcastNotifications( |
169 int type, | 159 int type, |
170 scoped_ptr<HistoryDetails> details) OVERRIDE { | 160 scoped_ptr<HistoryDetails> details) OVERRIDE { |
171 // This gets called when there are notifications to broadcast. Instead, we | 161 // This gets called when there are notifications to broadcast. Instead, we |
172 // store them so we can tell that the correct notifications were sent. | 162 // store them so we can tell that the correct notifications were sent. |
173 notifications_.push_back(std::make_pair(type, details.release())); | 163 notifications_.push_back(std::make_pair(type, details.release())); |
174 } | 164 } |
175 virtual void NotifySyncURLsModified(URLRows* rows) OVERRIDE {} | 165 virtual void NotifySyncURLsModified(URLRows* rows) OVERRIDE {} |
176 virtual void NotifySyncURLsDeleted(bool all_history, | 166 virtual void NotifySyncURLsDeleted(bool all_history, |
177 bool archived, | 167 bool expired, |
178 URLRows* rows) OVERRIDE {} | 168 URLRows* rows) OVERRIDE {} |
179 }; | 169 }; |
180 | 170 |
181 // The example data consists of 4 visits. The middle two visits are to the | 171 // The example data consists of 4 visits. The middle two visits are to the |
182 // same URL, while the first and last are for unique ones. This allows a test | 172 // same URL, while the first and last are for unique ones. This allows a test |
183 // for the oldest or newest to include both a URL that should get totally | 173 // for the oldest or newest to include both a URL that should get totally |
184 // deleted (the one on the end) with one that should only get a visit deleted | 174 // deleted (the one on the end) with one that should only get a visit deleted |
185 // (with the one in the middle) when it picks the proper threshold time. | 175 // (with the one in the middle) when it picks the proper threshold time. |
186 // | 176 // |
187 // Each visit has indexed data, each URL has thumbnail. The first two URLs will | 177 // Each visit has indexed data, each URL has thumbnail. The first two URLs will |
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 // TODO(sky): fix this. This test isn't really valid for TopSites. For | 303 // TODO(sky): fix this. This test isn't really valid for TopSites. For |
314 // TopSites we should be checking URL always, not the id. | 304 // TopSites we should be checking URL always, not the id. |
315 URLRow info; | 305 URLRow info; |
316 if (!main_db_->GetURLRow(url_id, &info)) | 306 if (!main_db_->GetURLRow(url_id, &info)) |
317 return false; | 307 return false; |
318 GURL url = info.url(); | 308 GURL url = info.url(); |
319 scoped_refptr<base::RefCountedMemory> data; | 309 scoped_refptr<base::RefCountedMemory> data; |
320 return top_sites_->GetPageThumbnail(url, false, &data); | 310 return top_sites_->GetPageThumbnail(url, false, &data); |
321 } | 311 } |
322 | 312 |
323 void ExpireHistoryTest::EnsureURLInfoGone(const URLRow& row, bool archived) { | 313 void ExpireHistoryTest::EnsureURLInfoGone(const URLRow& row, bool expired) { |
324 // The passed in |row| must originate from |main_db_| so that its ID will be | 314 // The passed in |row| must originate from |main_db_| so that its ID will be |
325 // set to what had been in effect in |main_db_| before the deletion. | 315 // set to what had been in effect in |main_db_| before the deletion. |
326 ASSERT_NE(0, row.id()); | 316 ASSERT_NE(0, row.id()); |
327 | 317 |
328 // Verify the URL no longer exists. | 318 // Verify the URL no longer exists. |
329 URLRow temp_row; | 319 URLRow temp_row; |
330 EXPECT_FALSE(main_db_->GetURLRow(row.id(), &temp_row)); | 320 EXPECT_FALSE(main_db_->GetURLRow(row.id(), &temp_row)); |
331 | 321 |
332 // There should be no visits. | 322 // There should be no visits. |
333 VisitVector visits; | 323 VisitVector visits; |
334 main_db_->GetVisitsForURL(row.id(), &visits); | 324 main_db_->GetVisitsForURL(row.id(), &visits); |
335 EXPECT_EQ(0U, visits.size()); | 325 EXPECT_EQ(0U, visits.size()); |
336 | 326 |
337 // Thumbnail should be gone. | 327 // Thumbnail should be gone. |
338 // TODO(sky): fix this, see comment in HasThumbnail. | 328 // TODO(sky): fix this, see comment in HasThumbnail. |
339 // EXPECT_FALSE(HasThumbnail(row.id())); | 329 // EXPECT_FALSE(HasThumbnail(row.id())); |
340 | 330 |
341 bool found_delete_notification = false; | 331 bool found_delete_notification = false; |
342 for (size_t i = 0; i < notifications_.size(); i++) { | 332 for (size_t i = 0; i < notifications_.size(); i++) { |
343 if (notifications_[i].first == chrome::NOTIFICATION_HISTORY_URLS_DELETED) { | 333 if (notifications_[i].first == chrome::NOTIFICATION_HISTORY_URLS_DELETED) { |
344 URLsDeletedDetails* details = reinterpret_cast<URLsDeletedDetails*>( | 334 URLsDeletedDetails* details = reinterpret_cast<URLsDeletedDetails*>( |
345 notifications_[i].second); | 335 notifications_[i].second); |
346 EXPECT_EQ(archived, details->archived); | 336 EXPECT_EQ(expired, details->expired); |
347 const history::URLRows& rows(details->rows); | 337 const history::URLRows& rows(details->rows); |
348 history::URLRows::const_iterator it_row = std::find_if( | 338 history::URLRows::const_iterator it_row = std::find_if( |
349 rows.begin(), rows.end(), history::URLRow::URLRowHasURL(row.url())); | 339 rows.begin(), rows.end(), history::URLRow::URLRowHasURL(row.url())); |
350 if (it_row != rows.end()) { | 340 if (it_row != rows.end()) { |
351 // Further verify that the ID is set to what had been in effect in the | 341 // Further verify that the ID is set to what had been in effect in the |
352 // main database before the deletion. The InMemoryHistoryBackend relies | 342 // main database before the deletion. The InMemoryHistoryBackend relies |
353 // on this to delete its cached copy of the row. | 343 // on this to delete its cached copy of the row. |
354 EXPECT_EQ(row.id(), it_row->id()); | 344 EXPECT_EQ(row.id(), it_row->id()); |
355 found_delete_notification = true; | 345 found_delete_notification = true; |
356 } | 346 } |
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
760 GetFavicon(url_row1.url(), favicon_base::FAVICON); | 750 GetFavicon(url_row1.url(), favicon_base::FAVICON); |
761 EXPECT_TRUE(HasFavicon(favicon_id)); | 751 EXPECT_TRUE(HasFavicon(favicon_id)); |
762 // TODO(sky): fix this, see comment in HasThumbnail. | 752 // TODO(sky): fix this, see comment in HasThumbnail. |
763 // EXPECT_TRUE(HasThumbnail(new_url_row1.id())); | 753 // EXPECT_TRUE(HasThumbnail(new_url_row1.id())); |
764 favicon_id = GetFavicon(url_row1.url(), favicon_base::FAVICON); | 754 favicon_id = GetFavicon(url_row1.url(), favicon_base::FAVICON); |
765 EXPECT_TRUE(HasFavicon(favicon_id)); | 755 EXPECT_TRUE(HasFavicon(favicon_id)); |
766 // TODO(sky): fix this, see comment in HasThumbnail. | 756 // TODO(sky): fix this, see comment in HasThumbnail. |
767 // EXPECT_TRUE(HasThumbnail(new_url_row2.id())); | 757 // EXPECT_TRUE(HasThumbnail(new_url_row2.id())); |
768 } | 758 } |
769 | 759 |
770 TEST_F(ExpireHistoryTest, ArchiveHistoryBeforeUnstarred) { | 760 TEST_F(ExpireHistoryTest, ExpireHistoryBeforeUnstarred) { |
771 URLID url_ids[3]; | 761 URLID url_ids[3]; |
772 Time visit_times[4]; | 762 Time visit_times[4]; |
773 AddExampleData(url_ids, visit_times); | 763 AddExampleData(url_ids, visit_times); |
774 | 764 |
775 URLRow url_row0, url_row1, url_row2; | 765 URLRow url_row0, url_row1, url_row2; |
776 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &url_row0)); | 766 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &url_row0)); |
777 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &url_row1)); | 767 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &url_row1)); |
778 ASSERT_TRUE(main_db_->GetURLRow(url_ids[2], &url_row2)); | 768 ASSERT_TRUE(main_db_->GetURLRow(url_ids[2], &url_row2)); |
779 | 769 |
780 // Archive the oldest two visits. This will actually result in deleting them | 770 // Expire the oldest two visits. |
781 // since their transition types are empty. | 771 expirer_.ExpireHistoryBefore(visit_times[1]); |
782 expirer_.ArchiveHistoryBefore(visit_times[1]); | |
783 | 772 |
784 // The first URL should be deleted, the second should not. | 773 // The first URL should be deleted along with its sole visit. The second URL |
| 774 // itself should not be affected, as there is still one more visit to it, but |
| 775 // its first visit should be deleted. |
785 URLRow temp_row; | 776 URLRow temp_row; |
786 EnsureURLInfoGone(url_row0, true); | 777 EnsureURLInfoGone(url_row0, true); |
787 EXPECT_TRUE(main_db_->GetURLRow(url_ids[1], &temp_row)); | 778 EXPECT_TRUE(main_db_->GetURLRow(url_ids[1], &temp_row)); |
788 EXPECT_TRUE(ModifiedNotificationSent(url_row1.url())); | 779 EXPECT_TRUE(ModifiedNotificationSent(url_row1.url())); |
| 780 VisitVector visits; |
| 781 main_db_->GetVisitsForURL(temp_row.id(), &visits); |
| 782 EXPECT_EQ(1U, visits.size()); |
| 783 EXPECT_EQ(visit_times[2], visits[0].visit_time); |
789 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); | 784 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); |
790 | 785 |
791 // Make sure the archived database has nothing in it. | 786 // Now expire one more visit so that the second URL should be removed. The |
792 EXPECT_FALSE(archived_db_->GetRowForURL(url_row1.url(), NULL)); | 787 // third URL and its visit should be intact. |
793 EXPECT_FALSE(archived_db_->GetRowForURL(url_row2.url(), NULL)); | |
794 | |
795 // Now archive one more visit so that the middle URL should be removed. This | |
796 // one will actually be archived instead of deleted. | |
797 ClearLastNotifications(); | 788 ClearLastNotifications(); |
798 expirer_.ArchiveHistoryBefore(visit_times[2]); | 789 expirer_.ExpireHistoryBefore(visit_times[2]); |
799 EnsureURLInfoGone(url_row1, true); | 790 EnsureURLInfoGone(url_row1, true); |
800 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); | 791 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); |
801 | 792 main_db_->GetVisitsForURL(temp_row.id(), &visits); |
802 // Make sure the archived database has an entry for the second URL. | 793 EXPECT_EQ(1U, visits.size()); |
803 URLRow archived_row; | |
804 // Note that the ID is different in the archived DB, so look up by URL. | |
805 EXPECT_TRUE(archived_db_->GetRowForURL(url_row1.url(), &archived_row)); | |
806 VisitVector archived_visits; | |
807 archived_db_->GetVisitsForURL(archived_row.id(), &archived_visits); | |
808 EXPECT_EQ(1U, archived_visits.size()); | |
809 } | 794 } |
810 | 795 |
811 TEST_F(ExpireHistoryTest, ArchiveHistoryBeforeStarred) { | 796 TEST_F(ExpireHistoryTest, ExpireHistoryBeforeStarred) { |
812 URLID url_ids[3]; | 797 URLID url_ids[3]; |
813 Time visit_times[4]; | 798 Time visit_times[4]; |
814 AddExampleData(url_ids, visit_times); | 799 AddExampleData(url_ids, visit_times); |
815 | 800 |
816 URLRow url_row0, url_row1; | 801 URLRow url_row0, url_row1; |
817 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &url_row0)); | 802 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &url_row0)); |
818 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &url_row1)); | 803 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &url_row1)); |
819 | 804 |
820 // Star the URLs. | 805 // Star the URLs. |
821 StarURL(url_row0.url()); | 806 StarURL(url_row0.url()); |
822 StarURL(url_row1.url()); | 807 StarURL(url_row1.url()); |
823 | 808 |
824 // Now archive the first three visits (first two URLs). The first two visits | 809 // Now expire the first three visits (first two URLs). The first three visits |
825 // should be deleted, the third archived. | 810 // should be deleted, but the URL records themselves should not, as they are |
826 expirer_.ArchiveHistoryBefore(visit_times[2]); | 811 // starred. |
| 812 expirer_.ExpireHistoryBefore(visit_times[2]); |
827 | 813 |
828 // The first URL should have its visit deleted, but it should still be present | |
829 // in the main DB and not in the archived one since it is starred. | |
830 URLRow temp_row; | 814 URLRow temp_row; |
831 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &temp_row)); | 815 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &temp_row)); |
832 // Note that the ID is different in the archived DB, so look up by URL. | |
833 EXPECT_FALSE(archived_db_->GetRowForURL(temp_row.url(), NULL)); | |
834 EXPECT_TRUE(ModifiedNotificationSent(url_row0.url())); | 816 EXPECT_TRUE(ModifiedNotificationSent(url_row0.url())); |
835 VisitVector visits; | 817 VisitVector visits; |
836 main_db_->GetVisitsForURL(temp_row.id(), &visits); | 818 main_db_->GetVisitsForURL(temp_row.id(), &visits); |
837 EXPECT_EQ(0U, visits.size()); | 819 EXPECT_EQ(0U, visits.size()); |
838 | 820 |
839 // The second URL should have its first visit deleted and its second visit | |
840 // archived. It should be present in both the main DB (because it's starred) | |
841 // and the archived DB (for the archived visit). | |
842 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &temp_row)); | 821 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &temp_row)); |
843 EXPECT_TRUE(ModifiedNotificationSent(url_row1.url())); | 822 EXPECT_TRUE(ModifiedNotificationSent(url_row1.url())); |
844 main_db_->GetVisitsForURL(temp_row.id(), &visits); | 823 main_db_->GetVisitsForURL(temp_row.id(), &visits); |
845 EXPECT_EQ(0U, visits.size()); | 824 EXPECT_EQ(0U, visits.size()); |
846 | 825 |
847 // Note that the ID is different in the archived DB, so look up by URL. | |
848 ASSERT_TRUE(archived_db_->GetRowForURL(temp_row.url(), &temp_row)); | |
849 archived_db_->GetVisitsForURL(temp_row.id(), &visits); | |
850 ASSERT_EQ(1U, visits.size()); | |
851 EXPECT_TRUE(visit_times[2] == visits[0].visit_time); | |
852 | |
853 // The third URL should be unchanged. | 826 // The third URL should be unchanged. |
854 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); | 827 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); |
855 EXPECT_FALSE(archived_db_->GetRowForURL(temp_row.url(), NULL)); | |
856 EXPECT_FALSE(ModifiedNotificationSent(temp_row.url())); | 828 EXPECT_FALSE(ModifiedNotificationSent(temp_row.url())); |
| 829 main_db_->GetVisitsForURL(temp_row.id(), &visits); |
| 830 EXPECT_EQ(1U, visits.size()); |
857 } | 831 } |
858 | 832 |
859 // Tests the return values from ArchiveSomeOldHistory. The rest of the | 833 // Tests the return values from ExpireSomeOldHistory. The rest of the |
860 // functionality of this function is tested by the ArchiveHistoryBefore* | 834 // functionality of this function is tested by the ExpireHistoryBefore* |
861 // tests which use this function internally. | 835 // tests which use this function internally. |
862 TEST_F(ExpireHistoryTest, ArchiveSomeOldHistory) { | 836 TEST_F(ExpireHistoryTest, ExpireSomeOldHistory) { |
863 URLID url_ids[3]; | 837 URLID url_ids[3]; |
864 Time visit_times[4]; | 838 Time visit_times[4]; |
865 AddExampleData(url_ids, visit_times); | 839 AddExampleData(url_ids, visit_times); |
866 const ExpiringVisitsReader* reader = expirer_.GetAllVisitsReader(); | 840 const ExpiringVisitsReader* reader = expirer_.GetAllVisitsReader(); |
867 | 841 |
868 // Deleting a time range with no URLs should return false (nothing found). | 842 // Deleting a time range with no URLs should return false (nothing found). |
869 EXPECT_FALSE(expirer_.ArchiveSomeOldHistory( | 843 EXPECT_FALSE(expirer_.ExpireSomeOldHistory( |
870 visit_times[0] - TimeDelta::FromDays(100), reader, 1)); | 844 visit_times[0] - TimeDelta::FromDays(100), reader, 1)); |
871 | 845 |
872 // Deleting a time range with not up the the max results should also return | 846 // Deleting a time range with not up the the max results should also return |
873 // false (there will only be one visit deleted in this range). | 847 // false (there will only be one visit deleted in this range). |
874 EXPECT_FALSE(expirer_.ArchiveSomeOldHistory(visit_times[0], reader, 2)); | 848 EXPECT_FALSE(expirer_.ExpireSomeOldHistory(visit_times[0], reader, 2)); |
875 | 849 |
876 // Deleting a time range with the max number of results should return true | 850 // Deleting a time range with the max number of results should return true |
877 // (max deleted). | 851 // (max deleted). |
878 EXPECT_TRUE(expirer_.ArchiveSomeOldHistory(visit_times[2], reader, 1)); | 852 EXPECT_TRUE(expirer_.ExpireSomeOldHistory(visit_times[2], reader, 1)); |
879 } | 853 } |
880 | 854 |
881 TEST_F(ExpireHistoryTest, ExpiringVisitsReader) { | 855 TEST_F(ExpireHistoryTest, ExpiringVisitsReader) { |
882 URLID url_ids[3]; | 856 URLID url_ids[3]; |
883 Time visit_times[4]; | 857 Time visit_times[4]; |
884 AddExampleData(url_ids, visit_times); | 858 AddExampleData(url_ids, visit_times); |
885 | 859 |
886 const ExpiringVisitsReader* all = expirer_.GetAllVisitsReader(); | 860 const ExpiringVisitsReader* all = expirer_.GetAllVisitsReader(); |
887 const ExpiringVisitsReader* auto_subframes = | 861 const ExpiringVisitsReader* auto_subframes = |
888 expirer_.GetAutoSubframeVisitsReader(); | 862 expirer_.GetAutoSubframeVisitsReader(); |
(...skipping 12 matching lines...) Expand all Loading... |
901 | 875 |
902 // Verify that the early expiration threshold was updated, since there are no | 876 // Verify that the early expiration threshold was updated, since there are no |
903 // AUTO_SUBFRAME visits in the given time range. | 877 // AUTO_SUBFRAME visits in the given time range. |
904 EXPECT_TRUE(now <= main_db_->GetEarlyExpirationThreshold()); | 878 EXPECT_TRUE(now <= main_db_->GetEarlyExpirationThreshold()); |
905 | 879 |
906 // Now, read all visits and verify that there's at least one. | 880 // Now, read all visits and verify that there's at least one. |
907 EXPECT_TRUE(all->Read(now, main_db_.get(), &visits, 1)); | 881 EXPECT_TRUE(all->Read(now, main_db_.get(), &visits, 1)); |
908 EXPECT_EQ(1U, visits.size()); | 882 EXPECT_EQ(1U, visits.size()); |
909 } | 883 } |
910 | 884 |
911 // Tests how ArchiveSomeOldHistory treats source information. | |
912 TEST_F(ExpireHistoryTest, ArchiveSomeOldHistoryWithSource) { | |
913 const GURL url("www.testsource.com"); | |
914 URLID url_id; | |
915 AddExampleSourceData(url, &url_id); | |
916 const ExpiringVisitsReader* reader = expirer_.GetAllVisitsReader(); | |
917 | |
918 // Archiving all the visits we added. | |
919 ASSERT_FALSE(expirer_.ArchiveSomeOldHistory(Time::Now(), reader, 10)); | |
920 | |
921 URLRow archived_row; | |
922 ASSERT_TRUE(archived_db_->GetRowForURL(url, &archived_row)); | |
923 VisitVector archived_visits; | |
924 archived_db_->GetVisitsForURL(archived_row.id(), &archived_visits); | |
925 ASSERT_EQ(4U, archived_visits.size()); | |
926 VisitSourceMap sources; | |
927 archived_db_->GetVisitsSource(archived_visits, &sources); | |
928 ASSERT_EQ(3U, sources.size()); | |
929 int result = 0; | |
930 VisitSourceMap::iterator iter; | |
931 for (int i = 0; i < 4; i++) { | |
932 iter = sources.find(archived_visits[i].visit_id); | |
933 if (iter == sources.end()) | |
934 continue; | |
935 switch (iter->second) { | |
936 case history::SOURCE_EXTENSION: | |
937 result |= 0x1; | |
938 break; | |
939 case history::SOURCE_FIREFOX_IMPORTED: | |
940 result |= 0x2; | |
941 break; | |
942 case history::SOURCE_SYNCED: | |
943 result |= 0x4; | |
944 default: | |
945 break; | |
946 } | |
947 } | |
948 EXPECT_EQ(0x7, result); | |
949 main_db_->GetVisitsSource(archived_visits, &sources); | |
950 EXPECT_EQ(0U, sources.size()); | |
951 main_db_->GetVisitsForURL(url_id, &archived_visits); | |
952 EXPECT_EQ(0U, archived_visits.size()); | |
953 } | |
954 | |
955 // TODO(brettw) add some visits with no URL to make sure everything is updated | 885 // TODO(brettw) add some visits with no URL to make sure everything is updated |
956 // properly. Have the visits also refer to nonexistent FTS rows. | 886 // properly. Have the visits also refer to nonexistent FTS rows. |
957 // | 887 // |
958 // Maybe also refer to invalid favicons. | 888 // Maybe also refer to invalid favicons. |
959 | 889 |
960 } // namespace history | 890 } // namespace history |
OLD | NEW |