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

Side by Side Diff: ash/tray_action/tray_action_unittest.cc

Issue 2848813002: Introduce ash mojo interface for lock screen action handlers (Closed)
Patch Set: . Created 3 years, 7 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 2017 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 "ash/tray_action/tray_action.h"
6
7 #include <memory>
8 #include <vector>
9
10 #include "ash/shell.h"
11 #include "ash/test/ash_test_base.h"
12 #include "ash/tray_action/tray_action_observer.h"
13 #include "base/macros.h"
14 #include "base/memory/ptr_util.h"
15
16 using ash::mojom::TrayActionState;
17
18 namespace ash {
19
20 namespace {
21
22 class ScopedTestStateObserver : public TrayActionObserver {
23 public:
24 explicit ScopedTestStateObserver(TrayAction* tray_action)
25 : tray_action_(tray_action) {
26 tray_action_->AddObserver(this);
27 }
28
29 ~ScopedTestStateObserver() override { tray_action_->RemoveObserver(this); }
30
31 void OnLockScreenNoteStateChanged(TrayActionState state) override {
32 observed_states_.push_back(state);
33 }
34
35 const std::vector<TrayActionState>& observed_states() const {
36 return observed_states_;
37 }
38
39 void ClearObservedStates() { observed_states_.clear(); }
40
41 private:
42 TrayAction* tray_action_;
43
44 std::vector<TrayActionState> observed_states_;
45
46 DISALLOW_COPY_AND_ASSIGN(ScopedTestStateObserver);
47 };
48
49 class TestTrayActionClient : public mojom::TrayActionClient {
50 public:
51 TestTrayActionClient() : binding_(this) {}
52
53 ~TestTrayActionClient() override = default;
54
55 mojom::TrayActionClientPtr CreateInterfacePtrAndBind() {
56 return binding_.CreateInterfacePtrAndBind();
57 }
58
59 void RequestNewLockScreenNote() override { action_requests_count_++; }
60
61 int action_requests_count() const { return action_requests_count_; }
62
63 void reset_action_requests_count() { action_requests_count_ = 0; }
64
65 private:
66 mojo::Binding<ash::mojom::TrayActionClient> binding_;
67
68 int action_requests_count_ = 0;
69
70 DISALLOW_COPY_AND_ASSIGN(TestTrayActionClient);
71 };
72
73 using TrayActionTest = test::AshTestBase;
74
75 } // namespace
76
77 TEST_F(TrayActionTest, NoTrayAction) {
78 TrayAction* tray_action = Shell::Get()->tray_action();
79 ScopedTestStateObserver observer(tray_action);
80
81 EXPECT_EQ(TrayActionState::kNotSupported,
82 tray_action->GetLockScreenNoteState());
83
84 tray_action->UpdateLockScreenNoteState(TrayActionState::kAvailable);
85
86 // The effective state should be |kNotSupported| as long as an action handler
87 // is not set.
88 EXPECT_EQ(TrayActionState::kNotSupported,
89 tray_action->GetLockScreenNoteState());
90 EXPECT_EQ(0u, observer.observed_states().size());
91
92 // Adding action handler should update the tray_action state.
93 std::unique_ptr<TestTrayActionClient> action_client =
94 base::MakeUnique<TestTrayActionClient>();
95 tray_action->SetClient(action_client->CreateInterfacePtrAndBind());
96
97 EXPECT_EQ(TrayActionState::kAvailable, tray_action->GetLockScreenNoteState());
98 // Effective state changed, so observer should be notified of it.
99 ASSERT_EQ(1u, observer.observed_states().size());
100 EXPECT_EQ(TrayActionState::kAvailable, observer.observed_states()[0]);
101 observer.ClearObservedStates();
102
103 // When action handler is reset, effective state should go back to
104 // |kNotSupported|.
105 tray_action->SetClient(nullptr);
106 action_client.reset();
107
108 EXPECT_EQ(TrayActionState::kNotSupported,
109 tray_action->GetLockScreenNoteState());
110 // Effective state changed, so observer should be notified of it.
111 ASSERT_EQ(1u, observer.observed_states().size());
112 EXPECT_EQ(TrayActionState::kNotSupported, observer.observed_states()[0]);
113 observer.ClearObservedStates();
114 }
115
116 TEST_F(TrayActionTest, StateChangesWithHandlerSet) {
117 TrayAction* tray_action = Shell::Get()->tray_action();
118
119 ScopedTestStateObserver observer(tray_action);
120 TestTrayActionClient action_handler;
121 tray_action->SetClient(action_handler.CreateInterfacePtrAndBind());
122
123 tray_action->UpdateLockScreenNoteState(
124
125 TrayActionState::kAvailable);
126 EXPECT_EQ(TrayActionState::kAvailable, tray_action->GetLockScreenNoteState());
127 ASSERT_EQ(1u, observer.observed_states().size());
128 EXPECT_EQ(TrayActionState::kAvailable, observer.observed_states()[0]);
129 observer.ClearObservedStates();
130
131 tray_action->UpdateLockScreenNoteState(
132
133 TrayActionState::kAvailable);
134 EXPECT_EQ(TrayActionState::kAvailable, tray_action->GetLockScreenNoteState());
135 // No real state change, so the observer should not be notified.
136 ASSERT_EQ(0u, observer.observed_states().size());
137
138 tray_action->UpdateLockScreenNoteState(
139
140 TrayActionState::kActive);
141 EXPECT_EQ(TrayActionState::kActive, tray_action->GetLockScreenNoteState());
142 ASSERT_EQ(1u, observer.observed_states().size());
143 EXPECT_EQ(TrayActionState::kActive, observer.observed_states()[0]);
144 observer.ClearObservedStates();
145
146 tray_action->SetClient(nullptr);
147 }
148
149 TEST_F(TrayActionTest, NormalStateProgression) {
150 TrayAction* tray_action = Shell::Get()->tray_action();
151
152 ScopedTestStateObserver observer(tray_action);
153 TestTrayActionClient action_handler;
154 tray_action->SetClient(action_handler.CreateInterfacePtrAndBind());
155
156 tray_action->UpdateLockScreenNoteState(
157
158 TrayActionState::kAvailable);
159 EXPECT_EQ(TrayActionState::kAvailable, tray_action->GetLockScreenNoteState());
160 ASSERT_EQ(1u, observer.observed_states().size());
161 EXPECT_EQ(TrayActionState::kAvailable, observer.observed_states()[0]);
162 observer.ClearObservedStates();
163
164 tray_action->UpdateLockScreenNoteState(
165
166 TrayActionState::kLaunching);
167 EXPECT_EQ(TrayActionState::kLaunching, tray_action->GetLockScreenNoteState());
168 ASSERT_EQ(1u, observer.observed_states().size());
169 EXPECT_EQ(TrayActionState::kLaunching, observer.observed_states()[0]);
170 observer.ClearObservedStates();
171
172 tray_action->UpdateLockScreenNoteState(
173
174 TrayActionState::kBackground);
175 EXPECT_EQ(TrayActionState::kBackground,
176 tray_action->GetLockScreenNoteState());
177 ASSERT_EQ(1u, observer.observed_states().size());
178 EXPECT_EQ(TrayActionState::kBackground, observer.observed_states()[0]);
179 observer.ClearObservedStates();
180
181 tray_action->UpdateLockScreenNoteState(
182
183 TrayActionState::kNotSupported);
184 EXPECT_EQ(TrayActionState::kNotSupported,
185 tray_action->GetLockScreenNoteState());
186 ASSERT_EQ(1u, observer.observed_states().size());
187 EXPECT_EQ(TrayActionState::kNotSupported, observer.observed_states()[0]);
188 observer.ClearObservedStates();
189
190 tray_action->SetClient(nullptr);
191 }
192
193 TEST_F(TrayActionTest, ObserversNotNotifiedOnDuplicateState) {
194 TrayAction* tray_action = Shell::Get()->tray_action();
195
196 ScopedTestStateObserver observer(tray_action);
197 TestTrayActionClient action_handler;
198 tray_action->SetClient(action_handler.CreateInterfacePtrAndBind());
199
200 tray_action->UpdateLockScreenNoteState(
201
202 TrayActionState::kAvailable);
203 EXPECT_EQ(TrayActionState::kAvailable, tray_action->GetLockScreenNoteState());
204 ASSERT_EQ(1u, observer.observed_states().size());
205 EXPECT_EQ(TrayActionState::kAvailable, observer.observed_states()[0]);
206 observer.ClearObservedStates();
207
208 tray_action->UpdateLockScreenNoteState(
209
210 TrayActionState::kAvailable);
211 EXPECT_EQ(TrayActionState::kAvailable, tray_action->GetLockScreenNoteState());
212 ASSERT_EQ(0u, observer.observed_states().size());
213
214 tray_action->SetClient(nullptr);
215 }
216
217 TEST_F(TrayActionTest, RequestAction) {
218 TrayAction* tray_action = Shell::Get()->tray_action();
219
220 TestTrayActionClient action_client;
221 tray_action->SetClient(action_client.CreateInterfacePtrAndBind());
222
223 EXPECT_EQ(0, action_client.action_requests_count());
224 tray_action->RequestNewLockScreenNote();
225 RunAllPendingInMessageLoop();
226 EXPECT_EQ(1, action_client.action_requests_count());
227
228 tray_action->SetClient(nullptr);
229 }
230
231 // Tests that there is no crash if handler is not set.
232 TEST_F(TrayActionTest, RequestActionWithNoHandler) {
233 TrayAction* tray_action = Shell::Get()->tray_action();
234 tray_action->RequestNewLockScreenNote();
235 }
236
237 } // namespace ash
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698