| Index: chrome/browser/predictors/resource_prefetch_predictor_tables_unittest.cc
|
| diff --git a/chrome/browser/predictors/resource_prefetch_predictor_tables_unittest.cc b/chrome/browser/predictors/resource_prefetch_predictor_tables_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..63ed7c4e75b3f9d139a4b554fa3bb6ca2239f139
|
| --- /dev/null
|
| +++ b/chrome/browser/predictors/resource_prefetch_predictor_tables_unittest.cc
|
| @@ -0,0 +1,472 @@
|
| +// Copyright 2014 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 <set>
|
| +#include <utility>
|
| +#include <vector>
|
| +
|
| +#include "base/message_loop/message_loop.h"
|
| +#include "base/strings/utf_string_conversions.h"
|
| +#include "chrome/browser/predictors/predictor_database.h"
|
| +#include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
|
| +#include "chrome/test/base/testing_profile.h"
|
| +#include "content/public/test/test_browser_thread.h"
|
| +#include "sql/statement.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +namespace predictors {
|
| +
|
| +class ResourcePrefetchPredictorTablesTest : public testing::Test {
|
| + public:
|
| + ResourcePrefetchPredictorTablesTest();
|
| + virtual ~ResourcePrefetchPredictorTablesTest();
|
| + virtual void SetUp() OVERRIDE;
|
| + virtual void TearDown() OVERRIDE;
|
| +
|
| + protected:
|
| + void TestGetAllData();
|
| + void TestUpdateData();
|
| + void TestDeleteData();
|
| + void TestDeleteSingleDataPoint();
|
| + void TestDeleteAllData();
|
| +
|
| + base::MessageLoop loop_;
|
| + content::TestBrowserThread db_thread_;
|
| + TestingProfile profile_;
|
| + scoped_ptr<PredictorDatabase> db_;
|
| + scoped_refptr<ResourcePrefetchPredictorTables> tables_;
|
| +
|
| + private:
|
| + typedef ResourcePrefetchPredictorTables::ResourceRow ResourceRow;
|
| + typedef std::vector<ResourceRow> ResourceRows;
|
| + typedef ResourcePrefetchPredictorTables::PrefetchData PrefetchData;
|
| + typedef ResourcePrefetchPredictorTables::PrefetchDataMap PrefetchDataMap;
|
| +
|
| + // Initializes the tables, |test_url_data_| and |test_host_data_|.
|
| + void InitializeSampleData();
|
| +
|
| + // Checks that the input PrefetchData are the same, although the resources
|
| + // can be in different order.
|
| + void TestPrefetchDataAreEqual(const PrefetchDataMap& lhs,
|
| + const PrefetchDataMap& rhs) const;
|
| + void TestResourceRowsAreEqual(const ResourceRows& lhs,
|
| + const ResourceRows& rhs) const;
|
| +
|
| + void AddKey(PrefetchDataMap* m, const std::string& key) const;
|
| +
|
| + // Useful for debugging test.
|
| + void PrintPrefetchData(const PrefetchData& data) const {
|
| + LOG(ERROR) << "[" << data.key_type << "," << data.primary_key
|
| + << "," << data.last_visit.ToInternalValue() << "]";
|
| + for (ResourceRows::const_iterator it = data.resources.begin();
|
| + it != data.resources.end(); ++it) {
|
| + LOG(ERROR) << "\t\t" << it->resource_url << "\t" << it->resource_type
|
| + << "\t" << it->number_of_hits << "\t" << it->number_of_misses
|
| + << "\t" << it->consecutive_misses
|
| + << "\t" << it->average_position
|
| + << "\t" << it->score;
|
| + }
|
| + }
|
| +
|
| + PrefetchDataMap test_url_data_;
|
| + PrefetchDataMap test_host_data_;
|
| +};
|
| +
|
| +class ResourcePrefetchPredictorTablesReopenTest
|
| + : public ResourcePrefetchPredictorTablesTest {
|
| + public:
|
| + virtual void SetUp() OVERRIDE {
|
| + // Write data to the table, and then reopen the db.
|
| + ResourcePrefetchPredictorTablesTest::SetUp();
|
| + ResourcePrefetchPredictorTablesTest::TearDown();
|
| +
|
| + db_.reset(new PredictorDatabase(&profile_));
|
| + loop_.RunUntilIdle();
|
| + tables_ = db_->resource_prefetch_tables();
|
| + }
|
| +};
|
| +
|
| +ResourcePrefetchPredictorTablesTest::ResourcePrefetchPredictorTablesTest()
|
| + : loop_(base::MessageLoop::TYPE_DEFAULT),
|
| + db_thread_(content::BrowserThread::DB, &loop_),
|
| + db_(new PredictorDatabase(&profile_)),
|
| + tables_(db_->resource_prefetch_tables()) {
|
| + loop_.RunUntilIdle();
|
| +}
|
| +
|
| +ResourcePrefetchPredictorTablesTest::~ResourcePrefetchPredictorTablesTest() {
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::SetUp() {
|
| + tables_->DeleteAllData();
|
| + InitializeSampleData();
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::TearDown() {
|
| + tables_ = NULL;
|
| + db_.reset();
|
| + loop_.RunUntilIdle();
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::TestGetAllData() {
|
| + PrefetchDataMap actual_url_data, actual_host_data;
|
| + tables_->GetAllData(&actual_url_data, &actual_host_data);
|
| +
|
| + TestPrefetchDataAreEqual(test_url_data_, actual_url_data);
|
| + TestPrefetchDataAreEqual(test_host_data_, actual_host_data);
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::TestDeleteData() {
|
| + std::vector<std::string> urls_to_delete, hosts_to_delete;
|
| + urls_to_delete.push_back("http://www.google.com");
|
| + urls_to_delete.push_back("http://www.yahoo.com");
|
| + hosts_to_delete.push_back("www.yahoo.com");
|
| +
|
| + tables_->DeleteData(urls_to_delete, hosts_to_delete);
|
| +
|
| + PrefetchDataMap actual_url_data, actual_host_data;
|
| + tables_->GetAllData(&actual_url_data, &actual_host_data);
|
| +
|
| + PrefetchDataMap expected_url_data, expected_host_data;
|
| + AddKey(&expected_url_data, "http://www.reddit.com");
|
| + AddKey(&expected_host_data, "www.facebook.com");
|
| +
|
| + TestPrefetchDataAreEqual(expected_url_data, actual_url_data);
|
| + TestPrefetchDataAreEqual(expected_host_data, actual_host_data);
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() {
|
| + // Delete a URL.
|
| + tables_->DeleteSingleDataPoint("http://www.reddit.com",
|
| + PREFETCH_KEY_TYPE_URL);
|
| +
|
| + PrefetchDataMap actual_url_data, actual_host_data;
|
| + tables_->GetAllData(&actual_url_data, &actual_host_data);
|
| +
|
| + PrefetchDataMap expected_url_data;
|
| + AddKey(&expected_url_data, "http://www.google.com");
|
| + AddKey(&expected_url_data, "http://www.yahoo.com");
|
| +
|
| + TestPrefetchDataAreEqual(expected_url_data, actual_url_data);
|
| + TestPrefetchDataAreEqual(test_host_data_, actual_host_data);
|
| +
|
| + // Delete a host.
|
| + tables_->DeleteSingleDataPoint("www.facebook.com", PREFETCH_KEY_TYPE_HOST);
|
| + actual_url_data.clear();
|
| + actual_host_data.clear();
|
| + tables_->GetAllData(&actual_url_data, &actual_host_data);
|
| +
|
| + PrefetchDataMap expected_host_data;
|
| + AddKey(&expected_host_data, "www.yahoo.com");
|
| +
|
| + TestPrefetchDataAreEqual(expected_url_data, actual_url_data);
|
| + TestPrefetchDataAreEqual(expected_host_data, actual_host_data);
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::TestUpdateData() {
|
| + PrefetchData google(PREFETCH_KEY_TYPE_URL, "http://www.google.com");
|
| + google.last_visit = base::Time::FromInternalValue(10);
|
| + google.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/style.css",
|
| + content::RESOURCE_TYPE_STYLESHEET,
|
| + 6,
|
| + 2,
|
| + 0,
|
| + 1.0));
|
| + google.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/image.png",
|
| + content::RESOURCE_TYPE_IMAGE,
|
| + 6,
|
| + 4,
|
| + 1,
|
| + 4.2));
|
| + google.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/a.xml",
|
| + content::RESOURCE_TYPE_LAST_TYPE,
|
| + 1,
|
| + 0,
|
| + 0,
|
| + 6.1));
|
| + google.resources
|
| + .push_back(ResourceRow(std::string(),
|
| + "http://www.resources.google.com/script.js",
|
| + content::RESOURCE_TYPE_SCRIPT,
|
| + 12,
|
| + 0,
|
| + 0,
|
| + 8.5));
|
| +
|
| + PrefetchData yahoo(PREFETCH_KEY_TYPE_HOST, "www.yahoo.com");
|
| + yahoo.last_visit = base::Time::FromInternalValue(7);
|
| + yahoo.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.yahoo.com/image.png",
|
| + content::RESOURCE_TYPE_IMAGE,
|
| + 120,
|
| + 1,
|
| + 1,
|
| + 10.0));
|
| +
|
| + tables_->UpdateData(google, yahoo);
|
| +
|
| + PrefetchDataMap actual_url_data, actual_host_data;
|
| + tables_->GetAllData(&actual_url_data, &actual_host_data);
|
| +
|
| + PrefetchDataMap expected_url_data, expected_host_data;
|
| + AddKey(&expected_url_data, "http://www.reddit.com");
|
| + AddKey(&expected_url_data, "http://www.yahoo.com");
|
| + expected_url_data.insert(std::make_pair("http://www.google.com", google));
|
| +
|
| + AddKey(&expected_host_data, "www.facebook.com");
|
| + expected_host_data.insert(std::make_pair("www.yahoo.com", yahoo));
|
| +
|
| + TestPrefetchDataAreEqual(expected_url_data, actual_url_data);
|
| + TestPrefetchDataAreEqual(expected_host_data, actual_host_data);
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::TestDeleteAllData() {
|
| + tables_->DeleteAllData();
|
| +
|
| + PrefetchDataMap actual_url_data, actual_host_data;
|
| + tables_->GetAllData(&actual_url_data, &actual_host_data);
|
| + EXPECT_TRUE(actual_url_data.empty());
|
| + EXPECT_TRUE(actual_host_data.empty());
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::TestPrefetchDataAreEqual(
|
| + const PrefetchDataMap& lhs,
|
| + const PrefetchDataMap& rhs) const {
|
| + EXPECT_EQ(lhs.size(), rhs.size());
|
| +
|
| + for (PrefetchDataMap::const_iterator rhs_it = rhs.begin();
|
| + rhs_it != rhs.end(); ++rhs_it) {
|
| + PrefetchDataMap::const_iterator lhs_it = lhs.find(rhs_it->first);
|
| + ASSERT_TRUE(lhs_it != lhs.end()) << rhs_it->first;
|
| +
|
| + TestResourceRowsAreEqual(lhs_it->second.resources,
|
| + rhs_it->second.resources);
|
| + }
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::TestResourceRowsAreEqual(
|
| + const ResourceRows& lhs,
|
| + const ResourceRows& rhs) const {
|
| + EXPECT_EQ(lhs.size(), rhs.size());
|
| +
|
| + std::set<GURL> resources_seen;
|
| + for (ResourceRows::const_iterator rhs_it = rhs.begin();
|
| + rhs_it != rhs.end(); ++rhs_it) {
|
| + const GURL& resource = rhs_it->resource_url;
|
| + EXPECT_FALSE(ContainsKey(resources_seen, resource));
|
| +
|
| + for (ResourceRows::const_iterator lhs_it = lhs.begin();
|
| + lhs_it != lhs.end(); ++lhs_it) {
|
| + if (*rhs_it == *lhs_it) {
|
| + resources_seen.insert(resource);
|
| + break;
|
| + }
|
| + }
|
| + EXPECT_TRUE(ContainsKey(resources_seen, resource));
|
| + }
|
| + EXPECT_EQ(lhs.size(), resources_seen.size());
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::AddKey(PrefetchDataMap* m,
|
| + const std::string& key) const {
|
| + PrefetchDataMap::const_iterator it = test_url_data_.find(key);
|
| + if (it != test_url_data_.end()) {
|
| + m->insert(std::make_pair(it->first, it->second));
|
| + return;
|
| + }
|
| + it = test_host_data_.find(key);
|
| + ASSERT_TRUE(it != test_host_data_.end());
|
| + m->insert(std::make_pair(it->first, it->second));
|
| +}
|
| +
|
| +void ResourcePrefetchPredictorTablesTest::InitializeSampleData() {
|
| + { // Url data.
|
| + PrefetchData google(PREFETCH_KEY_TYPE_URL, "http://www.google.com");
|
| + google.last_visit = base::Time::FromInternalValue(1);
|
| + google.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/style.css",
|
| + content::RESOURCE_TYPE_STYLESHEET,
|
| + 5,
|
| + 2,
|
| + 1,
|
| + 1.1));
|
| + google.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/script.js",
|
| + content::RESOURCE_TYPE_SCRIPT,
|
| + 4,
|
| + 0,
|
| + 1,
|
| + 2.1));
|
| + google.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/image.png",
|
| + content::RESOURCE_TYPE_IMAGE,
|
| + 6,
|
| + 3,
|
| + 0,
|
| + 2.2));
|
| + google.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/a.font",
|
| + content::RESOURCE_TYPE_LAST_TYPE,
|
| + 2,
|
| + 0,
|
| + 0,
|
| + 5.1));
|
| + google.resources
|
| + .push_back(ResourceRow(std::string(),
|
| + "http://www.resources.google.com/script.js",
|
| + content::RESOURCE_TYPE_SCRIPT,
|
| + 11,
|
| + 0,
|
| + 0,
|
| + 8.5));
|
| +
|
| + PrefetchData reddit(PREFETCH_KEY_TYPE_URL, "http://www.reddit.com");
|
| + reddit.last_visit = base::Time::FromInternalValue(2);
|
| + reddit.resources
|
| + .push_back(ResourceRow(std::string(),
|
| + "http://reddit-resource.com/script1.js",
|
| + content::RESOURCE_TYPE_SCRIPT,
|
| + 4,
|
| + 0,
|
| + 1,
|
| + 1.0));
|
| + reddit.resources
|
| + .push_back(ResourceRow(std::string(),
|
| + "http://reddit-resource.com/script2.js",
|
| + content::RESOURCE_TYPE_SCRIPT,
|
| + 2,
|
| + 0,
|
| + 0,
|
| + 2.1));
|
| +
|
| + PrefetchData yahoo(PREFETCH_KEY_TYPE_URL, "http://www.yahoo.com");
|
| + yahoo.last_visit = base::Time::FromInternalValue(3);
|
| + yahoo.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/image.png",
|
| + content::RESOURCE_TYPE_IMAGE,
|
| + 20,
|
| + 1,
|
| + 0,
|
| + 10.0));
|
| +
|
| + test_url_data_.clear();
|
| + test_url_data_.insert(std::make_pair("http://www.google.com", google));
|
| + test_url_data_.insert(std::make_pair("http://www.reddit.com", reddit));
|
| + test_url_data_.insert(std::make_pair("http://www.yahoo.com", yahoo));
|
| +
|
| + PrefetchData empty_host_data(PREFETCH_KEY_TYPE_HOST, std::string());
|
| + tables_->UpdateData(google, empty_host_data);
|
| + tables_->UpdateData(reddit, empty_host_data);
|
| + tables_->UpdateData(yahoo, empty_host_data);
|
| + }
|
| +
|
| + { // Host data.
|
| + PrefetchData facebook(PREFETCH_KEY_TYPE_HOST, "www.facebook.com");
|
| + facebook.last_visit = base::Time::FromInternalValue(4);
|
| + facebook.resources
|
| + .push_back(ResourceRow(std::string(),
|
| + "http://www.facebook.com/style.css",
|
| + content::RESOURCE_TYPE_STYLESHEET,
|
| + 5,
|
| + 2,
|
| + 1,
|
| + 1.1));
|
| + facebook.resources
|
| + .push_back(ResourceRow(std::string(),
|
| + "http://www.facebook.com/script.js",
|
| + content::RESOURCE_TYPE_SCRIPT,
|
| + 4,
|
| + 0,
|
| + 1,
|
| + 2.1));
|
| + facebook.resources
|
| + .push_back(ResourceRow(std::string(),
|
| + "http://www.facebook.com/image.png",
|
| + content::RESOURCE_TYPE_IMAGE,
|
| + 6,
|
| + 3,
|
| + 0,
|
| + 2.2));
|
| + facebook.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.facebook.com/a.font",
|
| + content::RESOURCE_TYPE_LAST_TYPE,
|
| + 2,
|
| + 0,
|
| + 0,
|
| + 5.1));
|
| + facebook.resources
|
| + .push_back(ResourceRow(std::string(),
|
| + "http://www.resources.facebook.com/script.js",
|
| + content::RESOURCE_TYPE_SCRIPT,
|
| + 11,
|
| + 0,
|
| + 0,
|
| + 8.5));
|
| +
|
| + PrefetchData yahoo(PREFETCH_KEY_TYPE_HOST, "www.yahoo.com");
|
| + yahoo.last_visit = base::Time::FromInternalValue(5);
|
| + yahoo.resources.push_back(ResourceRow(std::string(),
|
| + "http://www.google.com/image.png",
|
| + content::RESOURCE_TYPE_IMAGE,
|
| + 20,
|
| + 1,
|
| + 0,
|
| + 10.0));
|
| +
|
| + test_host_data_.clear();
|
| + test_host_data_.insert(std::make_pair("www.facebook.com", facebook));
|
| + test_host_data_.insert(std::make_pair("www.yahoo.com", yahoo));
|
| +
|
| + PrefetchData empty_url_data(PREFETCH_KEY_TYPE_URL, std::string());
|
| + tables_->UpdateData(empty_url_data, facebook);
|
| + tables_->UpdateData(empty_url_data, yahoo);
|
| + }
|
| +}
|
| +
|
| +// Test cases.
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesTest, GetAllData) {
|
| + TestGetAllData();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesTest, UpdateData) {
|
| + TestUpdateData();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesTest, DeleteData) {
|
| + TestDeleteData();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesTest, DeleteSingleDataPoint) {
|
| + TestDeleteSingleDataPoint();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesTest, DeleteAllData) {
|
| + TestDeleteAllData();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesReopenTest, GetAllData) {
|
| + TestGetAllData();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesReopenTest, UpdateData) {
|
| + TestUpdateData();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesReopenTest, DeleteData) {
|
| + TestDeleteData();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesReopenTest, DeleteSingleDataPoint) {
|
| + TestDeleteSingleDataPoint();
|
| +}
|
| +
|
| +TEST_F(ResourcePrefetchPredictorTablesReopenTest, DeleteAllData) {
|
| + TestDeleteAllData();
|
| +}
|
| +
|
| +} // namespace predictors
|
|
|