Home | History | Annotate | Download | only in webui
      1 // Copyright (c) 2013 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/ui/webui/history_ui.h"
      6 
      7 #include "base/strings/utf_string_conversions.h"
      8 #include "testing/gtest/include/gtest/gtest.h"
      9 
     10 namespace {
     11 
     12 struct TestResult {
     13   std::string url;
     14   int64 hour_offset;  // Visit time in hours past the baseline time.
     15 };
     16 
     17 // Duplicates on the same day in the local timezone are removed, so set a
     18 // baseline time in local time.
     19 const base::Time baseline_time = base::Time::UnixEpoch().LocalMidnight();
     20 
     21 // For each item in |results|, create a new Value representing the visit, and
     22 // insert it into |list_value|.
     23 void AddQueryResults(
     24     TestResult* test_results,
     25     int test_results_size,
     26     std::vector<BrowsingHistoryHandler::HistoryEntry>* results) {
     27   for (int i = 0; i < test_results_size; ++i) {
     28     BrowsingHistoryHandler::HistoryEntry entry;
     29     entry.time = baseline_time +
     30                  base::TimeDelta::FromHours(test_results[i].hour_offset);
     31     entry.url = GURL(test_results[i].url);
     32     entry.all_timestamps.insert(entry.time.ToInternalValue());
     33     results->push_back(entry);
     34   }
     35 }
     36 
     37 // Returns true if |result| matches the test data given by |correct_result|,
     38 // otherwise returns false.
     39 bool ResultEquals(
     40     const BrowsingHistoryHandler::HistoryEntry& result,
     41     const TestResult& correct_result) {
     42   base::Time correct_time =
     43       baseline_time + base::TimeDelta::FromHours(correct_result.hour_offset);
     44 
     45   return result.time == correct_time && result.url == GURL(correct_result.url);
     46 }
     47 
     48 }  // namespace
     49 
     50 // Tests that the MergeDuplicateResults method correctly removes duplicate
     51 // visits to the same URL on the same day.
     52 TEST(HistoryUITest, MergeDuplicateResults) {
     53   {
     54     // Basic test that duplicates on the same day are removed.
     55     TestResult test_data[] = {
     56       { "http://google.com", 0 },
     57       { "http://google.de", 1 },
     58       { "http://google.com", 2 },
     59       { "http://google.com", 3 }  // Most recent.
     60     };
     61     std::vector<BrowsingHistoryHandler::HistoryEntry> results;
     62     AddQueryResults(test_data, arraysize(test_data), &results);
     63     BrowsingHistoryHandler::MergeDuplicateResults(&results);
     64 
     65     ASSERT_EQ(2U, results.size());
     66     EXPECT_TRUE(ResultEquals(results[0], test_data[3]));
     67     EXPECT_TRUE(ResultEquals(results[1], test_data[1]));
     68   }
     69 
     70   {
     71     // Test that a duplicate URL on the next day is not removed.
     72     TestResult test_data[] = {
     73       { "http://google.com", 0 },
     74       { "http://google.com", 23 },
     75       { "http://google.com", 24 },  // Most recent.
     76     };
     77     std::vector<BrowsingHistoryHandler::HistoryEntry> results;
     78     AddQueryResults(test_data, arraysize(test_data), &results);
     79     BrowsingHistoryHandler::MergeDuplicateResults(&results);
     80 
     81     ASSERT_EQ(2U, results.size());
     82     EXPECT_TRUE(ResultEquals(results[0], test_data[2]));
     83     EXPECT_TRUE(ResultEquals(results[1], test_data[1]));
     84   }
     85 
     86   {
     87     // Test multiple duplicates across multiple days.
     88     TestResult test_data[] = {
     89       // First day.
     90       { "http://google.de", 0 },
     91       { "http://google.com", 1 },
     92       { "http://google.de", 2 },
     93       { "http://google.com", 3 },
     94 
     95       // Second day.
     96       { "http://google.de", 24 },
     97       { "http://google.com", 25 },
     98       { "http://google.de", 26 },
     99       { "http://google.com", 27 },  // Most recent.
    100     };
    101     std::vector<BrowsingHistoryHandler::HistoryEntry> results;
    102     AddQueryResults(test_data, arraysize(test_data), &results);
    103     BrowsingHistoryHandler::MergeDuplicateResults(&results);
    104 
    105     ASSERT_EQ(4U, results.size());
    106     EXPECT_TRUE(ResultEquals(results[0], test_data[7]));
    107     EXPECT_TRUE(ResultEquals(results[1], test_data[6]));
    108     EXPECT_TRUE(ResultEquals(results[2], test_data[3]));
    109     EXPECT_TRUE(ResultEquals(results[3], test_data[2]));
    110   }
    111 
    112   {
    113     // Test that timestamps for duplicates are properly saved.
    114     TestResult test_data[] = {
    115       { "http://google.com", 0 },
    116       { "http://google.de", 1 },
    117       { "http://google.com", 2 },
    118       { "http://google.com", 3 }  // Most recent.
    119     };
    120     std::vector<BrowsingHistoryHandler::HistoryEntry> results;
    121     AddQueryResults(test_data, arraysize(test_data), &results);
    122     BrowsingHistoryHandler::MergeDuplicateResults(&results);
    123 
    124     ASSERT_EQ(2U, results.size());
    125     EXPECT_TRUE(ResultEquals(results[0], test_data[3]));
    126     EXPECT_TRUE(ResultEquals(results[1], test_data[1]));
    127     EXPECT_EQ(3u, results[0].all_timestamps.size());
    128     EXPECT_EQ(1u, results[1].all_timestamps.size());
    129   }
    130 }
    131