blob: c3b33f5d1cc2f0f1ecf4cd68ba7936502fdacf93 [file] [log] [blame]
// Copyright 2018 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 "chrome/browser/android/explore_sites/record_site_click_task.h"
#include "base/bind.h"
#include "base/logging.h"
#include "base/test/bind_test_util.h"
#include "base/test/mock_callback.h"
#include "chrome/browser/android/explore_sites/explore_sites_schema.h"
#include "components/offline_pages/task/task.h"
#include "components/offline_pages/task/task_test_base.h"
#include "sql/database.h"
#include "sql/meta_table.h"
#include "sql/statement.h"
#include "testing/gtest/include/gtest/gtest.h"
using offline_pages::TaskTestBase;
namespace explore_sites {
const char kUrl[] = "https://www.example.com";
const int kType = 5;
class ExploreSitesRecordSiteClickTest : public TaskTestBase {
public:
ExploreSitesRecordSiteClickTest() = default;
~ExploreSitesRecordSiteClickTest() override = default;
void SetUp() override {
store_ = std::make_unique<ExploreSitesStore>(task_runner());
success_ = false;
}
ExploreSitesStore* store() { return store_.get(); }
void ExecuteSync(base::RepeatingCallback<bool(sql::Database*)> query) {
store()->Execute(base::OnceCallback<bool(sql::Database*)>(query),
base::BindOnce([](bool result) { ASSERT_TRUE(result); }),
false);
RunUntilIdle();
}
bool success() { return success_; }
void PopulateActivity();
private:
std::unique_ptr<ExploreSitesStore> store_;
bool success_;
DISALLOW_COPY_AND_ASSIGN(ExploreSitesRecordSiteClickTest);
};
void ExploreSitesRecordSiteClickTest::PopulateActivity() {
ExecuteSync(base::BindLambdaForTesting([&](sql::Database* db) {
for (int i = 0; i < 200; i++) {
sql::Statement insert_activity(db->GetUniqueStatement(R"(
INSERT INTO activity
(time, category_type, url)
VALUES
(?, 1, "https://www.google.com");
)"));
insert_activity.BindInt64(0, i + 1);
insert_activity.Run();
}
return true;
}));
}
TEST_F(ExploreSitesRecordSiteClickTest, StoreFailure) {
store()->SetInitializationStatusForTest(InitializationStatus::FAILURE);
RecordSiteClickTask task(store(), kUrl, kType);
RunTask(&task);
// A database failure should be completed but return with an error.
EXPECT_TRUE(task.complete());
EXPECT_FALSE(task.result());
}
TEST_F(ExploreSitesRecordSiteClickTest, EmptyUrlTask) {
RecordSiteClickTask task(store(), "", kType);
RunTask(&task);
// The task should be completed but return with an error.
EXPECT_TRUE(task.complete());
EXPECT_FALSE(task.result());
// Check that activity table is not modified.
ExecuteSync(base::BindLambdaForTesting([&](sql::Database* db) {
sql::Statement cat_activity_s(
db->GetUniqueStatement("SELECT COUNT(*) FROM activity"));
cat_activity_s.Step();
EXPECT_EQ(0, cat_activity_s.ColumnInt(0));
return true;
}));
}
TEST_F(ExploreSitesRecordSiteClickTest, ValidUrlTask) {
RecordSiteClickTask task(store(), kUrl, kType);
RunTask(&task);
// The task should be completed but return with an error.
EXPECT_TRUE(task.complete());
EXPECT_TRUE(task.result());
// Check that activity table is not modified.
ExecuteSync(base::BindLambdaForTesting([&](sql::Database* db) {
sql::Statement cat_activity_s(db->GetUniqueStatement(
"SELECT COUNT(*), url, category_type FROM activity"));
cat_activity_s.Step();
EXPECT_EQ(1, cat_activity_s.ColumnInt(0));
EXPECT_EQ(kUrl, cat_activity_s.ColumnString(1));
EXPECT_EQ(kType, cat_activity_s.ColumnInt(2));
return true;
}));
}
TEST_F(ExploreSitesRecordSiteClickTest, RemoveWhenOver200) {
PopulateActivity();
RecordSiteClickTask task(store(), kUrl, kType);
RunTask(&task);
// The task should be completed but return with an error.
EXPECT_TRUE(task.complete());
EXPECT_TRUE(task.result());
// Check that activity table is not modified.
ExecuteSync(base::BindLambdaForTesting([&](sql::Database* db) {
sql::Statement cat_activity_s(
db->GetUniqueStatement("SELECT COUNT(*) FROM activity"));
cat_activity_s.Step();
EXPECT_EQ(200, cat_activity_s.ColumnInt(0));
return true;
}));
}
} // namespace explore_sites