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 <vector>
      6 
      7 #include "chrome/browser/history/android/visit_sql_handler.h"
      8 
      9 #include "base/files/file_path.h"
     10 #include "base/files/scoped_temp_dir.h"
     11 #include "base/strings/stringprintf.h"
     12 #include "base/strings/utf_string_conversions.h"
     13 #include "chrome/browser/history/android/urls_sql_handler.h"
     14 #include "chrome/browser/history/history_database.h"
     15 #include "chrome/common/chrome_constants.h"
     16 #include "testing/gtest/include/gtest/gtest.h"
     17 
     18 using base::Time;
     19 using base::TimeDelta;
     20 
     21 namespace history {
     22 
     23 class VisitSQLHandlerTest : public testing::Test {
     24  public:
     25   VisitSQLHandlerTest()
     26       : urls_sql_handler_(&history_db_),
     27         visit_sql_handler_(&history_db_) {
     28   }
     29   virtual ~VisitSQLHandlerTest() {}
     30 
     31  protected:
     32   virtual void SetUp() {
     33     // Get a temporary directory for the test DB files.
     34     ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
     35     base::FilePath history_db_name = temp_dir_.path().AppendASCII(
     36         chrome::kHistoryFilename);
     37     ASSERT_EQ(sql::INIT_OK, history_db_.Init(history_db_name));
     38   }
     39 
     40   virtual void TearDown() {
     41   }
     42 
     43   HistoryDatabase history_db_;
     44   base::ScopedTempDir temp_dir_;
     45   UrlsSQLHandler urls_sql_handler_;
     46   VisitSQLHandler visit_sql_handler_;
     47 
     48  private:
     49   DISALLOW_COPY_AND_ASSIGN(VisitSQLHandlerTest);
     50 };
     51 
     52 // Insert a url with only url set to verify no visit was inserted in visit
     53 // table.
     54 TEST_F(VisitSQLHandlerTest, InsertURL) {
     55   HistoryAndBookmarkRow row;
     56   row.set_raw_url("http://google.com");
     57   row.set_url(GURL("http://google.com"));
     58 
     59   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
     60   ASSERT_TRUE(visit_sql_handler_.Insert(&row));
     61 
     62   URLRow url_row;
     63   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
     64 
     65   // Noting should be inserted to visit table.
     66   VisitVector visits;
     67   ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits));
     68   EXPECT_EQ(0u, visits.size());
     69 }
     70 
     71 // Insert a url with last visit time set to verify a visit was inserted.
     72 TEST_F(VisitSQLHandlerTest, InsertURLWithLastVisitTime) {
     73   HistoryAndBookmarkRow row;
     74   row.set_raw_url("http://google.com");
     75   row.set_url(GURL("http://google.com"));
     76   row.set_last_visit_time(Time::Now());
     77 
     78   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
     79   ASSERT_TRUE(visit_sql_handler_.Insert(&row));
     80 
     81   URLRow url_row;
     82   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
     83 
     84   VisitVector visits;
     85   ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits));
     86   EXPECT_EQ(1u, visits.size());
     87   EXPECT_EQ(row.last_visit_time(), visits[0].visit_time);
     88 }
     89 
     90 // Insert a urls with created time to verify the a visit was inserted.
     91 TEST_F(VisitSQLHandlerTest, InsertURLWithCreatedTime) {
     92   HistoryAndBookmarkRow row;
     93   row.set_raw_url("http://google.com");
     94   row.set_url(GURL("http://google.com"));
     95   row.set_title(base::UTF8ToUTF16("Google"));
     96   row.set_created(Time::Now());
     97 
     98   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
     99   ASSERT_TRUE(visit_sql_handler_.Insert(&row));
    100 
    101   URLRow url_row;
    102   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    103 
    104   VisitVector visits;
    105   ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits));
    106   EXPECT_EQ(1u, visits.size());
    107   EXPECT_EQ(row.created(), visits[0].visit_time);
    108 }
    109 
    110 // Insert a URL with visit count as 1 to verify a visit was inserted.
    111 TEST_F(VisitSQLHandlerTest, InsertURLWithVisitCount) {
    112   HistoryAndBookmarkRow row;
    113   row.set_raw_url("http://google.com");
    114   row.set_url(GURL("http://google.com"));
    115   row.set_visit_count(1);
    116 
    117   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
    118   ASSERT_TRUE(visit_sql_handler_.Insert(&row));
    119 
    120   URLRow url_row;
    121   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    122 
    123   VisitVector visits;
    124   ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits));
    125   EXPECT_EQ(1u, visits.size());
    126   EXPECT_NE(Time(), visits[0].visit_time);
    127 }
    128 
    129 // Insert a URL with all values set to verify the visit rows
    130 // were inserted correctly.
    131 TEST_F(VisitSQLHandlerTest, Insert) {
    132   HistoryAndBookmarkRow row;
    133   row.set_raw_url("http://google.com");
    134   row.set_url(GURL("http://google.com"));
    135   row.set_visit_count(10);
    136   row.set_last_visit_time(Time::Now());
    137   row.set_created(Time::Now() - TimeDelta::FromDays(1));
    138 
    139   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
    140   ASSERT_TRUE(visit_sql_handler_.Insert(&row));
    141 
    142   URLRow url_row;
    143   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    144 
    145   VisitVector visits;
    146   ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits));
    147   // 10 row were inserted.
    148   EXPECT_EQ(10u, visits.size());
    149   // The earlies one has created time set.
    150   EXPECT_EQ(row.created(), visits[0].visit_time);
    151   // The latest one has last visit time set.
    152   EXPECT_EQ(row.last_visit_time(), visits[9].visit_time);
    153 }
    154 
    155 // Test the case that both visit time and visit count updated.
    156 TEST_F(VisitSQLHandlerTest, UpdateVisitTimeAndVisitCount) {
    157   HistoryAndBookmarkRow row;
    158   row.set_raw_url("http://google.com");
    159   row.set_url(GURL("http://google.com"));
    160   row.set_title(base::UTF8ToUTF16("Google"));
    161   row.set_visit_count(10);
    162   row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10));
    163 
    164   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
    165   ASSERT_TRUE(visit_sql_handler_.Insert(&row));
    166 
    167   URLRow url_row;
    168   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    169 
    170   HistoryAndBookmarkRow update_row;
    171   update_row.set_last_visit_time(Time::Now());
    172   update_row.set_visit_count(1);
    173 
    174   TableIDRow id;
    175   id.url_id = url_row.id();
    176   TableIDRows ids;
    177   ids.push_back(id);
    178   ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids));
    179   ASSERT_TRUE(visit_sql_handler_.Update(update_row, ids));
    180 
    181   VisitVector visits;
    182   ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits));
    183   EXPECT_EQ(1u, visits.size());
    184   EXPECT_EQ(update_row.last_visit_time(), visits[0].visit_time);
    185 }
    186 
    187 // Update visit count to zero to verify the visit rows of this url
    188 // were removed.
    189 TEST_F(VisitSQLHandlerTest, UpdateVisitCountZero) {
    190   HistoryAndBookmarkRow row;
    191   row.set_raw_url("http://google.com");
    192   row.set_url(GURL("http://google.com"));
    193   row.set_visit_count(10);
    194   row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10));
    195 
    196   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
    197   ASSERT_TRUE(visit_sql_handler_.Insert(&row));
    198 
    199   URLRow url_row;
    200   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    201 
    202   HistoryAndBookmarkRow update_row;
    203   update_row.set_visit_count(0);
    204   TableIDRow id;
    205   id.url_id = url_row.id();
    206   TableIDRows ids;
    207   ids.push_back(id);
    208   ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids));
    209   ASSERT_TRUE(visit_sql_handler_.Update(update_row, ids));
    210 
    211   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    212   EXPECT_EQ(0, url_row.visit_count());
    213   // Last visit is reset.
    214   EXPECT_EQ(Time(), url_row.last_visit());
    215   VisitVector visits;
    216   ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits));
    217   EXPECT_EQ(0u, visits.size());
    218 }
    219 
    220 // Update both last visit time and created time to verify
    221 // that visits row are updated correctly.
    222 TEST_F(VisitSQLHandlerTest, UpdateBothTime) {
    223   HistoryAndBookmarkRow row;
    224   row.set_raw_url("http://google.com");
    225   row.set_url(GURL("http://google.com"));
    226   row.set_visit_count(10);
    227   row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10));
    228 
    229   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
    230   ASSERT_TRUE(visit_sql_handler_.Insert(&row));
    231   URLRow url_row;
    232   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    233 
    234   HistoryAndBookmarkRow update_row;
    235   update_row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(9));
    236   update_row.set_created(Time::Now() - TimeDelta::FromDays(10));
    237   TableIDRow id;
    238   id.url_id = url_row.id();
    239   TableIDRows ids;
    240   ids.push_back(id);
    241   ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids));
    242   ASSERT_TRUE(visit_sql_handler_.Update(update_row, ids));
    243 
    244   VisitVector visits;
    245   ASSERT_TRUE(history_db_.GetVisitsForURL(row.url_id(), &visits));
    246   // Though both time are updated, visit count was increase by 1 because of
    247   // last visit time's change.
    248   EXPECT_EQ(11u, visits.size());
    249   EXPECT_EQ(update_row.created(), visits[0].visit_time);
    250   EXPECT_EQ(update_row.last_visit_time(), visits[10].visit_time);
    251 }
    252 
    253 // Update the visit count to verify the new visits are inserted.
    254 TEST_F(VisitSQLHandlerTest, UpdateVisitCountIncreased) {
    255   HistoryAndBookmarkRow row;
    256   row.set_raw_url("http://google.com");
    257   row.set_url(GURL("http://google.com"));
    258   row.set_visit_count(10);
    259   row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10));
    260 
    261   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
    262   URLRow url_row;
    263   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    264   EXPECT_EQ(row.url(), url_row.url());
    265   EXPECT_EQ(10, url_row.visit_count());
    266   EXPECT_EQ(row.last_visit_time(), url_row.last_visit());
    267 
    268   HistoryAndBookmarkRow update_row;
    269   update_row.set_visit_count(11);
    270   TableIDRow id;
    271   id.url_id = url_row.id();
    272   TableIDRows ids;
    273   ids.push_back(id);
    274   ASSERT_TRUE(urls_sql_handler_.Update(update_row, ids));
    275   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    276   EXPECT_EQ(row.url(), url_row.url());
    277   EXPECT_EQ(11, url_row.visit_count());
    278   EXPECT_LT(row.last_visit_time(), url_row.last_visit());
    279 }
    280 
    281 TEST_F(VisitSQLHandlerTest, Delete) {
    282   HistoryAndBookmarkRow row;
    283   row.set_raw_url("http://google.com");
    284   row.set_url(GURL("http://google.com"));
    285   row.set_visit_count(10);
    286   row.set_last_visit_time(Time::Now() - TimeDelta::FromDays(10));
    287 
    288   ASSERT_TRUE(urls_sql_handler_.Insert(&row));
    289   URLRow url_row;
    290   ASSERT_TRUE(history_db_.GetURLRow(row.url_id(), &url_row));
    291   EXPECT_EQ(row.url(), url_row.url());
    292   EXPECT_EQ(10, url_row.visit_count());
    293   EXPECT_EQ(row.last_visit_time(), url_row.last_visit());
    294 
    295   TableIDRow id;
    296   id.url_id = url_row.id();
    297   TableIDRows ids;
    298   ids.push_back(id);
    299   ASSERT_TRUE(urls_sql_handler_.Delete(ids));
    300   EXPECT_FALSE(history_db_.GetURLRow(row.url_id(), &url_row));
    301 }
    302 
    303 }  // namespace history
    304