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

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

Powered by Google App Engine
This is Rietveld 408576698