blob: 251184fc62c8cd8a20851cba651be8eaee30c230 [file] [log] [blame]
// Copyright 2017 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/media/media_engagement_preloaded_list.h"
#include <utility>
#include "base/files/file_path.h"
#include "base/macros.h"
#include "base/path_service.h"
#include "base/test/metrics/histogram_tester.h"
#include "build/build_config.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/test/base/testing_profile.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "url/gurl.h"
#include "url/origin.h"
namespace {
const base::FilePath kTestDataPath = base::FilePath(
FILE_PATH_LITERAL("gen/chrome/test/data/media/engagement/preload"));
// This sample data is auto generated at build time.
const base::FilePath kSampleDataPath = kTestDataPath.AppendASCII("test.pb");
const base::FilePath kMissingFilePath = kTestDataPath.AppendASCII("missing.pb");
const base::FilePath kBadFormatFilePath =
kTestDataPath.AppendASCII("bad_format.pb");
const base::FilePath kEmptyFilePath = kTestDataPath.AppendASCII("empty.pb");
const base::FilePath kFileReadFailedPath =
base::FilePath(FILE_PATH_LITERAL(".."));
base::FilePath GetModulePath() {
base::FilePath module_dir;
#if defined(OS_ANDROID)
EXPECT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &module_dir));
#else
EXPECT_TRUE(base::PathService::Get(base::DIR_MODULE, &module_dir));
#endif
return module_dir;
}
} // namespace
class MediaEngagementPreloadedListTest : public ::testing::Test {
public:
void SetUp() override {
preloaded_list_ = std::make_unique<MediaEngagementPreloadedList>();
ASSERT_FALSE(IsLoaded());
ASSERT_TRUE(IsEmpty());
}
bool LoadFromFile(base::FilePath path) {
return preloaded_list_->LoadFromFile(path);
}
bool CheckOriginIsPresent(GURL url) {
return preloaded_list_->CheckOriginIsPresent(url::Origin::Create(url));
}
bool CheckStringIsPresent(const std::string& input) {
return preloaded_list_->CheckStringIsPresent(input) !=
MediaEngagementPreloadedList::DafsaResult::kNotFound;
}
base::FilePath GetFilePathRelativeToModule(base::FilePath path) {
return GetModulePath().Append(path);
}
bool IsLoaded() { return preloaded_list_->loaded(); }
bool IsEmpty() { return preloaded_list_->empty(); }
void ExpectCheckResultFoundHttpsOnlyCount(int count) {
ExpectCheckResultCount(
MediaEngagementPreloadedList::CheckResult::kFoundHttpsOnly, count);
}
void ExpectCheckResultFoundHttpsButWasHttpOnlyCount(int count) {
ExpectCheckResultCount(
MediaEngagementPreloadedList::CheckResult::kFoundHttpsOnlyButWasHttp,
count);
}
void ExpectCheckResultFoundHttpOrHttpsCount(int count) {
ExpectCheckResultCount(
MediaEngagementPreloadedList::CheckResult::kFoundHttpOrHttps, count);
}
void ExpectCheckResultNotFoundCount(int count) {
ExpectCheckResultCount(MediaEngagementPreloadedList::CheckResult::kNotFound,
count);
}
void ExpectCheckResultNotLoadedCount(int count) {
ExpectCheckResultCount(
MediaEngagementPreloadedList::CheckResult::kListNotLoaded, count);
}
void ExpectCheckResultListEmptyCount(int count) {
ExpectCheckResultCount(
MediaEngagementPreloadedList::CheckResult::kListEmpty, count);
}
void ExpectCheckResultTotal(int total) {
histogram_tester_.ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramCheckResultName, total);
}
void ExpectLoadResultLoaded() {
ExpectLoadResult(MediaEngagementPreloadedList::LoadResult::kLoaded);
}
void ExpectLoadResultFileNotFound() {
ExpectLoadResult(MediaEngagementPreloadedList::LoadResult::kFileNotFound);
}
void ExpectLoadResultFileReadFailed() {
ExpectLoadResult(MediaEngagementPreloadedList::LoadResult::kFileReadFailed);
}
void ExpectLoadResultParseProtoFailed() {
ExpectLoadResult(
MediaEngagementPreloadedList::LoadResult::kParseProtoFailed);
}
const base::HistogramTester& histogram_tester() const {
return histogram_tester_;
}
protected:
void ExpectLoadResult(MediaEngagementPreloadedList::LoadResult result) {
histogram_tester_.ExpectBucketCount(
MediaEngagementPreloadedList::kHistogramLoadResultName,
static_cast<int>(result), 1);
// Ensure not other results were logged.
histogram_tester_.ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLoadResultName, 1);
}
void ExpectCheckResultCount(MediaEngagementPreloadedList::CheckResult result,
int count) {
histogram_tester_.ExpectBucketCount(
MediaEngagementPreloadedList::kHistogramCheckResultName,
static_cast<int>(result), count);
}
std::unique_ptr<MediaEngagementPreloadedList> preloaded_list_;
base::HistogramTester histogram_tester_;
};
TEST_F(MediaEngagementPreloadedListTest, CheckOriginIsPresent) {
ASSERT_TRUE(LoadFromFile(GetFilePathRelativeToModule(kSampleDataPath)));
EXPECT_TRUE(IsLoaded());
EXPECT_FALSE(IsEmpty());
// Check the load result was recorded on the histogram.
ExpectLoadResultLoaded();
// Check some origins that are not in the list.
ExpectCheckResultTotal(0);
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://example.com")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://example.org:1234")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://test--3ya.com")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("http://123.123.123.123")));
// Check they were recorded on the histogram.
ExpectCheckResultTotal(4);
ExpectCheckResultFoundHttpsOnlyCount(3);
ExpectCheckResultFoundHttpOrHttpsCount(1);
// Check some origins that are not in the list.
EXPECT_FALSE(CheckOriginIsPresent(GURL("https://example.org")));
EXPECT_FALSE(CheckOriginIsPresent(GURL("http://example.com")));
EXPECT_FALSE(CheckOriginIsPresent(GURL("http://123.123.123.124")));
// Check they were recorded on the histogram.
ExpectCheckResultTotal(7);
ExpectCheckResultNotFoundCount(2);
ExpectCheckResultFoundHttpsButWasHttpOnlyCount(1);
// Make sure only the full origin matches.
EXPECT_FALSE(CheckStringIsPresent("123"));
EXPECT_FALSE(CheckStringIsPresent("http"));
EXPECT_FALSE(CheckStringIsPresent("example.org"));
}
TEST_F(MediaEngagementPreloadedListTest, LoadMissingFile) {
ASSERT_FALSE(LoadFromFile(GetFilePathRelativeToModule(kMissingFilePath)));
EXPECT_FALSE(IsLoaded());
EXPECT_TRUE(IsEmpty());
// Check the load result was recorded on the histogram.
ExpectLoadResultFileNotFound();
// Test checking an origin and make sure the result is recorded to the
// histogram.
EXPECT_FALSE(CheckOriginIsPresent(GURL("https://example.com")));
ExpectCheckResultTotal(1);
ExpectCheckResultNotLoadedCount(1);
}
TEST_F(MediaEngagementPreloadedListTest, LoadFileReadFailed) {
ASSERT_FALSE(LoadFromFile(kFileReadFailedPath));
EXPECT_FALSE(IsLoaded());
EXPECT_TRUE(IsEmpty());
// Check the load result was recorded on the histogram.
ExpectLoadResultFileReadFailed();
// Test checking an origin and make sure the result is recorded to the
// histogram.
EXPECT_FALSE(CheckOriginIsPresent(GURL("https://example.com")));
ExpectCheckResultTotal(1);
ExpectCheckResultNotLoadedCount(1);
}
TEST_F(MediaEngagementPreloadedListTest, LoadBadFormatFile) {
ASSERT_FALSE(LoadFromFile(GetFilePathRelativeToModule(kBadFormatFilePath)));
EXPECT_FALSE(IsLoaded());
EXPECT_TRUE(IsEmpty());
// Check the load result was recorded on the histogram.
ExpectLoadResultParseProtoFailed();
// Test checking an origin and make sure the result is recorded to the
// histogram.
EXPECT_FALSE(CheckOriginIsPresent(GURL("https://example.com")));
ExpectCheckResultTotal(1);
ExpectCheckResultNotLoadedCount(1);
}
TEST_F(MediaEngagementPreloadedListTest, LoadEmptyFile) {
ASSERT_TRUE(LoadFromFile(GetFilePathRelativeToModule(kEmptyFilePath)));
EXPECT_TRUE(IsLoaded());
EXPECT_TRUE(IsEmpty());
// Check the load result was recorded on the histogram.
ExpectLoadResultLoaded();
// Test checking an origin and make sure the result is recorded to the
// histogram.
EXPECT_FALSE(CheckOriginIsPresent(GURL("https://example.com")));
ExpectCheckResultTotal(1);
ExpectCheckResultListEmptyCount(1);
}
TEST_F(MediaEngagementPreloadedListTest, CheckOriginIsPresent_UnsecureSchemes) {
ASSERT_TRUE(LoadFromFile(GetFilePathRelativeToModule(kSampleDataPath)));
EXPECT_TRUE(IsLoaded());
EXPECT_FALSE(IsEmpty());
// Check the load result was recorded on the histogram.
ExpectLoadResultLoaded();
// An origin that has both HTTP and HTTPS entries should allow either.
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://google.com")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("http://google.com")));
ExpectCheckResultTotal(2);
ExpectCheckResultFoundHttpOrHttpsCount(2);
// An origin that only has a HTTP origin should allow either.
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://123.123.123.123")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("http://123.123.123.123")));
ExpectCheckResultTotal(4);
ExpectCheckResultFoundHttpOrHttpsCount(4);
// An origin that has only HTTPS should only allow HTTPS.
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://example.com")));
EXPECT_FALSE(CheckOriginIsPresent(GURL("http://example.com")));
ExpectCheckResultTotal(6);
ExpectCheckResultFoundHttpsOnlyCount(1);
ExpectCheckResultFoundHttpsButWasHttpOnlyCount(1);
}
TEST_F(MediaEngagementPreloadedListTest, RecordsLoadTimeOnSuccess) {
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLoadTimeName, 0);
ASSERT_TRUE(LoadFromFile(GetFilePathRelativeToModule(kSampleDataPath)));
EXPECT_TRUE(IsLoaded());
EXPECT_FALSE(IsEmpty());
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLoadTimeName, 1);
}
TEST_F(MediaEngagementPreloadedListTest, RecordsLoadTimeOnFailure) {
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLoadTimeName, 0);
ASSERT_FALSE(LoadFromFile(GetFilePathRelativeToModule(kBadFormatFilePath)));
EXPECT_FALSE(IsLoaded());
EXPECT_TRUE(IsEmpty());
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLoadTimeName, 1);
}
TEST_F(MediaEngagementPreloadedListTest, RecordsLoadTimeWhenEmpty) {
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLoadTimeName, 0);
ASSERT_TRUE(LoadFromFile(GetFilePathRelativeToModule(kEmptyFilePath)));
EXPECT_TRUE(IsLoaded());
EXPECT_TRUE(IsEmpty());
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLoadTimeName, 1);
}
TEST_F(MediaEngagementPreloadedListTest, RecordsLookupTime) {
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLookupTimeName, 0);
ASSERT_TRUE(LoadFromFile(GetFilePathRelativeToModule(kSampleDataPath)));
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLookupTimeName, 0);
{
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://example.com")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://example.org:1234")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://test--3ya.com")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("http://123.123.123.123")));
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLookupTimeName, 4);
}
// Histograms recorded when checking the same values.
{
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://example.com")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://example.org:1234")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("https://test--3ya.com")));
EXPECT_TRUE(CheckOriginIsPresent(GURL("http://123.123.123.123")));
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLookupTimeName, 8);
}
// Histograms recorded when checking values that are not present.
{
EXPECT_FALSE(CheckOriginIsPresent(GURL("https://example.org")));
EXPECT_FALSE(CheckOriginIsPresent(GURL("http://example.com")));
EXPECT_FALSE(CheckOriginIsPresent(GURL("http://123.123.123.124")));
histogram_tester().ExpectTotalCount(
MediaEngagementPreloadedList::kHistogramLookupTimeName, 11);
}
}