15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/android/bookmark_model_sql_handler.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/synchronization/waitable_event.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_database.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h" 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/browser/bookmark_model.h" 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "content/public/test/test_utils.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace history { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkModelSQLHandlerTest : public testing::Test { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelSQLHandlerTest() 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_manager_( 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()), 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_(NULL), 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_thread_(BrowserThread::UI, &message_loop_), 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread_(BrowserThread::FILE, &message_loop_) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 36a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) virtual ~BookmarkModelSQLHandlerTest() {} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the testing profile, so the bookmark_model_sql_handler could 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get the bookmark model from it. 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile_manager_.SetUp()); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It seems that the name has to be chrome::kInitialProfile, so it 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could be found by ProfileManager::GetLastUsedProfile(). 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* testing_profile = profile_manager_.CreateTestingProfile( 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kInitialProfile); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the BookmarkModel that doesn't need to invoke load(). 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile->CreateBookmarkModel(true); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bookmark_model_ = BookmarkModelFactory::GetForProfile(testing_profile); 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) test::WaitForBookmarkModelToLoad(bookmark_model_); 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(bookmark_model_); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the BookmarkModel from LastUsedProfile, this is the same way that 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // how the BookmarkModelSQLHandler gets the BookmarkModel. 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile = ProfileManager::GetLastUsedProfile(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the directory for history database. 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::FilePath history_db_name = temp_dir_.path().AppendASCII( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kHistoryFilename); 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) history_db_.Init(history_db_name); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Runs the MessageLoopForUI, and return till all pending messages were 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // processed. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void RunMessageLoopForUI() { 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfileManager profile_manager_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModel* bookmark_model_; 7290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoopForUI message_loop_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::ScopedTempDir temp_dir_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryDatabase history_db_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkModelSQLHandlerTest, InsertIntoMobileFolder) { 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow row; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_raw_url("http://bookmark.com"); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_url(GURL("http://bookmark.com")); 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) row.set_title(base::UTF8ToUTF16("Bookmark Title")); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_is_bookmark(true); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelSQLHandler handler(&history_db_); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Insert(&row)); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const BookmarkNode*> nodes; 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetNodesByURL(row.url(), &nodes); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, nodes.size()); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(row.title(), nodes[0]->GetTitle()); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent = nodes[0]->parent(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(parent); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bookmark_model_->mobile_node()->id(), parent->id()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkModelSQLHandlerTest, InsertIntoSpecificFolder) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow row; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_raw_url("http://bookmark.com"); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_url(GURL("http://bookmark.com")); 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) row.set_title(base::UTF8ToUTF16("Bookmark Title")); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_is_bookmark(true); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set other folder as parent. 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_parent_id(bookmark_model_->other_node()->id()); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelSQLHandler handler(&history_db_); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Insert(&row)); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const BookmarkNode*> nodes; 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetNodesByURL(row.url(), &nodes); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, nodes.size()); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(row.title(), nodes[0]->GetTitle()); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent = nodes[0]->parent(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(parent); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(row.parent_id(), parent->id()); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkModelSQLHandlerTest, UpdateHistoryToBookmark) { 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Added a row in url database. 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLRow url_row(GURL("http://www.google.com")); 1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_row.set_title(base::UTF8ToUTF16("Google")); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) URLID url_id = history_db_.AddURL(url_row); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(url_id); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the added row as bookmark. 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow row; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_url(url_row.url()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_is_bookmark(true); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TableIDRow id_row; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_row.url_id = url_id; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_row.url = url_row.url(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TableIDRows id_rows; 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_rows.push_back(id_row); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelSQLHandler handler(&history_db_); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Update(row, id_rows)); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get all bookmarks and verify there is only one. 14146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) std::vector<BookmarkModel::URLAndTitle> bookmarks; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetBookmarks(&bookmarks); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, bookmarks.size()); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.url(), bookmarks[0].url); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.title(), bookmarks[0].title); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the bookmark node. 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<const BookmarkNode*> nodes; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetNodesByURL(row.url(), &nodes); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, nodes.size()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.title(), nodes[0]->GetTitle()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent = nodes[0]->parent(); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(parent); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(bookmark_model_->mobile_node()->id(), parent->id()); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the bookmark 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_is_bookmark(false); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Update(row, id_rows)); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmarks.clear(); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetBookmarks(&bookmarks); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(bookmarks.empty()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update with the parent id. 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_parent_id(bookmark_model_->other_node()->id()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_is_bookmark(true); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Update(row, id_rows)); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get all bookmarks and verify there is only one. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmarks.clear(); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetBookmarks(&bookmarks); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, bookmarks.size()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.url(), bookmarks[0].url); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.title(), bookmarks[0].title); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the bookmark node. 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nodes.clear(); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetNodesByURL(row.url(), &nodes); 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, nodes.size()); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.title(), nodes[0]->GetTitle()); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent1 = nodes[0]->parent(); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(parent1); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(row.parent_id(), parent1->id()); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Only update the title. 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) url_row.set_title(base::UTF8ToUTF16("Google Inc.")); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) history_db_.UpdateURLRow(url_id, url_row); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow update_title; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_title.set_title(url_row.title()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Update(update_title, id_rows)); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get all bookmarks and verify there is only one. 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmarks.clear(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetBookmarks(&bookmarks); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, bookmarks.size()); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.url(), bookmarks[0].url); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.title(), bookmarks[0].title); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get the bookmark node. 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nodes.clear(); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bookmark_model_->GetNodesByURL(row.url(), &nodes); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(1u, nodes.size()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(url_row.title(), nodes[0]->GetTitle()); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const BookmarkNode* parent2 = nodes[0]->parent(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(parent2); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The parent id shouldn't changed. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(row.parent_id(), parent2->id()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(BookmarkModelSQLHandlerTest, Delete) { 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert 3 bookmarks, 2 of them have the same URL, but one is in mobile 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // folder, another is in other folder, The 3rd one has different URL. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow row; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL url1 = GURL("http://bookmark.com"); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_raw_url("http://bookmark.com"); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_url(url1); 2155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) row.set_title(base::UTF8ToUTF16("Bookmark Title")); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_is_bookmark(true); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkModelSQLHandler handler(&history_db_); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Insert(&row)); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Set other folder as parent. 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_parent_id(bookmark_model_->other_node()->id()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Insert(&row)); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_url(GURL("http://google.com")); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Insert(&row)); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get all bookmarks and verify there are 3 bookmarks. 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, bookmark_model_->mobile_node()->child_count()); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(2, bookmark_model_->other_node()->child_count()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove the third one. 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TableIDRow id_row; 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_row.url = row.url(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TableIDRows id_rows; 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_rows.push_back(id_row); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Delete(id_rows)); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Verify the first 2 bookmarks still exist. 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, bookmark_model_->mobile_node()->child_count()); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, bookmark_model_->other_node()->child_count()); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_row.url = url1; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_rows.clear(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) id_rows.push_back(id_row); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(handler.Delete(id_rows)); 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RunMessageLoopForUI(); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // All bookmarks were deleted. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(bookmark_model_->HasBookmarks()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace history 254