Home | History | Annotate | Download | only in android
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/history/android/android_history_provider_service.h"
      6 
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "base/time/time.h"
      9 #include "chrome/browser/bookmarks/bookmark_model_factory.h"
     10 #include "chrome/browser/history/android/android_history_types.h"
     11 #include "chrome/common/chrome_constants.h"
     12 #include "chrome/test/base/testing_browser_process.h"
     13 #include "chrome/test/base/testing_profile.h"
     14 #include "chrome/test/base/testing_profile_manager.h"
     15 #include "components/bookmarks/test/bookmark_test_helpers.h"
     16 #include "content/public/browser/browser_thread.h"
     17 #include "content/public/test/test_browser_thread.h"
     18 #include "testing/gtest/include/gtest/gtest.h"
     19 
     20 namespace {
     21 
     22 using base::Bind;
     23 using base::Time;
     24 using content::BrowserThread;
     25 using history::AndroidStatement;
     26 using history::HistoryAndBookmarkRow;
     27 using history::SearchRow;
     28 
     29 // The test cases in this file don't intent to test the detail features of
     30 // Android content provider which have been covered by
     31 // android_provider_backend_unittest.cc, instead, they verify the code path to
     32 // AndroidProviderBackend working fine.
     33 
     34 class AndroidHistoryProviderServiceTest : public testing::Test {
     35  public:
     36   AndroidHistoryProviderServiceTest()
     37       : profile_manager_(
     38           TestingBrowserProcess::GetGlobal()),
     39         ui_thread_(BrowserThread::UI, &message_loop_),
     40         file_thread_(BrowserThread::FILE, &message_loop_) {
     41   }
     42   virtual ~AndroidHistoryProviderServiceTest() {
     43   }
     44 
     45  protected:
     46   virtual void SetUp() OVERRIDE {
     47     // Setup the testing profile, so the bookmark_model_sql_handler could
     48     // get the bookmark model from it.
     49     ASSERT_TRUE(profile_manager_.SetUp());
     50     // It seems that the name has to be chrome::kInitialProfile, so it
     51     // could be found by ProfileManager::GetLastUsedProfile().
     52     testing_profile_ = profile_manager_.CreateTestingProfile(
     53         chrome::kInitialProfile);
     54 
     55     testing_profile_->CreateBookmarkModel(true);
     56     test::WaitForBookmarkModelToLoad(
     57         BookmarkModelFactory::GetForProfile(testing_profile_));
     58     ASSERT_TRUE(testing_profile_->CreateHistoryService(true, false));
     59     service_.reset(new AndroidHistoryProviderService(testing_profile_));
     60   }
     61 
     62   virtual void TearDown() OVERRIDE {
     63     testing_profile_->DestroyHistoryService();
     64     profile_manager_.DeleteTestingProfile(chrome::kInitialProfile);
     65     testing_profile_=NULL;
     66   }
     67 
     68  protected:
     69   TestingProfileManager profile_manager_;
     70   base::MessageLoop message_loop_;
     71   content::TestBrowserThread ui_thread_;
     72   content::TestBrowserThread file_thread_;
     73   scoped_ptr<AndroidHistoryProviderService> service_;
     74   CancelableRequestConsumer cancelable_consumer_;
     75   TestingProfile* testing_profile_;
     76 
     77  private:
     78   DISALLOW_COPY_AND_ASSIGN(AndroidHistoryProviderServiceTest);
     79 };
     80 
     81 class CallbackHelper : public base::RefCountedThreadSafe<CallbackHelper> {
     82  public:
     83   CallbackHelper()
     84       : success_(false),
     85         statement_(NULL),
     86         cursor_position_(0),
     87         count_(0) {
     88   }
     89 
     90   bool success() const {
     91     return success_;
     92   }
     93 
     94   AndroidStatement* statement() const {
     95     return statement_;
     96   }
     97 
     98   int cursor_position() const {
     99     return cursor_position_;
    100   }
    101 
    102   int count() const {
    103     return count_;
    104   }
    105 
    106   void OnInserted(AndroidHistoryProviderService::Handle handle,
    107                   bool success,
    108                   int64 id) {
    109     success_ = success;
    110     base::MessageLoop::current()->Quit();
    111   }
    112 
    113   void OnQueryResult(AndroidHistoryProviderService::Handle handle,
    114                      bool success,
    115                      AndroidStatement* statement) {
    116     success_ = success;
    117     statement_ = statement;
    118     base::MessageLoop::current()->Quit();
    119   }
    120 
    121   void OnUpdated(AndroidHistoryProviderService::Handle handle,
    122                  bool success,
    123                  int count) {
    124     success_ = success;
    125     count_ = count;
    126     base::MessageLoop::current()->Quit();
    127   }
    128 
    129   void OnDeleted(AndroidHistoryProviderService::Handle handle,
    130                  bool success,
    131                  int count) {
    132     success_ = success;
    133     count_ = count;
    134     base::MessageLoop::current()->Quit();
    135   }
    136 
    137   void OnStatementMoved(AndroidHistoryProviderService::Handle handle,
    138                         int cursor_position) {
    139     cursor_position_ = cursor_position;
    140     base::MessageLoop::current()->Quit();
    141   }
    142 
    143  private:
    144   friend class base::RefCountedThreadSafe<CallbackHelper>;
    145   ~CallbackHelper() {
    146   }
    147 
    148   bool success_;
    149   AndroidStatement* statement_;
    150   int cursor_position_;
    151   int count_;
    152 
    153   DISALLOW_COPY_AND_ASSIGN(CallbackHelper);
    154 };
    155 
    156 TEST_F(AndroidHistoryProviderServiceTest, TestHistoryAndBookmark) {
    157   HistoryAndBookmarkRow row;
    158   row.set_raw_url("http://www.google.com");
    159   row.set_url(GURL("http://www.google.com"));
    160 
    161   scoped_refptr<CallbackHelper> callback(new CallbackHelper());
    162 
    163   // Insert a row and verify it succeeded.
    164   service_->InsertHistoryAndBookmark(row, &cancelable_consumer_,
    165       Bind(&CallbackHelper::OnInserted, callback.get()));
    166 
    167   base::MessageLoop::current()->Run();
    168   EXPECT_TRUE(callback->success());
    169 
    170   std::vector<HistoryAndBookmarkRow::ColumnID> projections;
    171   projections.push_back(HistoryAndBookmarkRow::ID);
    172 
    173   // Query the inserted row.
    174   service_->QueryHistoryAndBookmarks(projections, std::string(),
    175       std::vector<base::string16>(), std::string(), &cancelable_consumer_,
    176       Bind(&CallbackHelper::OnQueryResult, callback.get()));
    177   base::MessageLoop::current()->Run();
    178   ASSERT_TRUE(callback->success());
    179 
    180   // Move the cursor to the begining and verify whether we could get
    181   // the same result.
    182   AndroidStatement* statement = callback->statement();
    183   service_->MoveStatement(statement, 0, -1, &cancelable_consumer_,
    184       Bind(&CallbackHelper::OnStatementMoved, callback.get()));
    185   base::MessageLoop::current()->Run();
    186   EXPECT_EQ(-1, callback->cursor_position());
    187   EXPECT_TRUE(callback->statement()->statement()->Step());
    188   EXPECT_FALSE(callback->statement()->statement()->Step());
    189   service_->CloseStatement(statement);
    190 
    191   // Update the row.
    192   HistoryAndBookmarkRow update_row;
    193   update_row.set_visit_count(3);
    194   service_->UpdateHistoryAndBookmarks(update_row, std::string(),
    195       std::vector<base::string16>(), &cancelable_consumer_,
    196       Bind(&CallbackHelper::OnUpdated, callback.get()));
    197   base::MessageLoop::current()->Run();
    198   EXPECT_TRUE(callback->success());
    199   EXPECT_EQ(1, callback->count());
    200 
    201   // Delete the row.
    202   service_->DeleteHistoryAndBookmarks(std::string(),
    203       std::vector<base::string16>(),
    204       &cancelable_consumer_, Bind(&CallbackHelper::OnDeleted, callback.get()));
    205   base::MessageLoop::current()->Run();
    206   EXPECT_TRUE(callback->success());
    207   EXPECT_EQ(1, callback->count());
    208 }
    209 
    210 TEST_F(AndroidHistoryProviderServiceTest, TestSearchTerm) {
    211   SearchRow search_row;
    212   search_row.set_search_term(base::UTF8ToUTF16("google"));
    213   search_row.set_url(GURL("http://google.com"));
    214   search_row.set_template_url_id(1);
    215   search_row.set_search_time(Time::Now());
    216 
    217   scoped_refptr<CallbackHelper> callback(new CallbackHelper());
    218 
    219   // Insert a row and verify it succeeded.
    220   service_->InsertSearchTerm(search_row, &cancelable_consumer_,
    221       Bind(&CallbackHelper::OnInserted, callback.get()));
    222 
    223   base::MessageLoop::current()->Run();
    224   EXPECT_TRUE(callback->success());
    225 
    226   std::vector<SearchRow::ColumnID> projections;
    227   projections.push_back(SearchRow::ID);
    228 
    229   // Query the inserted row.
    230   service_->QuerySearchTerms(projections, std::string(),
    231       std::vector<base::string16>(), std::string(), &cancelable_consumer_,
    232       Bind(&CallbackHelper::OnQueryResult, callback.get()));
    233   base::MessageLoop::current()->Run();
    234   ASSERT_TRUE(callback->success());
    235 
    236   // Move the cursor to the begining and verify whether we could get
    237   // the same result.
    238   AndroidStatement* statement = callback->statement();
    239   service_->MoveStatement(statement, 0, -1, &cancelable_consumer_,
    240       Bind(&CallbackHelper::OnStatementMoved, callback.get()));
    241   base::MessageLoop::current()->Run();
    242   EXPECT_EQ(-1, callback->cursor_position());
    243   EXPECT_TRUE(callback->statement()->statement()->Step());
    244   EXPECT_FALSE(callback->statement()->statement()->Step());
    245   service_->CloseStatement(statement);
    246 
    247   // Update the row.
    248   SearchRow update_row;
    249   update_row.set_search_time(Time::Now());
    250   service_->UpdateSearchTerms(update_row, std::string(),
    251       std::vector<base::string16>(), &cancelable_consumer_,
    252       Bind(&CallbackHelper::OnUpdated, callback.get()));
    253   base::MessageLoop::current()->Run();
    254   EXPECT_TRUE(callback->success());
    255   EXPECT_EQ(1, callback->count());
    256 
    257   // Delete the row.
    258   service_->DeleteSearchTerms(std::string(), std::vector<base::string16>(),
    259       &cancelable_consumer_, Bind(&CallbackHelper::OnDeleted, callback.get()));
    260   base::MessageLoop::current()->Run();
    261   EXPECT_TRUE(callback->success());
    262   EXPECT_EQ(1, callback->count());
    263 }
    264 
    265 }  // namespace
    266