Chromium Code Reviews| Index: ui/base/ime/input_method_ibus_unittest.cc |
| diff --git a/ui/base/ime/input_method_ibus_unittest.cc b/ui/base/ime/input_method_ibus_unittest.cc |
| index 8ca771e8668aba3ab1b9096b7ec1e4055c863539..46d9b4adf437e60f9a1471743d406771f39d8447 100644 |
| --- a/ui/base/ime/input_method_ibus_unittest.cc |
| +++ b/ui/base/ime/input_method_ibus_unittest.cc |
| @@ -20,6 +20,7 @@ |
| namespace ui { |
| namespace { |
| +const int kCreateInputContextMaxTrialCount = 10; |
| uint32 GetOffsetInUTF16(const std::string& utf8_string, uint32 utf8_offset) { |
| string16 utf16_string = UTF8ToUTF16(utf8_string); |
| @@ -77,18 +78,30 @@ class CreateInputContextNoResponseHandler { |
| } |
| }; |
| -class CreateInputContextDelayFailHandler { |
| +class CreateInputContextDelayHandler { |
| public: |
| - ~CreateInputContextDelayFailHandler() { |
| - error_callback_.Run(); |
| + explicit CreateInputContextDelayHandler(const dbus::ObjectPath& object_path) |
| + : object_path_(object_path) { |
| } |
| void Run(const std::string& client_name, |
| const chromeos::IBusClient::CreateInputContextCallback& callback, |
| const chromeos::IBusClient::ErrorCallback& error_callback) { |
| + callback_ = callback; |
| error_callback_ = error_callback; |
| } |
| + void RunCallback(bool success) { |
| + if (success) { |
|
Yusuke Sato
2012/08/07 20:03:44
remove {}
Seigo Nonaka
2012/08/08 04:32:52
Done.
|
| + callback_.Run(object_path_); |
| + } else { |
|
Yusuke Sato
2012/08/07 20:03:44
remove }{
Seigo Nonaka
2012/08/08 04:32:52
Done.
|
| + error_callback_.Run(); |
| + } |
| + } |
| + |
| + private: |
| + dbus::ObjectPath object_path_; |
| + chromeos::IBusClient::CreateInputContextCallback callback_; |
| chromeos::IBusClient::ErrorCallback error_callback_; |
| }; |
|
Yusuke Sato
2012/08/07 20:03:44
disallow copy&assign
Seigo Nonaka
2012/08/08 04:32:52
Done.
|
| @@ -358,6 +371,7 @@ TEST_F(InputMethodIBusTest, InitiallyConnected) { |
| // However, since the current text input type is 'NONE' (the default), FocusIn |
| // shouldn't be called. |
| EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); |
| + EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| } |
| // Create ui::InputMethodIBus, then start ibus-daemon. |
| @@ -373,6 +387,7 @@ TEST_F(InputMethodIBusTest, InitiallyDisconnected) { |
| EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| EXPECT_EQ(1, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| EXPECT_EQ(0, mock_ibus_input_context_client_->focus_in_call_count()); |
| + EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| } |
| // Confirm that ui::InputMethodIBus does not crash on "disconnected" signal |
| @@ -387,6 +402,7 @@ TEST_F(InputMethodIBusTest, Disconnect) { |
| // dynamical shutting down. |
| mock_dbus_thread_manager_->set_ibus_bus(NULL); |
| ime_->OnDisconnected(); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| } |
| // Confirm that ui::InputMethodIBus re-creates an input context when ibus-daemon |
| @@ -401,6 +417,7 @@ TEST_F(InputMethodIBusTest, DisconnectThenReconnect) { |
| mock_ibus_input_context_client_->reset_object_proxy_call_caount()); |
| mock_dbus_thread_manager_->set_ibus_bus(NULL); |
| ime_->OnDisconnected(); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| ime_->OnConnected(); |
| // Check if the old context is deleted. |
| @@ -409,6 +426,7 @@ TEST_F(InputMethodIBusTest, DisconnectThenReconnect) { |
| // Check if a new context is created. |
| EXPECT_EQ(2, mock_ibus_client_->create_input_context_call_count()); |
| EXPECT_EQ(2, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_TRUE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| } |
| // Confirm that ui::InputMethodIBus does not crash even if NULL context is |
| @@ -424,10 +442,14 @@ TEST_F(InputMethodIBusTest, CreateContextFail) { |
| chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| ime_->Init(true); |
| - EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| + // InputMethodIBus tries several times if the CreateInputContext method call |
| + // is failed. |
| + EXPECT_EQ(kCreateInputContextMaxTrialCount, |
| + mock_ibus_client_->create_input_context_call_count()); |
| // |set_capabilities_call_count()| should be zero since a context is not |
| // created yet. |
| EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| } |
| // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon does not |
| @@ -442,24 +464,105 @@ TEST_F(InputMethodIBusTest, CreateContextNoResp) { |
| ime_->Init(true); |
| EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| +} |
| + |
| +// Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
| +// after ui::InputMethodIBus is deleted. |
| +TEST_F(InputMethodIBusTest, CreateContextFailDelayed) { |
| + CreateInputContextDelayHandler create_input_context_handler( |
| + dbus::ObjectPath("Sample object path")); |
| + mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| + &CreateInputContextDelayHandler::Run, |
| + base::Unretained(&create_input_context_handler))); |
| + |
| + chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| + ime_->Init(true); |
| + EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| + EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| + |
| + ime_->SetFocusedTextInputClient(NULL); |
| + ime_.reset(); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| + |
| + create_input_context_handler.RunCallback(false); |
| + EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| + EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| } |
| // Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
| -// after ui::InputMethodIBus is deleted. See comments in ~MockIBusClient() as |
| -// well. |
| -TEST_F(InputMethodIBusTest, CreateContextDelayed) { |
| - CreateInputContextDelayFailHandler create_input_context_handler; |
| +// after ui::InputMethodIBus is deleted. |
| +TEST_F(InputMethodIBusTest, CreateContextSuccessDelayed) { |
| + CreateInputContextDelayHandler create_input_context_handler( |
| + dbus::ObjectPath("Sample object path")); |
| mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| - &CreateInputContextDelayFailHandler::Run, |
| + &CreateInputContextDelayHandler::Run, |
| base::Unretained(&create_input_context_handler))); |
| chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| ime_->Init(true); |
| EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| - // After this line, the destructor for |ime_| will run first. Then, the |
| - // destructor for the handler will run. In the latter function, a new input |
| - // context will be created and passed to InitOrAbandonInputContext(). |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| + |
| + ime_->SetFocusedTextInputClient(NULL); |
| + ime_.reset(); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| + |
| + create_input_context_handler.RunCallback(true); |
| + EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| + EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| +} |
| + |
| +// Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
| +// after disconnected from ibus-daemon. |
| +TEST_F(InputMethodIBusTest, CreateContextSuccessDelayedAfterDisconnection) { |
| + CreateInputContextDelayHandler create_input_context_handler( |
| + dbus::ObjectPath("Sample object path")); |
| + mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| + &CreateInputContextDelayHandler::Run, |
| + base::Unretained(&create_input_context_handler))); |
| + |
| + chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| + ime_->Init(true); |
| + EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| + EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| + |
| + ime_->OnDisconnected(); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| + |
| + create_input_context_handler.RunCallback(true); |
| + EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| + EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| +} |
| + |
| +// Confirm that ui::InputMethodIBus does not crash even if ibus-daemon responds |
| +// after disconnected from ibus-daemon. |
| +TEST_F(InputMethodIBusTest, CreateContextFailDelayedAfterDisconnection) { |
| + CreateInputContextDelayHandler create_input_context_handler( |
| + dbus::ObjectPath("Sample object path")); |
| + mock_ibus_client_->set_create_input_context_handler(base::Bind( |
| + &CreateInputContextDelayHandler::Run, |
| + base::Unretained(&create_input_context_handler))); |
| + |
| + chromeos::DBusThreadManager::Get()->InitIBusBus("dummy address"); |
| + ime_->Init(true); |
| + EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| + EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| + |
| + ime_->OnDisconnected(); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| + |
| + create_input_context_handler.RunCallback(false); |
| + EXPECT_EQ(1, mock_ibus_client_->create_input_context_call_count()); |
| + EXPECT_EQ(0, mock_ibus_input_context_client_->set_capabilities_call_count()); |
| + EXPECT_FALSE(mock_ibus_input_context_client_->IsObjectProxyReady()); |
| } |
| // Confirm that IBusClient::FocusIn is called on "connected" if input_type_ is |