OLD | NEW |
| (Empty) |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "components/mus/ws/user_activity_monitor.h" | |
6 | |
7 #include "base/message_loop/message_loop.h" | |
8 #include "base/run_loop.h" | |
9 #include "base/test/simple_test_tick_clock.h" | |
10 #include "base/test/test_mock_time_task_runner.h" | |
11 #include "components/mus/ws/test_utils.h" | |
12 #include "mojo/public/cpp/bindings/interface_request.h" | |
13 #include "testing/gtest/include/gtest/gtest.h" | |
14 | |
15 using mus::mojom::UserIdleObserver; | |
16 | |
17 namespace mus { | |
18 namespace ws { | |
19 namespace test { | |
20 | |
21 class TestUserActivityObserver : public mojom::UserActivityObserver { | |
22 public: | |
23 TestUserActivityObserver() : binding_(this) {} | |
24 ~TestUserActivityObserver() override {} | |
25 | |
26 mojom::UserActivityObserverPtr GetPtr() { | |
27 return binding_.CreateInterfacePtrAndBind(); | |
28 } | |
29 | |
30 bool GetAndResetReceivedUserActivity() { | |
31 bool val = received_user_activity_; | |
32 received_user_activity_ = false; | |
33 return val; | |
34 } | |
35 | |
36 private: | |
37 // mojom::UserActivityObserver: | |
38 void OnUserActivity() override { received_user_activity_ = true; } | |
39 | |
40 mojo::Binding<mojom::UserActivityObserver> binding_; | |
41 bool received_user_activity_ = false; | |
42 | |
43 DISALLOW_COPY_AND_ASSIGN(TestUserActivityObserver); | |
44 }; | |
45 | |
46 class TestUserIdleObserver : public mojom::UserIdleObserver { | |
47 public: | |
48 TestUserIdleObserver() : binding_(this) {} | |
49 ~TestUserIdleObserver() override {} | |
50 | |
51 mojom::UserIdleObserverPtr GetPtr() { | |
52 return binding_.CreateInterfacePtrAndBind(); | |
53 } | |
54 | |
55 bool GetAndResetIdleState(UserIdleObserver::IdleState* state) { | |
56 if (!received_idle_state_) | |
57 return false; | |
58 received_idle_state_ = false; | |
59 *state = idle_state_; | |
60 return true; | |
61 } | |
62 | |
63 private: | |
64 // mojom::UserIdleObserver: | |
65 void OnUserIdleStateChanged(UserIdleObserver::IdleState new_state) override { | |
66 received_idle_state_ = true; | |
67 idle_state_ = new_state; | |
68 } | |
69 | |
70 mojo::Binding<mojom::UserIdleObserver> binding_; | |
71 bool received_idle_state_ = false; | |
72 UserIdleObserver::IdleState idle_state_ = UserIdleObserver::IdleState::ACTIVE; | |
73 | |
74 DISALLOW_COPY_AND_ASSIGN(TestUserIdleObserver); | |
75 }; | |
76 | |
77 class UserActivityMonitorTest : public testing::Test { | |
78 public: | |
79 UserActivityMonitorTest() {} | |
80 ~UserActivityMonitorTest() override {} | |
81 | |
82 UserActivityMonitor* monitor() { return monitor_.get(); } | |
83 | |
84 void FastForwardBy(base::TimeDelta delta) { | |
85 task_runner_->FastForwardBy(delta); | |
86 } | |
87 void RunUntilIdle() { task_runner_->RunUntilIdle(); } | |
88 | |
89 private: | |
90 // testing::Test: | |
91 void SetUp() override { | |
92 task_runner_ = make_scoped_refptr(new base::TestMockTimeTaskRunner( | |
93 base::Time::Now(), base::TimeTicks::Now())); | |
94 message_loop_.SetTaskRunner(task_runner_); | |
95 monitor_.reset(new UserActivityMonitor(task_runner_->GetMockTickClock())); | |
96 } | |
97 | |
98 base::MessageLoop message_loop_; | |
99 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_; | |
100 std::unique_ptr<UserActivityMonitor> monitor_; | |
101 | |
102 DISALLOW_COPY_AND_ASSIGN(UserActivityMonitorTest); | |
103 }; | |
104 | |
105 TEST_F(UserActivityMonitorTest, UserActivityObserver) { | |
106 TestUserActivityObserver first_observer, second_observer; | |
107 monitor()->AddUserActivityObserver(3, first_observer.GetPtr()); | |
108 monitor()->AddUserActivityObserver(4, second_observer.GetPtr()); | |
109 | |
110 // The first activity should notify both observers. | |
111 monitor()->OnUserActivity(); | |
112 RunUntilIdle(); | |
113 EXPECT_TRUE(first_observer.GetAndResetReceivedUserActivity()); | |
114 EXPECT_TRUE(second_observer.GetAndResetReceivedUserActivity()); | |
115 | |
116 // The next activity after just one second should not notify either observer. | |
117 FastForwardBy(base::TimeDelta::FromSeconds(1)); | |
118 monitor()->OnUserActivity(); | |
119 RunUntilIdle(); | |
120 EXPECT_FALSE(first_observer.GetAndResetReceivedUserActivity()); | |
121 EXPECT_FALSE(second_observer.GetAndResetReceivedUserActivity()); | |
122 | |
123 FastForwardBy(base::TimeDelta::FromMilliseconds(2001)); | |
124 monitor()->OnUserActivity(); | |
125 RunUntilIdle(); | |
126 EXPECT_TRUE(first_observer.GetAndResetReceivedUserActivity()); | |
127 EXPECT_FALSE(second_observer.GetAndResetReceivedUserActivity()); | |
128 | |
129 FastForwardBy(base::TimeDelta::FromSeconds(1)); | |
130 monitor()->OnUserActivity(); | |
131 RunUntilIdle(); | |
132 EXPECT_FALSE(first_observer.GetAndResetReceivedUserActivity()); | |
133 EXPECT_TRUE(second_observer.GetAndResetReceivedUserActivity()); | |
134 } | |
135 | |
136 // Tests that idleness observers receive the correct notification upon | |
137 // connection. | |
138 TEST_F(UserActivityMonitorTest, UserIdleObserverConnectNotification) { | |
139 UserIdleObserver::IdleState idle_state; | |
140 | |
141 // If an observer is added without any user activity, then it still receives | |
142 // an ACTIVE notification immediately. | |
143 TestUserIdleObserver first_observer; | |
144 monitor()->AddUserIdleObserver(1, first_observer.GetPtr()); | |
145 RunUntilIdle(); | |
146 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state)); | |
147 EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state); | |
148 | |
149 // If an observer is added without any user activity and the system has been | |
150 // idle, then the observer receives an IDLE notification immediately. | |
151 FastForwardBy(base::TimeDelta::FromMinutes(5)); | |
152 TestUserIdleObserver second_observer; | |
153 monitor()->AddUserIdleObserver(4, second_observer.GetPtr()); | |
154 RunUntilIdle(); | |
155 EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state)); | |
156 EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state); | |
157 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state)); | |
158 EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state); | |
159 | |
160 // If an observer is added after some user activity, then it receives an | |
161 // immediate ACTIVE notification. | |
162 monitor()->OnUserActivity(); | |
163 TestUserIdleObserver third_observer; | |
164 monitor()->AddUserIdleObserver(1, third_observer.GetPtr()); | |
165 RunUntilIdle(); | |
166 EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state)); | |
167 EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state); | |
168 EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state)); | |
169 EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state); | |
170 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state)); | |
171 EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state); | |
172 | |
173 FastForwardBy(base::TimeDelta::FromMinutes(10)); | |
174 TestUserIdleObserver fourth_observer; | |
175 monitor()->AddUserIdleObserver(1, fourth_observer.GetPtr()); | |
176 RunUntilIdle(); | |
177 EXPECT_TRUE(fourth_observer.GetAndResetIdleState(&idle_state)); | |
178 EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state); | |
179 EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state)); | |
180 EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state); | |
181 EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state)); | |
182 EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state); | |
183 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state)); | |
184 EXPECT_EQ(UserIdleObserver::IdleState::IDLE, idle_state); | |
185 | |
186 // All observers are idle. These should not receive any IDLE notifications as | |
187 // more time passes by. | |
188 FastForwardBy(base::TimeDelta::FromMinutes(100)); | |
189 RunUntilIdle(); | |
190 EXPECT_FALSE(first_observer.GetAndResetIdleState(&idle_state)); | |
191 EXPECT_FALSE(second_observer.GetAndResetIdleState(&idle_state)); | |
192 EXPECT_FALSE(third_observer.GetAndResetIdleState(&idle_state)); | |
193 EXPECT_FALSE(fourth_observer.GetAndResetIdleState(&idle_state)); | |
194 | |
195 // Some activity would notify ACTIVE to all observers. | |
196 monitor()->OnUserActivity(); | |
197 RunUntilIdle(); | |
198 EXPECT_TRUE(fourth_observer.GetAndResetIdleState(&idle_state)); | |
199 EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state); | |
200 EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state)); | |
201 EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state); | |
202 EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state)); | |
203 EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state); | |
204 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state)); | |
205 EXPECT_EQ(UserIdleObserver::IdleState::ACTIVE, idle_state); | |
206 | |
207 // Yet more activity should not send any notifications. | |
208 monitor()->OnUserActivity(); | |
209 RunUntilIdle(); | |
210 EXPECT_FALSE(first_observer.GetAndResetIdleState(&idle_state)); | |
211 EXPECT_FALSE(second_observer.GetAndResetIdleState(&idle_state)); | |
212 EXPECT_FALSE(third_observer.GetAndResetIdleState(&idle_state)); | |
213 EXPECT_FALSE(fourth_observer.GetAndResetIdleState(&idle_state)); | |
214 } | |
215 | |
216 } // namespace test | |
217 } // namespace ws | |
218 } // namespace mus | |
OLD | NEW |