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/android_history_provider_service.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/task/cancelable_task_tracker.h" 9eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 10010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h" 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h" 161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/android/android_history_types.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Bind; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::AndroidStatement; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::HistoryAndBookmarkRow; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::SearchRow; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cases in this file don't intent to test the detail features of 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Android content provider which have been covered by 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// android_provider_backend_unittest.cc, instead, they verify the code path to 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AndroidProviderBackend working fine. 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AndroidHistoryProviderServiceTest : public testing::Test { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidHistoryProviderServiceTest() 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_manager_( 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()), 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_thread_(BrowserThread::UI, &message_loop_), 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread_(BrowserThread::FILE, &message_loop_) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AndroidHistoryProviderServiceTest() { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the testing profile, so the bookmark_model_sql_handler could 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get the bookmark model from it. 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile_manager_.SetUp()); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It seems that the name has to be chrome::kInitialProfile, so it 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could be found by ProfileManager::GetLastUsedProfile(). 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_ = profile_manager_.CreateTestingProfile( 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kInitialProfile); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->CreateBookmarkModel(true); 57010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test::WaitForBookmarkModelToLoad( 58010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BookmarkModelFactory::GetForProfile(testing_profile_)); 59bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ASSERT_TRUE(testing_profile_->CreateHistoryService(true, false)); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_.reset(new AndroidHistoryProviderService(testing_profile_)); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->DestroyHistoryService(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager_.DeleteTestingProfile(chrome::kInitialProfile); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_=NULL; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfileManager profile_manager_; 7190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AndroidHistoryProviderService> service_; 75116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker cancelable_tracker_; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* testing_profile_; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AndroidHistoryProviderServiceTest); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CallbackHelper : public base::RefCountedThreadSafe<CallbackHelper> { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackHelper() 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : success_(false), 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement_(NULL), 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_position_(0), 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count_(0) { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success() const { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement() const { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return statement_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cursor_position() const { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cursor_position_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count() const { 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return count_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnInserted(int64 id) { 108116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch success_ = id != 0; 10990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 112116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnQueryResult(AndroidStatement* statement) { 113116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch success_ = statement != NULL; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement_ = statement; 11590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnUpdated(int count) { 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch success_ = count != 0; 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count_ = count; 12190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void OnDeleted(int count) { 1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) success_ = count != 0; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count_ = count; 12790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 130116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnStatementMoved(int cursor_position) { 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_position_ = cursor_position; 13290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<CallbackHelper>; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CallbackHelper() { 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success_; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cursor_position_; 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count_; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackHelper); 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AndroidHistoryProviderServiceTest, TestHistoryAndBookmark) { 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow row; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_raw_url("http://www.google.com"); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_url(GURL("http://www.google.com")); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CallbackHelper> callback(new CallbackHelper()); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert a row and verify it succeeded. 156116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->InsertHistoryAndBookmark( 157116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch row, 158116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnInserted, callback.get()), 159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 16190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<HistoryAndBookmarkRow::ColumnID> projections; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) projections.push_back(HistoryAndBookmarkRow::ID); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Query the inserted row. 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->QueryHistoryAndBookmarks( 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch projections, 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<base::string16>(), 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnQueryResult, callback.get()), 174116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(callback->success()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the cursor to the begining and verify whether we could get 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same result. 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement = callback->statement(); 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->MoveStatement( 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch statement, 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch -1, 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnStatementMoved, callback.get()), 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 18790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, callback->cursor_position()); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->statement()->statement()->Step()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(callback->statement()->statement()->Step()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->CloseStatement(statement); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the row. 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow update_row; 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_row.set_visit_count(3); 196116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->UpdateHistoryAndBookmarks( 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch update_row, 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 199116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<base::string16>(), 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnUpdated, callback.get()), 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 20290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, callback->count()); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the row. 2075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_->DeleteHistoryAndBookmarks( 2085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::string(), 2095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) std::vector<base::string16>(), 2105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Bind(&CallbackHelper::OnDeleted, callback.get()), 2115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &cancelable_tracker_); 21290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, callback->count()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AndroidHistoryProviderServiceTest, TestSearchTerm) { 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SearchRow search_row; 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) search_row.set_search_term(base::UTF8ToUTF16("google")); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_row.set_url(GURL("http://google.com")); 221116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch search_row.set_keyword_id(1); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_row.set_search_time(Time::Now()); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CallbackHelper> callback(new CallbackHelper()); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert a row and verify it succeeded. 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->InsertSearchTerm(search_row, 228116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnInserted, callback.get()), 229116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 23190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SearchRow::ColumnID> projections; 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) projections.push_back(SearchRow::ID); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Query the inserted row. 238116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->QuerySearchTerms( 239116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch projections, 240116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 241116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<base::string16>(), 242116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 243116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnQueryResult, callback.get()), 244116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 24590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(callback->success()); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the cursor to the begining and verify whether we could get 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same result. 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement = callback->statement(); 251116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->MoveStatement( 252116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch statement, 253116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 0, 254116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch -1, 255116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnStatementMoved, callback.get()), 256116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 25790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, callback->cursor_position()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->statement()->statement()->Step()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(callback->statement()->statement()->Step()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->CloseStatement(statement); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the row. 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SearchRow update_row; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_row.set_search_time(Time::Now()); 266116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->UpdateSearchTerms(update_row, 267116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 268116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<base::string16>(), 269116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnUpdated, callback.get()), 270116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 27190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, callback->count()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the row. 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) service_->DeleteSearchTerms(std::string(), 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) std::vector<base::string16>(), 2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Bind(&CallbackHelper::OnDeleted, callback.get()), 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) &cancelable_tracker_); 28090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, callback->count()); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 286