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

Side by Side Diff: chromeos/dbus/ibus/ibus_input_context_client_unittest.cc

Issue 10310090: Implement IBusInputContextClient (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Address comments. Created 8 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 (c) 2012 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 "chromeos/dbus/ibus/ibus_input_context_client.h"
6
7 #include <map>
8 #include <string>
9 #include "base/message_loop.h"
10 #include "chromeos/dbus/ibus/ibus_text.h"
11 #include "dbus/message.h"
12 #include "dbus/mock_bus.h"
13 #include "dbus/mock_object_proxy.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16
17 using ::testing::Invoke;
18 using ::testing::Return;
19 using ::testing::_;
20
21 namespace chromeos {
22
23 // TODO(nona): Remove after complete libibus removal.
24 using chromeos::ibus::IBusText;
25
26 namespace {
27 const char kServiceName[] = "org.freedesktop.IBus";
28 const char kInputContextInterface[] = "org.freedesktop.IBus.InputContext";
29 const char kObjectPath[] = "/org/freedesktop/IBus/InputContext_1010";
30
31 // Signal names.
32 const char kCommitTextSignal[] = "CommitText";
33 const char kForwardKeyEventSignal[] = "ForwardKeyEvent";
34 const char kHidePreeditTextSignal[] = "HidePreeditText";
35 const char kShowPreeditTextSignal[] = "ShowPreeditText";
36 const char kUpdatePreeditTextSignal[] = "UpdatePreeditText";
37
38 // Method names.
39 const char kFocusInMethod[] = "FocusIn";
40 const char kFocusOutMethod[] = "FocusOut";
41 const char kResetMethod[] = "Reset";
42 const char kSetCapabilitiesMethod[] = "SetCapabilities";
43 const char kSetCursorLocationMethod[] = "SetCursorLocation";
44 const char kProcessKeyEventMethod[] = "ProcessKeyEvent";
45
46 // Following variables are used in callback expectations.
47 const uint32 kCapabilities = 12345;
48 const int32 kCursorX = 30;
49 const int32 kCursorY = 31;
50 const int32 kCursorWidth = 32;
51 const int32 kCursorHeight = 33;
52 const uint32 kKeyval = 34;
53 const uint32 kKeycode = 35;
54 const uint32 kState = 36;
55 const bool kIsKeyHandled = false;
56
57 class MockCommitTextHandler {
58 public:
59 MOCK_METHOD1(Run, void(const IBusText& text));
60 };
61
62 class MockForwardKeyEventHandler {
63 public:
64 MOCK_METHOD3(Run, void(uint32 keyval, uint32 keycode, uint32 state));
65 };
66
67 class MockHidePreeditTextHandler {
68 public:
69 MOCK_METHOD0(Run, void());
70 };
71
72 class MockShowPreeditTextHandler {
73 public:
74 MOCK_METHOD0(Run, void());
75 };
76
77 class MockUpdatePreeditTextHandler {
78 public:
79 MOCK_METHOD3(Run, void(const IBusText& text, uint32 cursor_pos,
80 bool visible));
81 };
82
83 class MockProcessKeyEventHandler {
84 public:
85 MOCK_METHOD1(Run, void(bool is_key_handled));
86 };
87
88 MATCHER_P(IBusTextEq, expected_text, "The expected IBusText does not match") {
89 // TODO(nona): Check attributes.
90 return (arg.text() == expected_text->text());
91 }
92
93 } // namespace
94
95 class IBusInputContextClientTest : public testing::Test {
96 public:
97 IBusInputContextClientTest() : response_(NULL) {}
98
99 virtual void SetUp() OVERRIDE {
100 // Create a mock bus.
101 dbus::Bus::Options options;
102 options.bus_type = dbus::Bus::SYSTEM;
103 mock_bus_ = new dbus::MockBus(options);
104
105 // Create a mock proxy.
106 mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(),
107 kServiceName,
108 dbus::ObjectPath(kObjectPath));
109
110 // Create a client.
111 client_.reset(IBusInputContextClient::Create(
112 REAL_DBUS_CLIENT_IMPLEMENTATION));
113
114 // Set an expectation so mock_bus's GetObjectProxy() for the given service
115 // name and the object path will return mock_proxy_. The GetObjectProxy
116 // function is called in Initialized function.
117 EXPECT_CALL(*mock_bus_, GetObjectProxy(kServiceName,
118 dbus::ObjectPath(kObjectPath)))
119 .WillOnce(Return(mock_proxy_.get()));
120
121 // Set expectations so mock_proxy's ConnectToSignal will use
122 // OnConnectToSignal() to run the callback. The ConnectToSignal is called in
123 // Initialize function.
124 EXPECT_CALL(*mock_proxy_, ConnectToSignal(
125 kInputContextInterface, kCommitTextSignal, _, _))
126 .WillRepeatedly(
127 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
128 EXPECT_CALL(*mock_proxy_, ConnectToSignal(
129 kInputContextInterface, kForwardKeyEventSignal, _, _))
130 .WillRepeatedly(
131 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
132 EXPECT_CALL(*mock_proxy_, ConnectToSignal(
133 kInputContextInterface, kHidePreeditTextSignal, _, _))
134 .WillRepeatedly(
135 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
136 EXPECT_CALL(*mock_proxy_, ConnectToSignal(
137 kInputContextInterface, kShowPreeditTextSignal, _, _))
138 .WillRepeatedly(
139 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
140 EXPECT_CALL(*mock_proxy_, ConnectToSignal(
141 kInputContextInterface, kUpdatePreeditTextSignal, _, _))
142 .WillRepeatedly(
143 Invoke(this, &IBusInputContextClientTest::OnConnectToSignal));
144
145 // Call Initialize to create object proxy and connect signals.
146 client_->Initialize(mock_bus_.get(), dbus::ObjectPath(kObjectPath));
147 }
148
149 virtual void TearDown() OVERRIDE {
150 EXPECT_TRUE(client_->IsConnected());
151 client_->ResetObjectProxy();
152 EXPECT_FALSE(client_->IsConnected());
153 }
154
155 // Handles FocusIn method call.
156 void OnFocusIn(dbus::MethodCall* method_call,
157 int timeout_ms,
158 const dbus::ObjectProxy::ResponseCallback& callback) {
159 EXPECT_EQ(kInputContextInterface, method_call->GetInterface());
160 EXPECT_EQ(kFocusInMethod, method_call->GetMember());
161 dbus::MessageReader reader(method_call);
162 EXPECT_FALSE(reader.HasMoreData());
163
164 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
165 }
166
167 // Handles FocusOut method call.
168 void OnFocusOut(dbus::MethodCall* method_call,
169 int timeout_ms,
170 const dbus::ObjectProxy::ResponseCallback& callback) {
171 EXPECT_EQ(kInputContextInterface, method_call->GetInterface());
172 EXPECT_EQ(kFocusOutMethod, method_call->GetMember());
173 dbus::MessageReader reader(method_call);
174 EXPECT_FALSE(reader.HasMoreData());
175
176 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
177 }
178
179 // Handles Reset method call.
180 void OnReset(dbus::MethodCall* method_call,
181 int timeout_ms,
182 const dbus::ObjectProxy::ResponseCallback& callback) {
183 EXPECT_EQ(kInputContextInterface, method_call->GetInterface());
184 EXPECT_EQ(kResetMethod, method_call->GetMember());
185 dbus::MessageReader reader(method_call);
186 EXPECT_FALSE(reader.HasMoreData());
187
188 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
189 }
190
191 // Handles SetCursorLocation method call.
192 void OnSetCursorLocation(
193 dbus::MethodCall* method_call,
194 int timeout_ms,
195 const dbus::ObjectProxy::ResponseCallback& callback) {
196 EXPECT_EQ(kInputContextInterface, method_call->GetInterface());
197 EXPECT_EQ(kSetCursorLocationMethod, method_call->GetMember());
198 dbus::MessageReader reader(method_call);
199 int32 x, y, width, height;
200 EXPECT_TRUE(reader.PopInt32(&x));
201 EXPECT_TRUE(reader.PopInt32(&y));
202 EXPECT_TRUE(reader.PopInt32(&width));
203 EXPECT_TRUE(reader.PopInt32(&height));
204 EXPECT_FALSE(reader.HasMoreData());
205
206 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
207 }
208
209 // Handles SetCapabilities method call.
210 void OnSetCapabilities(dbus::MethodCall* method_call,
211 int timeout_ms,
212 const dbus::ObjectProxy::ResponseCallback& callback) {
213 EXPECT_EQ(kInputContextInterface, method_call->GetInterface());
214 EXPECT_EQ(kSetCapabilitiesMethod, method_call->GetMember());
215 uint32 capabilities;
216 dbus::MessageReader reader(method_call);
217 EXPECT_TRUE(reader.PopUint32(&capabilities));
218 EXPECT_EQ(kCapabilities, capabilities);
219 EXPECT_FALSE(reader.HasMoreData());
220
221 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
222 }
223
224 // Handles ProcessKeyEvent method call.
225 void OnProcessKeyEvent(dbus::MethodCall* method_call,
226 int timeout_ms,
227 const dbus::ObjectProxy::ResponseCallback& callback) {
228 EXPECT_EQ(kInputContextInterface, method_call->GetInterface());
229 EXPECT_EQ(kProcessKeyEventMethod, method_call->GetMember());
230 uint32 keyval, keycode, state;
231 dbus::MessageReader reader(method_call);
232 EXPECT_TRUE(reader.PopUint32(&keyval));
233 EXPECT_TRUE(reader.PopUint32(&keycode));
234 EXPECT_TRUE(reader.PopUint32(&state));
235 EXPECT_FALSE(reader.HasMoreData());
236
237 message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
238 }
239
240 protected:
241 // The client to be tested.
242 scoped_ptr<IBusInputContextClient> client_;
243 // The mock bus.
244 scoped_refptr<dbus::MockBus> mock_bus_;
245 // The mock object proxy.
246 scoped_refptr<dbus::MockObjectProxy> mock_proxy_;
247 // Response returned by mock methods.
248 dbus::Response* response_;
249 // A message loop to emulate asynchronous behavior.
250 MessageLoop message_loop_;
251 // The map from signal to signal handler.
252 std::map<std::string, dbus::ObjectProxy::SignalCallback> signal_callback_map_;
253
254 private:
255 // Used to implement the mock proxy.
256 void OnConnectToSignal(
257 const std::string& interface_name,
258 const std::string& signal_name,
259 const dbus::ObjectProxy::SignalCallback& signal_callback,
260 const dbus::ObjectProxy::OnConnectedCallback& on_connected_callback) {
261 signal_callback_map_[signal_name] = signal_callback;
262 const bool success = true;
263 message_loop_.PostTask(FROM_HERE, base::Bind(on_connected_callback,
264 interface_name,
265 signal_name,
266 success));
267 }
268 };
269
270 TEST_F(IBusInputContextClientTest, CommitTextHandler) {
271 const char kSampleText[] = "Sample Text";
272 IBusText ibus_text;
273 ibus_text.set_text(kSampleText);
274
275 // Set handler expectations.
276 MockCommitTextHandler handler;
277 EXPECT_CALL(handler, Run(IBusTextEq(&ibus_text)));
278 client_->SetCommitTextHandler(base::Bind(&MockCommitTextHandler::Run,
279 base::Unretained(&handler)));
280 message_loop_.RunAllPending();
281
282 // Emit signal.
283 dbus::Signal signal(kInputContextInterface, kCommitTextSignal);
284 dbus::MessageWriter writer(&signal);
285 AppendIBusText(ibus_text, &writer);
286 ASSERT_FALSE(signal_callback_map_[kCommitTextSignal].is_null());
287 signal_callback_map_[kCommitTextSignal].Run(&signal);
288
289 // Unset the handler so expect not calling handler.
290 client_->UnsetCommitTextHandler();
291 signal_callback_map_[kCommitTextSignal].Run(&signal);
292 }
293
294 TEST_F(IBusInputContextClientTest, ForwardKeyEventHandlerTest) {
295 // Set handler expectations.
296 MockForwardKeyEventHandler handler;
297 EXPECT_CALL(handler, Run(kKeyval, kKeycode, kState));
298 client_->SetForwardKeyEventHandler(
299 base::Bind(&MockForwardKeyEventHandler::Run,
300 base::Unretained(&handler)));
301 message_loop_.RunAllPending();
302
303 // Emit signal.
304 dbus::Signal signal(kInputContextInterface, kForwardKeyEventSignal);
305 dbus::MessageWriter writer(&signal);
306 writer.AppendUint32(kKeyval);
307 writer.AppendUint32(kKeycode);
308 writer.AppendUint32(kState);
309 ASSERT_FALSE(signal_callback_map_[kForwardKeyEventSignal].is_null());
310 signal_callback_map_[kForwardKeyEventSignal].Run(&signal);
311
312 // Unset the handler so expect not calling handler.
313 client_->UnsetForwardKeyEventHandler();
314 signal_callback_map_[kForwardKeyEventSignal].Run(&signal);
315 }
316
317 TEST_F(IBusInputContextClientTest, HidePreeditTextHandlerTest) {
318 // Set handler expectations.
319 MockHidePreeditTextHandler handler;
320 EXPECT_CALL(handler, Run());
321 client_->SetHidePreeditTextHandler(
322 base::Bind(&MockHidePreeditTextHandler::Run,
323 base::Unretained(&handler)));
324 message_loop_.RunAllPending();
325
326 // Emit signal.
327 dbus::Signal signal(kInputContextInterface, kHidePreeditTextSignal);
328 ASSERT_FALSE(signal_callback_map_[kHidePreeditTextSignal].is_null());
329 signal_callback_map_[kHidePreeditTextSignal].Run(&signal);
330
331 // Unset the handler so expect not calling handler.
332 client_->UnsetHidePreeditTextHandler();
333 signal_callback_map_[kHidePreeditTextSignal].Run(&signal);
334 }
335
336 TEST_F(IBusInputContextClientTest, ShowPreeditTextHandlerTest) {
337 // Set handler expectations.
338 MockShowPreeditTextHandler handler;
339 EXPECT_CALL(handler, Run());
340 client_->SetShowPreeditTextHandler(
341 base::Bind(&MockShowPreeditTextHandler::Run,
342 base::Unretained(&handler)));
343 message_loop_.RunAllPending();
344
345 // Emit signal.
346 dbus::Signal signal(kInputContextInterface, kShowPreeditTextSignal);
347 ASSERT_FALSE(signal_callback_map_[kShowPreeditTextSignal].is_null());
348 signal_callback_map_[kShowPreeditTextSignal].Run(&signal);
349
350 // Unset the handler so expect not calling handler.
351 client_->UnsetShowPreeditTextHandler();
352 signal_callback_map_[kShowPreeditTextSignal].Run(&signal);
353 }
354
355 TEST_F(IBusInputContextClientTest, UpdatePreeditTextHandlerTest) {
356 const uint32 kCursorPos = 20;
357 const bool kVisible = false;
358 const char kSampleText[] = "Sample Text";
359 IBusText ibus_text;
360 ibus_text.set_text(kSampleText);
361
362 // Set handler expectations.
363 MockUpdatePreeditTextHandler handler;
364 EXPECT_CALL(handler, Run(IBusTextEq(&ibus_text), kCursorPos, kVisible));
365 client_->SetUpdatePreeditTextHandler(
366 base::Bind(&MockUpdatePreeditTextHandler::Run,
367 base::Unretained(&handler)));
368 message_loop_.RunAllPending();
369
370 // Emit signal.
371 dbus::Signal signal(kInputContextInterface, kUpdatePreeditTextSignal);
372 dbus::MessageWriter writer(&signal);
373 AppendIBusText(ibus_text, &writer);
374 writer.AppendUint32(kCursorPos);
375 writer.AppendBool(kVisible);
376 ASSERT_FALSE(signal_callback_map_[kUpdatePreeditTextSignal].is_null());
377 signal_callback_map_[kUpdatePreeditTextSignal].Run(&signal);
378
379 // Unset the handler so expect not calling handler.
380 client_->UnsetUpdatePreeditTextHandler();
381 signal_callback_map_[kUpdatePreeditTextSignal].Run(&signal);
382 }
383
384 TEST_F(IBusInputContextClientTest, FocusInTest) {
385 // Set expectations.
386 EXPECT_CALL(*mock_proxy_, CallMethod(_, _, _))
387 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnFocusIn));
388 // Create response.
389 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
390 response_ = response.get();
391
392 // Call FocusIn.
393 client_->FocusIn();
394 // Run the message loop.
395 message_loop_.RunAllPending();
396 }
397
398 TEST_F(IBusInputContextClientTest, FocusOutTest) {
399 // Set expectations.
400 EXPECT_CALL(*mock_proxy_, CallMethod(_, _, _))
401 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnFocusOut));
402 // Create response.
403 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
404 response_ = response.get();
405
406 // Call FocusOut.
407 client_->FocusOut();
408 // Run the message loop.
409 message_loop_.RunAllPending();
410 }
411
412 TEST_F(IBusInputContextClientTest, ResetTest) {
413 // Set expectations.
414 EXPECT_CALL(*mock_proxy_, CallMethod(_, _, _))
415 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnReset));
416 // Create response.
417 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
418 response_ = response.get();
419
420 // Call Reset.
421 client_->Reset();
422 // Run the message loop.
423 message_loop_.RunAllPending();
424 }
425
426 TEST_F(IBusInputContextClientTest, SetCapabilitiesTest) {
427 // Set expectations.
428 EXPECT_CALL(*mock_proxy_, CallMethod(_, _, _))
429 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnSetCapabilities));
430 // Create response.
431 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
432 response_ = response.get();
433
434 // Call SetCapabilities.
435 client_->SetCapabilities(kCapabilities);
436 // Run the message loop.
437 message_loop_.RunAllPending();
438 }
439
440 TEST_F(IBusInputContextClientTest, SetCursorLocationTest) {
441 // Set expectations.
442 EXPECT_CALL(*mock_proxy_, CallMethod(_, _, _))
443 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnSetCursorLocation));
444 // Create response.
445 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
446 response_ = response.get();
447
448 // Call SetCursorLocation.
449 client_->SetCursorLocation(kCursorX, kCursorY, kCursorWidth, kCursorHeight);
450 // Run the message loop.
451 message_loop_.RunAllPending();
452 }
453
454 TEST_F(IBusInputContextClientTest, OnProcessKeyEvent) {
455 // Set expectations.
456 EXPECT_CALL(*mock_proxy_, CallMethod(_, _, _))
457 .WillOnce(Invoke(this, &IBusInputContextClientTest::OnProcessKeyEvent));
458 MockProcessKeyEventHandler callback;
459 EXPECT_CALL(callback, Run(kIsKeyHandled));
460 // Create response.
461 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
462 dbus::MessageWriter writer(response.get());
463 writer.AppendBool(kIsKeyHandled);
464 response_ = response.get();
465
466 // Call ProcessKeyEvent.
467 client_->ProcessKeyEvent(kKeyval,
468 kKeycode,
469 kState,
470 base::Bind(&MockProcessKeyEventHandler::Run,
471 base::Unretained(&callback)));
472 // Run the message loop.
473 message_loop_.RunAllPending();
474 }
475
476 } // namespace chromeos
OLDNEW
« no previous file with comments | « chromeos/dbus/ibus/ibus_input_context_client.cc ('k') | chromeos/dbus/ibus/mock_ibus_input_context_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698