blob: 5086ad7c0f26b05b1d67a94ea4288c8e1c4aa8f5 [file] [log] [blame]
// Copyright 2019 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/usage_stats/usage_stats_database.h"
#include <utility>
#include "components/leveldb_proto/testing/fake_db.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
using leveldb_proto::test::FakeDB;
namespace usage_stats {
namespace {
const char kFqdn1[] = "foo.com";
const char kFqdn2[] = "bar.org";
const char kToken1[] = "token1";
const char kToken2[] = "token2";
} // namespace
class UsageStatsDatabaseTest : public testing::Test {
public:
UsageStatsDatabaseTest() {
auto fake_db = std::make_unique<FakeDB<UsageStat>>(&fake_db_unowned_store_);
// Maintain a pointer to the FakeDB for test callback execution.
fake_db_unowned_ = fake_db.get();
usage_stats_database_ =
std::make_unique<UsageStatsDatabase>(std::move(fake_db));
}
UsageStatsDatabase* usage_stats_database() {
return usage_stats_database_.get();
}
FakeDB<UsageStat>* fake_db() { return fake_db_unowned_; }
MOCK_METHOD1(OnUpdateDone, void(UsageStatsDatabase::Error));
MOCK_METHOD2(OnGetAllSuspensionsDone,
void(UsageStatsDatabase::Error, std::vector<std::string>));
MOCK_METHOD2(OnGetAllTokenMappingsDone,
void(UsageStatsDatabase::Error, UsageStatsDatabase::TokenMap));
private:
std::map<std::string, UsageStat> fake_db_unowned_store_;
FakeDB<UsageStat>* fake_db_unowned_;
std::unique_ptr<UsageStatsDatabase> usage_stats_database_;
DISALLOW_COPY_AND_ASSIGN(UsageStatsDatabaseTest);
};
TEST_F(UsageStatsDatabaseTest, Initialization) {
ASSERT_NE(nullptr, usage_stats_database());
ASSERT_NE(nullptr, fake_db());
}
// Suspension Tests
TEST_F(UsageStatsDatabaseTest, SetSuspensionsSuccess) {
base::flat_set<std::string> domains({kFqdn1, kFqdn2});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kNoError));
usage_stats_database()->SetSuspensions(
domains, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(true);
}
TEST_F(UsageStatsDatabaseTest, SetSuspensionsFailure) {
base::flat_set<std::string> domains({kFqdn1, kFqdn2});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kUnknownError));
usage_stats_database()->SetSuspensions(
domains, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(false);
}
TEST_F(UsageStatsDatabaseTest, GetAllSuspensionsSuccess) {
std::vector<std::string> expected;
EXPECT_CALL(*this, OnGetAllSuspensionsDone(
UsageStatsDatabase::Error::kNoError, expected));
usage_stats_database()->GetAllSuspensions(
base::BindOnce(&UsageStatsDatabaseTest::OnGetAllSuspensionsDone,
base::Unretained(this)));
fake_db()->LoadCallback(true);
}
TEST_F(UsageStatsDatabaseTest, GetAllSuspensionsFailure) {
std::vector<std::string> expected;
EXPECT_CALL(*this, OnGetAllSuspensionsDone(
UsageStatsDatabase::Error::kUnknownError, expected));
usage_stats_database()->GetAllSuspensions(
base::BindOnce(&UsageStatsDatabaseTest::OnGetAllSuspensionsDone,
base::Unretained(this)));
fake_db()->LoadCallback(false);
}
TEST_F(UsageStatsDatabaseTest, SetAndGetSuspension) {
// Insert 1 suspension.
base::flat_set<std::string> domains({kFqdn1});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kNoError));
usage_stats_database()->SetSuspensions(
domains, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(true);
// Get 1 suspension.
std::vector<std::string> expected({kFqdn1});
EXPECT_CALL(*this, OnGetAllSuspensionsDone(
UsageStatsDatabase::Error::kNoError, expected));
usage_stats_database()->GetAllSuspensions(
base::BindOnce(&UsageStatsDatabaseTest::OnGetAllSuspensionsDone,
base::Unretained(this)));
fake_db()->LoadCallback(true);
}
TEST_F(UsageStatsDatabaseTest, SetRemoveAndGetSuspension) {
// Insert 2 suspensions.
base::flat_set<std::string> domains1({kFqdn1, kFqdn2});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kNoError));
usage_stats_database()->SetSuspensions(
domains1, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(true);
// Insert 1 suspension, and remove the other.
base::flat_set<std::string> domains2({kFqdn1});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kNoError));
usage_stats_database()->SetSuspensions(
domains2, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(true);
// Get 1 suspension.
std::vector<std::string> expected({kFqdn1});
EXPECT_CALL(*this, OnGetAllSuspensionsDone(
UsageStatsDatabase::Error::kNoError, expected));
usage_stats_database()->GetAllSuspensions(
base::BindOnce(&UsageStatsDatabaseTest::OnGetAllSuspensionsDone,
base::Unretained(this)));
fake_db()->LoadCallback(true);
}
// Token Mapping Tests
TEST_F(UsageStatsDatabaseTest, SetTokenMappingsSuccess) {
UsageStatsDatabase::TokenMap mappings({{kToken1, kFqdn1}, {kToken2, kFqdn2}});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kNoError));
usage_stats_database()->SetTokenMappings(
mappings, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(true);
}
TEST_F(UsageStatsDatabaseTest, SetTokenMappingsFailure) {
UsageStatsDatabase::TokenMap mappings({{kToken1, kFqdn1}, {kToken2, kFqdn2}});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kUnknownError));
usage_stats_database()->SetTokenMappings(
mappings, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(false);
}
TEST_F(UsageStatsDatabaseTest, GetAllTokenMappingsSuccess) {
UsageStatsDatabase::TokenMap expected;
EXPECT_CALL(*this, OnGetAllTokenMappingsDone(
UsageStatsDatabase::Error::kNoError, expected));
usage_stats_database()->GetAllTokenMappings(
base::BindOnce(&UsageStatsDatabaseTest::OnGetAllTokenMappingsDone,
base::Unretained(this)));
fake_db()->LoadCallback(true);
}
TEST_F(UsageStatsDatabaseTest, GetAllTokenMappingsFailure) {
UsageStatsDatabase::TokenMap expected;
EXPECT_CALL(*this, OnGetAllTokenMappingsDone(
UsageStatsDatabase::Error::kUnknownError, expected));
usage_stats_database()->GetAllTokenMappings(
base::BindOnce(&UsageStatsDatabaseTest::OnGetAllTokenMappingsDone,
base::Unretained(this)));
fake_db()->LoadCallback(false);
}
TEST_F(UsageStatsDatabaseTest, SetAndGetTokenMapping) {
UsageStatsDatabase::TokenMap mapping({{kToken1, kFqdn1}});
// Insert 1 token mapping.
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kNoError));
usage_stats_database()->SetTokenMappings(
mapping, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(true);
// Get 1 token mapping.
EXPECT_CALL(*this, OnGetAllTokenMappingsDone(
UsageStatsDatabase::Error::kNoError, mapping));
usage_stats_database()->GetAllTokenMappings(
base::BindOnce(&UsageStatsDatabaseTest::OnGetAllTokenMappingsDone,
base::Unretained(this)));
fake_db()->LoadCallback(true);
}
TEST_F(UsageStatsDatabaseTest, SetRemoveAndGetTokenMapping) {
// Insert 2 token mappings.
UsageStatsDatabase::TokenMap mappings1(
{{kToken1, kFqdn1}, {kToken2, kFqdn2}});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kNoError));
usage_stats_database()->SetTokenMappings(
mappings1, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(true);
// Re-insert 1 token mapping, and remove the other.apping) {
UsageStatsDatabase::TokenMap mappings2({{kToken1, kFqdn1}});
EXPECT_CALL(*this, OnUpdateDone(UsageStatsDatabase::Error::kNoError));
usage_stats_database()->SetTokenMappings(
mappings2, base::BindOnce(&UsageStatsDatabaseTest::OnUpdateDone,
base::Unretained(this)));
fake_db()->UpdateCallback(true);
// Get 1 remaining token mapping.
EXPECT_CALL(*this, OnGetAllTokenMappingsDone(
UsageStatsDatabase::Error::kNoError, mappings2));
usage_stats_database()->GetAllTokenMappings(
base::BindOnce(&UsageStatsDatabaseTest::OnGetAllTokenMappingsDone,
base::Unretained(this)));
fake_db()->LoadCallback(true);
}
} // namespace usage_stats