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

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

Powered by Google App Engine
This is Rietveld 408576698