blob: 4c3cbd16b4bc0522b1227c7062150035901fad36 [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 "ash/system/lock_screen_notification_controller.h"
#include "ash/system/notification_center/notification_center_test_api.h"
#include "ash/system/status_area_widget.h"
#include "ash/system/status_area_widget_test_helper.h"
#include "ash/test/ash_test_base.h"
#include "ui/message_center/message_center.h"
namespace ash {
class LockScreenNotificationControllerTest
: public AshTestBase,
public testing::WithParamInterface<bool> {
public:
LockScreenNotificationControllerTest() = default;
LockScreenNotificationControllerTest(
const LockScreenNotificationControllerTest&) = delete;
LockScreenNotificationControllerTest& operator=(
const LockScreenNotificationControllerTest&) = delete;
~LockScreenNotificationControllerTest() override = default;
void SetUp() override {
AshTestBase::SetUp();
test_api_ = std::make_unique<NotificationCenterTestApi>();
}
bool IsLockScreenNotificationPresent() {
return message_center::MessageCenter::Get()->FindNotificationById(
LockScreenNotificationController::kLockScreenNotificationId);
}
NotificationCenterTestApi* test_api() { return test_api_.get(); }
private:
std::unique_ptr<NotificationCenterTestApi> test_api_;
};
// Tests that locking/unlocking the screen adds/removes the lockscreen
// notification if notifications are hidden.
TEST_F(LockScreenNotificationControllerTest,
NoLockScreenNotificationWithoutHiddenNotifications) {
// The notification should not exist on an unlocked screen.
ASSERT_FALSE(IsLockScreenNotificationPresent());
// The notification should not exist on the lockscreen either because there is
// no hidden notification.
BlockUserSession(BLOCKED_BY_LOCK_SCREEN);
EXPECT_FALSE(IsLockScreenNotificationPresent());
}
TEST_F(LockScreenNotificationControllerTest,
LockScreenNotificationWithHiddenNotification) {
// Locking the screen with a hidden notification should cause the lockscreen
// notification to show up.
test_api()->AddNotification();
BlockUserSession(BLOCKED_BY_LOCK_SCREEN);
EXPECT_TRUE(IsLockScreenNotificationPresent());
// Unlocking the screen should result in the lockscreen notification being
// removed.
UnblockUserSession();
EXPECT_FALSE(IsLockScreenNotificationPresent());
}
TEST_F(LockScreenNotificationControllerTest,
NotificationNotShownWithSystemNotifications) {
// A system notification should not trigger the lockscreen notification since
// it's not hidden.
test_api()->AddSystemNotification();
BlockUserSession(BLOCKED_BY_LOCK_SCREEN);
EXPECT_FALSE(IsLockScreenNotificationPresent());
}
TEST_F(LockScreenNotificationControllerTest, NotificationsAddedOnLockScreen) {
BlockUserSession(BLOCKED_BY_LOCK_SCREEN);
EXPECT_FALSE(IsLockScreenNotificationPresent());
// Adding a system notification on the lockscreen should have no effect.
test_api()->AddSystemNotification();
EXPECT_FALSE(IsLockScreenNotificationPresent());
// Adding a normal notification should trigger the lock screen notification.
test_api()->AddNotification();
EXPECT_TRUE(IsLockScreenNotificationPresent());
}
TEST_F(LockScreenNotificationControllerTest, NotificationsRemovedOnLockScreen) {
std::string id, system_id;
system_id = test_api()->AddSystemNotification();
id = test_api()->AddNotification();
BlockUserSession(BLOCKED_BY_LOCK_SCREEN);
EXPECT_TRUE(IsLockScreenNotificationPresent());
// Removing `id` should remove the lock screen notification since there are no
// hidden notifications left.
test_api()->RemoveNotification(id);
EXPECT_FALSE(IsLockScreenNotificationPresent());
}
} // namespace ash