Home | History | Annotate | Download | only in suggestions
      1 // Copyright 2014 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 "components/suggestions/suggestions_store.h"
      6 
      7 #include "base/time/time.h"
      8 #include "components/pref_registry/testing_pref_service_syncable.h"
      9 #include "components/suggestions/proto/suggestions.pb.h"
     10 #include "testing/gtest/include/gtest/gtest.h"
     11 
     12 using user_prefs::TestingPrefServiceSyncable;
     13 
     14 namespace suggestions {
     15 
     16 namespace {
     17 
     18 const char kTestTitle[] = "Foo site";
     19 const char kTestUrl[] = "http://foo.com/";
     20 const int kTimeGapUsec = 100000;
     21 
     22 void AddSuggestion(SuggestionsProfile* suggestions, const char *title,
     23                    const char *url, int64 expiry_ts) {
     24   ChromeSuggestion* suggestion = suggestions->add_suggestions();
     25   suggestion->set_url(title);
     26   suggestion->set_title(url);
     27   suggestion->set_expiry_ts(expiry_ts);
     28 }
     29 
     30 SuggestionsProfile CreateTestSuggestions() {
     31   SuggestionsProfile suggestions;
     32   ChromeSuggestion* suggestion = suggestions.add_suggestions();
     33   suggestion->set_url(kTestTitle);
     34   suggestion->set_title(kTestUrl);
     35   return suggestions;
     36 }
     37 
     38 SuggestionsProfile CreateTestSuggestionsProfileWithExpiry(int expired_count,
     39                                                           int valid_count) {
     40   int64 now_usec = (base::Time::NowFromSystemTime() - base::Time::UnixEpoch())
     41       .ToInternalValue();
     42   srand(7);  // Constant seed for rand() function.
     43   int64 offset_limit_usec = 30 * base::Time::kMicrosecondsPerDay;
     44   int64 offset_usec = rand() % offset_limit_usec + kTimeGapUsec;
     45 
     46   SuggestionsProfile suggestions;
     47   for (int i = 0; i < valid_count; i++)
     48     AddSuggestion(&suggestions, kTestTitle, kTestUrl, now_usec + offset_usec);
     49   for (int i = 0; i < expired_count; i++)
     50     AddSuggestion(&suggestions, kTestTitle, kTestUrl, now_usec - offset_usec);
     51 
     52   return suggestions;
     53 }
     54 
     55 void ValidateSuggestions(const SuggestionsProfile& expected,
     56                          const SuggestionsProfile& actual) {
     57   EXPECT_EQ(expected.suggestions_size(), actual.suggestions_size());
     58   for (int i = 0; i < expected.suggestions_size(); ++i) {
     59     EXPECT_EQ(expected.suggestions(i).url(), actual.suggestions(i).url());
     60     EXPECT_EQ(expected.suggestions(i).title(), actual.suggestions(i).title());
     61     EXPECT_EQ(expected.suggestions(i).expiry_ts(),
     62               actual.suggestions(i).expiry_ts());
     63     EXPECT_EQ(expected.suggestions(i).favicon_url(),
     64               actual.suggestions(i).favicon_url());
     65     EXPECT_EQ(expected.suggestions(i).thumbnail(),
     66               actual.suggestions(i).thumbnail());
     67   }
     68 }
     69 
     70 }  // namespace
     71 
     72 class SuggestionsStoreTest : public testing::Test {
     73  public:
     74   SuggestionsStoreTest()
     75     : pref_service_(new user_prefs::TestingPrefServiceSyncable) {}
     76 
     77   virtual void SetUp() OVERRIDE {
     78     SuggestionsStore::RegisterProfilePrefs(pref_service_->registry());
     79     suggestions_store_.reset(new SuggestionsStore(pref_service_.get()));
     80   }
     81 
     82  protected:
     83   scoped_ptr<user_prefs::TestingPrefServiceSyncable> pref_service_;
     84   scoped_ptr<SuggestionsStore> suggestions_store_;
     85 
     86   DISALLOW_COPY_AND_ASSIGN(SuggestionsStoreTest);
     87 };
     88 
     89 // Tests LoadSuggestions function to filter expired suggestions.
     90 TEST_F(SuggestionsStoreTest, LoadAllExpired) {
     91   SuggestionsProfile suggestions = CreateTestSuggestionsProfileWithExpiry(5, 0);
     92   SuggestionsProfile filtered_suggestions;
     93 
     94   // Store and load. Expired suggestions should not be loaded.
     95   EXPECT_TRUE(suggestions_store_->StoreSuggestions(suggestions));
     96   EXPECT_FALSE(suggestions_store_->LoadSuggestions(&filtered_suggestions));
     97   EXPECT_EQ(0, filtered_suggestions.suggestions_size());
     98 }
     99 
    100 // Tests LoadSuggestions function to filter expired suggestions.
    101 TEST_F(SuggestionsStoreTest, LoadValidAndExpired) {
    102   SuggestionsProfile suggestions = CreateTestSuggestionsProfileWithExpiry(5, 3);
    103   SuggestionsProfile filtered_suggestions;
    104 
    105   // Store and load. Expired suggestions should not be loaded.
    106   EXPECT_TRUE(suggestions_store_->StoreSuggestions(suggestions));
    107   EXPECT_TRUE(suggestions_store_->LoadSuggestions(&filtered_suggestions));
    108   EXPECT_EQ(3, filtered_suggestions.suggestions_size());
    109 }
    110 
    111 // Tests LoadSuggestions function to filter expired suggestions.
    112 TEST_F(SuggestionsStoreTest, CheckStoreAfterLoadExpired) {
    113   SuggestionsProfile suggestions = CreateTestSuggestionsProfileWithExpiry(5, 3);
    114   SuggestionsProfile filtered_suggestions;
    115 
    116   // Store and load. Expired suggestions should not be loaded.
    117   EXPECT_TRUE(suggestions_store_->StoreSuggestions(suggestions));
    118   EXPECT_TRUE(suggestions_store_->LoadSuggestions(&filtered_suggestions));
    119 
    120   SuggestionsProfile loaded_suggestions;
    121   EXPECT_TRUE(suggestions_store_->LoadSuggestions(&loaded_suggestions));
    122   EXPECT_EQ(3, loaded_suggestions.suggestions_size());
    123   ValidateSuggestions(filtered_suggestions, loaded_suggestions);
    124 }
    125 
    126 TEST_F(SuggestionsStoreTest, LoadStoreClear) {
    127   const SuggestionsProfile suggestions = CreateTestSuggestions();
    128   const SuggestionsProfile empty_suggestions;
    129   SuggestionsProfile recovered_suggestions;
    130 
    131   // Attempt to load when prefs are empty.
    132   EXPECT_FALSE(suggestions_store_->LoadSuggestions(&recovered_suggestions));
    133   ValidateSuggestions(empty_suggestions, recovered_suggestions);
    134 
    135   // Store then reload.
    136   EXPECT_TRUE(suggestions_store_->StoreSuggestions(suggestions));
    137   EXPECT_TRUE(suggestions_store_->LoadSuggestions(&recovered_suggestions));
    138   ValidateSuggestions(suggestions, recovered_suggestions);
    139 
    140   // Clear.
    141   suggestions_store_->ClearSuggestions();
    142   EXPECT_FALSE(suggestions_store_->LoadSuggestions(&recovered_suggestions));
    143   ValidateSuggestions(empty_suggestions, recovered_suggestions);
    144 }
    145 
    146 }  // namespace suggestions
    147