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