blob: ee2c9678a0730021c4f4f37e6a90248f0689eff8 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/viz/service/performance_hint/boost_manager.h"
#include "base/test/scoped_feature_list.h"
#include "base/test/simple_test_tick_clock.h"
#include "components/viz/service/performance_hint/hint_session.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace viz {
namespace {
using BoostType = HintSession::BoostType;
class BoostManagerTestHelper : public BoostManager {
public:
using BoostManager::GetCurrentBoostTypeForTesting;
};
} // namespace
class BoostManagerTest : public testing::Test {
private:
base::test::ScopedFeatureList scoped_list_;
protected:
base::SimpleTestTickClock test_tick_clock_;
BoostManagerTestHelper manager_;
static constexpr base::TimeDelta kTargetFrameDuration =
base::Milliseconds(10);
static constexpr base::TimeDelta kActualFrameDuration = base::Milliseconds(7);
void InitAndEnableBoostFeature() {
scoped_list_.InitAndEnableFeature(features::kEnableADPFScrollBoost);
}
void InitAndDisableBoostFeature() {
scoped_list_.InitAndDisableFeature(features::kEnableADPFScrollBoost);
}
base::TimeDelta GetBoostModeTimeout() const {
return features::kADPFBoostTimeout.Get();
}
void ExecuteAndAssert(BoostType provided_boost_type,
base::TimeTicks provided_draw_start,
BoostType expected_boost_type,
base::TimeDelta expected_frame_duration) {
base::TimeDelta frame_duration =
manager_.GetFrameDurationAndMaybeUpdateBoostType(
kTargetFrameDuration, kActualFrameDuration, provided_draw_start,
provided_boost_type);
ASSERT_EQ(frame_duration, expected_frame_duration);
BoostType new_boost_type = manager_.GetCurrentBoostTypeForTesting();
ASSERT_EQ(new_boost_type, expected_boost_type);
}
};
TEST_F(BoostManagerTest, ScrollBoostExperimentEnabled) {
InitAndEnableBoostFeature();
base::TimeTicks draw_start = test_tick_clock_.NowTicks();
// Use BoostType::kDefault.
ExecuteAndAssert(BoostType::kDefault, draw_start, BoostType::kDefault,
kActualFrameDuration);
// Use BoostType::kScrollBoost, it takes effect immediately.
ExecuteAndAssert(BoostType::kScrollBoost, draw_start, BoostType::kScrollBoost,
3 * kTargetFrameDuration);
// Use BoostType::kDefault, but it doesn't take effect, because the previously
// set BoostType::kScrollBoost has not yet been exhausted.
ExecuteAndAssert(BoostType::kDefault, draw_start, BoostType::kScrollBoost,
3 * kTargetFrameDuration);
// Use BoostType::kDefault, after BoostType::kScrollBoost has been exhausted.
test_tick_clock_.Advance(GetBoostModeTimeout() + base::Milliseconds(1));
draw_start = test_tick_clock_.NowTicks();
ExecuteAndAssert(BoostType::kDefault, draw_start, BoostType::kDefault,
kActualFrameDuration);
}
TEST_F(BoostManagerTest, ScrollBoostExperimentDisabled) {
InitAndDisableBoostFeature();
base::TimeTicks draw_start = test_tick_clock_.NowTicks();
// Use BoostType::kDefault.
ExecuteAndAssert(BoostType::kDefault, draw_start, BoostType::kDefault,
kActualFrameDuration);
// Use BoostType::kScrollBoost, it doesn't take effect because the experiment
// is disabled.
ExecuteAndAssert(BoostType::kScrollBoost, draw_start, BoostType::kDefault,
kActualFrameDuration);
}
TEST_F(BoostManagerTest, WakeUpBoostExperimentEnabled) {
InitAndEnableBoostFeature();
base::TimeTicks draw_start = test_tick_clock_.NowTicks();
// Use BoostType::kWakeUpBoost, it takes effect immediately.
ExecuteAndAssert(BoostType::kWakeUpBoost, draw_start, BoostType::kWakeUpBoost,
1.5 * kTargetFrameDuration);
// Use BoostType::kDefault, but it doesn't take effect, because the previously
// set BoostType::kWakeUpBoost has not yet been exhausted.
ExecuteAndAssert(BoostType::kDefault, draw_start, BoostType::kWakeUpBoost,
1.5 * kTargetFrameDuration);
// Use BoostType::kDefault, after BoostType::kWakeUpBoost has been exhausted.
test_tick_clock_.Advance(GetBoostModeTimeout() + base::Milliseconds(1));
draw_start = test_tick_clock_.NowTicks();
ExecuteAndAssert(BoostType::kDefault, draw_start, BoostType::kDefault,
kActualFrameDuration);
}
TEST_F(BoostManagerTest, WakeUpBoostExperimentDisabled) {
InitAndDisableBoostFeature();
base::TimeTicks draw_start = test_tick_clock_.NowTicks();
// Use BoostType::kWakeUpBoost, it only increase actual duration(the same
// behaviour as before introducing this experiment) because the experiment is
// disabled.
ExecuteAndAssert(BoostType::kWakeUpBoost, draw_start, BoostType::kDefault,
1.5 * kTargetFrameDuration);
ExecuteAndAssert(BoostType::kDefault, draw_start, BoostType::kDefault,
kActualFrameDuration);
}
} // namespace viz