blob: 98b256b1269d0eef891966bd89b0e9cf202101b7 [file] [log] [blame]
Avi Drissman4e1b7bc32022-09-15 14:03:501// Copyright 2018 The Chromium Authors
Sam Goto366a1d92019-01-18 21:47:352// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Ayu Ishii9311e692020-05-06 17:06:195#include <tuple>
Sam Gotobfba2e7f2019-02-28 21:15:106#include <utility>
7
Avi Drissmanadac21992023-01-11 23:46:398#include "base/functional/bind.h"
9#include "base/functional/callback_helpers.h"
Gabriel Charette9f60dd12020-03-06 20:48:0410#include "base/memory/ptr_util.h"
Keishi Hattori0e45c022021-11-27 09:25:5211#include "base/memory/raw_ptr.h"
Sam Goto366a1d92019-01-18 21:47:3512#include "base/run_loop.h"
Guido Urdanetaef4e91942020-11-09 15:06:2413#include "base/test/bind.h"
Reilly Grant4b6750d2021-11-08 08:42:4614#include "base/test/gmock_callback_support.h"
15#include "base/test/test_future.h"
Sam Gotobfba2e7f2019-02-28 21:15:1016#include "base/time/time.h"
Reilly Grant980a89b2021-07-24 02:52:5917#include "content/browser/idle/idle_manager_impl.h"
Sam Goto366a1d92019-01-18 21:47:3518#include "content/browser/permissions/permission_controller_impl.h"
Reilly Grantf5f49932021-07-20 03:39:3819#include "content/public/browser/browser_context.h"
Sam Goto366a1d92019-01-18 21:47:3520#include "content/public/browser/permission_controller.h"
Ayu Ishii9311e692020-05-06 17:06:1921#include "content/public/test/browser_task_environment.h"
Sam Goto366a1d92019-01-18 21:47:3522#include "content/public/test/mock_permission_manager.h"
Sam Goto366a1d92019-01-18 21:47:3523#include "content/public/test/test_browser_context.h"
Reilly Grantf5f49932021-07-20 03:39:3824#include "content/public/test/test_renderer_host.h"
Gyuyoung Kim5164b1bd2019-08-14 04:17:2725#include "mojo/public/cpp/bindings/receiver.h"
Ayu Ishii659dfb22019-03-27 22:26:3026#include "mojo/public/cpp/test_support/test_utils.h"
Sam Goto366a1d92019-01-18 21:47:3527#include "services/service_manager/public/cpp/bind_source_info.h"
Sam Goto366a1d92019-01-18 21:47:3528#include "testing/gmock/include/gmock/gmock.h"
29#include "testing/gtest/include/gtest/gtest.h"
Andy Paicua6d6d852022-04-28 18:08:3630#include "third_party/blink/public/common/permissions/permission_utils.h"
Julie Jeongeun Kim9f06c5a2019-03-21 07:27:3131#include "third_party/blink/public/mojom/idle/idle_manager.mojom.h"
Nicolas Ouellet-Payeur52feb9df2022-05-12 20:28:3732#include "ui/base/idle/idle_time_provider.h"
33#include "ui/base/test/idle_test_utils.h"
Sam Goto366a1d92019-01-18 21:47:3534
Ayu Ishii4aa9d9f2020-05-01 19:49:4935using blink::mojom::IdleManagerError;
Ayu Ishii4aa9d9f2020-05-01 19:49:4936using blink::mojom::IdleStatePtr;
Sam Goto366a1d92019-01-18 21:47:3537using ::testing::_;
Sam Goto366a1d92019-01-18 21:47:3538using ::testing::Invoke;
Sam Goto786548c2019-02-28 01:28:0839using ::testing::NiceMock;
Ayu Ishii4aa9d9f2020-05-01 19:49:4940using ::testing::Return;
Sam Goto366a1d92019-01-18 21:47:3541
Florian Jacky8373f042025-04-16 14:20:5342MATCHER_P(PermissionTypeMatcher, id, "") {
43 return ::testing::Matches(::testing::Eq(id))(
44 blink::PermissionDescriptorToPermissionType(arg));
45}
46
Sam Goto366a1d92019-01-18 21:47:3547namespace content {
48
49namespace {
50
Ayu Ishii4aa9d9f2020-05-01 19:49:4951const char kTestUrl[] = "https://www.google.com";
52
Reilly Grant4b6750d2021-11-08 08:42:4653enum UserIdleState {
54 kActive,
55 kIdle,
56};
57
58enum ScreenIdleState {
59 kUnlocked,
60 kLocked,
61};
Sam Goto366a1d92019-01-18 21:47:3562
63class MockIdleMonitor : public blink::mojom::IdleMonitor {
64 public:
Daniil Hrybchuk35217192025-02-14 09:34:2765 MOCK_METHOD(void, Update, (IdleStatePtr, bool));
Sam Goto366a1d92019-01-18 21:47:3566};
67
Nicolas Ouellet-Payeur52feb9df2022-05-12 20:28:3768class MockIdleTimeProvider : public ui::IdleTimeProvider {
Sam Goto366a1d92019-01-18 21:47:3569 public:
70 MockIdleTimeProvider() = default;
71 ~MockIdleTimeProvider() override = default;
Ayu Ishii4aa9d9f2020-05-01 19:49:4972 MockIdleTimeProvider(const MockIdleTimeProvider&) = delete;
73 MockIdleTimeProvider& operator=(const MockIdleTimeProvider&) = delete;
Sam Goto366a1d92019-01-18 21:47:3574
Daniil Hrybchuk35217192025-02-14 09:34:2775 MOCK_METHOD(base::TimeDelta, CalculateIdleTime, ());
76 MOCK_METHOD(bool, CheckIdleStateIsLocked, ());
Sam Goto366a1d92019-01-18 21:47:3577};
78
Reilly Grantf5f49932021-07-20 03:39:3879class IdleManagerTest : public RenderViewHostTestHarness {
Daniil Hrybchuk35217192025-02-14 09:34:2780 public:
81 IdleManagerTest(const IdleManagerTest&) = delete;
82 IdleManagerTest& operator=(const IdleManagerTest&) = delete;
83
Sam Goto366a1d92019-01-18 21:47:3584 protected:
Ayu Ishii9311e692020-05-06 17:06:1985 IdleManagerTest()
Reilly Grantf5f49932021-07-20 03:39:3886 : RenderViewHostTestHarness(
87 base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
Ayu Ishii4aa9d9f2020-05-01 19:49:4988 ~IdleManagerTest() override = default;
Sam Goto366a1d92019-01-18 21:47:3589
Ayu Ishii4aa9d9f2020-05-01 19:49:4990 void SetUp() override {
Reilly Grantf5f49932021-07-20 03:39:3891 RenderViewHostTestHarness::SetUp();
92
Reilly Grant5ac325b2021-07-27 02:55:5693 NavigateAndCommit(url_);
94
Ayu Ishii9311e692020-05-06 17:06:1995 permission_manager_ = new NiceMock<MockPermissionManager>();
Reilly Grantf5f49932021-07-20 03:39:3896 auto* test_browser_context =
97 static_cast<TestBrowserContext*>(browser_context());
98 test_browser_context->SetPermissionControllerDelegate(
Keishi Hattori0e45c022021-11-27 09:25:5299 base::WrapUnique(permission_manager_.get()));
Reilly Grantf5f49932021-07-20 03:39:38100
101 idle_time_provider_ = new NiceMock<MockIdleTimeProvider>();
102 idle_manager_ = std::make_unique<IdleManagerImpl>(main_rfh());
Nicolas Ouellet-Payeur52feb9df2022-05-12 20:28:37103 scoped_idle_time_provider_ =
104 std::make_unique<ui::test::ScopedIdleProviderForTest>(
105 base::WrapUnique(idle_time_provider_.get()));
Reilly Grant5ac325b2021-07-27 02:55:56106 idle_manager_->CreateService(service_remote_.BindNewPipeAndPassReceiver());
Ayu Ishii4aa9d9f2020-05-01 19:49:49107 }
108
109 void TearDown() override {
punithnayak7ca20ab2023-10-24 05:47:55110 permission_manager_ = nullptr;
111 idle_time_provider_ = nullptr;
Reilly Grant980a89b2021-07-24 02:52:59112 scoped_idle_time_provider_.reset();
Ayu Ishii4aa9d9f2020-05-01 19:49:49113 idle_manager_.reset();
Reilly Grantf5f49932021-07-20 03:39:38114 RenderViewHostTestHarness::TearDown();
Ayu Ishii4aa9d9f2020-05-01 19:49:49115 }
116
117 IdleManagerImpl* GetIdleManager() { return idle_manager_.get(); }
118
Reilly Grant5ac325b2021-07-27 02:55:56119 void SetPermissionStatus(blink::mojom::PermissionStatus permission_status) {
Ayu Ishii4aa9d9f2020-05-01 19:49:49120 ON_CALL(*permission_manager_,
Illia Klimovf2842842022-03-22 11:33:39121 GetPermissionStatusForCurrentDocument(
Florian Jacky8373f042025-04-16 14:20:53122 PermissionTypeMatcher(blink::PermissionType::IDLE_DETECTION),
123 main_rfh(),
Thomas Nguyen235933322024-05-27 14:52:11124 /*should_include_device_status*/ false))
Ayu Ishii4aa9d9f2020-05-01 19:49:49125 .WillByDefault(Return(permission_status));
126 }
127
Reilly Grant4b6750d2021-11-08 08:42:46128 std::tuple<UserIdleState, ScreenIdleState> AddMonitorRequest() {
129 base::test::TestFuture<IdleManagerError, IdleStatePtr> future;
130 service_remote_->AddMonitor(monitor_receiver_.BindNewPipeAndPassRemote(),
131 future.GetCallback());
132 EXPECT_EQ(IdleManagerError::kSuccess, future.Get<0>());
133 return std::make_tuple(
134 future.Get<1>()->idle_time.has_value() ? UserIdleState::kIdle
135 : UserIdleState::kActive,
136 future.Get<1>()->screen_locked ? ScreenIdleState::kLocked
137 : ScreenIdleState::kUnlocked);
Ayu Ishii9311e692020-05-06 17:06:19138 }
139
Reilly Grant4b6750d2021-11-08 08:42:46140 std::tuple<UserIdleState, ScreenIdleState> GetIdleStatus(
141 bool expect_override) {
Ayu Ishii9311e692020-05-06 17:06:19142 base::RunLoop loop;
Reilly Grant4b6750d2021-11-08 08:42:46143 IdleStatePtr result;
Ayu Ishii9311e692020-05-06 17:06:19144
Reilly Grant4b6750d2021-11-08 08:42:46145 EXPECT_CALL(idle_monitor_, Update(_, expect_override))
146 .WillOnce(Invoke([&loop, &result](IdleStatePtr state,
147 bool is_overridden_by_devtools) {
148 result = std::move(state);
149 loop.Quit();
150 }));
Ayu Ishii9311e692020-05-06 17:06:19151
Reilly Grant4b6750d2021-11-08 08:42:46152 if (!expect_override) {
153 // If we aren't expecting an override then we need to fast forward in
154 // order to run the polling task.
155 task_environment()->FastForwardBy(base::Seconds(1));
156 }
157
Ayu Ishii9311e692020-05-06 17:06:19158 loop.Run();
Reilly Grant4b6750d2021-11-08 08:42:46159 return std::make_tuple(result->idle_time.has_value()
160 ? UserIdleState::kIdle
161 : UserIdleState::kActive,
162 result->screen_locked ? ScreenIdleState::kLocked
163 : ScreenIdleState::kUnlocked);
Ayu Ishii9311e692020-05-06 17:06:19164 }
165
166 void DisconnectRenderer() {
167 base::RunLoop loop;
168
169 // Simulates the renderer disconnecting.
170 monitor_receiver_.reset();
171
172 // Wait for the IdleManager to observe the pipe close.
173 loop.RunUntilIdle();
174 }
175
176 MockIdleTimeProvider* idle_time_provider() const {
177 return idle_time_provider_;
178 }
Sam Goto366a1d92019-01-18 21:47:35179
Ayu Ishii9311e692020-05-06 17:06:19180 protected:
181 mojo::Remote<blink::mojom::IdleManager> service_remote_;
182
Sam Goto366a1d92019-01-18 21:47:35183 private:
Ayu Ishii4aa9d9f2020-05-01 19:49:49184 std::unique_ptr<IdleManagerImpl> idle_manager_;
punithnayak7ca20ab2023-10-24 05:47:55185 raw_ptr<MockPermissionManager> permission_manager_;
186 raw_ptr<MockIdleTimeProvider> idle_time_provider_;
Nicolas Ouellet-Payeur52feb9df2022-05-12 20:28:37187 std::unique_ptr<ui::test::ScopedIdleProviderForTest>
188 scoped_idle_time_provider_;
Ayu Ishii9311e692020-05-06 17:06:19189 NiceMock<MockIdleMonitor> idle_monitor_;
190 mojo::Receiver<blink::mojom::IdleMonitor> monitor_receiver_{&idle_monitor_};
Ayu Ishii4aa9d9f2020-05-01 19:49:49191 GURL url_ = GURL(kTestUrl);
Sam Goto366a1d92019-01-18 21:47:35192};
193
194} // namespace
195
196TEST_F(IdleManagerTest, AddMonitor) {
Reilly Grant5ac325b2021-07-27 02:55:56197 SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED);
Sam Goto366a1d92019-01-18 21:47:35198
Sam Goto786548c2019-02-28 01:28:08199 // Initial state of the system.
Ayu Ishii9311e692020-05-06 17:06:19200 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35201 .WillOnce(Return(base::Seconds(0)));
Ayu Ishii9311e692020-05-06 17:06:19202 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
203 .WillOnce(Return(false));
Sam Goto786548c2019-02-28 01:28:08204
Ayu Ishii9311e692020-05-06 17:06:19205 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46206 AddMonitorRequest());
Sam Goto366a1d92019-01-18 21:47:35207}
208
Ayu Ishii9311e692020-05-06 17:06:19209TEST_F(IdleManagerTest, Idle) {
Reilly Grant5ac325b2021-07-27 02:55:56210 SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED);
Sam Goto366a1d92019-01-18 21:47:35211
Ayu Ishii9311e692020-05-06 17:06:19212 // Initial state of the system.
213 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35214 .WillOnce(Return(base::Seconds(0)));
Ayu Ishii9311e692020-05-06 17:06:19215 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
216 .WillOnce(Return(false));
Sam Goto366a1d92019-01-18 21:47:35217
Ayu Ishii9311e692020-05-06 17:06:19218 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46219 AddMonitorRequest());
Sam Goto366a1d92019-01-18 21:47:35220
Ayu Ishii9311e692020-05-06 17:06:19221 // Simulates a user going idle.
222 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35223 .WillOnce(Return(base::Seconds(60)));
Ayu Ishii9311e692020-05-06 17:06:19224 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
225 .WillOnce(Return(true));
Sam Goto366a1d92019-01-18 21:47:35226
Ayu Ishii9311e692020-05-06 17:06:19227 EXPECT_EQ(std::make_tuple(UserIdleState::kIdle, ScreenIdleState::kLocked),
Reilly Grant4b6750d2021-11-08 08:42:46228 GetIdleStatus(/*expect_override=*/false));
Sam Goto366a1d92019-01-18 21:47:35229
Ayu Ishii9311e692020-05-06 17:06:19230 // Simulates a user going active, calling a callback under the threshold.
231 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35232 .WillOnce(Return(base::Seconds(0)));
Ayu Ishii9311e692020-05-06 17:06:19233 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
234 .WillOnce(Return(false));
Sam Goto366a1d92019-01-18 21:47:35235
Ayu Ishii9311e692020-05-06 17:06:19236 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46237 GetIdleStatus(/*expect_override=*/false));
Sam Goto786548c2019-02-28 01:28:08238}
Sam Goto366a1d92019-01-18 21:47:35239
Ayu Ishii9311e692020-05-06 17:06:19240TEST_F(IdleManagerTest, UnlockingScreen) {
Reilly Grant5ac325b2021-07-27 02:55:56241 SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED);
Sam Goto366a1d92019-01-18 21:47:35242
Ayu Ishii9311e692020-05-06 17:06:19243 // Initial state of the system.
244 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35245 .WillOnce(Return(base::Seconds(70)));
Ayu Ishii9311e692020-05-06 17:06:19246 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
247 .WillOnce(Return(true));
Sam Goto366a1d92019-01-18 21:47:35248
Ayu Ishii9311e692020-05-06 17:06:19249 EXPECT_EQ(std::make_tuple(UserIdleState::kIdle, ScreenIdleState::kLocked),
Reilly Grant4b6750d2021-11-08 08:42:46250 AddMonitorRequest());
Sam Goto786548c2019-02-28 01:28:08251
Ayu Ishii9311e692020-05-06 17:06:19252 // Simulates a user unlocking the screen.
253 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35254 .WillOnce(Return(base::Seconds(0)));
Ayu Ishii9311e692020-05-06 17:06:19255 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
256 .WillOnce(Return(false));
Sam Goto786548c2019-02-28 01:28:08257
Ayu Ishii9311e692020-05-06 17:06:19258 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46259 GetIdleStatus(/*expect_override=*/false));
Sam Goto786548c2019-02-28 01:28:08260}
261
Ayu Ishii9311e692020-05-06 17:06:19262TEST_F(IdleManagerTest, LockingScreen) {
Reilly Grant5ac325b2021-07-27 02:55:56263 SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED);
Sam Goto786548c2019-02-28 01:28:08264
Ayu Ishii9311e692020-05-06 17:06:19265 // Initial state of the system.
266 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35267 .WillOnce(Return(base::Seconds(0)));
Ayu Ishii9311e692020-05-06 17:06:19268 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
269 .WillOnce(Return(false));
Sam Goto786548c2019-02-28 01:28:08270
Ayu Ishii9311e692020-05-06 17:06:19271 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46272 AddMonitorRequest());
Sam Goto786548c2019-02-28 01:28:08273
Ayu Ishii9311e692020-05-06 17:06:19274 // Simulates a user locking the screen.
275 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35276 .WillOnce(Return(base::Seconds(10)));
Ayu Ishii9311e692020-05-06 17:06:19277 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
278 .WillOnce(Return(true));
Sam Goto786548c2019-02-28 01:28:08279
Ayu Ishii9311e692020-05-06 17:06:19280 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kLocked),
Reilly Grant4b6750d2021-11-08 08:42:46281 GetIdleStatus(/*expect_override=*/false));
Sam Goto786548c2019-02-28 01:28:08282}
283
Ayu Ishii9311e692020-05-06 17:06:19284TEST_F(IdleManagerTest, LockingScreenThenIdle) {
Reilly Grant5ac325b2021-07-27 02:55:56285 SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED);
Sam Goto786548c2019-02-28 01:28:08286
Ayu Ishii9311e692020-05-06 17:06:19287 // Initial state of the system.
288 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35289 .WillOnce(Return(base::Seconds(0)));
Ayu Ishii9311e692020-05-06 17:06:19290 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
291 .WillOnce(Return(false));
Sam Goto786548c2019-02-28 01:28:08292
Ayu Ishii9311e692020-05-06 17:06:19293 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46294 AddMonitorRequest());
Sam Goto786548c2019-02-28 01:28:08295
Ayu Ishii9311e692020-05-06 17:06:19296 // Simulates a user locking screen.
297 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35298 .WillOnce(Return(base::Seconds(10)));
Ayu Ishii9311e692020-05-06 17:06:19299 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
300 .WillOnce(Return(true));
Sam Goto786548c2019-02-28 01:28:08301
Ayu Ishii9311e692020-05-06 17:06:19302 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kLocked),
Reilly Grant4b6750d2021-11-08 08:42:46303 GetIdleStatus(/*expect_override=*/false));
Sam Goto786548c2019-02-28 01:28:08304
Ayu Ishii9311e692020-05-06 17:06:19305 // Simulates a user going idle, while the screen is still locked.
306 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35307 .WillOnce(Return(base::Seconds(70)));
Ayu Ishii9311e692020-05-06 17:06:19308 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
309 .WillOnce(Return(true));
Sam Goto786548c2019-02-28 01:28:08310
Ayu Ishii9311e692020-05-06 17:06:19311 EXPECT_EQ(std::make_tuple(UserIdleState::kIdle, ScreenIdleState::kLocked),
Reilly Grant4b6750d2021-11-08 08:42:46312 GetIdleStatus(/*expect_override=*/false));
Sam Goto786548c2019-02-28 01:28:08313}
314
Ayu Ishii9311e692020-05-06 17:06:19315TEST_F(IdleManagerTest, LockingScreenAfterIdle) {
Reilly Grant5ac325b2021-07-27 02:55:56316 SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED);
Sam Goto786548c2019-02-28 01:28:08317
Ayu Ishii9311e692020-05-06 17:06:19318 // Initial state of the system.
319 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35320 .WillOnce(Return(base::Seconds(0)));
Ayu Ishii9311e692020-05-06 17:06:19321 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
322 .WillOnce(Return(false));
Sam Goto786548c2019-02-28 01:28:08323
Ayu Ishii9311e692020-05-06 17:06:19324 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46325 AddMonitorRequest());
Sam Goto786548c2019-02-28 01:28:08326
Ayu Ishii9311e692020-05-06 17:06:19327 // Simulates a user going idle, but with the screen still unlocked.
328 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35329 .WillOnce(Return(base::Seconds(60)));
Ayu Ishii9311e692020-05-06 17:06:19330 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
331 .WillOnce(Return(false));
Sam Goto786548c2019-02-28 01:28:08332
Ayu Ishii9311e692020-05-06 17:06:19333 EXPECT_EQ(std::make_tuple(UserIdleState::kIdle, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46334 GetIdleStatus(/*expect_override=*/false));
Sam Goto786548c2019-02-28 01:28:08335
Ayu Ishii9311e692020-05-06 17:06:19336 // Simulates the screen getting locked by the system after the user goes
337 // idle (e.g. screensaver kicks in first, throwing idleness, then getting
338 // locked).
339 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime())
Peter Kastinge5a38ed2021-10-02 03:06:35340 .WillOnce(Return(base::Seconds(60)));
Ayu Ishii9311e692020-05-06 17:06:19341 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked())
342 .WillOnce(Return(true));
Sam Goto786548c2019-02-28 01:28:08343
Ayu Ishii9311e692020-05-06 17:06:19344 EXPECT_EQ(std::make_tuple(UserIdleState::kIdle, ScreenIdleState::kLocked),
Reilly Grant4b6750d2021-11-08 08:42:46345 GetIdleStatus(/*expect_override=*/false));
Sam Goto366a1d92019-01-18 21:47:35346}
347
Sam Goto241ac98b2019-01-29 19:00:31348TEST_F(IdleManagerTest, RemoveMonitorStopsPolling) {
349 // Simulates the renderer disconnecting (e.g. on page reload) and verifies
350 // that the polling stops for the idle detection.
351
Reilly Grant5ac325b2021-07-27 02:55:56352 SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED);
Ayu Ishii9311e692020-05-06 17:06:19353
Reilly Grant4b6750d2021-11-08 08:42:46354 AddMonitorRequest();
Ayu Ishii9311e692020-05-06 17:06:19355
Nicolas Ouellet-Payeur52feb9df2022-05-12 20:28:37356 EXPECT_TRUE(ui::IdlePollingService::GetInstance()->IsPollingForTest());
Sam Goto241ac98b2019-01-29 19:00:31357
Ayu Ishii9311e692020-05-06 17:06:19358 DisconnectRenderer();
Sam Goto241ac98b2019-01-29 19:00:31359
Nicolas Ouellet-Payeur52feb9df2022-05-12 20:28:37360 EXPECT_FALSE(ui::IdlePollingService::GetInstance()->IsPollingForTest());
Sam Goto241ac98b2019-01-29 19:00:31361}
362
Wei Lee01971182020-09-18 09:15:21363TEST_F(IdleManagerTest, PermissionDenied) {
Reilly Grant5ac325b2021-07-27 02:55:56364 SetPermissionStatus(blink::mojom::PermissionStatus::DENIED);
Ayu Ishii4aa9d9f2020-05-01 19:49:49365
366 MockIdleMonitor monitor;
367 mojo::Receiver<blink::mojom::IdleMonitor> monitor_receiver(&monitor);
368
369 // Should not start initial state of the system.
Ayu Ishii9311e692020-05-06 17:06:19370 EXPECT_CALL(*idle_time_provider(), CalculateIdleTime()).Times(0);
371 EXPECT_CALL(*idle_time_provider(), CheckIdleStateIsLocked()).Times(0);
Ayu Ishii4aa9d9f2020-05-01 19:49:49372
373 base::RunLoop loop;
Ayu Ishii9311e692020-05-06 17:06:19374 service_remote_->AddMonitor(
Reilly Grant4b6750d2021-11-08 08:42:46375 monitor_receiver.BindNewPipeAndPassRemote(),
Ayu Ishii9311e692020-05-06 17:06:19376 base::BindLambdaForTesting(
377 [&loop](IdleManagerError error, IdleStatePtr state) {
378 EXPECT_EQ(IdleManagerError::kPermissionDisabled, error);
379 EXPECT_FALSE(state);
380 loop.Quit();
381 }));
Ayu Ishii4aa9d9f2020-05-01 19:49:49382 loop.Run();
383}
384
Maksim Sadyma30263e2020-07-29 17:09:27385TEST_F(IdleManagerTest, SetAndClearOverrides) {
Reilly Grant5ac325b2021-07-27 02:55:56386 SetPermissionStatus(blink::mojom::PermissionStatus::GRANTED);
Maksim Sadyma30263e2020-07-29 17:09:27387
388 // Verify initial state without overrides.
389 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46390 AddMonitorRequest());
Maksim Sadyma30263e2020-07-29 17:09:27391
392 // Set overrides and verify overriden values returned.
393 auto* impl = GetIdleManager();
Reilly Grant4b6750d2021-11-08 08:42:46394 impl->SetIdleOverride(/*is_user_active=*/false, /*is_screen_unlocked=*/false);
Maksim Sadyma30263e2020-07-29 17:09:27395 EXPECT_EQ(std::make_tuple(UserIdleState::kIdle, ScreenIdleState::kLocked),
Reilly Grant4b6750d2021-11-08 08:42:46396 GetIdleStatus(/*expect_override=*/true));
Maksim Sadyma30263e2020-07-29 17:09:27397
398 // Clear overrides and verify initial values returned.
399 impl->ClearIdleOverride();
400 EXPECT_EQ(std::make_tuple(UserIdleState::kActive, ScreenIdleState::kUnlocked),
Reilly Grant4b6750d2021-11-08 08:42:46401 GetIdleStatus(/*expect_override=*/false));
Maksim Sadyma30263e2020-07-29 17:09:27402}
Reilly Grant5ac325b2021-07-27 02:55:56403
Sam Goto366a1d92019-01-18 21:47:35404} // namespace content