root/chrome/browser/history/history_types_unittest.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. CheckHistoryResultConsistency
  2. AddSimpleData
  3. TEST
  4. TEST
  5. TEST

// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "base/strings/utf_string_conversions.h"
#include "chrome/browser/history/history_types.h"
#include "testing/gtest/include/gtest/gtest.h"

namespace history {

namespace {

// Validates the consistency of the given history result. We just make sure
// that the URL rows match the indices structure. The unit tests themselves
// test the index structure to verify things are in the right order, so we
// don't need to.
void CheckHistoryResultConsistency(const QueryResults& result) {
  for (size_t i = 0; i < result.size(); i++) {
    size_t match_count;
    const size_t* matches = result.MatchesForURL(result[i].url(), &match_count);

    bool found = false;
    for (size_t match = 0; match < match_count; match++) {
      if (matches[match] == i) {
        found = true;
        break;
      }
    }

    EXPECT_TRUE(found) << "The URL had no index referring to it.";
  }
}

const char kURL1[] = "http://www.google.com/";
const char kURL2[] = "http://news.google.com/";

// Adds kURL1 twice and kURL2 once.
void AddSimpleData(QueryResults* results) {
  GURL url1(kURL1);
  GURL url2(kURL2);
  URLResult result1(url1, base::Time::Now());
  URLResult result2(url1, base::Time::Now());
  URLResult result3(url2, base::Time::Now());

  // The URLResults are invalid after being inserted.
  results->AppendURLBySwapping(&result1);
  results->AppendURLBySwapping(&result2);
  results->AppendURLBySwapping(&result3);
  CheckHistoryResultConsistency(*results);
}

}  // namespace

// Tests insertion and deletion by range.
TEST(HistoryQueryResult, DeleteRange) {
  GURL url1(kURL1);
  GURL url2(kURL2);
  QueryResults results;
  AddSimpleData(&results);

  // Make sure the first URL is in there twice. The indices can be in either
  // order.
  size_t match_count;
  const size_t* matches = results.MatchesForURL(url1, &match_count);
  ASSERT_EQ(2U, match_count);
  EXPECT_TRUE((matches[0] == 0 && matches[1] == 1) ||
              (matches[0] == 1 && matches[1] == 0));

  // Check the second one.
  matches = results.MatchesForURL(url2, &match_count);
  ASSERT_EQ(1U, match_count);
  EXPECT_TRUE(matches[0] == 2);

  // Delete the first instance of the first URL.
  results.DeleteRange(0, 0);
  CheckHistoryResultConsistency(results);

  // Check the two URLs.
  matches = results.MatchesForURL(url1, &match_count);
  ASSERT_EQ(1U, match_count);
  EXPECT_TRUE(matches[0] == 0);
  matches = results.MatchesForURL(url2, &match_count);
  ASSERT_EQ(1U, match_count);
  EXPECT_TRUE(matches[0] == 1);

  // Now delete everything and make sure it's deleted.
  results.DeleteRange(0, 1);
  EXPECT_EQ(0U, results.size());
  EXPECT_FALSE(results.MatchesForURL(url1, NULL));
  EXPECT_FALSE(results.MatchesForURL(url2, NULL));
}

// Tests insertion and deletion by URL.
TEST(HistoryQueryResult, ResultDeleteURL) {
  GURL url1(kURL1);
  GURL url2(kURL2);
  QueryResults results;
  AddSimpleData(&results);

  // Delete the first URL.
  results.DeleteURL(url1);
  CheckHistoryResultConsistency(results);
  EXPECT_EQ(1U, results.size());

  // The first one should be gone, and the second one should be at [0].
  size_t match_count;
  EXPECT_FALSE(results.MatchesForURL(url1, NULL));
  const size_t* matches = results.MatchesForURL(url2, &match_count);
  ASSERT_EQ(1U, match_count);
  EXPECT_TRUE(matches[0] == 0);

  // Delete the second URL, there should be nothing left.
  results.DeleteURL(url2);
  EXPECT_EQ(0U, results.size());
  EXPECT_FALSE(results.MatchesForURL(url2, NULL));
}

TEST(HistoryQueryResult, RowSignificance) {
  const base::Time& threshold(AutocompleteAgeThreshold());
  const GURL url("http://www.google.com/");
  URLRow url_row(url);
  url_row.set_title(base::UTF8ToUTF16("Google"));
  EXPECT_FALSE(RowQualifiesAsSignificant(url_row, threshold));
  EXPECT_FALSE(RowQualifiesAsSignificant(url_row, base::Time()));
  url_row.set_visit_count(kLowQualityMatchVisitLimit);
  EXPECT_TRUE(RowQualifiesAsSignificant(url_row, threshold));
  EXPECT_TRUE(RowQualifiesAsSignificant(url_row, base::Time()));
  url_row.set_visit_count(1);
  EXPECT_FALSE(RowQualifiesAsSignificant(url_row, threshold));
  EXPECT_FALSE(RowQualifiesAsSignificant(url_row, base::Time()));
  url_row.set_typed_count(kLowQualityMatchTypedLimit);
  EXPECT_TRUE(RowQualifiesAsSignificant(url_row, threshold));
  EXPECT_TRUE(RowQualifiesAsSignificant(url_row, base::Time()));
  url_row.set_typed_count(0);
  EXPECT_FALSE(RowQualifiesAsSignificant(url_row, threshold));
  EXPECT_FALSE(RowQualifiesAsSignificant(url_row, base::Time()));
  url_row.set_last_visit(base::Time::Now() - base::TimeDelta::FromDays(1));
  EXPECT_TRUE(RowQualifiesAsSignificant(url_row, threshold));
  EXPECT_TRUE(RowQualifiesAsSignificant(url_row, base::Time()));
  url_row.set_last_visit(base::Time::Now() -
      base::TimeDelta::FromDays(kLowQualityMatchAgeLimitInDays + 1));
  EXPECT_FALSE(RowQualifiesAsSignificant(url_row, threshold));
  EXPECT_FALSE(RowQualifiesAsSignificant(url_row, base::Time()));
}

}  // namespace history

/* [<][>][^][v][top][bottom][index][help] */