blob: 5a768353fa08af6bf4eb2d6bbea2bfbdfe1c869c [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 "components/optimization_guide/optimization_guide_service.h"
#include <memory>
#include <string>
#include "base/files/file_path.h"
#include "base/files/file_util.h"
#include "base/files/scoped_temp_dir.h"
#include "base/macros.h"
#include "base/run_loop.h"
#include "base/test/scoped_task_environment.h"
#include "base/version.h"
#include "components/optimization_guide/hints_component_info.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace optimization_guide {
const base::FilePath::CharType kFileName1[] = FILE_PATH_LITERAL("somefile1.pb");
const base::FilePath::CharType kFileName2[] = FILE_PATH_LITERAL("somefile2.pb");
class TestObserver : public OptimizationGuideServiceObserver {
public:
TestObserver()
: hints_component_notification_count_(0),
hints_component_version_("0.0.0.0") {}
~TestObserver() override {}
void OnHintsComponentAvailable(const HintsComponentInfo& info) override {
++hints_component_notification_count_;
hints_component_version_ = info.version;
hints_component_path_ = info.path;
}
int hints_component_notification_count() const {
return hints_component_notification_count_;
}
const base::Version& hints_component_version() const {
return hints_component_version_;
}
const base::FilePath& hints_component_path() const {
return hints_component_path_;
}
private:
int hints_component_notification_count_;
base::Version hints_component_version_;
base::FilePath hints_component_path_;
DISALLOW_COPY_AND_ASSIGN(TestObserver);
};
class OptimizationGuideServiceTest : public testing::Test {
public:
OptimizationGuideServiceTest() {}
~OptimizationGuideServiceTest() override {}
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
optimization_guide_service_ = std::make_unique<OptimizationGuideService>(
scoped_task_environment_.GetMainThreadTaskRunner());
observer_ = std::make_unique<TestObserver>();
}
OptimizationGuideService* optimization_guide_service() {
return optimization_guide_service_.get();
}
TestObserver* observer() { return observer_.get(); }
void AddObserver() { optimization_guide_service_->AddObserver(observer()); }
void RemoveObserver() {
optimization_guide_service_->RemoveObserver(observer());
}
void MaybeUpdateHintsComponent(const HintsComponentInfo& info) {
optimization_guide_service_->MaybeUpdateHintsComponent(info);
scoped_task_environment_.RunUntilIdle();
base::RunLoop().RunUntilIdle();
}
base::FilePath temp_dir() const { return temp_dir_.GetPath(); }
private:
base::test::ScopedTaskEnvironment scoped_task_environment_;
base::ScopedTempDir temp_dir_;
std::unique_ptr<OptimizationGuideService> optimization_guide_service_;
std::unique_ptr<TestObserver> observer_;
DISALLOW_COPY_AND_ASSIGN(OptimizationGuideServiceTest);
};
TEST_F(OptimizationGuideServiceTest, ProcessHintsIssuesNotification) {
AddObserver();
HintsComponentInfo component_info(base::Version("1.0.0.0"),
temp_dir().Append(kFileName1));
MaybeUpdateHintsComponent(component_info);
EXPECT_EQ(observer()->hints_component_notification_count(), 1);
EXPECT_EQ(component_info.version, observer()->hints_component_version());
EXPECT_EQ(component_info.path, observer()->hints_component_path());
}
TEST_F(OptimizationGuideServiceTest, ProcessHintsNewVersionProcessed) {
AddObserver();
HintsComponentInfo component_info_1(base::Version("1.0.0.0"),
temp_dir().Append(kFileName1));
HintsComponentInfo component_info_2(base::Version("2.0.0.0"),
temp_dir().Append(kFileName2));
MaybeUpdateHintsComponent(component_info_1);
MaybeUpdateHintsComponent(component_info_2);
EXPECT_EQ(observer()->hints_component_notification_count(), 2);
EXPECT_EQ(component_info_2.version, observer()->hints_component_version());
EXPECT_EQ(component_info_2.path, observer()->hints_component_path());
}
TEST_F(OptimizationGuideServiceTest, ProcessHintsPastVersionIgnored) {
AddObserver();
HintsComponentInfo component_info_1(base::Version("2.0.0.0"),
temp_dir().Append(kFileName1));
HintsComponentInfo component_info_2(base::Version("1.0.0.0"),
temp_dir().Append(kFileName2));
MaybeUpdateHintsComponent(component_info_1);
MaybeUpdateHintsComponent(component_info_2);
EXPECT_EQ(observer()->hints_component_notification_count(), 1);
EXPECT_EQ(component_info_1.version, observer()->hints_component_version());
EXPECT_EQ(component_info_1.path, observer()->hints_component_path());
}
TEST_F(OptimizationGuideServiceTest, ProcessHintsSameVersionIgnored) {
AddObserver();
HintsComponentInfo component_info_1(base::Version("2.0.0.0"),
temp_dir().Append(kFileName1));
HintsComponentInfo component_info_2(base::Version("2.0.0.0"),
temp_dir().Append(kFileName2));
MaybeUpdateHintsComponent(component_info_1);
MaybeUpdateHintsComponent(component_info_2);
EXPECT_EQ(observer()->hints_component_notification_count(), 1);
EXPECT_EQ(component_info_1.version, observer()->hints_component_version());
EXPECT_EQ(component_info_1.path, observer()->hints_component_path());
}
TEST_F(OptimizationGuideServiceTest,
UnregisteredObserverDoesNotReceiveNotification) {
// Add and remove observer to ensure that observer properly unregistered.
AddObserver();
RemoveObserver();
HintsComponentInfo component_info(base::Version("1.0.0.0"),
temp_dir().Append(kFileName1));
MaybeUpdateHintsComponent(component_info);
EXPECT_EQ(observer()->hints_component_notification_count(), 0);
}
TEST_F(OptimizationGuideServiceTest,
RegisteredObserverReceivesNotificationForCurrentComponent) {
HintsComponentInfo component_info(base::Version("1.0.0.0"),
temp_dir().Append(kFileName1));
MaybeUpdateHintsComponent(component_info);
AddObserver();
EXPECT_EQ(observer()->hints_component_notification_count(), 1);
EXPECT_EQ(component_info.version, observer()->hints_component_version());
EXPECT_EQ(component_info.path, observer()->hints_component_path());
}
} // namespace optimization_guide