summaryrefslogtreecommitdiffstats
path: root/chromeos
diff options
context:
space:
mode:
authornona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-11 20:42:27 +0000
committernona@chromium.org <nona@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-11 20:42:27 +0000
commitd19b934ba8c6f872806c88fc7276f408de630809 (patch)
tree70dd583a01ce81f954e55c409c09d0ab8c398c8c /chromeos
parent5117f5ba7aa81b64f549ba6792d20ca462dcd0db (diff)
downloadchromium_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.cc78
-rw-r--r--chromeos/dbus/ibus/ibus_client.h15
-rw-r--r--chromeos/dbus/ibus/ibus_client_unittest.cc218
-rw-r--r--chromeos/dbus/ibus/ibus_constants.h2
-rw-r--r--chromeos/dbus/ibus/mock_ibus_client.cc8
-rw-r--r--chromeos/dbus/ibus/mock_ibus_client.h8
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(