android_history_provider_service_unittest.cc revision 5821806d5e7f356e8fa4b058a389a808ea183019
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) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/time.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/utf_string_conversions.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/android/android_history_types.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Bind; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::AndroidStatement; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::HistoryAndBookmarkRow; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::SearchRow; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cases in this file don't intent to test the detail features of 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Android content provider which have been covered by 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// android_provider_backend_unittest.cc, instead, they verify the code path to 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// AndroidProviderBackend working fine. 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class AndroidHistoryProviderServiceTest : public testing::Test { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidHistoryProviderServiceTest() 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_manager_( 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<TestingBrowserProcess*>(g_browser_process)), 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_thread_(BrowserThread::UI, &message_loop_), 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread_(BrowserThread::FILE, &message_loop_) { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~AndroidHistoryProviderServiceTest() { 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the testing profile, so the bookmark_model_sql_handler could 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get the bookmark model from it. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile_manager_.SetUp()); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It seems that the name has to be chrome::kInitialProfile, so it 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could be found by ProfileManager::GetLastUsedProfile(). 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_ = profile_manager_.CreateTestingProfile( 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kInitialProfile); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->CreateBookmarkModel(true); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->BlockUntilBookmarkModelLoaded(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->CreateHistoryService(true, false); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_.reset(new AndroidHistoryProviderService(testing_profile_)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->DestroyHistoryService(); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager_.DeleteTestingProfile(chrome::kInitialProfile); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_=NULL; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfileManager profile_manager_; 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop message_loop_; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AndroidHistoryProviderService> service_; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CancelableRequestConsumer cancelable_consumer_; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* testing_profile_; 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(AndroidHistoryProviderServiceTest); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CallbackHelper : public base::RefCountedThreadSafe<CallbackHelper> { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackHelper() 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : success_(false), 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement_(NULL), 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_position_(0), 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count_(0) { 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success() const { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success_; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement() const { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return statement_; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cursor_position() const { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return cursor_position_; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count() const { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return count_; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnInserted(AndroidHistoryProviderService::Handle handle, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 id) { 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = success; 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Quit(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnQueryResult(AndroidHistoryProviderService::Handle handle, 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement) { 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = success; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement_ = statement; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Quit(); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnUpdated(AndroidHistoryProviderService::Handle handle, 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = success; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count_ = count; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Quit(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDeleted(AndroidHistoryProviderService::Handle handle, 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success, 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count) { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) success_ = success; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) count_ = count; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Quit(); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnStatementMoved(AndroidHistoryProviderService::Handle handle, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cursor_position) { 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cursor_position_ = cursor_position; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Quit(); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<CallbackHelper>; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CallbackHelper() { 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement_; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int cursor_position_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int count_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackHelper); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AndroidHistoryProviderServiceTest, TestHistoryAndBookmark) { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow row; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_raw_url("http://www.google.com"); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_url(GURL("http://www.google.com")); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CallbackHelper> callback(new CallbackHelper()); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert a row and verify it succeeded. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->InsertHistoryAndBookmark(row, &cancelable_consumer_, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CallbackHelper::OnInserted, callback.get())); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<HistoryAndBookmarkRow::ColumnID> projections; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) projections.push_back(HistoryAndBookmarkRow::ID); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Query the inserted row. 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->QueryHistoryAndBookmarks(projections, std::string(), 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16>(), std::string(), &cancelable_consumer_, 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CallbackHelper::OnQueryResult, callback.get())); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(callback->success()); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the cursor to the begining and verify whether we could get 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same result. 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement = callback->statement(); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->MoveStatement(statement, 0, -1, &cancelable_consumer_, 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CallbackHelper::OnStatementMoved, callback.get())); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, callback->cursor_position()); 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->statement()->statement()->Step()); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(callback->statement()->statement()->Step()); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->CloseStatement(statement); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the row. 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow update_row; 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_row.set_visit_count(3); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->UpdateHistoryAndBookmarks(update_row, std::string(), 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16>(), &cancelable_consumer_, 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CallbackHelper::OnUpdated, callback.get())); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, callback->count()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the row. 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->DeleteHistoryAndBookmarks(std::string(), std::vector<string16>(), 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &cancelable_consumer_, Bind(&CallbackHelper::OnDeleted, callback.get())); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, callback->count()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(AndroidHistoryProviderServiceTest, TestSearchTerm) { 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SearchRow search_row; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_row.set_search_term(UTF8ToUTF16("google")); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_row.set_url(GURL("http://google.com")); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_row.set_template_url_id(1); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) search_row.set_search_time(Time::Now()); 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CallbackHelper> callback(new CallbackHelper()); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert a row and verify it succeeded. 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->InsertSearchTerm(search_row, &cancelable_consumer_, 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CallbackHelper::OnInserted, callback.get())); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<SearchRow::ColumnID> projections; 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) projections.push_back(SearchRow::ID); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Query the inserted row. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->QuerySearchTerms(projections, std::string(), 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16>(), std::string(), &cancelable_consumer_, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CallbackHelper::OnQueryResult, callback.get())); 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(callback->success()); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Move the cursor to the begining and verify whether we could get 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the same result. 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement = callback->statement(); 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->MoveStatement(statement, 0, -1, &cancelable_consumer_, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CallbackHelper::OnStatementMoved, callback.get())); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(-1, callback->cursor_position()); 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->statement()->statement()->Step()); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(callback->statement()->statement()->Step()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->CloseStatement(statement); 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update the row. 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SearchRow update_row; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) update_row.set_search_time(Time::Now()); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->UpdateSearchTerms(update_row, std::string(), 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<string16>(), &cancelable_consumer_, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Bind(&CallbackHelper::OnUpdated, callback.get())); 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, callback->count()); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Delete the row. 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_->DeleteSearchTerms(std::string(), std::vector<string16>(), 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &cancelable_consumer_, Bind(&CallbackHelper::OnDeleted, callback.get())); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MessageLoop::current()->Run(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, callback->count()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 262