1ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// found in the LICENSE file. 4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <vector> 6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/file_util.h" 8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/path_service.h" 9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "base/string_util.h" 10ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/scoped_temp_dir.h" 113345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick#include "base/utf_string_conversions.h" 12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/history.h" 13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/browser/history/starred_url_database.h" 14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "chrome/common/chrome_paths.h" 15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include "testing/gtest/include/gtest/gtest.h" 16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace history { 18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass StarredURLDatabaseTest : public testing::Test, 20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public StarredURLDatabase { 21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public: 22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredURLDatabaseTest() { 23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void AddPage(const GURL& url) { 26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch URLRow row(url); 27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch row.set_visit_count(1); 28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(AddURL(row)); 29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void CompareEntryByID(const StarredEntry& entry) { 32c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(entry.id != 0); 33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry db_value; 34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(GetStarredEntry(entry.id, &db_value)); 35c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry.id, db_value.id); 36c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry.title == db_value.title); 37c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry.date_added.ToTimeT(), db_value.date_added.ToTimeT()); 38ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(entry.folder_id, db_value.folder_id); 39ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_EQ(entry.parent_folder_id, db_value.parent_folder_id); 40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry.visual_order, db_value.visual_order); 41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry.type, db_value.type); 42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_EQ(entry.url_id, db_value.url_id); 43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch if (entry.type == StarredEntry::URL) 44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(entry.url == db_value.url); 45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch int GetStarredEntryCount() { 48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DCHECK(db_.is_open()); 49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch std::vector<StarredEntry> entries; 50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetAllStarredEntries(&entries); 51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return static_cast<int>(entries.size()); 52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarID CreateStarredEntry(StarredEntry* entry) { 55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return StarredURLDatabase::CreateStarredEntry(entry); 56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool GetStarredEntry(StarID star_id, StarredEntry* entry) { 59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return StarredURLDatabase::GetStarredEntry(star_id, entry); 60c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch bool EnsureStarredIntegrity() { 63c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return StarredURLDatabase::EnsureStarredIntegrity(); 64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private: 67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Test setup. 68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void SetUp() { 69ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 70ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen db_file_ = temp_dir_.path().AppendASCII("VisitTest.db"); 71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::Delete(db_file_, false); 72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Copy db file over that contains starred table. 74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath old_history_path; 75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch PathService::Get(chrome::DIR_TEST_DATA, &old_history_path); 76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch old_history_path = old_history_path.AppendASCII("bookmarks"); 77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch old_history_path = old_history_path.Append( 78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FILE_PATH_LITERAL("History_with_empty_starred")); 79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch file_util::CopyFile(old_history_path, db_file_); 80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EXPECT_TRUE(db_.Open(db_file_)); 82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Initialize the tables for this test. 84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateURLTable(false); 85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateMainURLIndex(); 86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch EnsureStarredIntegrity(); 87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch void TearDown() { 89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch db_.Close(); 90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Provided for URL/StarredURLDatabase. 93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch virtual sql::Connection& GetDB() { 94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch return db_; 95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch } 96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 97ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ScopedTempDir temp_dir_; 98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch FilePath db_file_; 99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch sql::Connection db_; 100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}; 101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//----------------------------------------------------------------------------- 103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 104ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(StarredURLDatabaseTest, FixOrphanedFolder) { 105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int initial_count = GetStarredEntryCount(); 106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 107ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Create a folder that isn't parented to the other/bookmark folders. 108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry g_entry; 109ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen g_entry.type = StarredEntry::USER_FOLDER; 110ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen g_entry.parent_folder_id = 100; 111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch g_entry.visual_order = 10; 112ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen g_entry.folder_id = 100; 113c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&g_entry); 114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(EnsureStarredIntegrity()); 116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure no new entries were added. 118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(initial_count + 1, GetStarredEntryCount()); 119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 120ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Make sure the folder was moved to the bookmark bar folder. 121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(g_entry.id, &g_entry)); 122ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(HistoryService::kBookmarkBarID, g_entry.parent_folder_id); 123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, g_entry.visual_order); 124c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 126c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(StarredURLDatabaseTest, FixOrphanedBookmarks) { 127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int initial_count = GetStarredEntryCount(); 128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Create two bookmarks that aren't in a random folder no on the bookmark bar. 130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry1; 131ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.parent_folder_id = 100; 132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry1.visual_order = 10; 133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry1.url = GURL("http://google.com/1"); 134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry1); 135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry2; 137ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry2.parent_folder_id = 101; 138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry2.visual_order = 20; 139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry2.url = GURL("http://google.com/2"); 140c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry2); 141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(EnsureStarredIntegrity()); 143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure no new entries were added. 145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(initial_count + 2, GetStarredEntryCount()); 146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure the entries were moved to the bookmark bar and the visual order 148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // order was updated appropriately. 149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(entry1.id, &entry1)); 150ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(HistoryService::kBookmarkBarID, entry1.parent_folder_id); 151c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(entry2.id, &entry2)); 153ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(HistoryService::kBookmarkBarID, entry2.parent_folder_id); 154c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE((entry1.visual_order == 0 && entry2.visual_order == 1) || 155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch (entry1.visual_order == 1 && entry2.visual_order == 0)); 156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 157c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 158ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(StarredURLDatabaseTest, FixFolderCycleDepth0) { 159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int initial_count = GetStarredEntryCount(); 160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 161ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Create a folder that is parented to itself. 162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry1; 163ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.folder_id = entry1.parent_folder_id = 100; 164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry1.visual_order = 10; 165ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.type = StarredEntry::USER_FOLDER; 166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry1); 167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(EnsureStarredIntegrity()); 169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure no new entries were added. 171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(initial_count + 1, GetStarredEntryCount()); 172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Make sure the folder were moved to the bookmark bar and the visual order 174c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // order was updated appropriately. 175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(entry1.id, &entry1)); 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(HistoryService::kBookmarkBarID, entry1.parent_folder_id); 177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, entry1.visual_order); 178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(StarredURLDatabaseTest, FixFolderCycleDepth1) { 181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int initial_count = GetStarredEntryCount(); 182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry1; 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.folder_id = 100; 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.parent_folder_id = 101; 186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry1.visual_order = 10; 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.type = StarredEntry::USER_FOLDER; 188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry1); 189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry2; 191ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry2.folder_id = 101; 192ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry2.parent_folder_id = 100; 193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry2.visual_order = 11; 194ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry2.type = StarredEntry::USER_FOLDER; 195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry2); 196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(EnsureStarredIntegrity()); 198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure no new entries were added. 200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(initial_count + 2, GetStarredEntryCount()); 201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 202ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Because the folders caused a cycle, entry1 is moved the bookmark bar, which 203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // breaks the cycle. 204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(entry1.id, &entry1)); 205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(entry2.id, &entry2)); 206ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(HistoryService::kBookmarkBarID, entry1.parent_folder_id); 207ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ASSERT_EQ(100, entry2.parent_folder_id); 208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, entry1.visual_order); 209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(0, entry2.visual_order); 210c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 212c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(StarredURLDatabaseTest, FixVisualOrder) { 213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int initial_count = GetStarredEntryCount(); 214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Star two urls. 216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry1; 217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry1.url = GURL("http://google.com/1"); 218ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.parent_folder_id = HistoryService::kBookmarkBarID; 219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry1.visual_order = 5; 220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry1); 221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Add url2 and star it. 223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry2; 224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry2.url = GURL("http://google.com/2"); 225ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry2.parent_folder_id = HistoryService::kBookmarkBarID; 226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry2.visual_order = 10; 227c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry2); 228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(EnsureStarredIntegrity()); 230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Make sure no new entries were added. 232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(initial_count + 2, GetStarredEntryCount()); 233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry; 235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(entry1.id, &entry)); 236c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry1.visual_order = 0; 237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompareEntryByID(entry1); 238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(entry2.id, &entry)); 240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry2.visual_order = 1; 241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CompareEntryByID(entry2); 242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 244ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(StarredURLDatabaseTest, FixDuplicateFolderIDs) { 245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int initial_count = GetStarredEntryCount(); 246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 247ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Create two folders with the same folder id. 248c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry1; 249ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.type = StarredEntry::USER_FOLDER; 250ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.folder_id = 10; 251ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry1.parent_folder_id = HistoryService::kBookmarkBarID; 252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry1); 253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry2 = entry1; 254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch CreateStarredEntry(&entry2); 255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(EnsureStarredIntegrity()); 257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 258ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen // Make sure only one folder exists. 259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(initial_count + 1, GetStarredEntryCount()); 260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry; 262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(GetStarredEntry(entry1.id, &entry) || 263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch GetStarredEntry(entry2.id, &entry)); 264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 266c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST_F(StarredURLDatabaseTest, RemoveStarredEntriesWithEmptyURL) { 267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch const int initial_count = GetStarredEntryCount(); 268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch StarredEntry entry; 270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry.url = GURL("http://google.com"); 271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch entry.title = UTF8ToUTF16("FOO"); 272ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen entry.parent_folder_id = HistoryService::kBookmarkBarID; 273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_NE(0, CreateStarredEntry(&entry)); 275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 276c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Remove the URL. 277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch DeleteURLRow(entry.url_id); 278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // Fix up the table. 280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_TRUE(EnsureStarredIntegrity()); 281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch // The entry we just created should have been nuked. 283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch ASSERT_EQ(initial_count, GetStarredEntryCount()); 284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} 285c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch 286c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch} // namespace history 287