Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(270)

Side by Side Diff: components/mus/ws/user_activity_monitor_unittest.cc

Issue 2094933003: mus: Add UserActivityMonitor. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: . Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(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::UserIdlenessObserver;
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 TestUserIdlenessObserver : public mojom::UserIdlenessObserver {
47 public:
48 TestUserIdlenessObserver() : binding_(this) {}
49 ~TestUserIdlenessObserver() override {}
50
51 mojom::UserIdlenessObserverPtr GetPtr() {
52 return binding_.CreateInterfacePtrAndBind();
53 }
54
55 bool GetAndResetIdleState(UserIdlenessObserver::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::UserIdlenessObserver:
65 void OnUserIdleStateChanged(
66 UserIdlenessObserver::IdleState new_state) override {
67 received_idle_state_ = true;
68 idle_state_ = new_state;
69 }
70
71 mojo::Binding<mojom::UserIdlenessObserver> binding_;
72 bool received_idle_state_ = false;
73 UserIdlenessObserver::IdleState idle_state_ =
74 UserIdlenessObserver::IdleState::ACTIVE;
75
76 DISALLOW_COPY_AND_ASSIGN(TestUserIdlenessObserver);
77 };
78
79 class UserActivityMonitorTest : public testing::Test {
80 public:
81 UserActivityMonitorTest() {}
82 ~UserActivityMonitorTest() override {}
83
84 UserActivityMonitor* monitor() { return monitor_.get(); }
85
86 void FastForwardBy(base::TimeDelta delta) {
87 task_runner_->FastForwardBy(delta);
88 }
89 void RunUntilIdle() { task_runner_->RunUntilIdle(); }
90
91 private:
92 // testing::Test:
93 void SetUp() override {
94 task_runner_ = make_scoped_refptr(new base::TestMockTimeTaskRunner(
95 base::Time::Now(), base::TimeTicks::Now()));
96 message_loop_.SetTaskRunner(task_runner_);
97 monitor_.reset(new UserActivityMonitor(task_runner_->GetMockTickClock()));
98 }
99
100 base::MessageLoop message_loop_;
101 scoped_refptr<base::TestMockTimeTaskRunner> task_runner_;
102 std::unique_ptr<UserActivityMonitor> monitor_;
103
104 DISALLOW_COPY_AND_ASSIGN(UserActivityMonitorTest);
105 };
106
107 TEST_F(UserActivityMonitorTest, UserActivityObserver) {
108 TestUserActivityObserver first_observer, second_observer;
109 monitor()->AddUserActivityObserver(3, first_observer.GetPtr());
110 monitor()->AddUserActivityObserver(4, second_observer.GetPtr());
111
112 // The first activity should notify both observers.
113 monitor()->OnUserActivity();
114 RunUntilIdle();
115 EXPECT_TRUE(first_observer.GetAndResetReceivedUserActivity());
116 EXPECT_TRUE(second_observer.GetAndResetReceivedUserActivity());
117
118 // The next activity after just one second should not notify either observer.
119 FastForwardBy(base::TimeDelta::FromSeconds(1));
120 monitor()->OnUserActivity();
121 RunUntilIdle();
122 EXPECT_FALSE(first_observer.GetAndResetReceivedUserActivity());
123 EXPECT_FALSE(second_observer.GetAndResetReceivedUserActivity());
124
125 FastForwardBy(base::TimeDelta::FromMilliseconds(2001));
126 monitor()->OnUserActivity();
127 RunUntilIdle();
128 EXPECT_TRUE(first_observer.GetAndResetReceivedUserActivity());
129 EXPECT_FALSE(second_observer.GetAndResetReceivedUserActivity());
130
131 FastForwardBy(base::TimeDelta::FromSeconds(1));
132 monitor()->OnUserActivity();
133 RunUntilIdle();
134 EXPECT_FALSE(first_observer.GetAndResetReceivedUserActivity());
135 EXPECT_TRUE(second_observer.GetAndResetReceivedUserActivity());
136 }
137
138 // Tests that idleness observers receive the correct notification upon
139 // connection.
140 TEST_F(UserActivityMonitorTest, UserIdlenessObserverConnectNotification) {
141 UserIdlenessObserver::IdleState idle_state;
142
143 // If an observer is added without any user activity, then it still receives
144 // an ACTIVE notification immediately.
145 TestUserIdlenessObserver first_observer;
146 monitor()->AddUserIdlenessObserver(1, first_observer.GetPtr());
147 RunUntilIdle();
148 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
149 EXPECT_EQ(UserIdlenessObserver::IdleState::ACTIVE, idle_state);
150
151 // If an observer is added without any user activity and the system has been
152 // idle, then the observer receives an IDLE notification immediately.
153 FastForwardBy(base::TimeDelta::FromMinutes(5));
154 TestUserIdlenessObserver second_observer;
155 monitor()->AddUserIdlenessObserver(4, second_observer.GetPtr());
156 RunUntilIdle();
157 EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state));
158 EXPECT_EQ(UserIdlenessObserver::IdleState::IDLE, idle_state);
159 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
160 EXPECT_EQ(UserIdlenessObserver::IdleState::IDLE, idle_state);
161
162 // If an observer is added after some user activity, then it receives an
163 // immediate ACTIVE notification.
164 monitor()->OnUserActivity();
165 TestUserIdlenessObserver third_observer;
166 monitor()->AddUserIdlenessObserver(1, third_observer.GetPtr());
167 RunUntilIdle();
168 EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state));
169 EXPECT_EQ(UserIdlenessObserver::IdleState::ACTIVE, idle_state);
170 EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state));
171 EXPECT_EQ(UserIdlenessObserver::IdleState::ACTIVE, idle_state);
172 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
173 EXPECT_EQ(UserIdlenessObserver::IdleState::ACTIVE, idle_state);
174
175 FastForwardBy(base::TimeDelta::FromMinutes(10));
176 TestUserIdlenessObserver fourth_observer;
177 monitor()->AddUserIdlenessObserver(1, fourth_observer.GetPtr());
178 RunUntilIdle();
179 EXPECT_TRUE(fourth_observer.GetAndResetIdleState(&idle_state));
180 EXPECT_EQ(UserIdlenessObserver::IdleState::IDLE, idle_state);
181 EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state));
182 EXPECT_EQ(UserIdlenessObserver::IdleState::IDLE, idle_state);
183 EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state));
184 EXPECT_EQ(UserIdlenessObserver::IdleState::IDLE, idle_state);
185 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
186 EXPECT_EQ(UserIdlenessObserver::IdleState::IDLE, idle_state);
187
188 // All observers are idle. These should not receive any IDLE notifications as
189 // more time passes by.
190 FastForwardBy(base::TimeDelta::FromMinutes(100));
191 RunUntilIdle();
192 EXPECT_FALSE(first_observer.GetAndResetIdleState(&idle_state));
193 EXPECT_FALSE(second_observer.GetAndResetIdleState(&idle_state));
194 EXPECT_FALSE(third_observer.GetAndResetIdleState(&idle_state));
195 EXPECT_FALSE(fourth_observer.GetAndResetIdleState(&idle_state));
196
197 // Some activity would notify ACTIVE to all observers.
198 monitor()->OnUserActivity();
199 RunUntilIdle();
200 EXPECT_TRUE(fourth_observer.GetAndResetIdleState(&idle_state));
201 EXPECT_EQ(UserIdlenessObserver::IdleState::ACTIVE, idle_state);
202 EXPECT_TRUE(third_observer.GetAndResetIdleState(&idle_state));
203 EXPECT_EQ(UserIdlenessObserver::IdleState::ACTIVE, idle_state);
204 EXPECT_TRUE(second_observer.GetAndResetIdleState(&idle_state));
205 EXPECT_EQ(UserIdlenessObserver::IdleState::ACTIVE, idle_state);
206 EXPECT_TRUE(first_observer.GetAndResetIdleState(&idle_state));
207 EXPECT_EQ(UserIdlenessObserver::IdleState::ACTIVE, idle_state);
208
209 // Yet more activity should not send any notifications.
210 monitor()->OnUserActivity();
211 RunUntilIdle();
212 EXPECT_FALSE(first_observer.GetAndResetIdleState(&idle_state));
213 EXPECT_FALSE(second_observer.GetAndResetIdleState(&idle_state));
214 EXPECT_FALSE(third_observer.GetAndResetIdleState(&idle_state));
215 EXPECT_FALSE(fourth_observer.GetAndResetIdleState(&idle_state));
216 }
217
218 } // namespace test
219 } // namespace ws
220 } // namespace mus
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698