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

Side by Side Diff: chrome/browser/history/expire_history_backend_unittest.cc

Issue 235863023: Eliminate the archived history database and clean up related code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 8 months 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 <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/bookmarks/bookmark_model.h" 19 #include "chrome/browser/bookmarks/bookmark_model.h"
20 #include "chrome/browser/bookmarks/bookmark_utils.h" 20 #include "chrome/browser/bookmarks/bookmark_utils.h"
21 #include "chrome/browser/chrome_notification_types.h" 21 #include "chrome/browser/chrome_notification_types.h"
22 #include "chrome/browser/history/archived_database.h"
23 #include "chrome/browser/history/expire_history_backend.h" 22 #include "chrome/browser/history/expire_history_backend.h"
24 #include "chrome/browser/history/history_database.h" 23 #include "chrome/browser/history/history_database.h"
25 #include "chrome/browser/history/history_notifications.h" 24 #include "chrome/browser/history/history_notifications.h"
26 #include "chrome/browser/history/thumbnail_database.h" 25 #include "chrome/browser/history/thumbnail_database.h"
27 #include "chrome/browser/history/top_sites.h" 26 #include "chrome/browser/history/top_sites.h"
28 #include "chrome/common/thumbnail_score.h" 27 #include "chrome/common/thumbnail_score.h"
29 #include "chrome/test/base/testing_profile.h" 28 #include "chrome/test/base/testing_profile.h"
30 #include "chrome/tools/profiles/thumbnail-inl.h" 29 #include "chrome/tools/profiles/thumbnail-inl.h"
31 #include "content/public/test/test_browser_thread.h" 30 #include "content/public/test/test_browser_thread.h"
32 #include "testing/gtest/include/gtest/gtest.h" 31 #include "testing/gtest/include/gtest/gtest.h"
33 #include "third_party/skia/include/core/SkBitmap.h" 32 #include "third_party/skia/include/core/SkBitmap.h"
34 #include "ui/gfx/codec/jpeg_codec.h" 33 #include "ui/gfx/codec/jpeg_codec.h"
35 34
36 using base::Time; 35 using base::Time;
37 using base::TimeDelta; 36 using base::TimeDelta;
38 using base::TimeTicks; 37 using base::TimeTicks;
39 using content::BrowserThread; 38 using content::BrowserThread;
40 39
41 // Filename constants. 40 // Filename constants.
42 static const base::FilePath::CharType kHistoryFile[] = 41 static const base::FilePath::CharType kHistoryFile[] =
43 FILE_PATH_LITERAL("History"); 42 FILE_PATH_LITERAL("History");
44 static const base::FilePath::CharType kArchivedHistoryFile[] =
45 FILE_PATH_LITERAL("Archived History");
46 static const base::FilePath::CharType kThumbnailFile[] = 43 static const base::FilePath::CharType kThumbnailFile[] =
47 FILE_PATH_LITERAL("Thumbnails"); 44 FILE_PATH_LITERAL("Thumbnails");
48 45
49 // The test must be in the history namespace for the gtest forward declarations 46 // The test must be in the history namespace for the gtest forward declarations
50 // to work. It also eliminates a bunch of ugly "history::". 47 // to work. It also eliminates a bunch of ugly "history::".
51 namespace history { 48 namespace history {
52 49
53 // ExpireHistoryTest ----------------------------------------------------------- 50 // ExpireHistoryTest -----------------------------------------------------------
54 51
55 class ExpireHistoryTest : public testing::Test, 52 class ExpireHistoryTest : public testing::Test,
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
100 97
101 BookmarkModel bookmark_model_; 98 BookmarkModel bookmark_model_;
102 99
103 base::MessageLoopForUI message_loop_; 100 base::MessageLoopForUI message_loop_;
104 content::TestBrowserThread ui_thread_; 101 content::TestBrowserThread ui_thread_;
105 content::TestBrowserThread db_thread_; 102 content::TestBrowserThread db_thread_;
106 103
107 ExpireHistoryBackend expirer_; 104 ExpireHistoryBackend expirer_;
108 105
109 scoped_ptr<HistoryDatabase> main_db_; 106 scoped_ptr<HistoryDatabase> main_db_;
110 scoped_ptr<ArchivedDatabase> archived_db_;
111 scoped_ptr<ThumbnailDatabase> thumb_db_; 107 scoped_ptr<ThumbnailDatabase> thumb_db_;
112 TestingProfile profile_; 108 TestingProfile profile_;
113 scoped_refptr<TopSites> top_sites_; 109 scoped_refptr<TopSites> top_sites_;
114 110
115 // Time at the beginning of the test, so everybody agrees what "now" is. 111 // Time at the beginning of the test, so everybody agrees what "now" is.
116 const Time now_; 112 const Time now_;
117 113
118 // Notifications intended to be broadcast, we can check these values to make 114 // Notifications intended to be broadcast, we can check these values to make
119 // sure that the deletor is doing the correct broadcasts. We own the details 115 // sure that the deletor is doing the correct broadcasts. We own the details
120 // pointers. 116 // pointers.
121 typedef std::vector< std::pair<int, HistoryDetails*> > 117 typedef std::vector< std::pair<int, HistoryDetails*> >
122 NotificationList; 118 NotificationList;
123 NotificationList notifications_; 119 NotificationList notifications_;
124 120
125 private: 121 private:
126 virtual void SetUp() { 122 virtual void SetUp() {
127 ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir()); 123 ASSERT_TRUE(tmp_dir_.CreateUniqueTempDir());
128 124
129 base::FilePath history_name = path().Append(kHistoryFile); 125 base::FilePath history_name = path().Append(kHistoryFile);
130 main_db_.reset(new HistoryDatabase); 126 main_db_.reset(new HistoryDatabase);
131 if (main_db_->Init(history_name) != sql::INIT_OK) 127 if (main_db_->Init(history_name) != sql::INIT_OK)
132 main_db_.reset(); 128 main_db_.reset();
133 129
134 base::FilePath archived_name = path().Append(kArchivedHistoryFile);
135 archived_db_.reset(new ArchivedDatabase);
136 if (!archived_db_->Init(archived_name))
137 archived_db_.reset();
138
139 base::FilePath thumb_name = path().Append(kThumbnailFile); 130 base::FilePath thumb_name = path().Append(kThumbnailFile);
140 thumb_db_.reset(new ThumbnailDatabase); 131 thumb_db_.reset(new ThumbnailDatabase);
141 if (thumb_db_->Init(thumb_name) != sql::INIT_OK) 132 if (thumb_db_->Init(thumb_name) != sql::INIT_OK)
142 thumb_db_.reset(); 133 thumb_db_.reset();
143 134
144 expirer_.SetDatabases(main_db_.get(), archived_db_.get(), thumb_db_.get()); 135 expirer_.SetDatabases(main_db_.get(), thumb_db_.get());
145 profile_.CreateTopSites(); 136 profile_.CreateTopSites();
146 profile_.BlockUntilTopSitesLoaded(); 137 profile_.BlockUntilTopSitesLoaded();
147 top_sites_ = profile_.GetTopSites(); 138 top_sites_ = profile_.GetTopSites();
148 } 139 }
149 140
150 virtual void TearDown() { 141 virtual void TearDown() {
151 top_sites_ = NULL; 142 top_sites_ = NULL;
152 143
153 ClearLastNotifications(); 144 ClearLastNotifications();
154 145
155 expirer_.SetDatabases(NULL, NULL, NULL); 146 expirer_.SetDatabases(NULL, NULL);
156 147
157 main_db_.reset(); 148 main_db_.reset();
158 archived_db_.reset();
159 thumb_db_.reset(); 149 thumb_db_.reset();
160 } 150 }
161 151
162 // BroadcastNotificationDelegate implementation. 152 // BroadcastNotificationDelegate implementation.
163 virtual void BroadcastNotifications( 153 virtual void BroadcastNotifications(
164 int type, 154 int type,
165 scoped_ptr<HistoryDetails> details) OVERRIDE { 155 scoped_ptr<HistoryDetails> details) OVERRIDE {
166 // This gets called when there are notifications to broadcast. Instead, we 156 // This gets called when there are notifications to broadcast. Instead, we
167 // store them so we can tell that the correct notifications were sent. 157 // store them so we can tell that the correct notifications were sent.
168 notifications_.push_back(std::make_pair(type, details.release())); 158 notifications_.push_back(std::make_pair(type, details.release()));
169 } 159 }
170 virtual void NotifySyncURLsDeleted( 160 virtual void NotifySyncURLsDeleted(
171 bool all_history, 161 bool all_history,
172 bool archived, 162 bool expired,
173 URLRows* rows) OVERRIDE {} 163 URLRows* rows) OVERRIDE {}
174 }; 164 };
175 165
176 // The example data consists of 4 visits. The middle two visits are to the 166 // The example data consists of 4 visits. The middle two visits are to the
177 // same URL, while the first and last are for unique ones. This allows a test 167 // same URL, while the first and last are for unique ones. This allows a test
178 // for the oldest or newest to include both a URL that should get totally 168 // for the oldest or newest to include both a URL that should get totally
179 // deleted (the one on the end) with one that should only get a visit deleted 169 // deleted (the one on the end) with one that should only get a visit deleted
180 // (with the one in the middle) when it picks the proper threshold time. 170 // (with the one in the middle) when it picks the proper threshold time.
181 // 171 //
182 // Each visit has indexed data, each URL has thumbnail. The first two URLs will 172 // Each visit has indexed data, each URL has thumbnail. The first two URLs will
(...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 316
327 // Thumbnail should be gone. 317 // Thumbnail should be gone.
328 // TODO(sky): fix this, see comment in HasThumbnail. 318 // TODO(sky): fix this, see comment in HasThumbnail.
329 // EXPECT_FALSE(HasThumbnail(row.id())); 319 // EXPECT_FALSE(HasThumbnail(row.id()));
330 320
331 bool found_delete_notification = false; 321 bool found_delete_notification = false;
332 for (size_t i = 0; i < notifications_.size(); i++) { 322 for (size_t i = 0; i < notifications_.size(); i++) {
333 if (notifications_[i].first == chrome::NOTIFICATION_HISTORY_URLS_DELETED) { 323 if (notifications_[i].first == chrome::NOTIFICATION_HISTORY_URLS_DELETED) {
334 URLsDeletedDetails* details = reinterpret_cast<URLsDeletedDetails*>( 324 URLsDeletedDetails* details = reinterpret_cast<URLsDeletedDetails*>(
335 notifications_[i].second); 325 notifications_[i].second);
336 EXPECT_FALSE(details->archived); 326 EXPECT_FALSE(details->expired);
337 const history::URLRows& rows(details->rows); 327 const history::URLRows& rows(details->rows);
338 if (std::find_if(rows.begin(), rows.end(), 328 if (std::find_if(rows.begin(), rows.end(),
339 history::URLRow::URLRowHasURL(row.url())) != rows.end()) { 329 history::URLRow::URLRowHasURL(row.url())) != rows.end()) {
340 found_delete_notification = true; 330 found_delete_notification = true;
341 } 331 }
342 } else { 332 } else {
343 EXPECT_NE(notifications_[i].first, 333 EXPECT_NE(notifications_[i].first,
344 chrome::NOTIFICATION_HISTORY_URL_VISITED); 334 chrome::NOTIFICATION_HISTORY_URL_VISITED);
345 EXPECT_NE(notifications_[i].first, 335 EXPECT_NE(notifications_[i].first,
346 chrome::NOTIFICATION_HISTORY_URLS_MODIFIED); 336 chrome::NOTIFICATION_HISTORY_URLS_MODIFIED);
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
711 chrome::FaviconID favicon_id = GetFavicon(url_row1.url(), chrome::FAVICON); 701 chrome::FaviconID favicon_id = GetFavicon(url_row1.url(), chrome::FAVICON);
712 EXPECT_TRUE(HasFavicon(favicon_id)); 702 EXPECT_TRUE(HasFavicon(favicon_id));
713 // TODO(sky): fix this, see comment in HasThumbnail. 703 // TODO(sky): fix this, see comment in HasThumbnail.
714 // EXPECT_TRUE(HasThumbnail(new_url_row1.id())); 704 // EXPECT_TRUE(HasThumbnail(new_url_row1.id()));
715 favicon_id = GetFavicon(url_row1.url(), chrome::FAVICON); 705 favicon_id = GetFavicon(url_row1.url(), chrome::FAVICON);
716 EXPECT_TRUE(HasFavicon(favicon_id)); 706 EXPECT_TRUE(HasFavicon(favicon_id));
717 // TODO(sky): fix this, see comment in HasThumbnail. 707 // TODO(sky): fix this, see comment in HasThumbnail.
718 // EXPECT_TRUE(HasThumbnail(new_url_row2.id())); 708 // EXPECT_TRUE(HasThumbnail(new_url_row2.id()));
719 } 709 }
720 710
721 TEST_F(ExpireHistoryTest, ArchiveHistoryBeforeUnstarred) { 711 TEST_F(ExpireHistoryTest, ExpireHistoryBeforeUnstarred) {
722 URLID url_ids[3]; 712 URLID url_ids[3];
723 Time visit_times[4]; 713 Time visit_times[4];
724 AddExampleData(url_ids, visit_times); 714 AddExampleData(url_ids, visit_times);
725 715
726 URLRow url_row1, url_row2; 716 URLRow url_row1, url_row2;
727 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &url_row1)); 717 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &url_row1));
728 ASSERT_TRUE(main_db_->GetURLRow(url_ids[2], &url_row2)); 718 ASSERT_TRUE(main_db_->GetURLRow(url_ids[2], &url_row2));
729 719
730 // Archive the oldest two visits. This will actually result in deleting them 720 // Expire the oldest two visits.
731 // since their transition types are empty (not important). 721 expirer_.ExpireHistoryBefore(visit_times[1]);
732 expirer_.ArchiveHistoryBefore(visit_times[1]);
733 722
734 // The first URL should be deleted, the second should not be affected. 723 // The first URL should be deleted along with its sole visit. The second URL
724 // itself should not be affected, as there is still one more visit to it, but
725 // its first visit should be deleted.
735 URLRow temp_row; 726 URLRow temp_row;
736 EXPECT_FALSE(main_db_->GetURLRow(url_ids[0], &temp_row)); 727 EXPECT_FALSE(main_db_->GetURLRow(url_ids[0], &temp_row));
737 EXPECT_TRUE(main_db_->GetURLRow(url_ids[1], &temp_row)); 728 EXPECT_TRUE(main_db_->GetURLRow(url_ids[1], &temp_row));
729 VisitVector visits;
730 main_db_->GetVisitsForURL(temp_row.id(), &visits);
731 EXPECT_EQ(1U, visits.size());
732 EXPECT_EQ(visit_times[2], visits[0].visit_time);
738 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); 733 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row));
739 734
740 // Make sure the archived database has nothing in it. 735 // Now expire one more visit so that the second URL should be removed. The
741 EXPECT_FALSE(archived_db_->GetRowForURL(url_row1.url(), NULL)); 736 // third URL and its visit should be intact.
742 EXPECT_FALSE(archived_db_->GetRowForURL(url_row2.url(), NULL)); 737 expirer_.ExpireHistoryBefore(visit_times[2]);
743
744 // Now archive one more visit so that the middle URL should be removed. This
745 // one will actually be archived instead of deleted.
746 expirer_.ArchiveHistoryBefore(visit_times[2]);
747 EXPECT_FALSE(main_db_->GetURLRow(url_ids[1], &temp_row)); 738 EXPECT_FALSE(main_db_->GetURLRow(url_ids[1], &temp_row));
748 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); 739 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row));
749 740 main_db_->GetVisitsForURL(temp_row.id(), &visits);
750 // Make sure the archived database has an entry for the second URL. 741 EXPECT_EQ(1U, visits.size());
751 URLRow archived_row;
752 // Note that the ID is different in the archived DB, so look up by URL.
753 EXPECT_TRUE(archived_db_->GetRowForURL(url_row1.url(), &archived_row));
754 VisitVector archived_visits;
755 archived_db_->GetVisitsForURL(archived_row.id(), &archived_visits);
756 EXPECT_EQ(1U, archived_visits.size());
757 } 742 }
758 743
759 TEST_F(ExpireHistoryTest, ArchiveHistoryBeforeStarred) { 744 TEST_F(ExpireHistoryTest, ExpireHistoryBeforeStarred) {
760 URLID url_ids[3]; 745 URLID url_ids[3];
761 Time visit_times[4]; 746 Time visit_times[4];
762 AddExampleData(url_ids, visit_times); 747 AddExampleData(url_ids, visit_times);
763 748
764 URLRow url_row0, url_row1; 749 URLRow url_row0, url_row1;
765 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &url_row0)); 750 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &url_row0));
766 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &url_row1)); 751 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &url_row1));
767 752
768 // Star the URLs. 753 // Star the URLs.
769 StarURL(url_row0.url()); 754 StarURL(url_row0.url());
770 StarURL(url_row1.url()); 755 StarURL(url_row1.url());
771 756
772 // Now archive the first three visits (first two URLs). The first two visits 757 // Now expire the first three visits (first two URLs). The first three visits
773 // should be, the third deleted, but the URL records should not. 758 // should be deleted, but the URL records should not.
774 expirer_.ArchiveHistoryBefore(visit_times[2]); 759 expirer_.ExpireHistoryBefore(visit_times[2]);
775 760
776 // The first URL should have its visit deleted, but it should still be present 761 // The first URL should have its visit deleted, but it should still be present
777 // in the main DB and not in the archived one since it is starred. 762 // in the main DB since it is starred.
778 URLRow temp_row; 763 URLRow temp_row;
779 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &temp_row)); 764 ASSERT_TRUE(main_db_->GetURLRow(url_ids[0], &temp_row));
780 // Note that the ID is different in the archived DB, so look up by URL.
781 EXPECT_FALSE(archived_db_->GetRowForURL(temp_row.url(), NULL));
782 VisitVector visits; 765 VisitVector visits;
783 main_db_->GetVisitsForURL(temp_row.id(), &visits); 766 main_db_->GetVisitsForURL(temp_row.id(), &visits);
784 EXPECT_EQ(0U, visits.size()); 767 EXPECT_EQ(0U, visits.size());
785 768
786 // The second URL should have its first visit deleted and its second visit 769 // The second URL should have both its visits deleted, but it should still be
787 // archived. It should be present in both the main DB (because it's starred) 770 // present in the main DB because it is starred.
788 // and the archived DB (for the archived visit).
789 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &temp_row)); 771 ASSERT_TRUE(main_db_->GetURLRow(url_ids[1], &temp_row));
790 main_db_->GetVisitsForURL(temp_row.id(), &visits); 772 main_db_->GetVisitsForURL(temp_row.id(), &visits);
791 EXPECT_EQ(0U, visits.size()); 773 EXPECT_EQ(0U, visits.size());
792 774
793 // Note that the ID is different in the archived DB, so look up by URL.
794 ASSERT_TRUE(archived_db_->GetRowForURL(temp_row.url(), &temp_row));
795 archived_db_->GetVisitsForURL(temp_row.id(), &visits);
796 ASSERT_EQ(1U, visits.size());
797 EXPECT_TRUE(visit_times[2] == visits[0].visit_time);
798
799 // The third URL should be unchanged. 775 // The third URL should be unchanged.
800 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row)); 776 EXPECT_TRUE(main_db_->GetURLRow(url_ids[2], &temp_row));
801 EXPECT_FALSE(archived_db_->GetRowForURL(temp_row.url(), NULL)); 777 main_db_->GetVisitsForURL(temp_row.id(), &visits);
778 EXPECT_EQ(1U, visits.size());
802 } 779 }
803 780
804 // Tests the return values from ArchiveSomeOldHistory. The rest of the 781 // Tests the return values from ExpireSomeOldHistory. The rest of the
805 // functionality of this function is tested by the ArchiveHistoryBefore* 782 // functionality of this function is tested by the ExpireHistoryBefore*
806 // tests which use this function internally. 783 // tests which use this function internally.
807 TEST_F(ExpireHistoryTest, ArchiveSomeOldHistory) { 784 TEST_F(ExpireHistoryTest, ExpireSomeOldHistory) {
808 URLID url_ids[3]; 785 URLID url_ids[3];
809 Time visit_times[4]; 786 Time visit_times[4];
810 AddExampleData(url_ids, visit_times); 787 AddExampleData(url_ids, visit_times);
811 const ExpiringVisitsReader* reader = expirer_.GetAllVisitsReader(); 788 const ExpiringVisitsReader* reader = expirer_.GetAllVisitsReader();
812 789
813 // Deleting a time range with no URLs should return false (nothing found). 790 // Deleting a time range with no URLs should return false (nothing found).
814 EXPECT_FALSE(expirer_.ArchiveSomeOldHistory( 791 EXPECT_FALSE(expirer_.ExpireSomeOldHistory(
815 visit_times[0] - TimeDelta::FromDays(100), reader, 1)); 792 visit_times[0] - TimeDelta::FromDays(100), reader, 1));
816 793
817 // Deleting a time range with not up the the max results should also return 794 // Deleting a time range with not up the the max results should also return
818 // false (there will only be one visit deleted in this range). 795 // false (there will only be one visit deleted in this range).
819 EXPECT_FALSE(expirer_.ArchiveSomeOldHistory(visit_times[0], reader, 2)); 796 EXPECT_FALSE(expirer_.ExpireSomeOldHistory(visit_times[0], reader, 2));
820 797
821 // Deleting a time range with the max number of results should return true 798 // Deleting a time range with the max number of results should return true
822 // (max deleted). 799 // (max deleted).
823 EXPECT_TRUE(expirer_.ArchiveSomeOldHistory(visit_times[2], reader, 1)); 800 EXPECT_TRUE(expirer_.ExpireSomeOldHistory(visit_times[2], reader, 1));
824 } 801 }
825 802
826 TEST_F(ExpireHistoryTest, ExpiringVisitsReader) { 803 TEST_F(ExpireHistoryTest, ExpiringVisitsReader) {
827 URLID url_ids[3]; 804 URLID url_ids[3];
828 Time visit_times[4]; 805 Time visit_times[4];
829 AddExampleData(url_ids, visit_times); 806 AddExampleData(url_ids, visit_times);
830 807
831 const ExpiringVisitsReader* all = expirer_.GetAllVisitsReader(); 808 const ExpiringVisitsReader* all = expirer_.GetAllVisitsReader();
832 const ExpiringVisitsReader* auto_subframes = 809 const ExpiringVisitsReader* auto_subframes =
833 expirer_.GetAutoSubframeVisitsReader(); 810 expirer_.GetAutoSubframeVisitsReader();
(...skipping 12 matching lines...) Expand all
846 823
847 // Verify that the early expiration threshold was updated, since there are no 824 // Verify that the early expiration threshold was updated, since there are no
848 // AUTO_SUBFRAME visits in the given time range. 825 // AUTO_SUBFRAME visits in the given time range.
849 EXPECT_TRUE(now <= main_db_->GetEarlyExpirationThreshold()); 826 EXPECT_TRUE(now <= main_db_->GetEarlyExpirationThreshold());
850 827
851 // Now, read all visits and verify that there's at least one. 828 // Now, read all visits and verify that there's at least one.
852 EXPECT_TRUE(all->Read(now, main_db_.get(), &visits, 1)); 829 EXPECT_TRUE(all->Read(now, main_db_.get(), &visits, 1));
853 EXPECT_EQ(1U, visits.size()); 830 EXPECT_EQ(1U, visits.size());
854 } 831 }
855 832
856 // Tests how ArchiveSomeOldHistory treats source information.
857 TEST_F(ExpireHistoryTest, ArchiveSomeOldHistoryWithSource) {
858 const GURL url("www.testsource.com");
859 URLID url_id;
860 AddExampleSourceData(url, &url_id);
861 const ExpiringVisitsReader* reader = expirer_.GetAllVisitsReader();
862
863 // Archiving all the visits we added.
864 ASSERT_FALSE(expirer_.ArchiveSomeOldHistory(Time::Now(), reader, 10));
865
866 URLRow archived_row;
867 ASSERT_TRUE(archived_db_->GetRowForURL(url, &archived_row));
868 VisitVector archived_visits;
869 archived_db_->GetVisitsForURL(archived_row.id(), &archived_visits);
870 ASSERT_EQ(4U, archived_visits.size());
871 VisitSourceMap sources;
872 archived_db_->GetVisitsSource(archived_visits, &sources);
873 ASSERT_EQ(3U, sources.size());
874 int result = 0;
875 VisitSourceMap::iterator iter;
876 for (int i = 0; i < 4; i++) {
877 iter = sources.find(archived_visits[i].visit_id);
878 if (iter == sources.end())
879 continue;
880 switch (iter->second) {
881 case history::SOURCE_EXTENSION:
882 result |= 0x1;
883 break;
884 case history::SOURCE_FIREFOX_IMPORTED:
885 result |= 0x2;
886 break;
887 case history::SOURCE_SYNCED:
888 result |= 0x4;
889 default:
890 break;
891 }
892 }
893 EXPECT_EQ(0x7, result);
894 main_db_->GetVisitsSource(archived_visits, &sources);
895 EXPECT_EQ(0U, sources.size());
896 main_db_->GetVisitsForURL(url_id, &archived_visits);
897 EXPECT_EQ(0U, archived_visits.size());
898 }
899
900 // TODO(brettw) add some visits with no URL to make sure everything is updated 833 // TODO(brettw) add some visits with no URL to make sure everything is updated
901 // properly. Have the visits also refer to nonexistent FTS rows. 834 // properly. Have the visits also refer to nonexistent FTS rows.
902 // 835 //
903 // Maybe also refer to invalid favicons. 836 // Maybe also refer to invalid favicons.
904 837
905 } // namespace history 838 } // namespace history
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698