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/sqlite_cursor.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <jni.h> 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_array.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/task/cancelable_task_tracker.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h" 15010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "chrome/browser/bookmarks/bookmark_model_factory.h" 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/favicon/chrome_favicon_client.h" 17116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/favicon/chrome_favicon_client_factory.h" 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/favicon/favicon_service.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/android/android_history_provider_service.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/android/android_time.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/history/history_service.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/history/history_service_factory.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_browser_process.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/test/base/testing_profile_manager.h" 27cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "components/bookmarks/test/bookmark_test_helpers.h" 281320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "components/history/core/android/android_history_types.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_browser_thread.h" 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Bind; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::Time; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::AndroidStatement; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::HistoryAndBookmarkRow; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using history::SearchRow; 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The test cases in this file don't test the JNI interface which will be 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// covered in Java tests. 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SQLiteCursorTest : public testing::Test, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public SQLiteCursor::TestObserver { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SQLiteCursorTest() 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : profile_manager_( 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TestingBrowserProcess::GetGlobal()), 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui_thread_(BrowserThread::UI, &message_loop_), 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) file_thread_(BrowserThread::FILE, &message_loop_) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SQLiteCursorTest() { 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Setup the testing profile, so the bookmark_model_sql_handler could 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // get the bookmark model from it. 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(profile_manager_.SetUp()); 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // It seems that the name has to be chrome::kInitialProfile, so it 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // could be found by ProfileManager::GetLastUsedProfile(). 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_ = profile_manager_.CreateTestingProfile( 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) chrome::kInitialProfile); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->CreateBookmarkModel(true); 68010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) test::WaitForBookmarkModelToLoad( 69010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) BookmarkModelFactory::GetForProfile(testing_profile_)); 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->CreateFaviconService(); 72bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch ASSERT_TRUE(testing_profile_->CreateHistoryService(true, false)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_.reset(new AndroidHistoryProviderService(testing_profile_)); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hs_ = HistoryServiceFactory::GetForProfile(testing_profile_, 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile::EXPLICIT_ACCESS); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_->DestroyHistoryService(); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) profile_manager_.DeleteTestingProfile(chrome::kInitialProfile); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) testing_profile_ = NULL; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Override SQLiteCursor::TestObserver. 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPostMoveToTask() OVERRIDE { 8690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetMoveToResult() OVERRIDE { 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnPostGetFaviconTask() OVERRIDE { 9490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OnGetFaviconResult() OVERRIDE { 9890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfileManager profile_manager_; 10390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop message_loop_; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread ui_thread_; 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::TestBrowserThread file_thread_; 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<AndroidHistoryProviderService> service_; 107116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::CancelableTaskTracker cancelable_tracker_; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile* testing_profile_; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryService* hs_; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(SQLiteCursorTest); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CallbackHelper : public base::RefCountedThreadSafe<CallbackHelper> { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CallbackHelper() 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : success_(false), 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement_(NULL) { 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success() const { 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return success_; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement() const { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return statement_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 131116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnInserted(int64 id) { 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch success_ = id != 0; 13390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch void OnQueryResult(AndroidStatement* statement) { 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch success_ = statement != NULL; 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) statement_ = statement; 13990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Quit(); 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class base::RefCountedThreadSafe<CallbackHelper>; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~CallbackHelper() { 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool success_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement_; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(CallbackHelper); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SQLiteCursorTest, Run) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow row; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_raw_url("http://www.google.com/"); 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_url(GURL("http://www.google.com/")); 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<unsigned char> favicon_data; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) favicon_data.push_back(1); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes *data_bytes = 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RefCountedBytes::TakeVector(&favicon_data); 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_favicon(data_bytes); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_last_visit_time(Time::Now()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) row.set_visit_count(2); 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) row.set_title(base::UTF8ToUTF16("cnn")); 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<CallbackHelper> callback(new CallbackHelper()); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Insert a row and verify it succeeded. 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->InsertHistoryAndBookmark( 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch row, 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnInserted, callback.get()), 173116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 17590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(callback->success()); 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<HistoryAndBookmarkRow::ColumnID> projections; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) projections.push_back(HistoryAndBookmarkRow::URL); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) projections.push_back(HistoryAndBookmarkRow::LAST_VISIT_TIME); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) projections.push_back(HistoryAndBookmarkRow::VISIT_COUNT); 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) projections.push_back(HistoryAndBookmarkRow::FAVICON); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Query the inserted row. 185116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch service_->QueryHistoryAndBookmarks( 186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch projections, 187116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::vector<base::string16>(), 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch std::string(), 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Bind(&CallbackHelper::OnQueryResult, callback.get()), 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch &cancelable_tracker_); 19290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) base::MessageLoop::current()->Run(); 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(callback->success()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AndroidStatement* statement = callback->statement(); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<std::string> column_names; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_names.push_back( 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow::GetAndroidName(HistoryAndBookmarkRow::URL)); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_names.push_back(HistoryAndBookmarkRow::GetAndroidName( 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow::LAST_VISIT_TIME)); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_names.push_back(HistoryAndBookmarkRow::GetAndroidName( 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow::VISIT_COUNT)); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_names.push_back(HistoryAndBookmarkRow::GetAndroidName( 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HistoryAndBookmarkRow::FAVICON)); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FaviconClient* favicon_client = 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ChromeFaviconClientFactory::GetForProfile(testing_profile_); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch FaviconService* favicon_service = 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch new FaviconService(testing_profile_, favicon_client); 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 211868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) SQLiteCursor* cursor = new SQLiteCursor(column_names, statement, 212868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) service_.get(), favicon_service); 213868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cursor->set_test_observer(this); 214868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) JNIEnv* env = base::android::AttachCurrentThread(); 215868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(1, cursor->GetCount(env, NULL)); 216868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(0, cursor->MoveTo(env, NULL, 0)); 217868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(row.url().spec(), base::android::ConvertJavaStringToUTF8( 218868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cursor->GetString(env, NULL, 0)).c_str()); 219868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(history::ToDatabaseTime(row.last_visit_time()), 220868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cursor->GetLong(env, NULL, 1)); 221868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(row.visit_count(), cursor->GetInt(env, NULL, 2)); 222868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::android::ScopedJavaLocalRef<jbyteArray> data = 223868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cursor->GetBlob(env, NULL, 3); 224868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) std::vector<uint8> out; 225868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) base::android::JavaByteArrayToByteVector(env, data.obj(), &out); 226868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(data_bytes->data().size(), out.size()); 227868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) EXPECT_EQ(data_bytes->data()[0], out[0]); 228868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) cursor->Destroy(env, NULL); 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // Cursor::Destroy posts the task in UI thread, run Message loop to release 230868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) // the statement, delete SQLiteCursor itself etc. 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllPendingInMessageLoop(); 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 233