diff options
author | nona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-11 20:42:27 +0000 |
---|---|---|
committer | nona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-09-11 20:42:27 +0000 |
commit | d19b934ba8c6f872806c88fc7276f408de630809 (patch) | |
tree | 70dd583a01ce81f954e55c409c09d0ab8c398c8c /chromeos | |
parent | 5117f5ba7aa81b64f549ba6792d20ca462dcd0db (diff) | |
download | chromium_src-d19b934ba8c6f872806c88fc7276f408de630809.zip chromium_src-d19b934ba8c6f872806c88fc7276f408de630809.tar.gz chromium_src-d19b934ba8c6f872806c88fc7276f408de630809.tar.bz2 |
Extends IBusClient to be able to call SetGlobalEngine and Exit.
BUG=126947
TEST=ran chromeos_unittests and try bots.
Review URL: https://chromiumcodereview.appspot.com/10919094
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@156115 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos')
-rw-r--r-- | chromeos/dbus/ibus/ibus_client.cc | 78 | ||||
-rw-r--r-- | chromeos/dbus/ibus/ibus_client.h | 15 | ||||
-rw-r--r-- | chromeos/dbus/ibus/ibus_client_unittest.cc | 218 | ||||
-rw-r--r-- | chromeos/dbus/ibus/ibus_constants.h | 2 | ||||
-rw-r--r-- | chromeos/dbus/ibus/mock_ibus_client.cc | 8 | ||||
-rw-r--r-- | chromeos/dbus/ibus/mock_ibus_client.h | 8 |
6 files changed, 310 insertions, 19 deletions
diff --git a/chromeos/dbus/ibus/ibus_client.cc b/chromeos/dbus/ibus/ibus_client.cc index c23980e..fc8d0c2 100644 --- a/chromeos/dbus/ibus/ibus_client.cc +++ b/chromeos/dbus/ibus/ibus_client.cc @@ -46,7 +46,7 @@ class IBusClientImpl : public IBusClient { weak_ptr_factory_.GetWeakPtr(), callback, error_callback), - base::Bind(&IBusClientImpl::OnCreateInputContextFail, + base::Bind(&IBusClientImpl::OnDBusMethodCallFail, weak_ptr_factory_.GetWeakPtr(), error_callback)); } @@ -69,7 +69,45 @@ class IBusClientImpl : public IBusClient { weak_ptr_factory_.GetWeakPtr(), callback, error_callback), - base::Bind(&IBusClientImpl::OnRegisterComponentFail, + base::Bind(&IBusClientImpl::OnDBusMethodCallFail, + weak_ptr_factory_.GetWeakPtr(), + error_callback)); + } + + // IBusClient override. + virtual void SetGlobalEngine(const std::string& engine_name, + const ErrorCallback& error_callback) OVERRIDE { + DCHECK(!error_callback.is_null()); + dbus::MethodCall method_call(ibus::bus::kServiceInterface, + ibus::bus::kSetGlobalEngineMethod); + dbus::MessageWriter writer(&method_call); + writer.AppendString(engine_name); + proxy_->CallMethodWithErrorCallback( + &method_call, + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::Bind(&IBusClientImpl::OnSetGlobalEngine, + weak_ptr_factory_.GetWeakPtr(), + error_callback), + base::Bind(&IBusClientImpl::OnDBusMethodCallFail, + weak_ptr_factory_.GetWeakPtr(), + error_callback)); + } + + // IBusClient override. + virtual void Exit(ExitOption option, + const ErrorCallback& error_callback) OVERRIDE { + DCHECK(!error_callback.is_null()); + dbus::MethodCall method_call(ibus::bus::kServiceInterface, + ibus::bus::kExitMethod); + dbus::MessageWriter writer(&method_call); + writer.AppendBool(option == RESTART_IBUS_DAEMON); + proxy_->CallMethodWithErrorCallback( + &method_call, + dbus::ObjectProxy::TIMEOUT_USE_DEFAULT, + base::Bind(&IBusClientImpl::OnExit, + weak_ptr_factory_.GetWeakPtr(), + error_callback), + base::Bind(&IBusClientImpl::OnDBusMethodCallFail, weak_ptr_factory_.GetWeakPtr(), error_callback)); } @@ -95,12 +133,6 @@ class IBusClientImpl : public IBusClient { callback.Run(object_path); } - // Handles error response of CreateInputContext method calls. - void OnCreateInputContextFail(const ErrorCallback& error_callback, - dbus::ErrorResponse* response) { - error_callback.Run(); - } - // Handles responses of RegisterComponent method calls. void OnRegisterComponent(const RegisterComponentCallback& callback, const ErrorCallback& error_callback, @@ -113,9 +145,29 @@ class IBusClientImpl : public IBusClient { callback.Run(); } + // Handles responses of RegisterComponent method calls. + void OnSetGlobalEngine(const ErrorCallback& error_callback, + dbus::Response* response) { + if (!response) { + LOG(ERROR) << "Response is NULL."; + error_callback.Run(); + return; + } + } + + // Handles responses of RegisterComponent method calls. + void OnExit(const ErrorCallback& error_callback, + dbus::Response* response) { + if (!response) { + LOG(ERROR) << "Response is NULL."; + error_callback.Run(); + return; + } + } + // Handles error response of RegisterComponent method call. - void OnRegisterComponentFail(const ErrorCallback& error_callback, - dbus::ErrorResponse* response) { + void OnDBusMethodCallFail(const ErrorCallback& error_callback, + dbus::ErrorResponse* response) { error_callback.Run(); } @@ -141,6 +193,12 @@ class IBusClientStubImpl : public IBusClient { const RegisterComponentCallback& callback, const ErrorCallback& error_callback) OVERRIDE {} + virtual void SetGlobalEngine(const std::string& engine_name, + const ErrorCallback& error_callback) OVERRIDE {} + + virtual void Exit(ExitOption option, + const ErrorCallback& error_callback) OVERRIDE {} + private: DISALLOW_COPY_AND_ASSIGN(IBusClientStubImpl); }; diff --git a/chromeos/dbus/ibus/ibus_client.h b/chromeos/dbus/ibus/ibus_client.h index 565df0f..78502d5 100644 --- a/chromeos/dbus/ibus/ibus_client.h +++ b/chromeos/dbus/ibus/ibus_client.h @@ -30,6 +30,10 @@ class IBusInputContextClient; // callbacks. class CHROMEOS_EXPORT IBusClient { public: + enum ExitOption { + RESTART_IBUS_DAEMON, + SHUT_DOWN_IBUS_DAEMON + }; typedef base::Callback<void(const dbus::ObjectPath&)> CreateInputContextCallback; typedef base::Callback<void()> RegisterComponentCallback; @@ -52,6 +56,17 @@ class CHROMEOS_EXPORT IBusClient { const RegisterComponentCallback& callback, const ErrorCallback& error_callback) = 0; + // Requests the ibus-daemon to set global engine. If failed, |error_callback| + // is called. + virtual void SetGlobalEngine(const std::string& engine_name, + const ErrorCallback& error_callback) = 0; + + // Requests the ibus-daemon to exit daemon process. If |option| is + // RESTART_IBUS_DAEMON, ibus-daemon will be relaunched. If |option| is + // SHUT_DOWN_IBUS_DAEMON, ibus-daemon will not be relaunched. The + // |error_callback| is called if an error occures. + virtual void Exit(ExitOption option, const ErrorCallback& error_callback) = 0; + // Factory function, creates a new instance and returns ownership. // For normal usage, access the singleton via DBusThreadManager::Get(). static CHROMEOS_EXPORT IBusClient* Create(DBusClientImplementationType type, diff --git a/chromeos/dbus/ibus/ibus_client_unittest.cc b/chromeos/dbus/ibus/ibus_client_unittest.cc index 6e6287b..050b15a 100644 --- a/chromeos/dbus/ibus/ibus_client_unittest.cc +++ b/chromeos/dbus/ibus/ibus_client_unittest.cc @@ -24,6 +24,8 @@ namespace chromeos { namespace { const char kClientName[] = "chrome"; +const char kEngineName[] = "engine"; +const bool kRestartFlag = true; } // namespace class MockCreateInputContextCallback { @@ -31,7 +33,7 @@ class MockCreateInputContextCallback { MOCK_METHOD1(Run, void(const dbus::ObjectPath& object_path)); }; -class MockCreateInputContextErrorCallback { +class MockErrorCallback { public: MOCK_METHOD0(Run, void()); }; @@ -71,6 +73,62 @@ class IBusClientTest : public testing::Test { error_response_)); } + // Handles SetGlobalEngine method call. + void OnSetGlobalEngine( + dbus::MethodCall* method_call, + int timeout_ms, + const dbus::ObjectProxy::ResponseCallback& callback, + const dbus::ObjectProxy::ErrorCallback& error_callback) { + dbus::MessageReader reader(method_call); + std::string engine_name; + EXPECT_TRUE(reader.PopString(&engine_name)); + EXPECT_EQ(kEngineName, engine_name); + EXPECT_FALSE(reader.HasMoreData()); + message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); + } + + // Handles fail case of SetGlobalEngine method call. + void OnSetGlobalEngineFail( + dbus::MethodCall* method_call, + int timeout_ms, + const dbus::ObjectProxy::ResponseCallback& callback, + const dbus::ObjectProxy::ErrorCallback& error_callback) { + dbus::MessageReader reader(method_call); + std::string engine_name; + EXPECT_TRUE(reader.PopString(&engine_name)); + EXPECT_EQ(kEngineName, engine_name); + EXPECT_FALSE(reader.HasMoreData()); + message_loop_.PostTask(FROM_HERE, base::Bind(error_callback, + error_response_)); + } + + // Handles Exit method call. + void OnExit(dbus::MethodCall* method_call, + int timeout_ms, + const dbus::ObjectProxy::ResponseCallback& callback, + const dbus::ObjectProxy::ErrorCallback& error_callback) { + dbus::MessageReader reader(method_call); + bool restart = false; + EXPECT_TRUE(reader.PopBool(&restart)); + EXPECT_EQ(kRestartFlag, restart); + EXPECT_FALSE(reader.HasMoreData()); + message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_)); + } + + // Handles fail case of Exit method call. + void OnExitFail(dbus::MethodCall* method_call, + int timeout_ms, + const dbus::ObjectProxy::ResponseCallback& callback, + const dbus::ObjectProxy::ErrorCallback& error_callback) { + dbus::MessageReader reader(method_call); + bool restart = false; + EXPECT_TRUE(reader.PopBool(&restart)); + EXPECT_EQ(kRestartFlag, restart); + EXPECT_FALSE(reader.HasMoreData()); + message_loop_.PostTask(FROM_HERE, base::Bind(error_callback, + error_response_)); + } + protected: virtual void SetUp() OVERRIDE { dbus::Bus::Options options; @@ -114,7 +172,7 @@ TEST_F(IBusClientTest, CreateInputContextTest) { .WillOnce(Invoke(this, &IBusClientTest::OnCreateInputContext)); MockCreateInputContextCallback callback; EXPECT_CALL(callback, Run(kInputContextObjectPath)); - MockCreateInputContextErrorCallback error_callback; + MockErrorCallback error_callback; EXPECT_CALL(error_callback, Run()).Times(0); // Create response. @@ -128,7 +186,7 @@ TEST_F(IBusClientTest, CreateInputContextTest) { kClientName, base::Bind(&MockCreateInputContextCallback::Run, base::Unretained(&callback)), - base::Bind(&MockCreateInputContextErrorCallback::Run, + base::Bind(&MockErrorCallback::Run, base::Unretained(&error_callback))); // Run the message loop. @@ -141,7 +199,7 @@ TEST_F(IBusClientTest, CreateInputContext_NullResponseFail) { .WillOnce(Invoke(this, &IBusClientTest::OnCreateInputContext)); MockCreateInputContextCallback callback; EXPECT_CALL(callback, Run(_)).Times(0); - MockCreateInputContextErrorCallback error_callback; + MockErrorCallback error_callback; EXPECT_CALL(error_callback, Run()); // Set NULL response. @@ -152,7 +210,7 @@ TEST_F(IBusClientTest, CreateInputContext_NullResponseFail) { kClientName, base::Bind(&MockCreateInputContextCallback::Run, base::Unretained(&callback)), - base::Bind(&MockCreateInputContextErrorCallback::Run, + base::Bind(&MockErrorCallback::Run, base::Unretained(&error_callback))); // Run the message loop. @@ -165,7 +223,7 @@ TEST_F(IBusClientTest, CreateInputContext_InvalidResponseFail) { .WillOnce(Invoke(this, &IBusClientTest::OnCreateInputContext)); MockCreateInputContextCallback callback; EXPECT_CALL(callback, Run(_)).Times(0); - MockCreateInputContextErrorCallback error_callback; + MockErrorCallback error_callback; EXPECT_CALL(error_callback, Run()); // Create invalid(empty) response. @@ -177,7 +235,7 @@ TEST_F(IBusClientTest, CreateInputContext_InvalidResponseFail) { kClientName, base::Bind(&MockCreateInputContextCallback::Run, base::Unretained(&callback)), - base::Bind(&MockCreateInputContextErrorCallback::Run, + base::Bind(&MockErrorCallback::Run, base::Unretained(&error_callback))); // Run the message loop. @@ -190,7 +248,7 @@ TEST_F(IBusClientTest, CreateInputContext_MethodCallFail) { .WillOnce(Invoke(this, &IBusClientTest::OnCreateInputContextFail)); MockCreateInputContextCallback callback; EXPECT_CALL(callback, Run(_)).Times(0); - MockCreateInputContextErrorCallback error_callback; + MockErrorCallback error_callback; EXPECT_CALL(error_callback, Run()); // The error response is not used in CreateInputContext. @@ -201,7 +259,149 @@ TEST_F(IBusClientTest, CreateInputContext_MethodCallFail) { kClientName, base::Bind(&MockCreateInputContextCallback::Run, base::Unretained(&callback)), - base::Bind(&MockCreateInputContextErrorCallback::Run, + base::Bind(&MockErrorCallback::Run, + base::Unretained(&error_callback))); + + // Run the message loop. + message_loop_.RunAllPending(); +} + +TEST_F(IBusClientTest, SetGlobalEngineTest) { + // Set expectations + EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) + .WillOnce(Invoke(this, &IBusClientTest::OnSetGlobalEngine)); + MockErrorCallback error_callback; + EXPECT_CALL(error_callback, Run()).Times(0); + + // Create empty response. + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); + response_ = response.get(); + + // The error response is not used in SetGLobalEngine. + error_response_ = NULL; + + // Call CreateInputContext. + client_->SetGlobalEngine( + kEngineName, + base::Bind(&MockErrorCallback::Run, + base::Unretained(&error_callback))); + + // Run the message loop. + message_loop_.RunAllPending(); +} + +TEST_F(IBusClientTest, SetGlobalEngineTest_InvalidResponse) { + // Set expectations + EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) + .WillOnce(Invoke(this, &IBusClientTest::OnSetGlobalEngineFail)); + MockErrorCallback error_callback; + EXPECT_CALL(error_callback, Run()); + + // Set invlaid response. + response_ = NULL; + + // The error response is not used in SetGLobalEngine. + error_response_ = NULL; + + // Call CreateInputContext. + client_->SetGlobalEngine( + kEngineName, + base::Bind(&MockErrorCallback::Run, + base::Unretained(&error_callback))); + + // Run the message loop. + message_loop_.RunAllPending(); +} + +TEST_F(IBusClientTest, SetGlobalEngineTest_MethodCallFail) { + // Set expectations + EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) + .WillOnce(Invoke(this, &IBusClientTest::OnSetGlobalEngineFail)); + MockErrorCallback error_callback; + EXPECT_CALL(error_callback, Run()); + + // Create empty response. + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); + response_ = response.get(); + + // The error response is not used in SetGLobalEngine. + error_response_ = NULL; + + // Call CreateInputContext. + client_->SetGlobalEngine( + kEngineName, + base::Bind(&MockErrorCallback::Run, + base::Unretained(&error_callback))); + + // Run the message loop. + message_loop_.RunAllPending(); +} + +TEST_F(IBusClientTest, ExitTest) { + // Set expectations + EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) + .WillOnce(Invoke(this, &IBusClientTest::OnExit)); + MockErrorCallback error_callback; + EXPECT_CALL(error_callback, Run()).Times(0); + + // Create empty response. + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); + response_ = response.get(); + + // The error response is not used in SetGLobalEngine. + error_response_ = NULL; + + // Call CreateInputContext. + client_->Exit( + IBusClient::RESTART_IBUS_DAEMON, + base::Bind(&MockErrorCallback::Run, + base::Unretained(&error_callback))); + + // Run the message loop. + message_loop_.RunAllPending(); +} + +TEST_F(IBusClientTest, ExitTest_InvalidResponse) { + // Set expectations + EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) + .WillOnce(Invoke(this, &IBusClientTest::OnExit)); + MockErrorCallback error_callback; + EXPECT_CALL(error_callback, Run()); + + // Set invlaid response. + response_ = NULL; + + // The error response is not used in SetGLobalEngine. + error_response_ = NULL; + + // Call CreateInputContext. + client_->Exit( + IBusClient::RESTART_IBUS_DAEMON, + base::Bind(&MockErrorCallback::Run, + base::Unretained(&error_callback))); + + // Run the message loop. + message_loop_.RunAllPending(); +} + +TEST_F(IBusClientTest, ExitTest_MethodCallFail) { + // Set expectations + EXPECT_CALL(*mock_proxy_, CallMethodWithErrorCallback(_, _, _, _)) + .WillOnce(Invoke(this, &IBusClientTest::OnExitFail)); + MockErrorCallback error_callback; + EXPECT_CALL(error_callback, Run()); + + // Create empty response. + scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); + response_ = response.get(); + + // The error response is not used in SetGLobalEngine. + error_response_ = NULL; + + // Call CreateInputContext. + client_->Exit( + IBusClient::RESTART_IBUS_DAEMON, + base::Bind(&MockErrorCallback::Run, base::Unretained(&error_callback))); // Run the message loop. diff --git a/chromeos/dbus/ibus/ibus_constants.h b/chromeos/dbus/ibus/ibus_constants.h index 8afc64d..6315d6f 100644 --- a/chromeos/dbus/ibus/ibus_constants.h +++ b/chromeos/dbus/ibus/ibus_constants.h @@ -16,6 +16,8 @@ const char kServicePath[] = "/org/freedesktop/IBus"; const char kServiceInterface[] = "org.freedesktop.IBus"; const char kCreateInputContextMethod[] = "CreateInputContext"; const char kRegisterComponentMethod[] = "RegisterComponent"; +const char kSetGlobalEngineMethod[] = "SetGlobalEngine"; +const char kExitMethod[] = "Exit"; } // namespace bus namespace input_context { diff --git a/chromeos/dbus/ibus/mock_ibus_client.cc b/chromeos/dbus/ibus/mock_ibus_client.cc index 455e769..fdb9ce5 100644 --- a/chromeos/dbus/ibus/mock_ibus_client.cc +++ b/chromeos/dbus/ibus/mock_ibus_client.cc @@ -30,4 +30,12 @@ void MockIBusClient::RegisterComponent( register_component_handler_.Run(ibus_component, callback, error_callback); } +void MockIBusClient::SetGlobalEngine(const std::string& engine_name, + const ErrorCallback& error_callback) { +} + +void MockIBusClient::Exit(ExitOption option, + const ErrorCallback& error_callback) { +} + } // namespace chromeos diff --git a/chromeos/dbus/ibus/mock_ibus_client.h b/chromeos/dbus/ibus/mock_ibus_client.h index 2202b68..215447f 100644 --- a/chromeos/dbus/ibus/mock_ibus_client.h +++ b/chromeos/dbus/ibus/mock_ibus_client.h @@ -35,6 +35,14 @@ class MockIBusClient : public IBusClient { const RegisterComponentCallback& callback, const ErrorCallback& error_callback) OVERRIDE; + // IBusClient override. + virtual void SetGlobalEngine(const std::string& engine_name, + const ErrorCallback& error_callback) OVERRIDE; + + // IBusClient override. + virtual void Exit(ExitOption option, + const ErrorCallback& error_callback) OVERRIDE; + // Function handler for CreateInputContext. The CreateInputContext function // invokes |create_input_context_handler_| unless it's not null. void set_create_input_context_handler( |