#include "third_party/blink/public/common/frame/user_activation_state.h"
#include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom.h"
#include "base/time/time.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::Microseconds(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_;
};
base::TimeTicks UserActivationStateTest::now_ticks_;
TEST_F(UserActivationStateTest, ConsumptionTest) {
UserActivationState user_activation_state;
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(mojom::UserActivationNotificationType::kTest);
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_TRUE(user_activation_state.IsActive());
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_FALSE(user_activation_state.IsActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
}
#if !defined(MEMORY_SANITIZER)
TEST_F(UserActivationStateTest, ExpirationTest) {
UserActivationState user_activation_state;
user_activation_state.Activate(mojom::UserActivationNotificationType::kTest);
AdvanceClock(base::Milliseconds(4995));
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_TRUE(user_activation_state.IsActive());
AdvanceClock(base::Milliseconds(10));
EXPECT_TRUE(user_activation_state.HasBeenActive());
EXPECT_FALSE(user_activation_state.IsActive());
}
#endif
TEST_F(UserActivationStateTest, ClearingTest) {
UserActivationState user_activation_state;
user_activation_state.Activate(mojom::UserActivationNotificationType::kTest);
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());
}
#if !defined(MEMORY_SANITIZER)
TEST_F(UserActivationStateTest, ConsumptionPlusExpirationTest) {
UserActivationState user_activation_state;
user_activation_state.Activate(mojom::UserActivationNotificationType::kTest);
AdvanceClock(base::Milliseconds(900));
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
user_activation_state.Activate(mojom::UserActivationNotificationType::kTest);
AdvanceClock(base::Seconds(5));
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
user_activation_state.Activate(mojom::UserActivationNotificationType::kTest);
AdvanceClock(base::Milliseconds(900));
user_activation_state.Activate(mojom::UserActivationNotificationType::kTest);
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
EXPECT_FALSE(user_activation_state.ConsumeIfActive());
user_activation_state.Activate(mojom::UserActivationNotificationType::kTest);
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
AdvanceClock(base::Seconds(900));
user_activation_state.Activate(mojom::UserActivationNotificationType::kTest);
EXPECT_TRUE(user_activation_state.ConsumeIfActive());
}
#endif
}