blob: 30bc7b472c3b3bdd07cd78e2c39ae68856f34f29 [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 "third_party/blink/public/common/frame/user_activation_state.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace blink {
class UserActivationStateTest : public testing::Test {
public:
void SetUp() override {
time_overrides_ = std::make_unique<base::subtle::ScopedTimeClockOverrides>(
nullptr, &UserActivationStateTest::Now, nullptr);
}
static base::TimeTicks Now() {
now_ticks_ += base::TimeDelta::FromMilliseconds(1);
return now_ticks_;
}
static void AdvanceClock(base::TimeDelta time_delta) {
now_ticks_ += time_delta;
}
private:
static base::TimeTicks now_ticks_;
std::unique_ptr<base::subtle::ScopedTimeClockOverrides> time_overrides_;
};
// static
base::TimeTicks UserActivationStateTest::now_ticks_;
TEST_F(UserActivationStateTest, ConsumptionTest) {
UserActivationState user_activation_state;
// Initially both sticky and transient bits are unset, and consumption
// attempts fail.
EXPECT_FALSE(user_activation_state.HasBeenActive());
EXPECT_FALSE(user_activation_state.IsActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
user_activation_state.Activate();
// After activation, both sticky and transient bits are set, and consumption
// attempt succeeds once.
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_TRUE(user_activation_state.IsActive());
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
// After successful consumption, only the transient bit gets reset, and
// further consumption attempts fail.
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_FALSE(user_activation_state.IsActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
}
TEST_F(UserActivationStateTest, ExpirationTest) {
UserActivationState user_activation_state;
user_activation_state.Activate();
// Right before activation expiry, both bits remain set.
AdvanceClock(base::TimeDelta::FromMilliseconds(999));
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_TRUE(user_activation_state.IsActive());
// Right after activation expiry, only the transient bit gets reset.
AdvanceClock(base::TimeDelta::FromMilliseconds(1));
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_FALSE(user_activation_state.IsActive());
}
TEST_F(UserActivationStateTest, ClearingTest) {
UserActivationState user_activation_state;
user_activation_state.Activate();
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_TRUE(user_activation_state.IsActive());
user_activation_state.Clear();
EXPECT_FALSE(user_activation_state.HasBeenActive());
EXPECT_FALSE(user_activation_state.IsActive());
}
TEST_F(UserActivationStateTest, ConsumptionPlusExpirationTest) {
UserActivationState user_activation_state;
// An activation is consumable before expiry.
user_activation_state.Activate();
AdvanceClock(base::TimeDelta::FromMilliseconds(900));
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
// An activation is not consumable after expiry.
user_activation_state.Activate();
AdvanceClock(base::TimeDelta::FromSeconds(1));
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
// Consecutive activations within expiry is consumable only once.
user_activation_state.Activate();
AdvanceClock(base::TimeDelta::FromMilliseconds(900));
user_activation_state.Activate();
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
// Non-consecutive activations within expiry is consumable separately.
user_activation_state.Activate();
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
AdvanceClock(base::TimeDelta::FromSeconds(900));
user_activation_state.Activate();
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
}
} // namespace blink