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